我有一个名为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
?
答案 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