Struts2输入校验剖析之编码方式校验

Terwer Struts2评论147字数 5523阅读18分24秒阅读模式

Struts2 提供了两种校验方式。文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

使用编码方式进行校验

新建 register.jsp 页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register</title>
</head>
<body>
    <h2 style="color:blue;">用户注册</h2>

    <s:actionerror cssStyle="color:red;" />

    ----------------------------------------------------------------------

    <%--
    <form action="register.action">
        username: <input type="text" name="username" size="20" /><br/>
        password: <input type="password" name="password" size="20" /><br/>
        repassword: <input type="password" name="repassword" size="20" /><br/>
        age: <input type="text" name="age" size="20" /><br/>
        birthday: <input type="text" name="birthday" size="20"/><br/>
        geaduation: <input type="text" name="graduation" size="20"/><br/>

        <input type="submit" value="submit"/>
    </form>
     --%>

    <s:fielderror cssStyle="color:blue;"></s:fielderror>
    <s:form action="register" theme="simple">
        username:<s:textfield name="username" label="username"></s:textfield><br/>
        password: <s:password name="password" label="password"></s:password><br/>
        repassword: <s:password name="repassword" label="repassword"></s:password><br/>
        age: <s:textfield name="age" label="age"></s:textfield><br/>
        birthday: <s:textfield name="birthday" label="birthday"></s:textfield><br/>
        geaduation: <s:textfield name="graduation" label="graduation"></s:textfield><br/>

        <s:submit value="submit"></s:submit>
    </s:form>

    <%--
    <s:form action="register">
        <s:textfield name="username" label="username"></s:textfield>
        <s:password name="password" label="password"></s:password>
        <s:password name="repassword" label="repassword"></s:password>
        <s:textfield name="age" label="age"></s:textfield>
        <s:textfield name="birthday" label="birthday"></s:textfield>
        <s:textfield name="graduation" label="graduation"></s:textfield>

        <s:submit value="submit"></s:submit>
    </s:form>
    --%>
</body>
</html>

流程处理的 Action

package space.terwer.struts23;

import java.util.Calendar;
import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {
    private String username;
    private String password;
    private String repassword;
    private Integer age;
    private Date birthday;
    private Date graduation;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRepassword() {
        return repassword;
    }

    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Date getGraduation() {
        return graduation;
    }

    public void setGraduation(Date graduation) {
        this.graduation = graduation;
    }

    @Override
    public void validate() {
        // System.out.println("validate incoked");

        if (null == this.getUsername() || this.getUsername().length() < 4 || this.getUsername().length() > 6) {
            this.addActionError("username invalid");

            this.addFieldError("username", "username invalid in field");
            this.addFieldError("username", "username invalid in field2");
        }

        if (null == this.getPassword() || this.getPassword().length() < 4 || this.getPassword().length() > 6) {
            this.addActionError("password invalid");
        } else if (null == this.getRepassword() || this.getRepassword().length() < 4
                || this.getRepassword().length() > 6) {
            this.addActionError("repassword invalid");
        } else if (!this.getPassword().equals(this.getRepassword())) {
            this.addActionError("the passwords not same");
        }

        if (this.getAge() < 10 || this.getAge() > 50) {
            this.addActionError("age invalid");
        }

        if (null == this.getBirthday()) {
            this.addActionError("birthday invalid");
        }

        if (null == this.getGraduation()) {
            this.addActionError("graduation invalid");
        }

        if (null != this.getBirthday() && null != this.getGraduation()) {
            Calendar c1 = Calendar.getInstance();
            c1.setTime(this.getBirthday());

            Calendar c2 = Calendar.getInstance();
            c2.setTime(this.getGraduation());

            if (c1.after(c2)) {
                this.addActionError("birthday should be before graduation");
            }
        }

        // 注意:这样不行
        // this.getFieldErrors().clear();
        // this.getActionErrors().clear();

        // 下面的代码可以直接清空错误,直接跳转
        // this.clearFieldErrors();
        // this.clearActionErrors();

        System.out.println("error cleared");
    }

    @Override
    public String execute() throws Exception {
        // System.out.println("execute invoked");
        return SUCCESS;
    }
}

流程处理 struts.xml

<action name="register" class="space.terwer.struts23.RegisterAction">
    <result name="success">/registerResult.jsp</result>
    <result name="input">/register.jsp</result>
</action>

结果页面 registerResult.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>  

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Register result</title>
</head>
<body>
    username: <s:property value="username"/><br/>
    password: <s:property value="password"/><br/>
    age: <s:property value="age"/><br/>
    birthday: <s:property value="birthday"/><br/>
    graduation: <s:property value="graduation"/><br/>
</body>
</html>

效果

Struts2输入校验剖析之编码方式校验文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

加入字段校验之后文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

Struts2输入校验剖析之编码方式校验文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

总结

  1. 执行流程:然后进行输入校验(执行 validate方法
    1. 首先进行类转换
    2. 然后进行输入校验(执行 validate​ 方法)
    3. 如果在上述过程中出现了任何错误,都不会再去执行 execute​ 方法,页面会转向 struts.xml​ 该 Action​ 的名为 input​ 的 result​ 所对应的页面。
  2. ActionSupport​​​ 类的 addActionError()​​​ 方法的视线:首先创建一个 ArrayList​​​ 对象,然后将错误消息添加到该 ArrayList​​​ 对象中。文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html
  3. 当调用 getActionErrors()​ 方法返回 Action​ 级别的错误信息列表时,返回的实际上是集合的一个副本,而非原集合中的元素,因此对集合副本调用 clear() 方法清除的依旧是副本中的元素而非原集合中的元素,此时原集合中的元素没有受到任何影响。文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

    如果需要清空,可以调用文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

    注意:清空错误的方法不能使用 clearActionErrors()​ ,这个操作的是错误对象列表。文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

    // 注意:这样不行
    this.getFieldErrors().clear();
    this.getActionErrors().clear();
    

    必须使用文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

    // 下面的代码可以直接清空错误,直接跳转
    this.clearFieldErrors();
    this.clearActionErrors();
    

    Struts2输入校验剖析之编码方式校验文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

  4. FieldError​ 级别的错误信息底层是用 LinkedHashMap​ 实现的,该 Map​ 的 key​ 是 String​ 类型, value​ 是 List<String>​ 类型,这表示一个 Field Name​ 可以对应多条错误信息,这些错误信息都放置在 List<String>​ 集合中。文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html

文章源自浅海拾贝-https://blog.terwergreen.com/struts2-input-verification-analysis-encoding-method-verification-jhxef.html
相关文章
  • 扫码加我微信
  • 验证消息请输入:来自你的博客
  • weinxin
  • 我的微信公众号
  • 微信扫一扫与我交流吧
  • weinxin
Terwer
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: