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教程。 希望这对你有所帮助。