一尘不染

Tomcat中的URL映射到FrontController servlet

tomcat

我正在尝试遵循基于Design PatternsWeb的应用程序中的模式。从映射“根” URL而言,这一切都很好。

我想通过“ Front Controller”发送所有请求,所以我已经把

<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

web.xml。逐步执行Netbeans将显示请求进入,并且Action运行正常,但随后一行

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一起使用?


阅读 182

收藏
2020-06-16

共1个答案

一尘不染

/*URL模式涵盖 一切,还转发的JSP文件和类似CSS/JS/图像静态资源。您不想在前端控制器servlet上使用它。

将您的控制器Servlet保持在更具体的URL模式上,例如/pages/*。您可以通过将静态资源分组到一个常见的文件夹(例如/resources创建一个Filter映射到该文件夹中并/*在该doFilter()方法中执行以下工作)中的静态资源,来达到消除URL中“/ pages”的功能要求:

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

2020-06-16