2010-09-07 5 views
0

Cela devrait être relativement simple à faire mais je n'ai pas encore trouvé de description de la façon de le faire.Interprétation de la requête au format JSP au lieu du servlet

Ma configuration est simple application web qui traite chaque demande par l'intermédiaire d'un servlet (je vais l'appeler MyEverythingServlet pour cette question). Voici une version légèrement modifiée de mon web.xml:

<servlet> 
    <servlet-name>MyEverythingServlet</servlet-name> 
    <servlet-class>blah.blah.blah.MyEverythingServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>MyEverythingServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

En ce moment, le servlet est assez simple et soit fait un travail (quand work.do fait partie du chemin) et si un fichier txt est spécifié dans le chemin, nous ferons une validation puis charger le fichier et d'envoyer le texte de la réponse:

response.getOutputStream().print(content); 

Ce que je voudrais faire est soit:

  • A l'intérieur du servlet, si la requête est une URL vers un fichier .jsp, j'aimerais être capable d'avoir le conteneur interpréter les parties de scriptlet JSP parties/taglib avant d'écrire la chaîne à la réponse.
  • Modifiez mon fichier web.xml pour qu'il traite les fichiers .jsp en dehors de MyEverythingServlet.

Répondre

4
  • A l'intérieur du servlet, si la demande est une URL à un fichier .jsp, je voudrais être en mesure d'avoir le récipient interpréter les choses parties scriptlet JSP/taglib avant d'écrire la chaîne à la réponse.

Il n'y a pas API directe disponible qui traite les fichiers JSP programme comme ça. En théorie, vous souhaitez avoir la JSP dans le contenu Web public et transmettre la demande à la JSP. Vous pouvez le faire avec RequestDispatcher#forward().

if (request.getServletPath().endsWith(".jsp")) { 
    request.getRequestDispatcher(request.getServletPath()).forward(request, response); 
} else { 
    // Write "plain" to response as you did. 
} 

Vous ne pouvez vouloir faire des vérifications sur l'exactitude des chemins, mais cela devrait au moins vous donner l'idée générique. Il y a cependant un petit problème: le servlet sera invoqué récursivement puisqu'il est mappé sur /*. Vous préférez remplacer ce MyEverythingServlet par un Filter qui délègue simplement le reste du travail à la servlet par défaut intégrée du serveur d'applications. Avoir un Servlet à écouter sur /* est déjà une indication de l'odeur de conception qui aurait dû être un Filter dès le départ sur;)

  • Changer mon web.xml pour avoir traiter .jsp des fichiers en dehors de MyEverythingServlet .

Vous ne pouvez pas avoir un "négatif" dans url-patternweb.xml. Le meilleur que vous pouvez faire est de laisser le servlet écouter sur un url-pattern plus spécifique comme *.txt ou /static/* et garder les fichiers JSP là dehors.

+0

suggérez-vous que j'utiliser le filtre et le filtre-mapping au lieu de servlet-mapping dans mon fichier web.xml? Ensuite, le filtre chercherait * .jsp et ne ferait rien pour ces requêtes (chain.doFilter())? Comment le filtre envoie-t-il des demandes non-JSP à MyEverythingServlet? –

+0

Vous pouvez également le faire (uniquement si ces fichiers non-JSP sont en dehors du contenu web public et que vous êtes obligé d'utiliser 'FileInputStream' ou ainsi de les lire). Vous devez ensuite mapper le servlet sur un 'modèle-url' plus spécifique et envoyer la requête en utilisant une URL correspondant à ce modèle (je vais à mon tour remettre en question la valeur du filtre ..;)). Mais si ces fichiers sont dans un contenu Web public, il suffit de continuer la chaîne de filtres. Le servlet par défaut intégré du servletcontainer servira le fichier non-JSP pour vous. – BalusC

+0

Ok, je pense que le seul élément qui me manque est comment le filtre transmettra la requête sur MyEverythingServlet. –

Questions connexes