`
qinjingkai
  • 浏览: 262140 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

struts2文件下载发生java.lang.IllegalStateException

阅读更多

 先说说程序设计的背景,功能就是实现文件下载,思路是先生成一个临时文件,下载后要删除这个临时文件。再这里我用struts2。先想到是直接用普通的配置方式处理问题,也就是不用显示的获得httpServletResponse对象,然后对httpServletResponse进行操作的方式,配置大致如下:

写道
<action name="downLoadAccountCheck" class="downLoadAccountCheckAction">
<result name="errorpage">./downerror.jsp</result>
<result name="success" type="stream">
<param name="contentType">
application/octet-stream;charset=ISO8859-1
</param>
<param name="inputName">inputStream</param>
<!-- 使用经过转码的文件名作为下载文件名,downloadFileName属性对应action类中的方法 getDownloadFileName() -->
<param name="contentDisposition">
attachment;filename="${downloadFileName}"
</param>
<param name="bufferSize">4096</param>
</result>
</action>

 但是这样的方法有一个问题,那就是文件无法删除。那就只好用传统的方法了,也就是上述的先获得httpServletResponse对象,然后对其操作的方法,代码如下

写道
public String spInfo() {
System.out.println("到达了spInfo1111111111"+spName);
try {
// 获取当前登录帐号
String operatorId =ActionUtil.getLoginUserID();
System.out.println("operatorId="+operatorId);
//权限当前取和按sp查询交易记录报表一致
int right = AuthorityUtil.getTopRight(operatorId, "ID_RETRANS_STATBYSP_REPORT");

String district=null;
if(right == AuthorityUtil.LOCAL_DATA_VISIBLE){
String local=ActionUtil.getLocalID(operatorId);
if(local==null||local.equals("")){
this.message = "查询成功!";
success = true;
return SUCCESS;
}

//如果登录用户不是省公司用户或维护人员,需要进行地域限制
if(!local.equals("ALL")&&!local.equals("DW")){
district = local;
}

}
if(right == AuthorityUtil.INVISIBLE){
this.message = "查询成功!";
success = true;
return SUCCESS;
}

list = reTxnLogDAO.queryTradeSp(spName, spState,district, startDate, endDate);
File file=new File(getFileNameForSPinfo(spName, spState, startDate, endDate)+".xls");
//File file=new File("d:/sptemp.xls");
if(file.exists()){
file.delete();
}
file.createNewFile();
System.out.println("file----abs:"+file.getAbsolutePath());
createSPInfoExcel(file, list);
downloadExcel(file, ServletActionContext.getResponse());
delExcel(file);
//message = "查询成功!";
//success = true;
} catch (Exception e) {
message = "查询失败!";
success = false;
e.printStackTrace();
}
return SUCCESS;
}

 但是新的问题又出现,那就是程序抛出了java.lang.IllegalStateException异常,异常信息大致如下

写道
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:742)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:513)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:422)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

 虽然说出现了上述异常不妨碍程序的使用,但是看起来很别扭,很不爽,经过研究把上述代码中的return SUCCESS 改成return null 问题得到解决!

分享到:
评论
2 楼 我爱java 2012-08-13  
有的功能return success 以后再struts.xml 还要接收这个success 做下一步的处理,想问一下return null以后功能岂不失效了么?怎么解决的?
1 楼 熊笨笨 2010-12-08  
呵呵。。。谢谢,我也遇到了这个问题。。。现在终于解决了。

相关推荐

    java.lang.IllegalStateException: getOutputStream() has already解决办法

    纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    有关struts2下载组件的具体介绍我就在此略过了,看此文的同志想必大多是碰到这样让人很是不爽的问题。 下面就将该问题的最终解决办法介绍如下。 问题概要: 在struts2中使用result里type="stream"的结果类型时,...

    tomcat部署多个项目.pdf

    在多个项目中,可能会遇到 `java.lang.IllegalStateException` 异常,例如: `java.lang.IllegalStateException: Web app root system property already set to dif` 这个异常是因为多个项目中的 `web.xml` 文件中...

    tomcat启动的错误

    2. **复制或移动驱动文件**:如果驱动位于`%TOMCAT_HOME%\lib`目录,则需要将其复制或移动到每个应用程序的`WEB-INF\lib`目录下。这是因为每个应用程序都需要独立的类路径来加载所需的库。 3. **检查版本兼容性**:...

    java的常见问题及解决方法参照.pdf

    当你遇到`java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode`时,可能是你在HQL查询中忘记了为表名添加别名。正确的做法是为每个表指定别名,例如`select p from ...

    java的常见问题及解决方法定义.pdf

    如果遇到“java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode”的错误,这意味着在使用Hibernate的HQL查询时,忘记为表名添加别名。正确的做法是在查询语句中明确...

    java常见异常汇总

    **异常描述**:在使用 HQL (Hibernate Query Language) 时,如果没有给表名添加别名,可能会引发 `java.lang.IllegalStateException`。 **原因分析**:在 HQL 查询语句中,如果没有为表指定别名,HQL 解析器将无法...

    java Struts2 在拦截器里的跳转问题

    首先,让我们来看看异常`java.lang.IllegalStateException`。这个异常通常表示在不合法或不合适的时间点调用了某个方法,比如在HTTP响应已经发送到客户端之后尝试修改响应状态。在这个场景下,异常可能源于`...

    超级有影响力霸气的Java面试题大全文档

     java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或...

    iteye的技术博客集合

    - **Java.lang.IllegalStateException: Cannot call sendError() after the response has**:这部分内容介绍了如何避免在发送响应后调用 sendError() 方法而导致的异常。 - **Java 中重载函数调用时出现的问题**:这...

Global site tag (gtag.js) - Google Analytics