我正在尝试遵循Design Patterns基于Web的应用程序的模式.从maping"root"URL开始,这一切都很好.
我想通过"前端控制器"提出所有请求,所以我放了
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
在web.xml.通过Netbeans逐步显示请求进入,并且Action工作正常,但接着是行
request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)
也被控制器捕获,它再次进入Action,一切都失败了.
我可以通过不从URL根目录来使其工作,例如
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/pages/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的.有没有办法让它与"根"URL一起使用?
该/*URL模式涵盖了一切,还转发的JSP文件和静态资源,如CSS/JS /图像.您不希望在前端控制器servlet上拥有它.
将控制器servlet保持在更具体的URL模式上/pages/*.您可以通过将静态资源分组到一个公共文件夹中来实现删除URL中"/ pages"的功能要求,/resources并创建一个Filter映射到该文件夹并/*在该doFilter()方法中执行以下作业:
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());
if (path.startsWith("/resources/")) {
// Just let container's default servlet do its job.
chain.doFilter(request, response);
} else {
// Delegate to your front controller.
request.getRequestDispatcher("/pages" + path).forward(request, response);
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,转发的JSP资源与此过滤器不匹配,因此容器将自己拾取它JspServlet.
| 归档时间: |
|
| 查看次数: |
8289 次 |
| 最近记录: |