Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何简单地设置一个Servlet来处理和预处理JSP请求_Java_Jsp_Servlets - Fatal编程技术网

Java 如何简单地设置一个Servlet来处理和预处理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将拥有它所需要的正确变量 到目前为止,我的问题是使用“/*”作

我想让一个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设置预处理。

对于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模式
/*

另见:

实际上,forward()调用不应在模式匹配中运行。你能检查一下index.jsp是否可以转发回“/”或其他什么吗?@kw4nta WEB-INF/index.jsp不做任何转发,我在WEB.xml中也看不到任何东西(我也删除了欢迎文件条目)。还有别的地方需要我检查吗?@kw4nta:你错了。您认为容器的内置
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);
}