2010-06-01 3 views
4

J'ai lu plusieurs docs et je ne comprends pas: je sais que je fais quelque chose de mal mais je ne comprends pas quoi. J'ai un site entièrement généré dynamiquement: il n'y a pratiquement pas de contenu statique.Java JSP/Servlet: servlet du contrôleur jetant le fameux débordement de pile

Donc, essayer de comprendre JSP/Servlet, j'ai écrit mon propre « contrôleur avant » intercepter chaque requête, il ressemble à ceci:

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

Fondamentalement, je veux une demande de l'utilisateur, comme:

  • example.org
  • example.org/bar
  • example.org/foo.html

pour passer par une servlet par défaut que j'ai écrite.

Le servlet examine ensuite l'URI et trouver auquel .jsp la demande doit être envoyée, et fait ensuite, après avoir réglé tous les attributs correctement, un:

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/index.jsp"); 
dispatcher.forward(req, resp); 

Lorsque j'utilise un motif d'URL (dans web.xml) comme, disons, *.html, tout fonctionne bien. Mais quand je le change en /* (pour vraiment tout intercepter), j'entre dans une boucle sans fin et il finit avec ... StackOverflow :)

Lorsque la demande est envoyée, est l'URI ".../WEB-INF/jsp/index.jsp " lui-même apparié par le web.xml filtre/* que j'ai défini?

EDIT apparemment, non, parce que c'est une application exacte index.jsp et, par conséquent, il contourne l'url motif web.xml. Donc, je ne comprends toujours pas comment je peux entrer dans cette boucle sans fin.

Comment dois-je faire si je veux tout intercepter en utilisant un/* url-pattern et être capable d'envoyer/transférer /?

Je ne pose pas de questions sur les spécifications/Javadocs ici: je suis vraiment confus au sujet de la situation dans son ensemble et j'ai besoin d'explications sur ce qui pourrait se passer. Est-ce que je ne suis pas supposé intercepter vraiment tout?

Si je peux tout intercepter, que dois-je savoir en ce qui concerne l'expédition/l'expédition?

+0

connexes: http://stackoverflow.com/questions/1069442/requestdispatcher-forward-loop – leonbloy

+0

@leonbloy: oh dang merci ... je vois. De BalusC 'réponse apparemment ce n'est pas une bonne idée d'utiliser "/ *" pour le mappage de servlet :( – NoozNooz42

+0

s'il vous plaît vider le code complet de trace de la pile/classe ici – techzen

Répondre

4

Malheureusement, la spécification Serlvet ne permet pas de créer un mappage de servlet pour correspondre uniquement à une requête entrante, pas à une forward. Cependant, cela peut être fait pour les mappages de filtres (et par défaut les mappages de filtres correspondent uniquement aux requêtes entrantes).

Ainsi, la solution typique pour intercepter tout avec un seul servlet est d'utiliser un UrlRewriteFilter:

<filter> 
    <filter-name>urlRewrite</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>urlRewrite</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<servlet> 
    <servlet-name>application</servlet-name> 
    <servlet-class>...</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>application</servlet-name> 
    <url-pattern>/app/*</url-pattern> 
</servlet-mapping> 

/WEB-INF/urlrewrite.xml:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE urlrewrite 
    PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" 
    "http://tuckey.org/res/dtds/urlrewrite3.0.dtd"> 

<urlrewrite default-match-type="wildcard"> 
    <rule> 
     <from>/**</from> 
     <to>/app/$1</to> 
    </rule> 
    <outbound-rule> 
     <from>/app/**</from> 
     <to>/$1</to> 
    </outbound-rule>  
</urlrewrite> 

De cette façon, vous permet également de spécifier des exceptions de /* mapping pour fichiers statiques

0

Essayez d'utiliser des entretoises dans lesquelles un motif de contrôleur frontal est incorporé. Là, vous aurez une classe d'action et vous pouvez définir des avants dans le fichier struts-config en utilisant lequel vous pouvez facilement gérer les avants. Suivez le tutoriel http://www.roseindia.net/struts/struts2/index.shtml J'espère que cela vous aide.

+2

Je ne suis pas à la recherche d'un framework, j'essaie d'apprendre JSP/Servlet comme je l'ai dit dans ma question, et j'ai l'impression que Struts est un peu comme la technologie du siècle dernier et que les gens partent de rien investir dans des cadres comme Spring MVC etc . :) – NoozNooz42

+0

Essayez d'utiliser *. * (sans espaces) dans votre modèle d'URL. –

+1

En outre, roseindia.net est une source [horrible] (http://balusc.blogspot.com/2008/06/what-is-it-with-roseindia.html). Il enseigne seulement de mauvaises pratiques. N'utilisez pas ce site comme source d'apprentissage. – BalusC

Questions connexes