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

时间:2014-09-05 02:50:14

标签: java jsp servlets url-mapping

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

    <servlet-mapping>
        <servlet-name>User</servlet-name>
        <url-pattern>/user/*</url-pattern>
    </servlet-mapping>

在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);

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

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

http://localhost:8080/myproj/user/resources/jsp/user_home.jsp

所以看起来很明显的问题是它正在映射回user/*模式。

如何在不经过网址映射的情况下让Servlet显示此页面,并正确显示我需要的jsp

2 个答案:

答案 0 :(得分:2)

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

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

request.getRequestDispatcher("/resources/jsp/user_home.jsp").forward(request, response);

答案 1 :(得分:1)

您不希望在servlet映射中使用*。只是因为每当你/user/中有URL时,它就会重定向回servlet。

星号接受URL的每个/user/,并根据servlet mappiing重定向它,所以你可能想要它

<servlet-mapping>
        <servlet-name>User</servlet-name>
        <url-pattern>/user/User</url-pattern>
    </servlet-mapping>

并在action action = user/User

中使用它