日期:2014-05-17  浏览次数:20690 次

困扰了我一星期,是关于struts2<result name="success" type="stream"> 用ajax方式调用下载的
具体情况是这样的,

1.首先读数据库,生成文件在服务器。


2.再用<result name="success" type="stream">做了一个下载功能,下载生成在服务器的文件。已经解决中英文文件名的问题的了。单独调用是正常的


由于生成文件的时候比较长,我想增加用户体验,在查的长时间过程中,在页面弹出一个全屏屏蔽层,层中间再显示个loading的gif。这样的话,前台页面就要知道后台程序时候完成生成文件这个操作了,方便关闭前台显示的loading屏蔽层了。


我有2个思路
1.用ajax方法,ajax有个回调函数,我就知道什么时候关闭loading。但问题是ajax调用<result name="success" type="stream">进行下载的话,下载窗口此终不出来。


2.让strtus2完成后给前台返回一个标志或状态,但下面这2个action并没有返回页面的地方啊。
这个是生成文件的action
<action name="ConvertXML" class="com.struts.action.ConvertXMLAction">
  <!-- action间跳转并能提交参数S -->
  <result name="success" type="redirectAction">
  <param name="actionName">download</param>  
  <param name="namespace">/</param> 
  <param name="fileName">${fileName}</param>  
  </result>
  <!-- action间跳转并能提交参数E -->
</action>

这个是下载的action
<action name="download" class="com.struts.action.DownloadAction">
  <result name="success" type="stream">
  <param name="contentDisposition">attachment;filename="${fileName}"</param>
  <param name="inputName">inputStream</param
  </result>
</action>







------解决方案--------------------
沙发 不熟 盼高手指教 同学习
------解决方案--------------------
用户点击要求生成文件时,在Session里放一个标志位,文件生成完毕后,在返回前,把Session里的标志位去掉

页面在用户点击后显示你的那个带动画的框,然后Ajax轮询后台

后台单独写一个Action专门给下载用的,在这个Action的处理方法里,查看Session里的标志位

如果标志位存在,说明文件还在生成,就告诉前台,前台就继续等着

否则认为文件生成完毕,马上就要给用户下载了,把你的那个带动画的框隐藏就OK了

问题是,你知道你做的东西大致的负载程度吗?如果负载大的话,就别玩这么多花活了
------解决方案--------------------
探讨
我想解决思路一的问题,如果解决了,就很简单了,直接在回调函数关gif就好了

------解决方案--------------------
首先要把思路理清楚,和 AJAX的工作原理也要搞清楚,,
首先你用AJAX 方法执行 Action 完成生成文件的动作, 返回一个标识符,,
out = response.getWriter();
out.print(标识符) ,标识符可以让客户端接收到,然后关闭Loding 窗口 这个 Action的 Return 动作, 其实就是JSP 的 转发动作,不要为空,地址就是 文件在 服务器的 URL ,,然后 客户端才会在 关闭 LoDING动作之后 弹出 下载的窗口,下载刚才生成到服务器的文件
------解决方案--------------------
你这个文件流就是不是有个生成的过程么,,当生成完这个 文件流 也就是在 你的Return 动作前,,out.print 任意一个字符串,,那么 客户端就可以接受到这个字符串, 证明有返回的值 ,就证明 文件流已经生成完毕,那么页面上JS的方法关闭那个层就OK了
------解决方案--------------------
探讨

用户点击要求生成文件时,在Session里放一个标志位,文件生成完毕后,在返回前,把Session里的标志位去掉

页面在用户点击后显示你的那个带动画的框,然后Ajax轮询后台

后台单独写一个Action专门给下载用的,在这个Action的处理方法里,查看Session里的标志位

如果标志位存在,说明文件还在生成,就告诉前台,前台就继续等着

否则认为文件生成完毕,马上就要给……