解决Struts2中不执行的有关问题

解决Struts2中<s:action>不执行的问题

事情的逻辑是这样的:

提交表单 -> 服务器对表单数据进行验证(使用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了。于是,左边的列表页面又显示出来了。

 

1 楼 liweixxxx1990 2012-04-22  
太感谢你了  我想了很久的问题终于解决了
可是我还是有一点不明白,我的action标签name所指的那个action并没有使用validate方法为什么也会出现上述错误啊,是受提交错误时filedError的影响吗??