2014.08.20 renderNull() 处理JFinal中的一个异常信息:java.lang.IllegalStateException: Committed

问题:

下载文件后后台报错:(核心提示)java.lang.IllegalStateException: Committed

问题详细描述:

JFinal中下载文件完成后(文件正常下载),后台报错,但是不影响程序功能。报错很不爽,需要解决。

网友解答:

地址:http://jorton468.blog.163.com/blog/static/72588135201102441617287/

java.lang.IllegalStateException: Committed : 异常表示,当前对客户端的响应已经结束,不能在响应结束后(Committed ),再次向客户端输出任何内容。

解决方式:

在renderFile()之后添加renderNull()方法:如下

renderFile(new File(docfile.getAbsolutePath()), docfile.getName(), getRequest(),getResponse());//下载

renderNull();

原因分析:

下载方法



1.renderFile(new File(docfile.getAbsolutePath()), docfile.getName(), getRequest(),getResponse());//下载

在这段代码执行完成之后,对客户端的response响应的已经完成;

2.程序默认调用render()方法,会将response再次使用,以向客户端发出响应,导致报错;

因为我没有写跳转地址,程序在下载完文件之后,去调用了默认的render()方法,而此时response已经响应结束,故报错。那,如果下载文件后我不跳转,不执行render()方法是否可以解决这个问题呢?

为此,我在文件下载完之后,添加一个renderNull()的方法。果然如此,不再报错。


注意:能够导致响应已经committed的操作包括:forward, redirect, flushBuffer。

JFinal中前后台实现交互后,会调用render()方法,跳转到一个目标地址去,如果不写,则会调用默认的render()方法,如下:

public void render() {
try {
if (isSupportActiveRecord) supportActiveRecord(request);

request.getRequestDispatcher(view).forward(request, response);
} catch (Exception e) {
throw new RenderException(e);
}
}

原因总结:

response是服务端对客户端请求的一个响应,对于当前页面中已经committed(提交)的response,就不能再使用这个response向缓冲区写任何东西,否则会有IllegalStateException的异常。

关于renderNull:

JFinal手册中指出,renderNull表示不向客户端返回数据。

实际使用中会用到renderNull的地方:导出excel、文件下载;

完整错误信息:

2014-08-20 12:31:00
[ERROR]-[Thread: qtp33018164-27]-[com.jfinal.core.ActionHandler.handle()]: /document/documentfile/dl?id=611
com.jfinal.render.RenderException: java.lang.IllegalStateException: Committed
at com.jfinal.render.JspRender.render(JspRender.java:58)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:92)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1333)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:487)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:972)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:417)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:906)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
at org.eclipse.jetty.server.Server.handle(Server.java:350)
at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:442)
at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:910)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:565)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:217)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:46)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:545)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:43)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalStateException: Committed
at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1069)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:199)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:98)
at com.jfinal.render.JspRender.render(JspRender.java:56)
... 24 more

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来的我比现在的我更优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值