web-dev-qa-db-fra.com

Que signifie servletcontext.getRealPath ("/") et quand dois-je l'utiliser?

Dans l'extrait suivant:

ServletContext context = request.getServletContext();
String path = context.getRealPath("/");

Que représente / dans la méthode getRealPath()? Quand devrais-je l'utiliser?

55
saplingPro

Introduction

La ServletContext#getRealPath() est destinée à convertir un chemin de contenu Web (le chemin dans la structure de dossiers WAR étendue sur le système de fichiers du serveur) en un chemin de système de fichiers absolu.

Le "/" représente la racine du contenu Web. C'est à dire. il représente le dossier web comme dans la structure de projet ci-dessous:

YourWebProject
 |-- src
 |    :
 |
 |-- web
 |    |-- META-INF
 |    |    `-- MANIFEST.MF
 |    |-- WEB-INF
 |    |    `-- web.xml
 |    |-- index.jsp
 |    `-- login.jsp
 :    

Ainsi, passer le "/" à getRealPath() vous renverrait le chemin du système de fichiers du disque absolu du dossier /web du fichier WAR développé du projet. Quelque chose comme /path/to/server/work/folder/some.war/ que vous devriez pouvoir utiliser dans File ou FileInputStream.

Notez que la plupart des débutants ne semblent pas voir/réaliser que vous pouvez réellement leur transmettre le chemin de contenu Web complet et qu’ils utilisent souvent

String absolutePathToIndexJSP = servletContext.getRealPath("/") + "index.jsp";

au lieu de

String absolutePathToIndexJSP = servletContext.getRealPath("/index.jsp");

Ne jamais écrire des fichiers là-bas

Notez également que même si vous pouvez y écrire de nouveaux fichiers à l'aide de FileOutputStream, toutes les modifications (par exemple, nouveaux fichiers ou fichiers modifiés) seront perdues chaque fois que le fichier WAR sera redéployé; avec la simple raison que toutes ces modifications ne sont pas contenues dans le fichier WAR original. Ainsi, tous les démarreurs qui tentent de sauvegarder des fichiers téléchargés le font mal. 

De plus, getRealPath() renverra toujours null ou un chemin complètement inattendu lorsque le serveur n'est pas configuré pour développer le fichier WAR dans le système de fichiers sur disque, mais plutôt dans, par exemple. mémoire en tant que système de fichiers virtuel. 

getRealPath() est inutilisable; tu ferais mieux de ne jamais l'utiliser

Utilisez getRealPath() avec précaution. Il n'y a actuellement aucun cas d'utilisation sensible dans le monde réel. Si tout ce dont vous avez besoin est d'obtenir une InputStream de la ressource Web, mieux vaut utiliser ServletContext#getResourceAsStream() , cela fonctionnera quelle que soit la façon dont le fichier WAR est développé. Donc, si vous voulez par exemple une InputStream de index.jsp, alors faites pas do:

InputStream input = new FileInputStream(servletContext.getRealPath("/index.jsp")); // Wrong!

Mais au lieu de faire:

InputStream input = servletContext.getResourceAsStream("/index.jsp"); // Right!

Ou, si vous souhaitez obtenir une liste de tous les chemins de ressource Web disponibles, utilisez plutôt ServletContext#getResourcePaths() .

Set<String> resourcePaths = servletContext.getResourcePaths("/");

Vous pouvez obtenir une ressource individuelle sous la forme URL via ServletContext#getResource() . Cela renverra null lorsque la ressource n'existe pas.

URL resource = servletContext.getResource(path);

Ou si vous avez l'intention de sauvegarder un fichier téléchargé ou de créer un fichier temporaire, consultez les liens "Voir aussi" ci-dessous.

Voir également:

98
BalusC

Le chemin de contexte d'une application Web est le répertoire qui contient le répertoire WEB-INF de l'application Web. Cela peut être considéré comme la "maison" de l'application Web. Souvent, lors de l'écriture d'applications Web, il peut être important de connaître l'emplacement réel de ce répertoire dans le système de fichiers, car cela vous permet d'effectuer des opérations telles que la lecture de fichiers ou l'écriture de fichiers.

Cet emplacement peut être obtenu via la méthode getRealPath () de l'objet ServletContext. Cette méthode peut recevoir un paramètre String défini sur File.separator pour obtenir le chemin à l'aide du séparateur de fichiers du système d'exploitation ("/" pour UNIX, "\" pour Windows). 

3
Sathish

Il y a aussi un changement entre Java 7 et Java 8. Certes, il s'agit d'un appel obsolète, mais je devais ajouter un "/" pour que notre programme fonctionne! Voici le lien qui en discute Pourquoi servletContext.getRealPath renvoie-t-il la valeur null sur Tomcat 8?

2
user96265

Ma méthode: 

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    try {
        String path = request.getRealPath("/WEB-INF/conf.properties");
        Properties p = new Properties();
        p.load(new FileInputStream(path));

        String StringConexion=p.getProperty("StringConexion");
        String User=p.getProperty("User");
        String Password=p.getProperty("Password");
    }
    catch(Exception e){
        String msg = "Excepcion " + e;
    }
}
0
Julio Azocar