Struts验证不能正常工作

时间:2014-09-25 21:36:25

标签: java forms jsp validation struts2

我有一个用于验证jsp中某些字段的操作。如果此操作返回输入,则会添加适当的字段错误。但在纠正字段并重新提交表格后,这不会重新提交;即使所有字段都正确,字段错误仍将保持附加。

图片1:

我已提交带有空Surname字段的表单。添加了适当的字段错误。

图片2:

然后我填写了Surname差距,但错误信息被卡住了,表单不会重新提交。

验证

public String validateForm() {
    if (name == null || name.equals("")) {
        addFieldError("name", "Name is required!");
        return INPUT;
    }

    if (surname == null || surname.equals("")) {
        addFieldError("surname", "Surname is required!");
        return INPUT;
    }

    if (username == null || username.equals("")) {
        addFieldError("username", "Username is required!");
        return INPUT;
    }

    if (password == null || password.equals("")) {
        addFieldError("password", "Password is required!");
        return INPUT;
    }

    if (!passwordCheck.equals(password)) {
        addFieldError("password", "Passwords do not match!");
        addFieldError("passwordCheck", "");
        return INPUT;
    } else {
        return SUCCESS;
    }
}

struts.xml中:

<package name="actions" namespace="/authenticated/admin" extends="struts-default">

    <action name="form">
        <result>/authenticated/admin/inputAccountSave.jsp</result>
    </action>

    <action name="register" class="AccountAction" method="createAccount">
        <result name="success">/success.jsp</result>
        <result name="input">/authenticated/admin/inputAccountSave.jsp
        </result>
    </action>

</package>


<package name="validations" extends="struts-default">

    <action name="validate" class="AccountAction" method="validateForm">
        <result name="success" type="redirectAction">
            <param name="actionName">register</param>
            <param name="name">${name}</param>
            <param name="surname">${surname}</param>
            <param name="username">${username}</param>
            <param name="password">${password}</param>
            <param name="role">${role}</param>
        </result>
        <result name="input">/authenticated/admin/inputAccountSave.jsp
        </result>
    </action>

</package>

形式:

<s:form name="register" action="validate" >
    <s:textfield name="name" label="Name" />
    <s:textfield name="surname" label="Surname" />
    <s:textfield name="username" label="Username" />
    <s:password name="password" label="Password" />
    <s:password name="passwordCheck" label="Confirm password" />
    <s:select name="role" label="Role" list="{'MANAGER', 'ADMIN'}"></s:select>
    <s:submit />
</s:form>

谢谢

1 个答案:

答案 0 :(得分:0)

首先,您不需要从validate返回INPUT,添加fieldError就足以指示 Workflow Interceptor 自动返回INPUT。

其次,你的方法,行为和表格的命名过于复杂,可能会产生误导......试着让事情变得更加简单。

第三:您正在使用Action方法进行验证。这不是它的工作原理。操作方法(默认为execute(),但它可以是任何内容,并且您将其命名为validateForm())必须处理Action的业务,而不是验证。验证由(XML,Annotations或)validate()方法处理,该方法由验证拦截器调用,并在到达操作之前执行。如果验证失败,则不会执行操作方法,并且请求将被重定向回定义为INPUT的结果。

如果您有兴趣,请阅读the detailed flow上的详情。

然后在你的情况下:

public String validateForm() {        
    return SUCCESS;
}

public void validate() {
    if (name == null || name.equals("")) {
        addFieldError("name", "Name is required!");            
    }

    if (surname == null || surname.equals("")) {
        addFieldError("surname", "Surname is required!");
    }

    if (username == null || username.equals("")) {
        addFieldError("username", "Username is required!");
    }

    if (password == null || password.equals("")) {
        addFieldError("password", "Password is required!");
    }

    if (!passwordCheck.equals(password)) {
        addFieldError("password", "Passwords do not match!");
        addFieldError("passwordCheck", "");
    } 
}

但为了您自己的安全,请尽快更改这些方法/操作名称:)