使用struts2上传文件时,由于上传总是要有个时间差,老是让用户看着提交的页面,用户可能以为没提交成功,又点一遍?又点一遍?得!本来没毛病的程序可能就这样就搞出毛病了。
在这样的背景下,加载转圈,进度条等表现技术应运而生,主要是用来显式地告诉user,嗯,程序正在玩命上传呢,不用重复提交了!
这里,可以使用struts2自带的interceptor,timer拦截器!
在使用过程中,莫名奇妙的发现,用着很不稳定,尤其是,上传需要的时间越长,在action内创建request对象,报(空指针异常)NullPointException的概率越大!
这里我大胆猜测了一下,不确定我的猜想是否正确,但是却很好的解决了问题!
先把我的过程贴出来,再说说问题在哪块。。
首先,表现层就不用说了,一个form表单,提交到action的默认execute方法上。
先看看struts.xml的配置:
<action name="upload" class="com.****.action.UploadFile">
<interceptor-ref name="timer" />
<interceptor-ref name="defaultStack" />
<interceptor-ref name="execAndWait">
<!-- 设置等待时间为1000ms -->
<param name="delay">1000</param>
</interceptor-ref>
<!-- 这是当1000ms内结果没有出来时,默认加载的加载页面,注意!必须放在其他所有的result的前面 -->
<result name="wait">/pages/wait.jsp</result>
<result name="input">/pages/uploadPage.jsp</result>
<result name="success">/pages/success.jsp</result>
</action>
wait.jsp:
只有一个地方要加上:在head中加:
<meta http-equiv="refresh" content="3;url=upload.action">
3:是每隔3秒,调用一下upload.action,查看是否已经上传成功!成功则跳转到success.jsp,如何还在继续上传,则继续在wait.jsp页面。
action:
之前总是抛空指针的地方,就是,在execute方法内,当上传成功后,使用
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.save(***);
就是这里,每当创建request对象是,总是报错空指针!
后来我先是把这个timer加加载页面的功能块去掉之后,该怎样就这样,世界是很美好的!
但是一加上!真是B了狗了!怎么搞怎么错!
仔细琢磨了下,当三秒过后的时候,再次访问的时候,我怀疑,是这里的request已经被第一次访问的时候的action线程占用了,再次访问就拿不到了,之前的线程也没有释放!毕竟这实在一个request中的!
这样我就开始了又一轮的探险:
这次我不再是需要request对象时才进行获取,我选择了一进如action中,就获取,让其成为全局变量。只获取一次!之后就直接调用,具体如下:
private HttpServletRequest request = null;
private HttpSession session = null;
public CreateStartupsAction() {
request = ServletActionContext.getRequest();
session = request.getSession();
}
就这样,一次成功!