getOutputStream和getWriter互斥问题

转载 2016年05月31日 22:52:32

二者都是往页面传值


  1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  2.         throws ServletException, IOException {  
  3.        //设置缓存时间为1小时:时间单位为毫秒  
  4.      response.setDateHeader("Expires", System.currentTimeMillis()+1000*3600);  
  5.      String data = "abcdefghigk";  
  6.      //response.getWriter().print(data);  也可以/response.getWriter().write(byte[])
  7.      response.getOutputStream().write(data.getBytes());  
  8.      //jsp中是也PrintWriter对象输出内容的  
  9.      request.getRequestDispatcher("index.jsp").forward(request, response);//改为response.sendRedirect("index.jsp");则不会抛该异常  
  10. }  



1.重定向的实现:

[java] view plain copy
  1. //和下句代码可互换位置,此两行相当于response.sendRedirect("");  
  2.     response.setStatus(302);  
  3.     //或者"location.jsp"  
  4.     response.setHeader("location","/HTTPHeader/location.jsp");  
2.重定向的用处:

   一般情况下尽量不要用重定向,因为其会向服务器发送两次请求,增加服务器的负荷,并且会产生两个request和response对,除了特殊的场合:如:

    (1)用户登录成功后跳转至首页,如果用转发的话,那么用户无法从地址栏上看到首页地址

    (2)购物时,点击"加入购物车"按钮,然后就转向“显示购物车商品的页面showCar.jsp”,如果使用转发技术的,那么在“showCar.jsp”页面上如果刷新页面的话,则就会将“加入购物车的事件在作一次”。

    (3)在表单提交后(get和post方式都是一样),如果想跳转至某页面,如果用转发的话,则转至页面后,如果刷新页面,则会造成表单重复提交:

如:当提交以post方式的表单后,如果刷新页面:


当点击重试后:


提交表单后,如果改为重定向到该页面,则刷新页面也只是刷新该页面,而不会造成表单重复提交

3. getOutputStream和getWriter互斥问题:

     这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。

    如:ExpiresServlet:

[java] view plain copy
  1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  2.         throws ServletException, IOException {  
  3.        //设置缓存时间为1小时:时间单位为毫秒  
  4.      response.setDateHeader("Expires", System.currentTimeMillis()+1000*3600);  
  5.      String data = "abcdefghigk";  
  6.      //response.getWriter().print(data);  
  7.      response.getOutputStream().write(data.getBytes());  
  8.      //jsp中是也PrintWriter对象输出内容的  
  9.      request.getRequestDispatcher("index.jsp").forward(request, response);//改为response.sendRedirect("index.jsp");则不会抛该异常  
  10. }  
如果访问该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方法关闭该输出流对象



ps

HttpServletResponse的字节流:response.getOutputStream().write()

中文乱码解决:
//通过Content-Type响应头,通知浏览器以何种编码格式打开内容
response.setHeader("Content-Type", "text/html;charset=UTF-8");
String data = "中国";
OutputStream out = response.getOutputStream();
//前后格式要统一,getBytes()不指定编码格式时使用平台默认编码格式
out.write(data.getBytes("UTF-8"));
可以回写<meta>标签来控制浏览器解析行为
String data = "中国";
OutputStream out = response.getOutputStream();

String meta = "<meta http-equiv='content-type' content='text/html;charset=UTF-8' />":
out.write(meta.getBtyes());
out.write(data.getBytes("UTF-8"));

数字乱码:

//通过Content-Type响应头,指定响应内容格式及所采用的编码格式
response.setHeader("Content-Type", "text/html;charset=UTF-8");
String data = "中国";
OutputStream out = response.getOutputStream();
//输出数字:要先把数字转为字符串再getBytes(),否则浏览器会将原数字按指定码表解析出其它内容,而不会输出原数字
out.write((3 + "").getBtyes());

HttpServletResponse的字符流:response.getWriter().write()

//指定响应以UTF-8格式编码内容
response.setCharacterEncoding("UTF-8");
//通知浏览器以何种编码格式打开内容
response.setHeader("Content-Type", "text/html;charset=UTF-8");
//或response.setContentType("text/html;charset=UTF-8");
String data = "中国";
OutputStream out = response.getWriter();
out.write(data);


//response.setContentType("text/html;charset=UTF-8")
//效果等价于setCharacterEncoding("UTF-8")及setHeader("Content-Type","text/html;charset=UTF-8")
response.setContentType("text/html;charset=UTF-8");
String data = "中国";
OutputStream out = response.getWriter();
out.write(data);


getWriter() getOutputStream() 对比 不能同时使用

getWriter() getOutputStream();   区别 1. getWriter() 用于向客户机回送字符数据 2. getOutputStream() 返回的对象,可以回送...
  • u011980994
  • u011980994
  • 2014年03月18日 15:26
  • 1594

同时调用getOutputStream()和getWriter()出现的问题以及请求转发和请求重定向的区别

同时调用getOutputStream()和getWriter()出现的问题以及请求转发和请求重定向的区别...
  • cckevincyh
  • cckevincyh
  • 2016年09月09日 21:05
  • 995

关于Servlet中getWriter()和getOutputStream()方法的疑惑

由于现在是刚刚接触Servlet技术,今天在看韩老师的关于servlet技术的视频中讲到getWriter()和getOutputStream()方法再同一个Response对象中不能同时调用。当时,...
  • LaLaLaZouBa
  • LaLaLaZouBa
  • 2013年08月17日 23:56
  • 4748

response细节--重定向的用处和getWrite/getOutputStream的用法冲突问题

1.重定向的实现: //和下句代码可互换位置,此两行相当于response.sendRedirect(""); response.setStatus(302); //或者"locat...
  • xh16319
  • xh16319
  • 2012年12月28日 23:38
  • 24572

getWriter() 和Response.getOutputStream冲突

java.lang.IllegalStateException异常:简单分析和简单解决方案 今天写java验证码程序,完成后使用一切正常,但是总抛出java.lang.Ill...
  • e_wsq
  • e_wsq
  • 2014年04月16日 00:21
  • 2478

getOutputStream和getWriter互斥问题

二者都是往页面传值 public void doGet(HttpServletRequest request, HttpServletResponse response)          ...
  • AlbertFly
  • AlbertFly
  • 2016年05月31日 22:52
  • 527

javaweb-day06-2&3 (Servlet - Response - 输出随机图片、请求重定向、web工程的URL地址写法、getOutputStream和getWriter互斥)

输出随机图片 package cn.mengmei.response; import java.awt.Color; import java.awt.Font; import java.awt.G...
  • u013440163
  • u013440163
  • 2015年02月10日 10:29
  • 619

getOutputStream()和getWriter()不能同时用

getOutputStream 和 getWriter方法不能同时共用,不能同时有两个输出流。   -------JAVA DOCS--------------------------------...
  • zhubin215130
  • zhubin215130
  • 2013年05月14日 16:56
  • 2152

cannot call getWriter() after getOutputStream()

cannot call getWriter() after getOutputStream() 在项目里的一个导出EXCEL方法总是报错,报错内容为 cannot call getWriter()...
  • bingzhilingyi
  • bingzhilingyi
  • 2018年01月11日 14:47
  • 65

java实现多个线程互斥访问文件

两个线程利用共享文件传递信息时,需要给文件加锁,实现文件的互斥访问。可以通过FileChannel和FileLock类实现文件的加锁操作。 注意事项: 当写线程对文件加锁后,可以对文件利用FileOu...
  • B08514
  • B08514
  • 2014年01月04日 22:20
  • 2171
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:getOutputStream和getWriter互斥问题
举报原因:
原因补充:

(最多只允许输入30个字)