Servlet不用手动关闭输出流么?

wonkju 2014-05-31 02:09:11
不管是 doGet,还是 doPost,
一般我们用的 response.getWriter()得到是 PrintWriter,Servlet服务是在哪里自动关闭 的?我搜了一下,有人说Servlet会自动关闭,但是我看一下源码,没找着.

GenericServlet的 destroy是空实现的,它的子类 HTTPServlet有没有去重写.是不是在别的地方关闭流呀?

谢各位.
...全文
962 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
高坚果兄弟 2014-05-31
  • 打赏
  • 举报
回复
引用 4 楼 magi1201 的回复:
servlet生命周期 用户可以在doGet或doPost中自己关闭输出流;也可以在destory中关闭释放;如果还没有做操作,destory 后会释放servlet实例,自然释放了servlet占用的所有资源。
想起以前犯的一个低级错误,filter中声明成员变量来保存request,rsponse,结果压力测试时发现老是莫名其妙的出错,后来才发现一个filter、servlet只有一个实例来处理所有请求,最基础的知识 servlet实例中压根没有request、response,destory想释放估计心有余而力不足,也不要指望在destory里关闭response,他压根不是干这个用的。 我测试用的是tomcat7.0,resoponse如果没有关闭,tomcat会自动关闭 org.apache.catalina.core.ApplicationDispatcher.doForward(ServletRequest request, ServletResponse response)方法 最后一段代码是

            // Close anyway
            try {
                PrintWriter writer = response.getWriter();
                writer.close();
            } catch (IllegalStateException e) {
                try {
                    ServletOutputStream stream = response.getOutputStream();
                    stream.close();
                } catch (IllegalStateException f) {
                    // Ignore
                } catch (IOException f) {
                    // Ignore
                }
            } catch (IOException e) {
                // Ignore
            }
可以清楚看到不管你有没有关闭,tomcat都重新关闭了一次
姜小白- 2014-05-31
  • 打赏
  • 举报
回复
servlet生命周期 用户可以在doGet或doPost中自己关闭输出流;也可以在destory中关闭释放;如果还没有做操作,destory 后会释放servlet实例,自然释放了servlet占用的所有资源。
宁波朱超 2014-05-31
  • 打赏
  • 举报
回复
建议楼主去把SERVLET的生命周期去好好了解一下。 了解之后这种问题就不会提了。
wonkju 2014-05-31
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
在Servlet中,因为filter的关系,很多时候需要把response里面的内容拿出来,进行过滤,比如编码上的问题,如果你在自己的response里面getWriter().close()掉,其他的filter会出现异常。 Servlet最后会帮你关闭的,放心。 如果自己用PrintWriter的话,还是得关闭
谢回答,不过我关心的是,在哪里关掉. 你也和网上许多人一样,说最好 Servlet自动关闭. 那如果别人问我,我不能说,因为别人说,会自动关闭,所以就是关闭吧.
姜小白- 2014-05-31
  • 打赏
  • 举报
回复
在Servlet中,因为filter的关系,很多时候需要把response里面的内容拿出来,进行过滤,比如编码上的问题,如果你在自己的response里面getWriter().close()掉,其他的filter会出现异常。 Servlet最后会帮你关闭的,放心。 如果自己用PrintWriter的话,还是得关闭
zhjdg 2014-05-31
  • 打赏
  • 举报
回复
javax.servlet 是标准,是给人实现的。 response 应该是由Connector 类实现的。 他对外是(javax.servlet.response) response 把方法限定在javax.servlet.response范围。 所以你想要看实现。 我是看的是tomcat4.1.2(深入剖析tomcat这本书是用这个的。) org.apache.catalina.connector.http.HttpProcessor response.finishResponse();

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧