2

我想让一个 Servlet 首先处理对 JSP 页面的所有请求。Servlet 将用于根据请求的 JSP 设置服务器端变量。

例如,我想要实现的是给定 url:example.com/index.jsp,Servlet 首先通过解析请求的 JSP (index.jsp) 来处理请求,设置特定于请求索引的变量。 jsp(使用request.setAttribute)然后分派到实际的 index.jsp(例如 /WEB-INF/index.jsp)。然后,JSP 将拥有它需要的正确变量。

到目前为止,我的问题是我使用“/ * ”作为我的 Servlet 的映射模式。它处理请求,然后使用requestDispatcher.forward("/WEB-INF/index.jsp")它以无限循环结束,因为这也匹配“/ *”模式。

我的 Servlet 应该如何处理请求的 url?我应该使用什么作为 web.xml 中的映射模式?

有这个标准的设置吗?我只是在寻找一种“最佳实践”方法来为我的所有 JSP 设置预处理。

4

1 回答 1

1

对于servlet URL 模式/*来说,这首先是一个奇怪的选择。这通常专门供过滤器使用。默认情况下,Servlet 也会在转发和包含时调用,但不会在过滤器上调用。Using将完全覆盖容器的内置函数,应该在转发期间调用它。/*JspServlet*.jsp

而是使用更具体的 URL 模式,例如/pages/*, /app/*, *.do, *.html, 等等。

当使用前缀 servlet 映射时,比如/pages/*你想隐藏 URL 中的额外路径,那么你应该保持前缀 servlet 映射不变,将所有其他资源放在一个公共路径中(通常它只是像 CSS 这样的静态资源/JS/images) 并创建一个额外的过滤器来检查它是否是资源请求,如果是,则继续链,如果不是,则转发到 servlet。这不会更改 URL。servlet 又可以安全地转发到 JSP。

这是一个示例,假设您的 servlet 已映射,/pages/*并且不应由 servlet 处理的所有(静态)资源都放在/resources文件夹中(您可以将 JSP 保留在 中/WEB-INF,该部分不需要更改; forward 无论如何都不会击中过滤器)。

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/resources/")) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/pages" + path).forward(request, response);
}

最后,只需将上述过滤器映射到/*.

也可以看看:

于 2012-08-10T13:00:44.243 回答