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

Servlets/JSP Java Discussion :

[Servlet/ActionServlet] Accès aux fichiers


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut [Servlet/ActionServlet] Accès aux fichiers
    Bonjour à tous,

    J'ai une appli utilisant Struts contenant des servlets et des actions. Mon problème se situe au niveau de l'accès des fichiers. En effet j'ai un fichier xml qui se situe sous WEB-INF/conf auquel j'aimerais accéder pour la parser (SAX). Mais voici le problème :
    Lorsque je tente d'y accéder par ma servlet d'init (je lui passe le nom du fichier par un init parameter du web.xml ) je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <param-name>configFilePath</param-name>
    <param-value>siteconfig.xml</param-value>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String configFilePath = servletConfig.getInitParameter("configFilePath");
    URL fileUrl = InitServlet.class.getResource(configFilePath);
    Le problème de cette méthode est que le fichier doit se trouver dans le même répertoire que mon fichier InitServlet.class (cette méthode prend en compte le nom du package pour récup la ressource).

    J'ai ensuite essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <param-name>configFilePath</param-name>
    <param-value>WEB-INF/conf/siteconfig.xml</param-value>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String configFilePath = servletConfig.getInitParameter("configFilePath");
    URL fileUrl = new File(configFilePath).toURL();
    Mais là il concatène le path de mon tomcat au lieu de concaténer le path de mon appli. Ce qui me donne ce chemin :
    /home/bibi/tomcat/WEB-INF/conf/siteconfig.xml
    au lieu de
    /home/bibi/tomcat/webapps/monApp/ROOT/WEB-INF/conf/siteconfig.xml

    Je pense que cette 2ème solution est un bon point de départ pour récupérer le chemin de mon fichier mais il me manque quelque chose je pense (sachant que le but est de ne rien mettre en dur au niveau du path, si ce n'est le chmin du fichier à l'intérieur de l'appli).

    J'espère avoir été clair, je surveille le thread pour répondre au + vite

    D'avance merci.

  2. #2
    Membre chevronné Avatar de florentB
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2006
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2006
    Messages : 332
    Par défaut
    salut.

    Tu peux récupérer ton fichier sous forme de stream :
    request.getSession().getServletContext().getResourceAsStream("tonFichier");

    Pour le paramètre, je ne sais plus quel chemin passer, mais il me semble que c'est du style "/WEB-INF/..." mais je n'en mettrais pas ma main à couper.

    Si du doit réaliser des opérations sur ton xml ensuite, tu peux réaliser les opérations à partir d'un stream, normalement ca ne pose pas de pb.

  3. #3
    Membre averti
    Inscrit en
    Février 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 29
    Par défaut
    Merci de ta réponse je teste ca dès que possible

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    salut,
    pour résoudre ce pb de recherche d'un fichier dans une appli, j'ai fait cette class utilitaire qui calcule le chemin absolu d'un fichier en regardant dans le répertoire de la webapp..., puis dans le classpath...

    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
    public class ServletTools {
        private static Logger logger = Logger.getLogger(ServletTools.class);
     
        private ServletTools() {
     
        }
     
        /**
         * Search the absolutepath of a path with this algorithm : 1) if the path
         * starts with '/', looking in the webapp's path root 2) if not found,
         * looking in the classpath 3) if the path doesn't start with '/', returns
         * path. If the path doesn't exist or there is an exception,
         * <code>null</code> is returned
         * 
         * @param servlet
         *            The servlet where we can find the path
         * @param path
         *            The path to find
         * @return The absolutepath of the path or <code>null</code> if the path
         *         doesn't exist
         */
        public static String pathToAbsolutePath(HttpServlet servlet, String path) {
            String absolutePath = null;
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
     
            if (loader == null) {
                loader = servlet.getClass().getClassLoader();
            }
     
            try {
                // Process each specified resource path
                if (path.charAt(0) == '/') {
                    URL resource = null;
                    // Is the path in the webapp's path root?
                    resource = servlet.getServletContext().getResource(path);
                    if (resource == null) {
                        // Is the path in the classpath?
                        resource = loader.getResource(path);
                    }
                    absolutePath = urlToString(resource, path, servlet);
                } else {
                    absolutePath = path;
                }
            } catch (MalformedURLException e) {
                logger.error(ExceptionTools.toString(e));
                absolutePath = null;
            } catch (UnsupportedEncodingException e) {
                logger.error(ExceptionTools.toString(e));
                absolutePath = null;
            }
            return absolutePath;
        }
     
        private static String urlToString(URL url, String path, HttpServlet servlet)
                throws UnsupportedEncodingException {
            final String TYPE_FILE = "file:/";
            final String TYPE_JNDI = "jndi:/";
     
            String string = null;
            if (url != null) {
                String externalForm = url.toExternalForm();
                if (externalForm.startsWith(TYPE_FILE)) {
                    string = externalForm.substring(TYPE_FILE.length());
                    string = URLDecoder.decode(string, "UTF-8");
                }
                if (externalForm.startsWith(TYPE_JNDI)) {
                    string = servlet.getServletContext().getRealPath(path);
                }
            }
            return string;
        }
    }
    Exemple d'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <param-name>configFilePath</param-name>
    <param-value>/WEB-INF/siteconfig.xml</param-value>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String configFilePath = servletConfig.getInitParameter("configFilePath");
    URL fileURL = new File(ServletTools.pathToAbsolutePath(servletConfig, configFilePath)).toURL();
    où servletConfig est une HttpServlet.



    La class ExceptionTools permet de mettre un Stacktrace dans une String (trouvé dans le forum):
    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
     
    import java.io.PrintWriter;
    import java.io.StringWriter;
     
    public class ExceptionTools {
        /**
         * Constructeur privé
         */
        private ExceptionTools() {
     
        }
     
        /**
         * Retourne la stacktrace de l'exception
         * 
         * @param e
         *            Exception
         * @return Stacktrace de l'exception
         */
        static public String toString(Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            if (e != null) {
                e.printStackTrace(pw);
            }
            return sw.toString();
        }
    }

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2006, 17h35
  2. [Applet] Accès aux fichiers
    Par alabakan dans le forum Applets
    Réponses: 2
    Dernier message: 21/10/2005, 09h33
  3. [Upload] Date de dernier accès aux fichiers...
    Par John@EuroDevz dans le forum Langage
    Réponses: 10
    Dernier message: 08/04/2005, 10h57
  4. [Tomcat]Droit d'accès aux fichiers créés par une servlet
    Par loulouleboss dans le forum Tomcat et TomEE
    Réponses: 7
    Dernier message: 15/07/2004, 14h32
  5. [Réseau] Autorisations d'accès aux fichiers
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 19/05/2004, 13h43

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