Tomcat中的URL映射到FrontController servlet

Mar*_*ark 10 tomcat servlets

我正在尝试遵循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一起使用?

Bal*_*usC 8

/*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.