如何基本上简单地设置一个Servlet来处理和预处理JSP请求

时间:2012-08-10 12:34:40

标签: java jsp servlets

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

/*首先是servlet网址格式的奇怪选择。这通常仅供filters使用。 Servlet默认情况下也是在前向和包含上调用,但不过滤。使用/*会完全覆盖容器的内置JspServlet,它应该在转发期间在*.jsp上调用。

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

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

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

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);
}

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

的网址格式

另见: