RequestDispatcher 转发被重新路由回同一个 Servlet

Cod*_*ein 5 java jsp servlets url-mapping

我有一个名为User.java. 它映射到 url 模式

    <servlet-mapping>
        <servlet-name>User</servlet-name>
        <url-pattern>/user/*</url-pattern>
    </servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

在 Servlet 内部,user/分析斜杠后面的路径,从数据库中检索有关该用户的数据,设置属性,然后user_home.jsp显示页面。实现这一点的代码是:

            User user = UserManager.getUserInfoById(userPath);  
            request.getSession().setAttribute("user", user);
            request.getRequestDispatcher("resources/jsp/user_home.jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)

问题是,user_home.jsp请求并没有打开 this ,而是再次映射到同一个 servlet User.java。它什么都不做。

我把输出语句放在doGet方法的开头,所以我可以看到 URL 是

http://localhost:8080/myproj/user/resources/jsp/user_home.jsp
Run Code Online (Sandbox Code Playgroud)

所以似乎明显的问题是它正在映射回user/*模式。

如何让 Servlet 在不通过 URL 映射的情况下显示此页面,并正确显示jsp我需要的内容?

Dav*_*que 4

如果传递给的路径request.getRequestDispatcher()不以“ /”开头,则将其解释为相对于当前路径。由于您的 servlet 的路径是/user/<something>,它会尝试将请求转发到/user/resources/jsp/user_home.jsp,这与您的 servlet 映射匹配,因此递归地转发到同一个 servlet。

另一方面,如果传递给的路径request.getRequestDispatcher()以“ /”开头,则它被解释为相对于当前上下文根。因此,假设该resources目录位于 web 应用程序的根目录,请尝试/在路径开头添加“”,例如:

request.getRequestDispatcher("/resources/jsp/user_home.jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)