【发布时间】:2012-02-20 14:03:23
【问题描述】:
我使用 DynamicMappingFilter 配置了 Stripes,因此我可以使用没有“*.action”的 URL。我希望 Stripes 处理我的错误页面。我做了一个简单的error.jsp 页面,我在web.xml 中引用了它来处理404 错误:
<jsp:forward page="/support/Error" />
它正在转发到这个,现在几乎是空的,Stripes 动作:
public class ErrorAction extends BaseAction implements ActionBean {
@DefaultHandler
public Resolution action() {
return new ForwardResolution("/WEB-INF/pages/test.jsp");
}
}
/WEB-INF/pages/test.jsp 是一个纯 HTML Hello World 页面(由 Netbeans 生成)。
但由于某种原因它不起作用。转发到/WEB-INF/pages/test.jsp 后,再次请求ErrorAction,这个循环一直持续到GlassFish 停止为止。
这是被记录的内容(/fasdfasdfasdf 是一个不存在的 URL):
INFO: 14:37:13,646 TRACE StripesFilter:198 - Intercepting request to URL: /fasdfasdfasdf
INFO: 14:37:13,648 DEBUG UrlBindingFactory:187 - No URL binding matches /fasdfasdfasdf
INFO: 14:37:13,648 DEBUG UrlBindingFactory:187 - No URL binding matches /fasdfasdfasdf
INFO: 14:37:13,650 TRACE StripesFilter:198 - Intercepting request to URL: /support/Error
WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context /mycompany-web-seller, because request parameters have already been read, or ServletRequest.getReader() has already been called
INFO: 14:37:13,652 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,653 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,653 TRACE DispatcherServlet:198 - Dispatching request to URL: /support/Error
INFO: 14:37:13,654 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage RequestInit
INFO: 14:37:13,654 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage ActionBeanResolution
INFO: 14:37:13,654 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,655 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,656 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage HandlerResolution
INFO: 14:37:13,656 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,657 DEBUG DispatcherHelper:187 - Resolved event: action; will invoke: ErrorAction.action()
INFO: 14:37:13,657 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage BindingAndValidation
INFO: 14:37:13,658 DEBUG DefaultActionBeanPropertyBinder:187 - Running required field validation on bean class com.mycompany.stripes.support.ErrorAction
INFO: 14:37:13,658 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage CustomValidation
INFO: 14:37:13,659 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage EventHandling
INFO: 14:37:13,659 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage ResolutionExecution
INFO: 14:37:13,660 DEBUG HttpCacheInterceptor:187 - Looking for HttpCache on com.mycompany.stripes.support.ErrorAction.action()
INFO: 14:37:13,660 DEBUG UrlBindingFactory:187 - No URL binding matches /WEB-INF/pages/test.jsp
INFO: 14:37:13,661 DEBUG UrlBindingFactory:187 - No URL binding matches /WEB-INF/pages/test.jsp
INFO: 14:37:13,662 TRACE ForwardResolution:198 - Forwarding to URL: /WEB-INF/pages/test.jsp
INFO: 14:37:13,667 TRACE StripesFilter:198 - Intercepting request to URL: /support/Error
INFO: 14:37:13,668 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,669 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,670 TRACE DispatcherServlet:198 - Dispatching request to URL: /support/Error
INFO: 14:37:13,670 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage RequestInit
INFO: 14:37:13,671 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage ActionBeanResolution
INFO: 14:37:13,671 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,672 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,673 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage HandlerResolution
INFO: 14:37:13,673 DEBUG UrlBindingFactory:187 - Matched /support/Error to /support/Error
INFO: 14:37:13,674 DEBUG DispatcherHelper:187 - Resolved event: action; will invoke: ErrorAction.action()
INFO: 14:37:13,675 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage BindingAndValidation
INFO: 14:37:13,675 DEBUG DefaultActionBeanPropertyBinder:187 - Running required field validation on bean class com.mycompany.stripes.support.ErrorAction
INFO: 14:37:13,676 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage CustomValidation
INFO: 14:37:13,676 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage EventHandling
INFO: 14:37:13,677 DEBUG ExecutionContext:187 - Transitioning to lifecycle stage ResolutionExecution
INFO: 14:37:13,677 DEBUG HttpCacheInterceptor:187 - Looking for HttpCache on com.mycompany.stripes.support.ErrorAction.action()
INFO: 14:37:13,678 DEBUG UrlBindingFactory:187 - No URL binding matches /WEB-INF/pages/test.jsp
INFO: 14:37:13,679 DEBUG UrlBindingFactory:187 - No URL binding matches /WEB-INF/pages/test.jsp
INFO: 14:37:13,679 TRACE ForwardResolution:198 - Forwarding to URL: /WEB-INF/pages/test.jsp
... and again the same
例外是:
WARNING: ApplicationDispatcher[/mycompany-web-seller] PWC1231: Servlet.service() for servlet default threw exception
javax.servlet.ServletException: PWC1232: Exceeded maximum depth for nested request dispatches: 20
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:772)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
at net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
at net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
at net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502)
at net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286)
at net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at net.sourceforge.stripes.controller.DynamicMappingFilter$2.doFilter(DynamicMappingFilter.java:431)
at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247)
at net.sourceforge.stripes.controller.DynamicMappingFilter.doFilter(DynamicMappingFilter.java:418)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:785)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:785)
at org.apache.jsp.error_jsp._jspService(error_jsp.java:48)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at net.sourceforge.stripes.controller.DynamicMappingFilter.doFilter(DynamicMappingFilter.java:397)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:785)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
at org.apache.catalina.core.ApplicationDispatcherForward.custom(ApplicationDispatcherForward.java:253)
at org.apache.catalina.core.ApplicationDispatcherForward.status(ApplicationDispatcherForward.java:209)
at org.apache.catalina.core.ApplicationDispatcherForward.commit(ApplicationDispatcherForward.java:131)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:353)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
at net.sourceforge.stripes.action.ForwardResolution.execute(ForwardResolution.java:110)
at net.sourceforge.stripes.controller.DispatcherHelper$7.intercept(DispatcherHelper.java:508)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:158)
at net.sourceforge.stripes.controller.HttpCacheInterceptor.intercept(HttpCacheInterceptor.java:99)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:113)
at net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
at net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
at net.sourceforge.stripes.controller.DispatcherHelper.executeResolution(DispatcherHelper.java:502)
at net.sourceforge.stripes.controller.DispatcherServlet.executeResolution(DispatcherServlet.java:286)
at net.sourceforge.stripes.controller.DispatcherServlet.service(DispatcherServlet.java:170)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at net.sourceforge.stripes.controller.DynamicMappingFilter$2.doFilter(DynamicMappingFilter.java:431)
at net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:247)
at net.sourceforge.stripes.controller.DynamicMappingFilter.doFilter(DynamicMappingFilter.java:418)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:785)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:785)
at org.apache.jsp.error_jsp._jspService(error_jsp.java:48)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at net.sourceforge.stripes.controller.DynamicMappingFilter.doFilter(DynamicMappingFilter.java:397)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:785)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:485)
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
at org.apache.catalina.core.ApplicationDispatcherForward.custom(ApplicationDispatcherForward.java:253)
at org.apache.catalina.core.ApplicationDispatcherForward.status(ApplicationDispatcherForward.java:209)
at org.apache.catalina.core.ApplicationDispatcherForward.commit(ApplicationDispatcherForward.java:131)
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:353)
... and again the same
这是在调试器中跟踪时请求的执行方式(仅认为重要的部分:
-> /badurl
-> DynamicMappingFilter
-> chain.doFilter
<- 404
* no Stripes ActionBean found for /badurl
<-
-> error.jsp
-> DynamicMappingFilter
-> chain.doFilter
-> error.jsp
-> /support/Error
-> DynamicMappingFilter
-> chain.doFilter
<- 404
* ErrorAction found
-> stripesDispatcher.service
-> ForwardResolution.execute (/WEB-INF/pages/test.jsp)
-> DynamicMappingFilter
-> chain.doFilter
-> /WEB-INF/pages/test.jsp
<-
<- OK
<-
? it does not return to ForwardResolution.execute
-> DynamicMappingFilter
-> chain.doFilter
-> error.jsp
and the loop starts again
有谁知道为什么转发到test.jsp 后会有/error.jsp 的请求?请求/error.jsp、/support/Error 按预期工作 - 呈现/WEB-INF/pages/test.jsp 并完成请求。
编辑:如果error.jsp 直接转发到/WEB-INF/pages/test,则不会有任何循环。它只是在它发生时通过 Stripes 动作。
【问题讨论】:
标签: jsp jakarta-ee stripes