我正在尝试遵循基于Design PatternsWeb的应用程序中的模式。从映射“根” URL而言,这一切都很好。
我想通过“ Front Controller”发送所有请求,所以我已经把
<servlet-mapping> <servlet-name>ControllerServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
在web.xml。逐步执行Netbeans将显示请求进入,并且Action运行正常,但随后一行
web.xml
request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
ALSO也被控制器捕获,再次进入操作,所有操作均失败。
我可以通过不从URL根目录开始工作,例如
<servlet-mapping> <servlet-name>ControllerServlet</servlet-name> <url-pattern>/pages/*</url-pattern> </servlet-mapping>
但这不是我想要的。有什么方法可以使其与“根” URL一起使用?
该/*URL模式涵盖 一切,还转发的JSP文件和类似CSS/JS/图像静态资源。您不想在前端控制器servlet上使用它。
/*
将您的控制器Servlet保持在更具体的URL模式上,例如/pages/*。您可以通过将静态资源分组到一个常见的文件夹(例如/resources创建一个Filter映射到该文件夹中并/*在该doFilter()方法中执行以下工作)中的静态资源,来达到消除URL中“/ pages”的功能要求:
/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); }
默认情况下,转发的JSP资源将不匹配此过滤器,因此它将由容器自己正确地拾取JspServlet。
JspServlet