Struts2下载文件点取消出现的异常解决

  1. 在使用Struts2下载文件时,如果点击保存或打开,没问题,点击取消时则会抛出如下异常:

  2.  

  3. 严重: Servlet.service() for servlet default threw exception  

  4. java.lang.IllegalStateException  

  5.     at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)  

  6.     at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:108)  

  7.     at com.opensymphony.module.sitemesh.filter.PageResponseWrapper.sendError(PageResponseWrapper.java:176)  

  8.     at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:108)  

  9.     at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:770)  

  10.     at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)  

  11.     at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)  


  12. 原因:

  13.     stream对应的类是org.apache.struts2.dispatcher.StreamResult,该类的处理过程如下:
        1、配置其中result标签下的各个参数
        2、从服务器中获取输入流,并同时与客户端建立输出流(服务器与客户端链接通过Socket进行连接)
        3、当点击“保存”或“打开”时,开始传输数据。如果点击“取消”,关闭所有的流

     但是实际发现Socket并没有断开,并且流也没有关闭,所以在JSP容器通过Response获取输出流之前,前面的流并没有关闭,所以会造成该异常的报出

     

    解决方法:

     

    1、下载struts2-sunspoter-stream-1.0.jar,复制到WEB-INF/lib下

    2、在原有的struts.xml的基础上进行相应的配置,如下:

    <package name="e3itm" extends="struts-default">
      <result-types>
       <!-- 用于处理下载文件点击取消时报出异常问题 -->
       <result-type name="streamx" class="com.sunspoter.lib.web.struts2.dispatcher.StreamResultX"></result-type>
      </result-types>

       <action name="download" class="com.DownloadAction">               

        <result name="success" type="streamx">  

                     <param name="inputName">download</param>  

                     <param name="bufferSize">4096</param>  

                     <param name="contentDisposition">filename=""</param>  

                     <param name="contentCharSet">UTF-8</param>  

                 </result>  

       </action>  

     

    </package>

     

    红色部分为添加的部分,并在原有的result中type改为“streamx”

     

    如果是使用注解方式同样如下:

    @Result(type="streamx", params={"inputName","inputStream","bufferSize","4096", "contentDisposition", "attachment;filename=\"${downloadFileName}\""})

     

    修改之后执行取消,效果如下:

    [WARN] StreamResultX Warn : socket write error


struts2-sunspoter-stream-1.1.jar 下载直接使用会报错
因为 struts2-sunspoter-stream-1.1.jar 只是JDK1。4编译的,在1。6以上情况下报错
解决方法是反编译其原代码,只有1个类,然后重新导出1。6JAR,就可以解决了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值