我想让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设置预处理。
答案 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);
}
最后,只需将上述过滤器映射到/*
。