2 votes

ServletRequest.getRequestDispatcher() pour les fichiers/ressources qui n'existent pas

Actuellement, je me prépare pour l'examen de développeur de composants web Java EE.

Dans le guide d'étude de l'examen et la documentation Java Servlet API, j'ai trouvé que la méthode

ServletRequest.getRequestDispatcher()

retourne

null si le conteneur de servlet ne peut pas renvoyer de RequestDispatcher.

Lorsque j'ai essayé avec un fichier statique inexistant, j'ai en fait obtenu une valeur non nulle. Et la redirection a entraîné l'envoi d'une erreur 404 au client. Même effet pour un servlet inexistant. J'utilise Apache Tomcat 7.0.

Cela signifie-t-il que ce comportement n'est pas défini et est laissé au choix de l'implémenteur ? Que veulent dire les auteurs de la documentation Java par "le conteneur de servlet ne peut pas renvoyer de RequestDispatcher" ? J'ai essayé de trouver une réponse dans la spécification JSR mais je n'ai pas pu trouver de réponse.

2voto

Perception Points 42290

Ceci est ce que la spécification Servlet 3.0 a à dire sur le comportement du dispatcher :

La méthode getRequestDispatcher prend un argument de type String décrivant un chemin à l'intérieur de la portée du ServletContext. Ce chemin doit être relatif à la racine du ServletContext et commencer par un '/', ou être vide. La méthode utilise le chemin pour rechercher un servlet, en utilisant les règles de correspondance du chemin du servlet dans le chapitre 12, "Mapping des requêtes aux servlets", l'enveloppe avec un objet RequestDispatcher, et retourne l'objet résultant. Si aucun servlet ne peut être résolu en fonction du chemin donné, un RequestDispatcher est fourni qui renvoie le contenu pour ce chemin.

Nulle part il ne mentionne le renvoi de null si un servlet correspondant ne peut être trouvé pour le chemin de dispatch. Au lieu de cela, il indique que le 'contenu' trouvé au chemin de dispatch sera retourné, ce que je traduis comme signifiant qu'une implémentation peut simplement permettre au conteneur de résoudre complètement le chemin (ce qui dans votre scénario conduit à un 404).

En ce qui concerne la Javadoc cependant, il semble documenté avec le cas d'utilisation le plus large possible, c'est-à-dire que si le conteneur ne peut pas créer de dispatcher pour une raison quelconque, il renverra un objet null (au lieu de lever une exception). Cela peut être dû à un problème technique dans l'implémentation, ou peut être en fait valide (par exemple, les implémentations JAX-RS peuvent accéder à certains niveaux de l'infrastructure Servlet, mais ne peuvent pas utiliser le contexte de servlet ou le dispatcher).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X