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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Points : 11
    Points
    11
    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 expérimenté
    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
    Points : 1 610
    Points
    1 610
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Points : 11
    Points
    11
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Points : 11
    Points
    11
    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 expérimenté
    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
    Points : 1 610
    Points
    1 610
    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 à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Points : 11
    Points
    11
    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 !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Alors, voilà quelques nouvelles :

    J'ai écris le code suivant :

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    String v_filename="tonFichier.xml" ;
    String v_contextPath = a_request.getContextPath();
     
    String v_contextRealPath = this.getServletContext().getRealPath(v_contextPath);
    File v_tonFichier_v4 = new File(v_contextRealPath + "/../res/" + v_filename);
     
    File v_tonFichier_v5 = new File(v_contextRealPath + "/../WEB-INF/classes/" + v_filename);		
     
    File v_tonFichier_v6 = v_tonFichier_v4.getCanonicalFile();
     
    File v_tonFichier_v7 = v_tonFichier_v5.getCanonicalFile();

    et pour chacun des 4 fichier j'affiche :
    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    v_HTML.append("v_tonFichier_vX<br/>");
    v_HTML.append("getAbsolutePath $$$" + v_tonFichier_vX.getAbsolutePath() + "$$$<br/>");
    v_HTML.append("getCanonicalPath $$$" + v_tonFichier_v1.getCanonicalPath() + "$$$<br/>");
    v_HTML.append("getName $$$" + v_tonFichier_vX.getName() + "$$$<br/>");
    v_HTML.append("getParent $$$" + v_tonFichier_vX.getParent() + "$$$<br/>");
    v_HTML.append("getPath $$$" + v_tonFichier_vX.getPath() + "$$$<br/>");
    v_HTML.append("exists $$$" + v_tonFichier_vX.exists() + "$$$<br/>");
    v_HTML.append("canRead $$$" + v_tonFichier_vX.canRead() + "$$$<br/>");
    v_HTML.append("canWrite $$$" + v_tonFichier_vX.canWrite() + "$$$<br/>");

    et voici ce que j'obtiens :

    v_tonFichier_v4
    getAbsolutePath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat/../res/tonFichier.xml$$$
    getCanonicalPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/res/tonFichier.xml$$$
    getName $$$tonFichier.xml$$$
    getParent $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat/../res$$$
    getPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat/../res/tonFichier.xml$$$
    exists $$$false$$$
    canRead $$$false$$$
    canWrite $$$false$$$

    v_tonFichier_v5
    getAbsolutePath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat/../WEB-INF/classes/tonFichier.xml$$$
    getCanonicalPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/WEB-INF/classes/tonFichier.xml$$$
    getName $$$tonFichier.xml$$$
    getParent $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat/../WEB-INF/classes$$$
    getPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat/../WEB-INF/classes/tonFichier.xml$$$
    exists $$$false$$$
    canRead $$$false$$$
    canWrite $$$false$$$

    v_tonFichier_v6
    getAbsolutePath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/res/tonFichier.xml$$$
    getCanonicalPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/res/tonFichier.xml$$$
    getName $$$tonFichier.xml$$$
    getParent $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/res$$$
    getPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/res/tonFichier.xml$$$
    exists $$$true$$$
    canRead $$$true$$$
    canWrite $$$true$$$

    v_tonFichier_v7
    getAbsolutePath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/WEB-INF/classes/tonFichier.xml$$$
    getCanonicalPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/WEB-INF/classes/tonFichier.xml$$$
    getName $$$tonFichier.xml$$$
    getParent $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/WEB-INF/classes$$$
    getPath $$$/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/WEB-INF/classes/tonFichier.xml$$$
    exists $$$true$$$
    canRead $$$true$$$
    canWrite $$$true$$$

    Tout cela sachant que j'avais placé un fichier dans ...../TestTomcat/res/ et un autre dans ...../TestTomcat/WEB-INF/classes/

    On peut voir que le code que tu me proposais ne "marche pas" (enfin, tel que j'ai compris ce que tu proposais). Il faut bidouiller avec le chemin canonique, ce qui m'oblige à créer 2 File (la première qui ne "marche pas", et la seconde qui exploite son chemin canonique).

    Donc j'aimerai savoir si tu as une petite feinte pour m'éviter de faire cette bidouille :-)

    Autre question : si jamais je veux atteindre de fichier, mais pas depuis ma servlet, c'est à dire depuis une classe "classique", comment faire ? (sans passer le chemin en paramètre bien entendu...). Parceque d'après ce que je comprends là, on se sert du contexte de la servlet, alors quand on est pas dans une servlet, comment fait on ?

    Merci !

  8. #8
    Membre expérimenté
    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
    Points : 1 610
    Points
    1 610
    Par défaut
    Quand tu fais String v_contextRealPath = this.getServletContext().getRealPath(v_contextPath);
    t'obtiens le chemin "/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat"
    Donc getRealPath() renvoie déja le context et considere le paramètre comme un sous dossier de "TestTomcat".
    si tu mets juste this.getServletContext().getRealPath("."); et t'auras
    "/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat"
    donc plus besoin des .. par la suite

    Pour ton autre question, il faut bien que le programme et la servlet est le chemin au fichier en commun, je te conseille dans ce cas de passer par une API de gestion de fichier de conf, celle d'apache par exemple: http://jakarta.apache.org/commons/configuration/

    Ca s'utilise assez facilement du genre:
    PropertiesConfiguration config = new PropertiesConfiguration("monApp.properties");
    String cocoonWs = config.getString("cocoonWs");

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Morbo
    Quand tu fais String v_contextRealPath = this.getServletContext().getRealPath(v_contextPath);
    t'obtiens le chemin "/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat/TestTomcat"
    Donc getRealPath() renvoie déja le context et considere le paramètre comme un sous dossier de "TestTomcat".
    si tu mets juste this.getServletContext().getRealPath("."); et t'auras
    "/usr/local/tomcat/apache-tomcat-5.5.20/webapps/TestTomcat"
    donc plus besoin des .. par la suite
    ... sans commentaires...
    Je dois être à l'ouest cet aprem...

    A noter que l'on peut mettre "." ou "", les deux fonctionnent.

    Citation Envoyé par Morbo
    Pour ton autre question, il faut bien que le programme et la servlet est le chemin au fichier en commun, je te conseille dans ce cas de passer par une API de gestion de fichier de conf, celle d'apache par exemple: http://jakarta.apache.org/commons/configuration/

    Ca s'utilise assez facilement du genre:
    PropertiesConfiguration config = new PropertiesConfiguration("monApp.properties");
    String cocoonWs = config.getString("cocoonWs");
    Ok je vais y jeter un oeil, merci !
    J'ai tendance à vouloir tout faire à la main alors qu'il y a des trucs tout fait...

  10. #10
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Points : 1 059
    Points
    1 059
    Par défaut
    Pour la java.security.AccessControlException: access denied (java.io.FilePermission /TestTomcat/hello.txt read) il faut tout simplement que tu paramètres les droits de tes applis web. sous debian ça se fait dans /etc/tomcat[version]/policy.d/04webbapps
    tu dois insérer des entrées du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    permission java.io.FilePermission "[chemin]", "autorisation(s)";
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 25
    Points : 11
    Points
    11
    Par défaut
    Bon, j'ai fini par faire ce que je voulais (ca fait une bonne semaine mais je n'avais pas encore eu le temps de repasser ici)...

    Merci Beuss pour ta proposition, mais je n'ai pas utilisé cette technique finalement donc je ne peux pas confirmer que ca marche, ni donner un exemple concret :-/

    En ce qui me concerne donc, je récupère le path réel de mon appli web :

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    String v_contextRealPath = this.getServletContext().getRealPath("");

    J'obtiens donc un chemin absolu sur le disque du serveur qui pointe vers le dossier contenant mon appli web (typiquement /usr/local/tomcat/apache-tomcat-5.5.20/webapps/MonAppli pour moi)

    Et dans ce dossier et ses sous dossiers, je peux faire tout ce que je veux, c'est à dire créer des dossiers, en supprimer, en renommer, bref tout ce que je veux faire.

    Voilà !

    Merci à tous pour vos réponses.

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Ingénieur Développeur - Lead Maximo
    Inscrit en
    Décembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur Développeur - Lead Maximo

    Informations forums :
    Inscription : Décembre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut une solution qui pourra t'aider
    Bonjour,
    J'ai eu un problème parait sur windows 7 lors du déploiement de mon application avec tomcat et j'ai pu le résoudre en modifiant les droits d'accès sur le dossier d'installation de tomcat.
    click droit>>propriétés>>sécurité>>modifier
    tu modifies le droit nécessaires à l'utilisateur de tomcat

+ 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