Struts验证无法正常工作 [英] Struts validation doesn't work properly

查看:156
本文介绍了Struts验证无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



图片1:



我已提交表单与空的姓氏字段。添加了相应的字段错误。



图片2:



然后填写姓氏差距,但错误信息

验证:

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

if(surname == null || surname.equals()){
addFieldError(surname,Surname is required!);
返回INPUT;


if(username == null || username.equals()){
addFieldError(username,Username is required!);
返回INPUT;


if(password == null || password.equals()){
addFieldError(password,Password is required!);
返回INPUT; $!

$ b if(!passwordCheck.equals(password)){
addFieldError(password,密码不匹配!);
addFieldError(passwordCheck,);
返回INPUT;
} else {
return SUCCESS;


Struts.xml:

 < package name =actionsnamespace =/ authenticated / adminextends =struts-default> 

< result> /authenticated/admin/inputAccountSave.jsp< / result>
< / action>

< result name =success> /success.jsp< / result>
< result name =input> /authenticated/admin/inputAccountSave.jsp
< / result>
< / action>

< / package>


< package name =validationsextends =struts-default>

< action name =validateclass =AccountActionmethod =validateForm>
< result name =successtype =redirectAction>
< param name =actionName>注册< / 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 =registeraction =validate> 
< s:submit />
< / s:form>

谢谢

解决方案<首先,你不需要返回INPUT来验证,添加fieldError足以指示工作流拦截器自动返回INPUT。第二,你的方法,动作和表单的命名过于复杂,可能会误导人们......尽量保持事情的简单性。



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



阅读更多关于详细流程,如果你有兴趣的话。



然后在你的情况下:

  public String validateForm(){
return SUCCESS;

$ b $ public void validate(){
if(name == null || name.equals()){
addFieldError(name, 名称是必需的!);
}

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!); $!

$ b if(!passwordCheck.equals(password)){
addFieldError(password,密码不匹配!);
addFieldError(passwordCheck,);
}
}

但是请尽快更改方法/操作名称你自己的安全:)

I have an action for validating some fields in jsp. If this action returns input, it adds an appropriate field error. But after correcting the field and resubmitting the form, this will not resubmit; the field error will stay attached even if all the fields are correct.

Picture 1:

I have submitted the form with empty Surname field. An appropriate field error was added.

Picture 2:

I have then filled the Surname gap, but the error message is stuck and the form wont resubmit.

Validation:

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>

Form:

<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>

Thank you

解决方案

First, you don't need to return INPUT from validate, adding the fieldError will be enough to instruct the Workflow Interceptor to return INPUT automatically.

Second, the naming of your methods, actions and forms is overcomplicateed and potentially misleading... try keeping the things simpler for the future.

Third: you are doing the validation in the Action method. That's not how it works. The action method (by default execute(), but it can be anything, and you have named it validateForm()) must take care of the business of the Action, NOT of the validation. The validation is handled by (XML, Annotations or) a validate() method, that is called by the Validation Interceptor, and is executed before the action is reached. If the validation fails, the action method won't be executed, and the request will be redirected back to the result defined as INPUT.

Read more on the detailed flow if you are interested.

Then in your case:

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", "");
    } 
}

But please change that methods / actions names ASAP, for your own safety :)

这篇关于Struts验证无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆