我有以下代码:
在控制器父类中,我有一个方法,其中包含以下内容:
public void redirect(HttpServletResponse response, String url)
throws IOException
{
response.sendRedirect(url);
}
但是当我尝试在我的控制器实现上使用它时,给出了以下异常:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Integer id = Integer.parseInt(request.getParameter("id"));
UserRepository users = new UserRepository(request);
User user = users.getUser(id);
// My validation :
if (user == null) {
this.redirect("list"); // throws me an exception
}
request.setAttribute("user", user);
request.setAttribute("action", "update");
request.setAttribute("legend", "Update User");
this.render(request, response, "/user/form");
}
我收到了西班牙语的异常消息,但我将其翻译如下:
java.lang.IllegalStateException: I can not forward after response has been carried out.
util.library.mvc.Controller.render(Controller.java:31)
modules.user.controllers.UpdateController.doGet(UpdateController.java:33)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
但是当我在这种情况下使用这种方法时:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
user.populate(request);
UserRepository userRepository = new UserRepository(request);
userRepository.update(user);
this.redirect(response, "list");
}
工作正常。
任何帮助?
答案 0 :(得分:2)
问题在于此if块
if (user == null) {
this.redirect("list"); // throws me an exception
}
你忘记回到这里了。因为它重定向,而不是在渲染和转发到另一个页面。
所以它应该是
if (user == null) {
this.redirect("list"); // throws me an exception
return;
}
希望这有帮助。
答案 1 :(得分:1)
您需要了解重定向是什么。
使用时
response.sendRedirect(url);
Servlet容器向客户端返回一个HTTP响应,其中包含302状态代码和指向重定向应该转到的URI的Location
标头。换句话说,您告诉客户端向Location
标头中的URI发送新 GET请求。
Servlet容器发送此HTTP响应后,响应处理完成。如果您尝试使用HttpServletResponse
执行任何其他操作,例如转发到JSP,您将获得一堆异常。
当您转发到JSP时,您希望Servlet容器呈现JSP的内容并将其写入HTTP响应,但是使用sendRedirect
,您已经发送了HTTP响应。如果你正在重定向,你就不能让它发生。
你如何防止它取决于你。 See Sanjeev's answer for one possibility.
答案 2 :(得分:0)
重写您的代码如下
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Integer id = Integer.parseInt(request.getParameter("id"));
UserRepository users = new UserRepository(request);
User user = users.getUser(id);
// My validation :
if (user != null) {
request.setAttribute("user", user);
request.setAttribute("action", "update");
request.setAttribute("legend", "Update User");
this.render(request, response, "/user/form");
} else {
this.redirect("list");
}
}