response细节--重定向的用处和getWrite/getOutputStream的用法冲突问题
2012-12-28 23:38
330 查看
IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!
1.重定向的实现://和下句代码可互换位置,此两行相当于response.sendRedirect(""); response.setStatus(302); //或者"location.jsp" response.setHeader("location","/HTTPHeader/location.jsp");2.重定向的用处:
一般情况下尽量不要用重定向,因为其会向服务器发送两次请求,增加服务器的负荷,并且会产生两个request和response对,除了特殊的场合:如:
(1)用户登录成功后跳转至首页,如果用转发的话,那么用户无法从地址栏上看到首页地址
(2)购物时,点击"加入购物车"按钮,然后就转向“显示购物车商品的页面showCar.jsp”,如果使用转发技术的,那么在“showCar.jsp”页面上如果刷新页面的话,则就会将“加入购物车的事件在作一次”。
(3)在表单提交后(get和post方式都是一样),如果想跳转至某页面,如果用转发的话,则转至页面后,如果刷新页面,则会造成表单重复提交:
如:当提交以post方式的表单后,如果刷新页面:
当点击重试后:
提交表单后,如果改为重定向到该页面,则刷新页面也只是刷新该页面,而不会造成表单重复提交
3. getOutputStream和getWriter互斥问题:
这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
如:ExpiresServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置缓存时间为1小时:时间单位为毫秒 response.setDateHeader("Expires", System.currentTimeMillis()+1000*3600); String data = "abcdefghigk"; //response.getWriter().print(data); response.getOutputStream().write(data.getBytes()); //jsp中是也PrintWriter对象输出内容的 request.getRequestDispatcher("index.jsp").forward(request, response);//改为response.sendRedirect("index.jsp");则不会抛该异常 }如果访问该Servlet,则会抛出:java.lang.IllegalStateException: getOutputStream() has already been called for this response 异常
这说明同一个response对象的这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
解决办法:将request.getRequestDispatcher("index.jsp").forward(request, response);//改为response.sendRedirect("index.jsp");则不会抛该异常
原因分析:改为重定向后,则 是两个response对象
4.其他问题:
(1)getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
(2)getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
(3)Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
(4)Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象
相关文章推荐
- 解决springmvc中文件下载功能中使用javax.servlet.ServletOutputStream out = response.getOutputStream();后运行出异常但结果正确的问题
- (生成excel)解决getOutputStream() has already been called for this response java getOutputStream()的问题
- response.response.getOutputStream()出问题了吗?
- (生成excel)解决getOutputStream() has already been called for this response java getOutputStream()的问题
- getOutputStream() has already been called for this response问题的解决
- 解决ScriptManager与Response.Write("")冲突问题
- 遇到问题----java.lang.IllegalStateException: getOutputStream() has already been called for this response
- 遇到问题----java.lang.IllegalStateException: getOutputStream() has already been called for this response
- response.getWriter().write()向前台打印信息乱码问题解决
- response.getWriter().write("中文");乱码问题
- 在jsp中使用response.getOutputStream()导致报错问题getOutputStream() has already been called for this response
- java.lang.IllegalStateException: getOutputStream() has already been called for this response问题
- response.getWriter().write()向前台打印信息乱码问题解决
- java.lang.IllegalStateException: getOutputStream() has already been called for this response的解决办法
- 关于向 OutputStream 中直接写入 int 的细节问题
- java.lang.IllegalStateException: getOutputStream() has already been called for this response
- java导出excel报错:getOutputStream() has already been called for this response
- .net 服务器 HttpRespond.Response.Redirect重定向问题理解
- java.lang.IllegalStateException: getOutputStream() has already been called for this response
- JSP文件下载及出现getOutputStream() has already been called for this response的解决方法