Java JSP / Servlet:控制器servlet抛出着名的堆栈溢出

我已经阅读了几篇文档但我没理解它:我知道我做错了但我不明白。 我有一个完全动态生成的网站:几乎没有任何静态内容。

所以,试图理解JSP / Servlet,我编写了自己的“前端控制器”拦截每一个查询,它看起来像这样:

 defaultservlet /*  

基本上我想要任何用户请求,例如:

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

所有人都通过我写的默认servlet。

然后,servlet检查URI并找到必须分派请求的.jsp ,然后在正确设置所有属性后执行:

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

当我使用url-pattern(在web.xml中 ),例如*.html ,一切正常。 但当我将其更改为/* (以真正拦截所有内容)时,我进入无限循环并最终得到一个… StackOverflow 🙂

调度请求时,URI “… / WEB-INF / jsp / index.jsp”本身是否与我设置的web.xmlfilter/ *相匹配?

EDIT显然不是,因为这是与index.jsp的精确映射,因此它绕过了web.xml url-pattern。 所以我仍然没有得到如何进入无限循环。

如果我想使用/ * url-pattern拦截所有内容并且能够发送/转发/,我该怎么办?

我不是在这里询问规格/ Javadocs:我对大局感到困惑,我需要对可能发生的事情做一些解释。

我不应该拦截真的一切吗?

如果我可以拦截一切,我应该注意哪些转发/调度?

不幸的是,Serlvet规范不允许创建servlet映射以仅匹配传入请求,而不是前向。 但是,这可以用于filter映射(默认情况下,filter映射仅匹配传入请求)。

因此,使用单个servlet拦截所有内容的典型解决方案是使用UrlRewriteFilter :

  urlRewrite org.tuckey.web.filters.urlrewrite.UrlRewriteFilter   urlRewrite /*   application ...   application /app/*  

/WEB-INF/urlrewrite.xml

     /** /app/$1   /app/** /$1   

这种方式还允许您为静态文件的/*映射指定exception。

尝试使用内置前控制器模式的struts。 在那里你将有一个动作类,你可以在struts-config文件中定义前进,使用它可以轻松管理前锋。

浏览http://www.roseindia.net/struts/struts2/index.shtml教程。 希望这对你有所帮助。