2

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フォームはまだ送信されていませんが、直接/自動的に検証されます。

どうすればこれを解決できますか?

4

1 に答える 1

3

アクションがinput結果を返すことができる場合は、struts.xml 構成でそれを処理する必要があります。

input結果は、何らかの検証エラーが発生した場合、またはアクションのプロパティの間違ったタイプを設定しようとした場合 (たとえばintDateフィールドに a を設定しようとした場合) に、検証インターセプターによって返されます。

Interceptor が次の Interceptor (最後の場合は Action) に進む代わりに結果を返す場合、呼び出された Action メソッドは実行されません。

コードとリクエストを注意深くチェックして、どこで失敗し、input結果を返しているかを確認してください。

PS:

とすれば

アクション クラスでインスタンス化するときに、フォームのドロップダウン オプションに適切な値を表示させるため、フォームを表示する前にクラスにアクセスします。

メソッドの実行前 (またはinput結果が返されたとき) にフィールドに事前入力する必要があることを意味します。そのprepare()ためには、検証インターセプターの前に実行される準備インターセプターによって実行されるメソッドを使用する必要があります。そうprepare()すれば、検証が失敗した場合でもコードが実行されます。

詳細については、検証が失敗したときにコントロールを再設定する方法を参照してください。

于 2013-06-19T08:20:00.540 に答える