Bonjour à tous !
Je suis actuellement en train de coder une application web en java (+ GWT) pour mon institut de recherche. A la base, je développe principalement en Matlab (pour mes projets de recherche) et en python (pour des applications un peu plus carré). Et je voulais rendre certaines de mes applications disponibles en ligne afin de faciliter la vie de certains de mes collègues. Je me suis mis au java il y a deux mois par l'intermédiaire de GWT et du petit tutorial qui est proposé sur le site officiel. De cette manière j'ai réussi à coder une web app pas trop dégueulasse. L'application en soit n'est pas très complexe et elle me sert pour me faire la main en java.
Le but de cette dernière est de proposer la création d'un fichier xml proposant des métadonnées pour des campagnes de recherche aéroportées. Elle est composé d'une partie client (très jolie et tout) et de deux servlets, l'un pour uploader un fichier xml vers le serveur (et qui sera ensuite lu pour afficher les métadonnées à l'écran), l'autre pour sauvegarder un fichier xml à parti de ce que l'utilisateur aura renseigné et pour le downloader.
J'utilise Eclipse 4.4 et le Google web toolkit plugin. En GWT Super Dev Mode, pas de soucis, tout fonctionne comme il faut, tant la partie client que les servlets. J'ai ensuite installer Apache Tomcat 7 et Jetty sur mon portable (Ubuntu 14.04) pour tester tout ça en local, tout en m'affranchissant du pc du boulot. J'ai compilé mon code, compressé le dossier war en fichier .war et je l'ai ensuite déployé sur Tomcat et Jetty. L'un et l'autre font tourner la partie client sans problème, mais impossible d'accéder aux servlets, en testant la fonction d'upload, dont j'envoyais le résultat dans un "TextArea", j'ai eu droit à un "Etat HTTP 404 - upload ... La ressource demandée n'est pas disponible" avec Jetty, et à peu de chose près la même chose avec Tomcat.
Après plusieurs heures de recherche sur le net, je n'ai pas trouvé ce qui pouvait bien cloché dans mon code .... J'ai vraiment l'impression de ne pas avoir fait d'erreur ... Je pense que c'est le fichier web.xml qui pose problème, mais même en annotant le servlet (@webquelquechose(url, name, etc)) ça ne fonctionne pas ...
Voici la partie de mon code client pour appeler le servlet d'upload:
Voici le serlet d'upload:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 final DialogBox myUploadDialog = new DialogBox(); myUploadDialog.setGlassEnabled(true); final VerticalPanel vpanel2 = new VerticalPanel(); myUploadDialog.add(vpanel2); final HorizontalPanel hpanel = new HorizontalPanel(); vpanel2.add(hpanel); vpanel2.getElement().setAttribute("style", "margin-left: 5px !important; margin-top: 10px !important; margin-right: 10px !important;"); Image xImage = new Image("images/open_icon.png"); xImage.setPixelSize(75, 75); hpanel.add(xImage); final VerticalPanel panel = new VerticalPanel(); hpanel.add(panel); panel.getElement().setAttribute("style", "margin-right:20px !important;"); final Label label = new Label("Please, select the file you want to modify"); label.getElement().setAttribute("style", "margin-right:20px !important; margin-bottom:30px !important; " + "margin-top:10px !important;"); panel.add(label); final FileUpload myFileUpload = new FileUpload(); myFileUpload.setName("uploadFormElement"); myFileUpload.getElement().setId("uploadFormElement"); myFileUpload.getElement().setId("myFile"); panel.add(myFileUpload); final FormPanel myUploadForm = new FormPanel(); myUploadForm.setAction("/upload"); myUploadForm.setEncoding(FormPanel.ENCODING_MULTIPART); myUploadForm.setMethod(FormPanel.METHOD_POST); myUploadForm.addSubmitHandler(new FormPanel.SubmitHandler() { @Override public void onSubmit(SubmitEvent event) { if (myFileUpload.getFilename().length() == 0) { Window.alert("Please, select a file."); event.cancel(); } else { myFileName = myFileUpload.getFilename(); } } }); myUploadForm.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { @Override public void onSubmitComplete(SubmitCompleteEvent event) { myUploadDialog.hide(); String ret = event.getResults(); readXml(ret); } }); final Button submitButton = new Button("Ok", new ClickHandler() { @Override public void onClick(ClickEvent event) { myUploadForm.submit(); } }); final Button cancelButton = new Button("Cancel", new ClickHandler() { @Override public void onClick(ClickEvent event) { myUploadDialog.hide(); } }); myUploadForm.add(vpanel2); HorizontalPanel myHPanel = new HorizontalPanel(); myHPanel.add(submitButton); myHPanel.add(cancelButton); submitButton.getElement().setAttribute("style", "margin-left:40px !important; font-family: DroidSansFallback " + "!important; font-weight: bold !important;"); cancelButton.getElement().setAttribute("style", "margin-left:65px !important; font-family: DroidSansFallback " + "!important; font-weight: bold !important;"); myHPanel.getElement().setAttribute("style", "margin-top:30px !important; margin-bottom:20px !important;"); panel.add(myHPanel); myUploadDialog.add(myUploadForm); myUploadDialog.setSize( "130px", "180px" ); myUploadDialog.setModal(true); myUploadDialog.center(); myUploadDialog.setStyleName("myUploadBox");
Et enfin le fichier web.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 package com.eufar.asmm.server; import java.io.IOException; import java.util.List; import java.util.Iterator; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @SuppressWarnings("hiding") public class UploadFunction<FileItem> extends HttpServlet implements Servlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); @SuppressWarnings("unused") boolean isMultipart = ServletFileUpload.isMultipartContent(request); FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List items = upload.parseRequest(request); Iterator iter = items.iterator(); while(iter.hasNext()){ Object obj = iter.next(); if(obj == null) continue; org.apache.commons.fileupload.FileItem item = (org.apache.commons.fileupload.FileItem)obj; if(item.isFormField()){ String name = item.getName(); String value = ""; if(name.compareTo("textBoxFormElement")==0){ value = item.getString(); } else { value = item.getString(); } response.getWriter().write(name + "=" + value + "\n"); } else { byte[] fileContents = item.get(); String message = new String(fileContents); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); response.getWriter().write(message); } } } catch (Exception ex) { response.getWriter().write("ERROR:" + ex.getMessage()); } } }
C'est à peu près tout. N'hésitez pas à me demander autre chose. Au pire je peux poster le code entier compilé et les sources sur mon compte dropbox, si nécessaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <!-- Servlets --> <servlet> <servlet-name>DownloadFunction</servlet-name> <servlet-class>com.eufar.asmm.server.DownloadFunction</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownloadFunction</servlet-name> <url-pattern>DownloadFunction</url-pattern> </servlet-mapping> <servlet> <servlet-name>UploadFunction</servlet-name> <servlet-class>com.eufar.asmm.server.UploadFunction</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadFunction</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> <servlet> <servlet-name>greetServlet</servlet-name> <servlet-class>com.eufar.asmm.server.GreetingServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>greetServlet</servlet-name> <url-pattern>/asmm_eufar/greet</url-pattern> </servlet-mapping> <!-- Default page to serve --> <welcome-file-list> <welcome-file>Asmm_eufar.html</welcome-file> </welcome-file-list> </web-app>
Merci de votre aide et à bientôt
Olivier
Partager