7

Struts2 Web アプリ (JQuery プラグインを使用) で Ajax 検証を使用しようとしていますが、問題があります。

@Validations アノテーションの使用に問題があったため、validate() メソッドをオーバーライドしただけで、検証中に xhtml フォームですべて正常に動作するようになりました。fieldsErrors はよく受信され、GUI に出力されます。

実際には、フォームが検証されると、アクションを起動するために 2 番目の POST がサーバーに送信されます。しかし、理由はわかりません。フレームワークはモデルの属性を設定せず、アクションの実行後の HTML 応答の生成中に、フレームワークは属性にアクセスできません (jsonValidationWorkflowStack を使用する場合のみ)。

簡単な例を作成しました:

アクション

    @Namespace("/actions")
    @ParentPackage("actions")
    @InterceptorRef(value = "jsonValidationWorkflowStack")
   public class ActionTest extends ActionSupport implements
        ModelDriven<ModelTest>, ParameterAware {
    private static final long serialVersionUID = 1L;

    private ModelTest model;
    private Map<String, String[]> parameters;

    public ActionTest() {
        model = new ModelTest();
    }

    @Action(value = "actionTest", results = {
            @Result(name = SUCCESS, location = "/jsp/win.jsp"),
            @Result(name = ERROR, location = "/jsp/loose.jsp"),         
    })
    public String executeAction1() throws Exception {
        System.out.println("pass: "+getModel().getPass()); //the field is always null
        if ("test".equals(getModel().getPass()))
            return SUCCESS;
        return ERROR;
    }

    @Override
    public ModelTest getModel() {
        return model;
    }

    @Override
    public void validate() {
        String field;
        if (parameters.get("pass") != null) {
            field = parameters.get("pass")[0];
            if (field == null || field.isEmpty())
                addFieldError("pass", "the field is not set");
            else if (!"test".equals(field))
                addFieldError("pass", "the password is \"test\"");
        }

    }

    @Override
    public void setParameters(Map<String, String[]> arg0) {
        this.parameters = arg0;

    }
}

モデル

    public class ModelTest {

    private String pass;
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

フォーム

<s:form action="actionTest" theme="xhtml">
<s:textfield name="pass"/>
<sj:submit validate="true"/>
</s:form>

この例では: - パスワードが "test" であっても常に Loose.jsp にリダイレクトされます - このアクションによってリダイレクトされた別の jsp で a を出力したい場合、何も表示されません (モデル)。

手を貸してくださいませんか?

PS: 下手な英語でごめんなさい:/

4

1 に答える 1

0

実際、モデル駆動型インターセプターには defaultStack が付属しています

<interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="debugging"/>
                <interceptor-ref name="profiling"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
</interceptor-stack>

含まれてjsonValidationWorkflowStackいないため、含まれていませんbasicStack

<interceptor-stack name="jsonValidationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel</param>
                </interceptor-ref>
                <interceptor-ref name="jsonValidation"/>
                <interceptor-ref name="workflow"/>
</interceptor-stack>

これはbasicStack

<interceptor-stack name="basicStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
</interceptor-stack>

追加してみてください

@Namespace("/actions")
    @ParentPackage("actions")
    @InterceptorRefs({
       @InterceptorRef("jsonValidationWorkflowStack"),
       @InterceptorRef("defaultStack")
})
于 2014-08-31T21:18:12.090 に答える