Struts2 数据校验之四兄弟

Posted 刘二雄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2 数据校验之四兄弟相关的知识,希望对你有一定的参考价值。

现在是科技的时代,大多数人都在网上购物了, 我们都碰到过相同的问题,各大网站弄的那些各种各样的注册页面,相信大家都深有体会。

有了这验证就很好的保证了我们的信息的准确性和安全性。

接下来我给大家讲解一下用struts2怎么实现页面上简单的拦截。

方法一:

用execute()方法来实现

1.0创建一个UserInfo类

package cn.struts.entity;

/**
 * Created by accp on 2017/3/6.
 */
public class UserInfo {
    //用户名
    private String name;
    //密码
    private String pwd;
    //电话
    private String phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

2.0创建一个ExecuteAction继承ActionSupport

package cn.struts.action;

import cn.struts.entity.UserInfo;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Created by accp on 2017/3/6.
 */
public class ExecuteAction extends ActionSupport {

    //用户对象
    private UserInfo user;
    //确认密码
    private String okpwd;

    @Override
    public String execute() throws Exception {
        //判断用户名是否为空
        if (user.getName().length() == 0) {
            addFieldError("name", "用户名不能为空");
        }
        //判断密码是否为空
        if (user.getPwd().length() == 0) {
            addFieldError("pwd", "密码不能为空");
        }
        //判断电号码是否为空
        if (user.getPhone().length() == 0) {
            addFieldError("phone", "电话不能为空");
        }
        //判断两次输入的密码是否一致
        if(!user.getPwd().equals(okpwd)){
            addFieldError("userpwd", "两次密码不一致");
        }
        //这是最重要的判断
        //判断上面是否还存在没有通过的验证
        if (this.hasFieldErrors()) {
            return "input";
        }
        return "success";
    }

    public UserInfo getUser() {
        return user;
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }

    public String getOkpwd() {
        return okpwd;
    }

    public void setOkpwd(String okpwd) {
        this.okpwd = okpwd;
    }
}

3.0编写struts.xml

  <action name="executeAction" class="cn.struts.action.ExecuteAction">
            <result>/success.jsp</result>
            <result name="input">/index.jsp</result>
 </action>

4.0编写页面

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<title>登陆页面</title>
<body>
<s:fielderror></s:fielderror>
<form action="execute" method="post">
    用户名:<input name="user.name"><br/>
    电话:<input name="user.phone"><br/>
    密码:<input name="user.pwd"><br/>
    确认密码:<input name="okpwd"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>
欢迎你:<s:property value="user.name"></s:property></body>
</html>

效果如下:

这些就是我们注册时常常碰到的提示!!!!

方法二:

用validate方法来进行验证

创建实体类我们在这里就省略了,直接创建ValidateAction

1.0ValidateAction继承ActionSupport ,重写了validate()方法

package cn.struts.action;

import cn.struts.entity.UserInfo;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Created by accp on 2017/3/6.
 */
public class ValidateAction extends ActionSupport {
    private UserInfo user;
    private String okpwd;
    @Override
    public void validate() {
        //判断用户名是否为空
        if(user.getName().length()==0){
            addFieldError("name","用户名不能为空");
        }
        //判断密码是否为空
        if(user.getPwd().length()==0){
            addFieldError("pwd","密码不能为空");
        }
        //判断电话是否为空
        if(user.getPhone().length()==0){
            addFieldError("phone","电话不能为空");
        }
        //判断两次密码输入是否一致
        if(!user.getPwd().equals(okpwd)){
            addFieldError("userpwd", "两次密码不一致");
        }
    }

    public UserInfo getUser() {
        return user;
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }

    public String getOkpwd() {
        return okpwd;
    }

    public void setOkpwd(String okpwd) {
        this.okpwd = okpwd;
    }
}

2.0struts.xml:

  <!--validate验证-->
        <action name="validate" class="cn.struts.action.ValidateAction">
            <result>/success.jsp</result>
            <result name="input">/index.jsp</result>
        </action>

我们只需要更改表单提交的名称即可。

3.0index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<title>登陆页面</title>
<body>
<s:fielderror></s:fielderror>
<form action="validate" method="post">
    用户名:<input name="user.name"><br/>
    电话:<input name="user.phone"><br/>
    密码:<input name="user.pwd"><br/>
    确认密码:<input name="okpwd"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

得到的效果跟上述方法一相同。

写到这里同学们有没有疑问?怎么没有验证长度,不可能我们注册或者登录时没有别的条件限制?

能想到这的都是经常上网站购物的..............

接下来我们讲解第三种方法

方法三:

上面我们也提到了可能有别的验证,比如说长度,格式等等之类的。在这里我们定义一个方法来实现。

1.0创建ValidateXxxAction继承ActionASupport

package cn.struts.action;

import cn.struts.entity.UserInfo;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Created by accp on 2017/3/6.
 */
public class ValidateXxxAction  extends ActionSupport{

    private UserInfo user;
    private String okpwd;
    //定义方法来做验证
    public void validateRegist(){
        //用户名的长度
        if(user.getName().length()<6){
            addFieldError("name","用户名长度不能小于6位");
        }
    }
   //这里一定要注意:这个方法名称与上面自己定义的方法的后半部分相同
    public String regist(){
        return SUCCESS;
    }
    @Override
    public void validate() {
        //判断用户名是否为空
        if(user.getName().length()==0){
            addFieldError("name","用户名不能为空");
        }
        //判断密码是否为空
        if(user.getPwd().length()==0){
            addFieldError("pwd","密码不能为空");
        }
        //判断电话是否为空
        if(user.getPhone().length()==0){
            addFieldError("phone","电话不能为空");
        }
        //判断两次密码输入是否一致
        if(!user.getPwd().equals(okpwd)){
            addFieldError("userpwd", "两次密码不一致");
        }
    }

    public UserInfo getUser() {
        return user;
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }

    public String getOkpwd() {
        return okpwd;
    }

    public void setOkpwd(String okpwd) {
        this.okpwd = okpwd;
    }
}

2.0struts.xml

<!--测试ValidateXxxAction -->
        <action name="validatexxx" class="cn.struts.action.ValidateXxxAction" method="regist">
            <result>/success.jsp</result>
            <result name="input">/index.jsp</result>
        </action>

3.0index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<title>登陆页面</title>
<body>
<s:fielderror></s:fielderror>
<form action="validatexxx" method="post">
    用户名:<input name="user.name"><br/>
    电话:<input name="user.phone"><br/>
    密码:<input name="user.pwd"><br/>
    确认密码:<input name="okpwd"><br/>
    <input type="submit" value="提交">
</form>

</body>
</html>

效果图:

除了上述我们讲的这些验证方法之外,struts2框架自身也带有验证。

方法四:

1.0创建ValidateFramework继承ActionSupport

package cn.struts.action;

import cn.struts.entity.UserInfo;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Created by accp on 2017/3/6.
 */
public class ValidateFramework extends ActionSupport {
    private UserInfo user;
    private String okpwd;

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    public UserInfo getUser() {
        return user;
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }

    public String getOkpwd() {
        return okpwd;
    }

    public void setOkpwd(String okpwd) {
        this.okpwd = okpwd;
    }
}

2.0编写ValidateFramework-validation.xml文件

下图是框架验证中验证器的类型图:

<!DOCTYPE
        validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>
    <!--判断用户名-->
    <field name="user.name">
        <!--自段不能为空-->
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用户名不能为空</message>
        </field-validator>
        <!--判断长度是否符合-->
        <field-validator type="stringlength">
            <param name="maxLength">10</param>
            <param name="minLength">6</param>
            <message>用户名的长度必须在${minLength}到${maxLength}</message>
        </field-validator>
    </field>
    <!--判断密码和确认密码-->
    <field name="user.pwd">
        <field-validator type="requiredstring">
            <message>密码不能为空</message>
        </field-validator>
    </field>
    <field name="okpwd">
        <field-validator type="fieldexpression">
            <param name="expression">user.pwd==okpwd</param>
            <message>密码和确认密码必须一致</message>
        </field-validator>
    </field>
    <!--判断电话-->
    <field name="user.phone">
 <filed-validator type="requiredstring">
<message>电话不能为空</message>
</filed-validator> <field-validator type="regex"> <param name="regex">^(\\d{3,4}-){0,1}(\\d{7,8})$</param> <message>电话格式不正确</message> </field-validator> </field> </validators>

3.0编写index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<title>登陆页面</title>
<body>
<s:fielderror></s:fielderror>
<form action="regist" method="post">
    用户名:<input name="user.name"><br/>
    电话:<input name="user.phone"><br/>
    密码:<input name="user.pwd"><br/>
    确认密码:<input name="okpwd"><br/>
    <input type="submit" value="提交">
</form>

</body>
</html>

效果图:

我简单的讲述了几种在struts2中常用的验证方法,在真实的开发模式中有许许多多的方法可以实现。在这里只是传递一种思想,没有多少技术含量..........

 

以上是关于Struts2 数据校验之四兄弟的主要内容,如果未能解决你的问题,请参考以下文章

Struts2之数据校验

struts2:字段校验和非字段校验代码示例

struts2 之 struts2数据校验

Struts2请求参数合法性校验机制

Struts2 校验数据问题

(转)struts2:数据校验,通过XWork校验框架实现(validation.xml)