码迷,mamicode.com
首页 > 编程语言 > 详细

使用printWrite 在jetty中报错 java.lang.IllegalStateException: STREAM

时间:2015-06-11 16:06:56      阅读:3363      评论:0      收藏:0      [点我收藏+]

标签:

 1 public void doFilter(ServletRequest request, ServletResponse response,
 2             FilterChain chain) throws IOException, ServletException {
 3         // TODO Auto-generated method stub
 4         HttpServletRequest req=(HttpServletRequest)request;
 5         HttpServletResponse res=(HttpServletResponse)response;
 6         HttpSession session=req.getSession();
 7         String url = req.getRequestURI().toString();
 8         chain.doFilter(req, res);
 9         String str = "docheck";
10         if(!url.endsWith("login")){
11             if(! url.contains(str)){
12             if(session.getAttribute("managerId") == null){
13                      PrintWriter out = res.getWriter();
14                     // ServletOutputStream out = res.getOutputStream();   
15                      String loginPage = "/ManagerAction/login";  
16                      StringBuilder builder = new StringBuilder();  
17                      builder.append("<script type=\"text/javascript\">");  
18                      builder.append("window.location.href=‘");  
19                      builder.append(loginPage);  
20                      builder.append("‘;");  
21                      builder.append("</script>");  
22                      out.print(builder.toString());
23                      out.close();
24             } 
25             }
26         }
27     }

技术分享

被这个问题折磨的挺难受,虽然不影响程序的正常使用,但是还是要解决的,查阅了相关资料,这是web容器生成的servlet代码中有out.write(””),这个和调用的response.getOutputStream()产生冲突.即Servlet规范说明,不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException。

之后将printWriter改为outputStream后,仍然不成功,会报错显示java.lang.IllegalStateException: WRITER

偶然间我将outputStream改为了ServletOutputStream竟然不报错了。

printWriter与 ServletOutputStream的区别

1. PrintWriter是以字符为单位,对所有的信息进行处理,而ServletOutputStream仅对二进制的资料进行处理。 
2. 
PrintWriter在输出字符文本时内部需要 将字符串转换成某种字符集编码的字节数组,使用他的好处就是不需要自己来完成从字符串到字节数组的转换。 转换的字符集编码是通过设置setContentTpye或setCharacterEncoding或setLocale等方法实现的;使用 ServletOutputStream对象直接从一个字节输入流中读取出来,然后再原封不动的输出到客服端。
3. 这两个方法相互排斥,只能调用其一,如果要用,则要在换方法之前调用flush(),将缓冲区数据冲掉。
4. PrintWriter自动清空缓冲区的功能被使能时(构造函数中autoFlush置为true),仅当println()方法被调用时才自动清缓冲区,而不是像PrintStream一样遇到一个换行符就清缓冲。 

至于outputStream与ServletOutputStream输出方式不同,一个是write(byte【】) 另一个是print(stringBuilder) 还有什么区别再详细研究。

使用printWrite 在jetty中报错 java.lang.IllegalStateException: STREAM

标签:

原文地址:http://www.cnblogs.com/zzy-blogs/p/4569107.html

(1)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!