2

まず、単純なテーマを使用しますが、それがなくても同じ動作が発生します (ページの書式設定を除く)。フォームを送信すると、名前フィールドが空になり、検証エラーを表示せずに register.jsp にリダイレクトされます。ログまたはデバッガーを確認した後、検証が正しく機能しているようで、サーバー ログ メッセージが期待どおりに書き込まれます。一般的なコードを投稿します。

struts.properties

struts.ui.theme=simple

マイアクション

private User user = new User()    // getter and setter

@Inject
transient UserDAO userDAO;

@Override
public User getModel() {
    return user;
}

public void validate(){

    LOG.debug("NAME VALIDATION " + user.getName());
    if("".equals(user.getName())){
        addFieldError("user.name", "Name can't be empty");
        LOG.debug("Validation Error on name");
    }       
}

デバッガーで確認すると、検証メソッドが機能しており、ログが書き込まれています。

struts.xml

<package name="users" extends="struts-default">
    <action name="registerUser" method="prepareRegister" class="com.test.MyAction">
        <result name="success">/register.jsp</result>
    </action>

    <action name="saveOrUpdateUser" method="saveOrUpdate" class="com.test.MyAction">
        <result name="input" type="redirect">registerUser</result>
        <result name="success" type="redirect">listUser</result>
    </action>
</package>

register.jsp

<td>
    <s:textfield id = "userName" 
              label = "User Name" 
               name = "user.name" />
</td>
<s:fielderror fieldName = "user.name" />

ご不明な点がございましたら、お気軽にお問い合わせください。私はstruts 2にかなり慣れていないので、struts 2のドキュメント検証方法を試し、他のチュートリアルもチェックしました。ロジックが機能していて、ビュー パーツ (jsp) が機能していないため、何かが欠けているのか、気付いていない設定ミスがあるのか​​ わかりません。前もって感謝します。

4

2 に答える 2

2

INPUT の結果がどのように機能するかを読み、プログラミング経験に何も追加しない ModelDriven 設計パターンを放棄した後、問題は Interceptor Stack の真ん中に簡単に隠れる可能性があるため、次の点に注意してください。

  • redirect外部 URL または非アクション URL にリダイレクトするときに使用する結果ですが、redirectActionアクションにリダイレクトするときに使用する必要があります。
  • リダイレクトすると、新しいリクエストが作成されるため、古いパラメーター (アクション エラー、メッセージ、フィールド エラーを含む) は失われます。

これを防ぐために、PRG パターン (したがってリダイレクト) を使用し続けたい場合は、リダイレクトを介してメッセージを保存および取得するMessageStore Interceptorを使用できます。それを含むインターセプタースタックを定義するだけで、問題が解決します。

または、ドキュメントの例のように一度実行します。

于 2016-04-13T13:39:10.397 に答える
1

これは、最終的にAndreaの有用なコメントの後に機能したものです:

<action name="saveOrUpdatePlayer" method="saveOrUpdate" class="com.test.MyAction">

     <interceptor-ref name="store">
        <param name="operationMode">STORE</param>
     </interceptor-ref>
     <interceptor-ref name="defaultStack" />

     <result name="input">/register.jsp</result>
     <result name="success" type="redirectAction">listUser</result>
</action>

これにより、検証メッセージが正しく表示されます。redirectActiontype forを使用するとinput、メッセージが消えていました。defaultStack仕事を成し遂げたようです。

于 2016-04-13T15:28:55.880 に答える