jquery - 使用 jsonValidationWorkflowStack 和模型驱动进行 Struts 2 Ajax 验证

标签 jquery ajax struts2 model-driven

我正在尝试在我的 Struts2 Web 应用程序(带有 JQuery 插件)中使用 Ajax 验证,但遇到了问题。

我在使用 @Validations 注释时遇到了问题,所以我只是重写了 validate() 方法,现在在验证期间,我的 xhtml 表单一切正常。 fieldsErrors 很受欢迎并打印在 gui 中。

事实是,当验证表单时,会向服务器发送第二个 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:抱歉我的英语不好:/

最佳答案

实际上模型驱动的拦截器带有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")
})

关于jquery - 使用 jsonValidationWorkflowStack 和模型驱动进行 Struts 2 Ajax 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12566016/

相关文章:

JavaScript 美国货币格式

javascript - 将值传递给循环内动态创建的函数调用

javascript - Rails 4 - 从 ajax 更新表单中的值或数据属性并在 if 语句中使用此更新的值

java - struts 2 - 将参数从一个页面传递到另一个页面

css - Struts 2 磁贴的滚动条

java - Struts2 - 动态表单字段和数据库数据检索

javascript - Neo4j API 中阻止跨源请求

jquery - 滚动时为图像设置动画

javascript - Angular onreadystatechange

javascript - 如何使用 jquery 停止 $(window).scroll 事件?