forward的细节

来源:互联网 发布:无限试驾2优化 编辑:程序博客网 时间:2024/06/16 17:34

新建servlet,在mvc开发模式下,需要forward到jsp页面,而在此之前,不能对response响应进行提交,

否则就会抛出异常java.lang.IllegalStateException: Cannot forward after response has been committed,不能进行forward。

public class Demo1 extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  String data = "aaa";
  Writer writer = response.getWriter();
  writer.write(data);
  writer.close();
  
  request.getRequestDispatcher("/message.jsp").forward(request, response);
 }

}

上面的例子错误比较明显,针对下面的例子,特别是servlet比较长,就可能会忽略掉。

public class Demo2 extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException { 

//满足某个条件时 
  if(true){
   request.getRequestDispatcher("/message1.jsp").forward(request, response);
  }
  
  request.getRequestDispatcher("/message2.jsp").forward(request, response);
 }

}

解决的方法就是在每次forward之后return,这样下面的代码就不会执行到,避免这个问题!

public class Demo2 extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException { 

  String data = "aaa";

Writer writer = response.getWriter();
  writer.write(data);
  
  request.getRequestDispatcher("/message2.jsp").forward(request, response);  
 }

}

当如上面所写,则不会出现异常,但是这样写的效果就是,会跳转到jsp页面,但是response所写的数据会被清空,也就是页面上没有呈现出数据。

还有一点就是,写入到HttpServletResponse对象中的响应头字段信息保持有效。

另外:总结一下forward的特点:客户端只有一次请求,服务器端有多个资源调用,也就是多个响应,浏览器地址栏没有变化。

原创粉丝点击