2

struts.xml中的action配置如下是没有问题的:

<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方法未执行,我的表单虽然尚未提交,但已直接/自动验证。

我该如何解决这个问题?

4

1 回答 1

3

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

input当发生某些验证错误时,或者当您尝试设置错误类型的操作属性时,验证拦截器会返回结果,例如,当您尝试将 a 设置intDate字段时。

当一个拦截器返回一个结果而不是继续到下一个拦截器(或者如果它是最后一个拦截器)时,被调用的 Action 方法将不会被执行,因为它不会被到达。

仔细检查您的代码和您的请求,看看它在哪里失败并返回input结果。

PS:

如果与

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

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

有关更多信息,请阅读验证失败时我们如何重新填充控件

于 2013-06-19T08:20:00.540 回答