我想让一个 Servlet 首先处理对 JSP 页面的所有请求。 Servlet 将用于根据请求的 JSP 设置服务器端变量。
例如,我想要实现的是给定的url:example.com/index.jsp,Servlet首先通过解析出请求的JSP(index.jsp)来处理请求,设置特定于请求 index.jsp(使用 request.setAttribute
),然后分派(dispatch)到实际的 index.jsp(例如/WEB-INF/index.jsp)。然后,JSP 将拥有所需的正确变量。
到目前为止,我的问题是我使用“/*”作为我的 Servlet 的映射模式。它处理请求,然后使用 requestDispatcher.forward("/WEB-INF/index.jsp")
结束无限循环,因为它也匹配“/*”模式。
我的 Servlet(s) 应该如何处理请求的 url?我应该在 web.xml 中使用什么作为映射模式?
有这方面的标准设置吗?我只是在寻找一种“最佳实践”方式来为我的所有 JSP 设置预处理。
最佳答案
/*
首先是一个奇怪的选择 servlet网址模式。这通常专门由 filters 使用.默认情况下,Servlet 也会在转发和包含时调用,但不会调用过滤器。使用 /*
将完全覆盖容器的内置 JspServlet
,它应该在转发期间在 *.jsp
上调用。
而是使用更具体的 URL 模式,如 /pages/*
、/app/*
、*.do
、* .html
等等。
当使用前缀 servlet 映射时,例如 /pages/*
并且您想隐藏 URL 中的额外路径,那么您应该保持前缀 servlet 映射不变,将所有 other 公共(public)路径中的资源(通常它只是像 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);
}
最后只需将上述过滤器映射到 /*
的 URL 模式。
另见:
关于java - 如何基本和简单地设置一个 Servlet 来处理和预处理 JSP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901789/