Les meilleures pratiques pour stocker et accéder à des fichiers de ressources dans les applications web java
J'ai un tas de texte, xml et d'autres fichiers (c'est à dire des ressources) que j'ai besoin d'accéder à l'aide de servlets java web app. Par exemple, il y a un fichier xml, une partie de ce qui est retourné avec une servlet par une requête de l'utilisateur. J'utilise Tomcat. Quelle est la meilleure pratique pour stocker ces fichiers et y accéder à partir du code java?
1) Quels sont les dossiers par défaut où dois-je les mettre, j'ai besoin de les mettre en archive Web ou dans l'un des Bocaux?
2) Comment accéder à ces fichiers à partir du code java? Comment puis-je définir le chemin d'accès afin qu'il fonctionne dans n'importe quel environnement?
P. S. j'ai lu un certain nombre de postes liées à ce sujet, dont la plupart vous recommandons de stocker les ressources dans des bocaux et d'y accéder à l'aide de java.lang.Classe.getResourceAsStream(Chaîne de caractères). Il semble étrange parce que les classes et les données doivent être séparées.
OriginalL'auteur Alexander | 2012-12-22
Vous devez vous connecter pour publier un commentaire.
Il est parfaitement bien de charger les ressources statiques en utilisant le chargeur de classe. C'est ce que ResourceBundle n'est à la charge de l'internationalisation des propriétés des fichiers par exemple.
Les mettre dans
WEB-INF/classes
avec vos fichiers de classe, ou dans un bocal à l'intérieur deWEB-INF/lib
, et de les charger avec le chargeur de classe, comme indiqué par les réponses que vous avez déjà lu.Qui ne vous interdit pas de vous placer ces fichiers dans un répertoire séparé de la source de Java fichiers dans votre projet. Le processus de construction devrait assurez-vous juste de les mettre dans l'emplacement approprié pour l'exécution. Le Maven et Gradle convention est de mettre les fichiers de la source sous
src/main/java
et les fichiers de ressources en vertu desrc/main/resources
.Ressources dans WEB-INF ne sont pas accessibles de l'extérieur, de sorte qu'il n'est pas possible de charger un fichier JS dans WEB-INF à partir du navigateur. Vous pouvez utiliser ServletContext.getResourceAsStream() pour charger les ressources de n'importe où dans la webapp (y compris WEB-INF), mais qui force le chargement de la classe à avoir accès à la ServletContext. Je ne comprends pas ta deuxième question. C'est une ressource statique. Pourquoi ne pas coder en dur le chemin d'accès dans certains constante?
On a besoin d'une instance de servlet pour getContext et ensuite d'obtenir des ressources ou un chemin d'accès au dossier. Est-il un moyen de le faire en statique sans instanciation de quoi que ce soit? Ma deuxième question est liée à l'endroit où je devrais stocker ces constantes. Est-il une place dans certains web-ressources connexes tels que web.xml (au lieu d'avoir une constante dans l'un de le code source de la classe)?
Vous pouvez ajouter un filtre permettant de stocker la requête en cours dans un ThreadLocal, et d'utiliser cette ThreadLocal dans le code pour obtenir l'accès à la demande, et puis le contexte de servlet. Mais je woul suffit d'utiliser le chargeur de classe. Qu'aimeriez-vous gagner par l'extériorisation le chemin d'accès au lieu d'utiliser une constante? Vous disposez de deux possibilités pour un bug: placer le fichier au mauvais endroit, ou la définition d'une mauvaise valeur de pas de valeur du tout dans la web.xml. Si vous voulez vraiment le faire, puis d'utiliser un context-param (ce qui nécessite le servletcontext), ou un env-entrée (que vous pouvez recherche en utilisant JNDI ou obtenir injecté en tant que ressource)
OriginalL'auteur JB Nizet