选择【Run As】-【Maven build】的时候,报:
eclipse安装的maven插件是m2eclipse,在控制台使用命令mvn compile并未报错。后在pom.xml文件<build>标签后面加上
即可。
其实使用命令行时就已经指定了phase,而使用m2eclipse的【Run As】-【Maven build】时并未为其指定goal或phase,所以才报这个错误。
选择【Run As】-【Maven build】的时候,报:
eclipse安装的maven插件是m2eclipse,在控制台使用命令mvn compile并未报错。后在pom.xml文件<build>标签后面加上
即可。
其实使用命令行时就已经指定了phase,而使用m2eclipse的【Run As】-【Maven build】时并未为其指定goal或phase,所以才报这个错误。
使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getText的时候报告异常
查询了很多评论,最终找到原因跟解决方案,具体解释在 http://stackoverflow.com/questions/16692658/execandwait-interceptor-not-redirecting-to-success-page-after-waiting
execAndWait
causes the action to be executed in a new thread.ActionContext
is ThreadLocal
, the new thread will not get the values stored in the parent thread version of ActionContext
. Every thread has a unique version of ActionContext
getText()
will throw a NPE when it tries to execute in the new thread because it depends onActionContext
简单解释一下,就是说
execAndWait 会导致执行的Action 在另外一个线程中被执行,而getText 依赖 ActionContext ,他从 ActionContext 中获得当前的Locale 从而根据语言的不同加载不同的文字,可是,由于ActionContext 是ThreadLocal 的,而execAndWait 新开线程的时候并没有把父线程的ActionContext 传递给子线程 结果导致在新开的子线程中的ActionContext中的数据都是null ,因此出现异常信息就不足为怪了。
解决方法为
To fix this, you need to copy the parent threads ActionContext
into the execAndWait
thread. You can do this by extending the BackgroundProcess
class, implementing the beforeInvocation()
and afterInvocation()
methods, and extending ExecuteAndWaitInterceptor
, implementing the getNewBackgroundProcess()
method.
代码例子如下,注意,原文中作者的代码存在多线程同步问题,具体体现在
被调用的时候,得到的 context 为null ,导致注入失败。
因此需要重载两个类,来解决这个问题
写完之后,在struts.xml 中配置一下拦截器,覆盖掉默认的拦截器,下面是我的配置例子
Struts 2模拟进度条的原理
对于一些需要较长时间才能完成的任务,在Web开发中,会由HTTP协议会因为超时而断开而面临许多风险,这是在桌面开发不曾遇到的。Struts 2提供的execAndWait拦截器就是为了处理和应付这种情况而设计的。注意,该拦截器不在"defaultStack"中,所以必须在使用它的动作里声明它,并且必须放在拦截器栈的最后一个。
使用了该拦截器后,动作依然正常执行,只是该拦截器会分配一个后台线程处理动作的运行,并在动作完成之前把用户带到一个"等待"页面。,该页面每隔一段时间刷新一次,直到那个后台线程执行完毕为止。如果用户随后又触发了同一个动作,但顶一个动作尚未执行完毕,这个拦截器将继续向用户发送"等待"结果;如果他已经执行完毕,用户会看到该动作的最终结果。
"等待"结果的行为与"dispatcher"结果的行为很相似,但是要注意的是,"等待"结果对应的视图带有如下的meta标签:
该标签的作用就每隔多少秒就重新加载一次同样的URL。"5"是5秒,"url=/Struts2/default_progressbar.action"表示要加载的URL。
Struts 2是一个灵活强大的框架,如果你不喜欢Struts 2提供的默认"等待页面",你也可以自己设计自己的等待页面,若在动作声明中,没有找到"等待"结果,将使用默认值。
execAndWait拦截器
execAndWait拦截器 可以接收以下参数:
示例:使用默认视图与自定义视图
创建一个动作类,该动作类的工作为挂起30秒:
配置struts.xml文件:
测试页面:
自定义等待页面:
最终结果页面:
在浏览器中输入:http://localhost:8081/Struts2/test.jsp,获得如下页面
首先点击,"default_view"链接:
查看它的源代码:
这次点击"customer_view"链接:
这是自定义界面,最后动作执行完毕后,都会获得最终页面
引用自:http://www.blogjava.net/athrunwang/archive/2011/11/18/364200.html