今天在写代码的时候遇见java.lang.IllegalStateException: Cannot forward after response has been committed这种异常,具体的代码实现如下所示:
package cn.zll.bookstore.category.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.zll.bookstore.category.domain.Category;
import cn.zll.bookstore.category.service.Service;
public class CategoryServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String name=request.getParameter("method");
if(name.equalsIgnoreCase("findall")){
findall(request,response);
}
if(name.equalsIgnoreCase("findallbook")){
findallbook(request,response);
}
}
public void findallbook(HttpServletRequest request,
HttpServletResponse response)throws IOException,ServletException {
request.getRequestDispatcher("/jsps/book/list.jsp").forward(request, response);
}
public void findall(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
Service s=new Service();
List<Category> list= s.finall();
request.setAttribute("list", list);
System.out.println(list.size());
request.getRequestDispatcher("/jsps/left.jsp").forward(request, response);
}
}
注意:在这个servlet中前后一共接受两个请求。
首先是接收到findall这个请求,请求成功之后把list,通过转发返回到
left.jsp页面。
然后servlet又接受到findallbook的请求(我这里没有返回的具体内容),然后在转发到list.jsp中。(这两个请求有前后依赖关系,后一个请求依赖前一个请求的response)
然后我运行的时候会报出如下的异常:
java.lang.IllegalStateException: Cannot forward after response has been committed
他也就是说明,在转发之前,我们已经返回response.
**因为我在第一次请求的时候已经返回过response了,所以会报错。
在同一个servlet中我们不能同时成功出现有两次转发(只能同时成功出现一次转发)。**
而且转发并不意味这程序的结束,转发之后还会执行后边的代码,这一点非常的重要,很多种情况在转发之后需要我们return的。
我这里的解决方法就是在创建一个servlet,把findallbook这个发送到新创建的的那个servlet中。这样就能避免异常报错。
如果您还有新的方法,可以在评论区进行交流。