避免返回"输入"在Struts中自动运行

时间:2013-06-19 05:17:41

标签: struts2 struts-config struts-validation

struts.xml中的操作配置如下所示没有问题:

<action name="customer-form">
    <result name="success" type="tiles">/customer.tiles</result>
</action>

当我在动作配置(struts.xml)上访问动作类时出现问题。我在显示表单之前访问该类,因为我希望表单中的下拉选项显示适当的值,因为我在操作类中实例化它。但事实证明,它将返回“输入”,我必须处理它。

行动类中的

方法:

public String addCusto(){
    custoType = new ArrayList<String>();
    custoType.add("ABC");
    custoType.add("EFG");
    System.out.println(custoType.size());
    return SUCCESS;
}

struts.xml中:

<action name="customer-form" class="com.satunol.struts.template.action.CustomerAction" method="addCusto">
    <result name="success" type="tiles">/customer.tiles</result>
    <result name="input" type="tiles">/customer.tiles</result>
</action>
jsp中

表单

<s:form action="savecusto" method="post" validate="true">
<s:select
   label="Customer Type"
   list="custoType"
   emptyOption="true"
   headerKey="-1"
   headerValue="None"/>
<s:textfield name="custo.name" key="custo.name" size="20" />
<s:textfield name="custo.email" key="email" size="20" />
<s:textfield name="custo.address" key="address" size="20" />
<s:textfield name="custo.phone" key="phone" size="20" />
<s:submit method="addCustomer" key="label.add.customer" align="center" />

结果呢? addCusto方法未执行,我的表单直接/自动验证,但尚未提交。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

如果您的Action可以返回input结果,那么您必须在struts.xml配置中处理它。

发生某些验证错误时,或者当您尝试设置Action的属性的错误类型时,验证拦截器会返回

input结果,例如当您尝试设置时intDate字段。

当一个Interceptor返回一个结果而不是继续前进到下一个Interceptor(如果它是最后一个,则返回Action)时,将不会执行被调用的Action方法,因为它不会被访问。

仔细检查您的代码和请求,以查看失败的位置并返回input结果。

P.S:

如果有

  

我在显示表单之前访问该类,因为我希望表单中的下拉选项显示适当的值,因为我在操作类中实例化它。

你的意思是你需要在执行任何方法之前预填充字段(或者当返回input结果时),你应该使用prepare()方法,由之前运行的Prepare Interceptor运行验证拦截器。这样,即使验证失败,您的prepare()代码也会被执行。

有关详情,请参阅How do we repopulate controls when validation fails