D'où vient getRequestDispatcher(“chemin”)?
Utilisant tomcat intégré, ce code:
System.out.println("getServletPath: " + request.getServletPath());
System.out.println("getServletContext: " + request.getServletContext().getContextPath());
System.out.println("getServerName: " + request.getServerName());
System.out.println("getServerPort: " + request.getServerPort());
Imprime:
getServletPath: /example
getServletContext:
getServerName: localhost
getServerPort: 9090
Est-ce à dire que:
request.getRequestDispatcher("/example/read.jsp").forward(request, response);
Va regarder cette URL forward(request, response)
de la JSP:
http://localhost:9090/example/read.jsp
?
Est-il un moyen d'imprimer ce absolue URL getRequestDispatcher("relativePath")
fait-il face?
OriginalL'auteur ThreaT | 2014-04-10
Vous devez vous connecter pour publier un commentaire.
La Spécification Servlet explique cette
Ces règles sont les suivantes
Vous demandez
Non, il n'est pas d'envoyer une requête HTTP, de sorte que le chemin n'a rien à voir avec une URI. C'est plus un chemin interne que le conteneur de Servlet va essayer de faire correspondre avec ses différentes url mappages pour les Servlets.
Vous aussi demander
Pas. Et ce n'est pas exactement une URL absolue. C'est un chemin qui peut être gérée par une ressource dans le contexte d'application web.
Après votre modification, vous
addWebapp
à votreTomcat
instance.Vous envoyer une demande de
Je vais supposer que
read.jsp
est dansJe crois que c'est dans la mise à disposition du public une partie de l'application web et, par conséquent, le conteneur de Servlet peut le rendre et d'y répondre avec elle.
Vous ai aussi ajouté une webapp avec
addContext
qui semble être similaire àaddWebapp
et a ajouté servlet mappages de ce contexte.
Je me suis trompé sur le
/example/*
de ne pas être en mesure de gérer/example
.Lorsque vous envoyez une demande à
depuis le chemin de contexte est "", le
Context
ci-dessus seront utilisés et la cartographie correspondre à laExampleController
inscrits ci-dessus. VotreServlet
code s'exécute et atteindreNote la javadoc de
ServletRequest#getRequestDispatcher(String)
En d'autres termes, ce
Servlet
,ExampleController
a été enregistré dans laServletContext
mappé pour le chemin de contexte""
, c'est à dire. de la racine. Le chemin/view2/example2/read.jsp
est en se référant à un autre contexte. Depuis ce contexte n'a pas de mappage, il répond avec 404.Vous pouvez obtenir une référence à un autre applications web dans un contexte différent. Vous devez utiliser
ServletContext#getContext(String)
. Par exempleMaintenant que vous avez la
ServletContext
, vous pouvez obtenir unRequestDispatcher
pour une ressource dans que contexte.depuis
ServletContext#getRequestDispatcher(String)
étatsRéponse Finale:
getRequestDispatcher("path")
va chercher dans le répertoire défini dans leaddWebapp
méthode lorsque le référencement d'un fichier JSP. Si une page vierge ouNullPointerException
s'affiche, vérifiez que vous avez effectué les opérations suivantes:addWebapp
définitions.addContext
puisaddWebApp
comme cela, afin qu'ils pointent versROOT
:File base = new File("src/com/example/view");
context = tomcat.addContext("", base.getAbsolutePath());
tomcat.addWebapp(null, "/", base.getAbsolutePath());
request.getRequestDispatcher("/example/read.jsp").forward(request, response);
à condition que le répertoire /exemple existe dans"src/com/example/view"
./example
le chemin de contexte de votre application?Si vous ouvrez votre navigateur réseau de la console, ce qui est inclus dans la réponse pour frapper juste
<wtv>/example
qu'une URL?Quoi d'autre? Qu'est-ce que le code de réponse? Quels sont les en-têtes? Le contenu? Vous pouvez les modifier à votre question?
Il y a quelques choses entre cette image et votre question qui ne correspondent pas. Dans votre image, vos servlet est mappé à
/example/*
, une demande de/example
serait géré par la Servlet. Quelque chose comme/example/blabla
serait. Voir point 2 dans ma réponse:This is done by stepping down the path tree a directory at a time, using the ’/’ character as a path separator.
Dans votre code, vous êtes actuellement à l'ajout de 4 applications web avec des contextes différents: l'un avec
addContext
et 3 autres avecaddWebapp
. Juste ajouternew File("src/com/example/view/example
comme lebaseDir
pour la premièreContext
. Rappelez-vous queaddWebapp
renvoie uneContext
objet.OriginalL'auteur Sotirios Delimanolis