IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tomcat et TomEE Java Discussion :

[Tomcat] Ecrire dans un fichier depuis une servlet deployée sous Tomcat (linux)


Sujet :

Tomcat et TomEE Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Par défaut [Tomcat] Ecrire dans un fichier depuis une servlet sous Tomcat (linux)
    Bonjour !

    Mon appli est, en gros, un gestionnaire de contacts, qui stock des infos sur des utilisateurs (10 à 20 users).
    Ces informations sont stockées dans un fichier xml : UsersInfos.xml.
    Dans mon appli, la servlet principale (ShowUserList) affiche, au format html, le contenu de ce fichier. Il y a donc un travail de parsing de ce fichier xml afin d'en obtenir la représentation sous forme d'Objects java.
    Mais je n'ai pas qu'à parser le contenu de ce fichier, je doit aussi écrire dessus. Or, j'ai lu sur un forum qu'il n'était pas possible d'écrire directement sur un fichier contenu dans un jar/war (ce qui peut semble assez logique), donc ce que je fais c'est que je crée un fichier UsersInfos.xml quelque part où je pourrai le modifier (en l'occurence j'ai choisi java.io.tmpdir).
    Afin de ne pas partir d'une base vierge (rentrer XX utilisateurs à la main à chaque fois) mon War contient plusieurs ressources dont un fichier "UsersInfos.xml" qui me sert donc de base de départ :

    ContactManagerOscar.war
    /WEB-INF/
    |-...
    |-res/
    | |-...
    | |-UsersInfos.xml
    |-...

    Je cherche donc à créer un nouveau fichier sur le server où je me trouve et le remplir avec le contenu de celui présent dans mon War.

    J'arrive trés bien à effectuer cette opération sous windows avec un petit environnement embarqué qui est capable d'héberger des servlets (à partir d'un .jar équivalent à mon war), mais dès que je passe sous Tomcat, je ne m'en sors pas et j'obtiens ça :

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    2006-10-13 14:34:53 HostConfig[localhost]: D?compression de l archive ContactManagerOscar.war de l application web
    2006-10-13 14:34:53 StandardHost[localhost]: Installation d une application pour le chemin de contexte /ContactManagerOscar depuis l URL file:/var/lib/tomcat4/webapps/ContactManagerOscar
    2006-10-13 14:34:53 WebappLoader[/ContactManagerOscar]: Deploying class repositories to work directory /var/lib/tomcat4/work/Standalone/localhost/ContactManagerOscar
    2006-10-13 14:34:53 WebappLoader[/ContactManagerOscar]: Deploy class files /WEB-INF/classes to /var/lib/tomcat4/webapps/ContactManagerOscar/WEB-INF/classes
    2006-10-13 14:34:53 WebappLoader[/ContactManagerOscar]: Deploy JAR /WEB-INF/lib/kxml-min.jar to /var/lib/tomcat4/webapps/ContactManagerOscar/WEB-INF/lib/kxml-min.jar
    2006-10-13 14:34:53 StandardManager[/ContactManagerOscar]: Alimentation de la classe du g?n?rateur de nombre al?atoire java.security.SecureRandom
    2006-10-13 14:34:53 StandardManager[/ContactManagerOscar]: L alimentation du g?n?rateur de nombre al?atoire est termin?
    2006-10-13 14:34:53 StandardWrapper[/ContactManagerOscar:showServlet]: La servlet showServlet est marqu? comme indisponible
    2006-10-13 14:34:53 StandardContext[/ContactManagerOscar]: La servlet /ContactManagerOscar a g?n?r? une exception "load()"
    javax.servlet.ServletException: Erreur ? l instantiation de la classe servlet com.monsite.partmult.webui.ShowUserList
    	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:865)
    	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:776)
    	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3363)
    	at org.apache.catalina.core.StandardContext.start(StandardContext.java:3586)
    	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:774)
    	at org.apache.catalina.core.ContainerBase.access$000(ContainerBase.java:115)
    	at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:135)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:758)
    	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:548)
    	at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:260)
    	at org.apache.catalina.core.StandardHost.install(StandardHost.java:741)
    	at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:445)
    	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:353)
    	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:671)
    	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1149)
    	at org.apache.catalina.core.StandardHost.start(StandardHost.java:707)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1141)
    	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:316)
    	at org.apache.catalina.core.StandardService.start(StandardService.java:450)
    	at org.apache.catalina.core.StandardServer.start(StandardServer.java:2143)
    	at org.apache.catalina.startup.Catalina.start(Catalina.java:463)
    	at org.apache.catalina.startup.Catalina.execute(Catalina.java:350)
    	at org.apache.catalina.startup.Catalina.process(Catalina.java:129)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:585)
    	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:156)
    ----- Root Cause -----
    java.security.AccessControlException: access denied (java.util.PropertyPermission java.io.tmpdir read)
    	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
    	at java.security.AccessController.checkPermission(AccessController.java:427)
    	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    	at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
    	at java.lang.System.getProperty(System.java:628)
    	at com.monsite.partmult.UsersHandler.<init>(UsersHandler.java:47)
    	at com.monsite.partmult.UsersHandler.getInstance(UsersHandler.java:34)
    	at com.monsite.partmult.Administrator.<init>(Administrator.java:20)
    	at com.monsite.partmult.Administrator.getInstance(Administrator.java:11)
    	at com.monsite.partmult.webui.ShowUserList.<init>(ShowUserList.java:35)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    	at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
    	at java.lang.Class.newInstance0(Class.java:350)
    	at java.lang.Class.newInstance(Class.java:303)
    	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:856)
    	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:776)
    	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3363)
    	at org.apache.catalina.core.StandardContext.start(StandardContext.java:3586)
    	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:774)
    	at org.apache.catalina.core.ContainerBase.access$000(ContainerBase.java:115)
    	at org.apache.catalina.core.ContainerBase$PrivilegedAddChild.run(ContainerBase.java:135)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:758)
    	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:548)
    	at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:260)
    	at org.apache.catalina.core.StandardHost.install(StandardHost.java:741)
    	at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:445)
    	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:353)
    	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:671)
    	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1149)
    	at org.apache.catalina.core.StandardHost.start(StandardHost.java:707)
    	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1141)
    	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:316)
    	at org.apache.catalina.core.StandardService.start(StandardService.java:450)
    	at org.apache.catalina.core.StandardServer.start(StandardServer.java:2143)
    	at org.apache.catalina.startup.Catalina.start(Catalina.java:463)
    	at org.apache.catalina.startup.Catalina.execute(Catalina.java:350)
    	at org.apache.catalina.startup.Catalina.process(Catalina.java:129)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:585)
    	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:156)
    Je pense (mais en fait je n'en sais rien) que c'est un problème de droit d'exécution qui n'ont pas les droits d'écriture, mais comment le savoir ?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Ben apparemment, l'utilisateur qui lance tomcat a même pas les droit de lecture sur le répertoir temp:
    java.security.AccessControlException: access denied (java.util.PropertyPermission java.io.tmpdir read)

    Pourquoi ne pas ecrire dans le dossier contextuel de ta servlet (ContactManagerOscar sans doute)? Là t'auras forcément les droits.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Par défaut
    Bonjour,

    merci de ta réponse.
    Effectivement, je pourrai tenter d'écrire directement dans ce dossier. Je vais essayer ça de ce pas et je vous tiens au courant !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Par défaut
    re-bonjour,

    bon, j'ai tenté d'écrire sous le répertoire courant, mais je n'arrive à rien de concluant. Voici mon code :

    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
    package com.monsite.partmult.webui;
     
    import java.io.File;
    import java.io.IOException;
     
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
     
    public class Servlet1 extends HttpServlet {
     
    	private static final long serialVersionUID = -2106153019418354173L;
     
    	public Servlet1() {
    		System.out.println("------Une nouvelle instance de Servlet1() a été créée.");
    	}
     
    	public void doGet(HttpServletRequest a_request, HttpServletResponse a_response) throws ServletException, IOException {
    		this.doGetPost(a_request, a_response);
    	}
     
    	public void doPost(HttpServletRequest a_request, HttpServletResponse a_response) throws ServletException, IOException {
    		this.doGetPost(a_request, a_response);
    	}
     
    	private void doGetPost(HttpServletRequest a_request, HttpServletResponse a_response) throws ServletException, IOException {
    		ServletOutputStream out = a_response.getOutputStream();
    		a_response.setContentType("text/html");
     
    		String v_context = a_request.getContextPath();
    		String v_res = v_context + "/res";
     
    		StringBuffer v_HTML = new StringBuffer(3000);
    		v_HTML.append("<html><head>\n");
    		v_HTML.append("<title>Servlet de test de Tomcat</title>\n");
    		v_HTML.append("</head><body>\n");
     
    		File v_serverFile = new File(v_context + "/hello.txt");
    		if (v_serverFile == null) {
    			v_HTML.append("NULL");
    		} else {
    			v_HTML.append("<br/>PAS NULL<br/>");
    			v_HTML.append("getAbsolutePath $$$" + v_serverFile.getAbsolutePath() + "$$$<br/>");
    			v_HTML.append("getCanonicalPath $$$" + v_serverFile.getCanonicalPath() + "$$$<br/>");
    			v_HTML.append("getName $$$" + v_serverFile.getName() + "$$$<br/>");
    			v_HTML.append("getParent $$$" + v_serverFile.getParent() + "$$$<br/>");
    			v_HTML.append("getPath $$$" + v_serverFile.getPath() + "$$$<br/>");
    			v_HTML.append("exists $$$" + v_serverFile.exists() + "$$$<br/>");
    			v_HTML.append("canRead $$$" + v_serverFile.canRead() + "$$$<br/>");
    			v_HTML.append("canWrite $$$" + v_serverFile.canWrite() + "$$$<br/>");
    		}
     
    		v_HTML.append("</body>\n</html>");
     
    		try {
    			out.println(v_HTML.toString());
    			out.close();
    		} catch (IOException ioe) {
    			ioe.printStackTrace();
    		}
    	}
    }
    Sous mon tomcat 4 de linux (serveur), il plante au "exist" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.security.AccessControlException: access denied (java.io.FilePermission /TestTomcat/hello.txt read)
    	at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
    	at java.security.AccessController.checkPermission(AccessController.java:427)
    	at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    	at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
    	at java.io.File.exists(File.java:700)
    	at com.monsite.partmult.webui.Servlet1.doGetPost(Servlet1.java:59)
    	at com.monsite.partmult.webui.Servlet1.doGet(Servlet1.java:22)
    et sous mon tomcat 5.5 en local de windows il ne plante pas et m'affiche une belle page. (Mais dès que je tente un createFile() il plante quand même)

    Je ne sais plus trop quoi faire là... je vais tenter la solution proposée dans le post du dessous (qui ressemble à ma demande).

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Par défaut
    Je pense que le pb vient du fait que tu utilises directement le contextpath qui est relatif à ta servlet pour localiser le fichier.
    Ce que donne /TestTomcat/hello.txt dans ton cas, alors que sur linux c'est un truc du genre /var/lib/...../tomcat/webapp/TestTomcat/hello.txt qui faudrait.
    Il faudrait donc faire un truc du genre:

    String v_context = this.getServletContext().getRealPath(a_request.getContextPath());

    Ou si tu te sert de la cette variable ailleurs et que ça empeche le reste de tourner.
    Fait le juste au moment où tu vas chercher le fichier:
    File v_serverFile = new File(this.getServletContext().getRealPath(v_context) + "/hello.txt");

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Par défaut
    Merci pour ta réponse,

    au final, j'avais utilisé une méthode qui ressemble à celle que tu proposes, et sous mon tomcat windows, ca marche trés bien (sauf un problème avec les espaces dans le chemin d'accès qu'il ne gère pas et qui empèche la création...)

    Je ne sais pas encore quelle méthode je vais utiliser, mais la tienne peut être intéressante pour un cas que je vais rencontrer...


    Donc au final, ca marche sous windows tomcat 5.5 et sous mon linux tomcat 4.1 (ou 4.4 je ne sais plus) j'ai des problèmes de droits d'écriture...

    Je vais réinstaller un beau tomcat tout propre pour tenter de voir si c'est lui ou linux qui fait des siennes...

    Je vous tiens au courant des évolutions !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecrire un fichier depuis une servlet
    Par aubertinp dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 23/10/2008, 14h12
  2. Réponses: 3
    Dernier message: 10/10/2007, 09h15
  3. Ecrire dans un fichier ou une bdd
    Par HaTnuX dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/01/2007, 14h02
  4. Écrire dans un fichier à une place précise
    Par alliance dans le forum Langage
    Réponses: 15
    Dernier message: 26/08/2006, 23h08
  5. [Tomcat] ecrire dans le fichier log de tomcat
    Par dietrich dans le forum Tomcat et TomEE
    Réponses: 21
    Dernier message: 30/01/2006, 08h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo