解决Struts2中不执行的有关问题
事情的逻辑是这样的:
提交表单 -> 服务器对表单数据进行验证(使用Struts2的validation框架) -> 验证错误,返回INPUT页面。
逻辑很简单,问题出在当验证失败返回到INPUT页面时,这个页面包含的<s:action>标签不执行。
<s:action>标签允许在JSP页面中直接调用Action,并可以将这个Action执行后返回的资源加载到此页面中。我的这个INPUT页面包含两部分,左边是由<s:action>返回的一个列表页面,右边是表单页面。
<s:filederror/> <!--显示错误 -->
<table> <tr> <td> <!-- 左边的列表 --> <s:action name="newsList" executeResult="true"></s:action> </td> <!-- 右边是表单 --> <td> <s:form action="add" method="post"> <s:textfield name="title" size="30"/> <s:textfield name="author" size="30"/> <s:submit/> </s:form> </td> </tr> </table>
一开始进入这个页面的时候,一切都正常,左边的列表也可正常的显示,但是,当提交表单后,服务器验证失败再返回到这个页面的时候,左边的列表就不能加载了,并抛出了异常:"Could not excute action: //newsList",这是怎么回事呢?
经过研究发现,的确是由于表单验证失败造成的。Struts2在执行action方法前,都要先执行validateXXX()和validate()方法来进行表单验证,由于我这里使用了表单验证机制,所以如果在验证时发现错误,则会将错误信息放入filedError中,并跳过action方法,直接返回到INPUT指定的视图中。这样,当返回INPUT视图后,视图中再通过<s:action>去请求另一个action时,会将之前filedError一起带入到这个action中,这个action(即newsList)同样也需要调用validate方法进行验证,当发现了存在filedError后,就会立即返回到这个action指定的input视图中,而并不执行这个action的逻辑方法。因此,也就出现了上面的action执行失败的问题了。
既然是由于发现filedError造成的,那么要解决这个问题,只需要写一个校验newsList action的方法,并在这个方法中将filedError清除就可以了。
public NewsAction extends ActionSupport {
public String newsList() { .... return SUCCESS; } //在校验方法中将error清除 public void validateNewsList() { this.clearErrorsAndMessages(); } }
这样,当struts调用这个action的校验方法时,将错误清除,这样就可以继续向下执行这个action了。于是,左边的列表页面又显示出来了。
可是我还是有一点不明白,我的action标签name所指的那个action并没有使用validate方法为什么也会出现上述错误啊,是受提交错误时filedError的影响吗??