Jersey est un framework permettant de develloper des web service rest
Home du projet ici.
Le user guide la.
L 'api ici
Tous le code des exemples est dispos sur mon cvs source forge
ici
Comme il s'agit d'un web service vous devait utiliser un serveur de servlette terme trés vague et générique pouvant deésigné pas mal de chose ...
J'en connais deux utilisé a mon taf TOMCAT et GRIZZLY
Grizzlly tous recement pour les test dit smok tests (test rapide) et tomcat pour la production
Hello
Si dessous vous trouverez les fichier du projet copier collez (pour le referencement) dispos sur mon sourceforge
Sa aide aussi pour avoir une vue d'ensemble utiliser control+f (firefox) pour chercher les partie interessante pour votre cas
Explication
Le web.xml fais la liaisons entre le framework et les url de type /WS/*
A noter que si vous faite un truc du style /* vous ne pourrez plus axceder a votre index.html et autre page web
Compil
Ce placer dans le repertoir et taper:
mvn war:exploded
On decompress le war pour pouvoir pointer le grissly et l'apache directement dessus
Pour eviter que le war prenne le nom du packahe rajouter name:Jersey1
test
Pour tester votre install lancer les class de test
Avec un navigateur lancer Jersey2.java (attention au port par default 8080)
Ensuite connecter vous à http://localhost:8080/
Vous devriez voir mon index.html + un commentaire devant qui vient de mon implem
Il est assais volumineux car il contient plusieur morceaux et usages
Grizzly pour effectuer les tests mais il pourrais etre utlisé en temps que serveur de prode
Je n'est pas pousser dans les tests avec le client jersey car c'est contraire a la politique de ma boitte
package com.gadille;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
// The Java class will be hosted at the URI path "/helloworld"
@Path("/helloworld")
public class HelloWorldResource {
// The Java method will process HTTP GET requests
@GET
// The Java method will produce content identified by the MIME Media
// type "text/plain"
@Produces("text/plain")
public String getClichedMessage() {
// Return some cliched textual content
return "Hello World";
}
}
Tomcat
Le propos et pas une formation tomcat reporter vous a ma page ici mais justes de vous aider a deployer votre hello world sur un tomcat
Il faut créer un context (tomcat arreté: /opt/tomcat-8080/bin/shutdown.sh)
cat /opt/tomcat-8080/conf/Catalina/localhost/Jersey1.xml
Puis fabriquer la webapp
cd /home/lio/workspace-perso/jersey1
mvn war:exploded
Cela va remplir le "target/Jersey1" (Jersey1 etant le parame name du pom.xml)
Demarrer votre tomcat
Et le resultat est visible sous http://localhost:8080/Jersey1
Grizzly Jersey
Voici un petit exemple de code pour lancer un serveur grizzly
String URL_PREFIX = "http://localhost:9998/Jersey1/WS/";
SelectorThread threadSelector;
threadSelector = GrizzlyServerFactory.create(URL_PREFIX);
System.out.println("Grizzly start on port 9998");
System.out.println("Attention grizzly ne sert pas du html mais que des servlette");
System.out.println("use url: http://localhost:8080/Jersey1/WS/helloworld to get hello");
System.out.println("hit enter to stop");
Scanner sc = new Scanner(System.in);
sc.nextLine();
if (threadSelector != null)threadSelector.stopEndpoint();
System.out.println("Grizzly stop");
On utilise la class selector qui est de plus haut niveaux que GrizzlyWebServer
A noter que le serveur grizzly ne sert pas les pages html par default
Grizzly Jersey Http html static
Il vous faudra trouver une implementation ou en faire une
cf la mienne
ServletAdapter sa;
GrizzlyWebServer ws = new GrizzlyWebServer(8080, contextPath);
sa = new ServletAdapter();
sa.addInitParameter("com.sun.jersey.config.property.packages", "com.gadille.services");
sa.setContextPath("/jersey"); // obligatoir sinnon sert du 200 vide
sa.setServletInstance(new ServletContainer());
ws.addGrizzlyAdapter(sa, new String[] { "/jersey" });
ws.addGrizzlyAdapter(new GrizzlyAdapter() {
@SuppressWarnings("unchecked")
@Override
public void service(GrizzlyRequest request, GrizzlyResponse response) {
try {
String uri = request.getRequestURI();
String urlContext = contextPath + uri;
File file = new File(urlContext);
if (file.isDirectory()) {
file = new File(urlContext + "/index.html");
}
if (file.exists()) {
FileReader fr = new FileReader(file);
response.getWriter().println("Impleme bitdon de http");
response.setContentType(MediaType.TEXT_HTML);
BufferedReader br = new BufferedReader(fr);
while (br.ready()) {
response.getWriter().println(br.readLine());
}
} else {
response.getWriter().println("404 connard");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new String[] { "/" });
ws.start();
System.out.println("Grizzly start on port 8080 by jersey2");
System.out.println("Attention grizzly ne sert pas du html mais que des servlette");
System.out.println("use url: http://localhost:8080/Jersey1/WS/helloworld to get hello");
System.out.println("hit enter to stop");
Scanner sc = new Scanner(System.in);
sc.nextLine();
System.out.println("Grizzly stop");
ws.stop();
Form
Exemple 1
Voici comment couplet un formullaire à Jersey
Form
<form action="http://localhost:8080/Jersey1/WS/Formu1"
enctype="application/x-www-form-urlencoded"
method="post" >
First name: <input type="text" name="fname"><br>
Last name: <input type="text" name="lname"><br>
<input type="submit" value="Submit">
</form>
Java
package com.gadille.services;
import java.io.IOException;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MultivaluedMap;
@Path("/Formu1")
public class Form1 {
//ok marche aussi
@POST
@Consumes("application/x-www-form-urlencoded")
@Produces("text/plain")
public String postLeads(MultivaluedMap formParams) throws IOException {
System.out.println(formParams.toString());
List list=formParams.get("fname");
String fname=list.get(0);
list=formParams.get("lname");
String lname=list.get(0);
return ("First name "+fname+"\nLast name "+lname);
}
}
Exemple 2
Form
meme formullaire mais on appéle la class 2
<form action="http://localhost:8080/Jersey1/WS/Formu2"
enctype="application/x-www-form-urlencoded"
method="post" >
First name: <input type="text" name="fname"><br>
Last name: <input type="text" name="lname"><br>
<input type="submit" value="Submit">
</form>
Java
package com.gadille.services;
import java.io.IOException;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/Formu2")
public class Form2 {
@POST
@Consumes("application/x-www-form-urlencoded")
@Produces(MediaType.TEXT_HTML)
public String postLeads(@FormParam("fname") @DefaultValue("???") String fname,@FormParam("lname") String lname) throws IOException {
return ("your first name is: <b>,"+fname+"</b>,<br>,your surname is:"+lname);
}
}
File
Exemple 1
Cette exmple permet de charger un fichier sour forme de stream avec un client java (ou autre)
Un extrait de la class code dispos ici
System.getProperty("user.home") + DATA_DIR + "/toto" ceci represente l'emplacement du fichier sur le serveur
toto est son nom (on ne connais pas le nom d'origine)
public void postFile1() throws HttpException, IOException {
System.out.println("postFile1 ==> Start");
// clean before test
File resultFile = new File(System.getProperty("user.home") + DATA_DIR + "/toto");
if (resultFile.exists())
resultFile.delete();
// post
PostMethod method = new PostMethod(URL_PREFIX + "LoadFile1");
method.setRequestHeader("Content-Type", MediaType.APPLICATION_OCTET_STREAM);
File basedir = new File(System.getProperty("basedir", "")).getAbsoluteFile();
File file = new File(basedir, "src/test/resources/test.txt");
InputStream inputStream = new FileInputStream(file);
method.setRequestEntity(new InputStreamRequestEntity(inputStream));
HttpClient client = new HttpClient();
try {
client.executeMethod(method);
assertEquals("Status code not valid", HttpServletResponse.SC_NO_CONTENT, method.getStatusCode());
} finally {
method.releaseConnection();
}
// verif
if (resultFile.exists()) {
System.out.println("File upload sucessfully");
} else {
Assert.assertTrue("File not uploaded", false);
}
System.out.println("postFile1 ==> end ok");
}
JerseyThe ResourceConfig instance does not contain any root resource classes.
Mon probleme venez d'un test qui ne passé pas donc je n'avais pas de class compiller dans le tomcat en sortie