Java 如何简单地设置一个Servlet来处理和预处理JSP请求
我想让一个Servlet首先处理对JSP页面的所有请求。Servlet将用于根据请求的JSP设置服务器端变量 例如,我想要实现的是给定url:example.com/index.jsp,Servlet首先通过解析请求的jsp(index.jsp)来处理请求,设置特定于请求的index.jsp的变量(使用Java 如何简单地设置一个Servlet来处理和预处理JSP请求,java,jsp,servlets,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将拥有它所需要的正确变量 到目前为止,我的问题是使用“/*”作
request.setAttribute
),然后发送到实际的index.jsp(例如/WEB-INF/index.jsp)。然后JSP将拥有它所需要的正确变量
到目前为止,我的问题是使用“/*”作为Servlet的映射模式。它处理请求,然后使用requestDispatcher.forward(“/WEB-INF/index.jsp”)
,这将在一个无限循环中结束,因为它也匹配“/*”模式
我的Servlet应该如何处理请求的url?我应该使用什么作为web.xml中的映射模式
有标准的设置吗?我只是在寻找一种“最佳实践”方法来为我所有的JSP设置预处理。对于URL模式来说,
/*
首先是一个奇怪的选择。这通常只供用户使用。默认情况下,servlet也会在转发和包含上调用,但不会在过滤器上调用。使用/*
将完全覆盖容器的内置JspServlet
,在转发过程中应该在*.jsp
上调用它
而是使用更具体的URL模式,如/pages/*
,/app/*
,*.do
,*.html
,等等
当使用前缀servlet映射时,如/pages/*
,并且您想从URL隐藏额外的路径,那么您应该保持前缀servlet映射不变,将所有其他资源放在公共路径中(通常它只是静态资源,如CSS/JS/图像)并创建一个额外的过滤器来检查它是否是一个资源请求,如果是,则继续该链,如果不是,则转发到servlet。这不会更改URL。servlet可以反过来安全地转发到JSP
下面是一个示例,假设您的servlet映射在/pages/*
上,并且所有不应由servlet处理的(静态)资源都放在/resources
文件夹中(您只需将JSP保存在/WEB-INF
中,该部分不需要更改;转发不会命中过滤器)
最后,只需将上述过滤器映射到URL模式/*
另见:
JspServlet
(映射到*.jsp
)如何处理jsp?马修:请不要注意这个不正确的说法。这只会让你更加困惑。谢谢巴卢斯。这是否意味着用于访问的url将是example.com/pages/index.jsp而不是example.com/index.jsp?如果没有过滤器,是的,但是有了过滤器,则不是。这非常有效。对于遇到与我的问题类似的问题的任何人,添加过滤器的方法是将JSP请求发送到“/pages/theRequested.JSP”,然后Servlet通过剥离“/pages/”替换“/WEB-INF/”来处理该请求,然后使用RequestDispatcher转发到正确的位置:“/WEB-INF/theRequested.JSP”不客气。顺便说一句,您也可以直接使用request.getPathInfo(),而不需要剥离/操作URI:getRequestDispatcher(“/WEB-INF”+request.getPathInfo())
。另请参见我的答案“请参见”部分中的“设计模式”链接。
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);
}