项目中用到Struts2框架的s:action标签,具体什么意思,怎么用,在这就不多说了,网上很多介召,这里主要说一下用s:action标签所遇到的一个问题:
Question-A :在主页面里包含s:action标签,首次加载主页面时,s:action可以正确执行(请求后台Action),并返回执行结果,这时submit主页面,并将执行结果再次返回到主页面,这时发现s:action不执行(还是上次的执行结果 )。
经分析,原因可能如下:
R-A: 猜测可能是web服务器,tomcat对页面代码进行了缓存,所以没有再次去请求被包含的s:action。于是在每次执行s:action时,添加一个随机数,如下:
<s:param name="tag"><s:property value="model.tag"/></s:param>
经过测试问题解决。
网上还有一种s:action标签不执行的情况,如下:
Question-B :提交表单 -> 服务器对表单数据进行验证(使用Struts2的validation框架) -> 验证错误,返回INPUT页面。逻辑很简单,问题出在当验证失败返回到INPUT页面时,这个页面包含的<s:action>标签不执行。
<s:action>标签允许在JSP页面中直接调用Action,并可以将这个Action执行后返回的资源加载到此页面中。
我的这个INPUT页面包含两部分,左边是由<s:action>返回的一个列表页面,右边是表单页面。经过研究发现,的确是由于表单验证失败造成的。
Struts2在执行action方法前,都要先执行validateXXX()和 validate()方法来进行表单验证,由于我这里使用了表单验证机制,所以如果在验证时发现错误,则会将错误信息放入filedError中,并跳过 action方法,直接返回到INPUT指定的视图中。
这样,当返回INPUT视图后,视图中再通过<s:action>去请求另一个 action时,会将之前filedError一起带入到这个action中,这个action(即newsList)同样也需要调用validate方法进行验证,当发现了存在filedError后,就会立即返回到这个action指定的input视图中,而并不执行这个action的逻辑方法。因此,也就出现了上面的action执行失败的问题了。
R-B: 既然是由于发现filedError造成的,那么要解决这个问题,只需要写一个校验newsList action的方法,并在这个方法中将filedError清除就可以了。这样,当struts调用这个action的校验方法时,将错误清除,这样就可以继续向下执行这个action了。于是,左边的列表页面又显示出来了。