天天看点

Struts2-服务端验证

一、使用ActionSupport编码实现验证

1、在Action类的业务方法中直接验证

示例代码(JavaBean方式获取数据)

  • 用户提交数据页面
<s:form action="error01" method="post">

    <s:textfield name="user.uname" id="uname">用户名:</s:textfield>
    <p/>
    <s:password name="user.pwd" id="pwd">密码:</s:password>
    <br/>
    <s:submit value="提交"></s:submit>

</s:form>
           
  • action配置
<action name="error01" class="com.pb08.demo01.UserAction">
    <result>/jsp/_使用ActionSupport编码实现验证/_在Action类的业务方法中直接验证jsp</result>
    <result name="input">/jsp/_使用ActionSupport编码实现验证/_在Action类的业务方法中直接验证jsp</result>
</action>
           
  • action类代码(关键)
、JavaBean代码略

、action类代码

public class UserAction extends ActionSupport {

    private User user;

    @Override
    public String execute() throws Exception {
        System.out.println("进入execute方法");
        /*验证用户名*/
        if(null == user.getUname() || "".equals(user.getUname())) {
            System.out.println("用户名不能为空");
            this.addFieldError("user.uname", "用户名不能为空(业务方法)");
        }

        /*验证密码*/
        if(null == user.getPwd() || "".equals(user.getPwd())) {
            System.out.println("密码不能为空");
            this.addFieldError("user.pwd", "密码不能为空(业务方法)");
        }

        /*完成注册的业务*/
        if(!(user.getUname().equals(user.getPwd()))) {
            System.out.println("用户名或密码错误");
            this.addActionError("用户名或密码错误!");
        }

        if(this.hasErrors()) {
            System.out.println("有hasFieldErrors错误!!!!!");
            return INPUT;
        }
        System.out.println("没错误!!!!!!");
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }

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

}
           
  • 错误页面代码
<body>
    用户名错误显示:<s:fielderror fieldName="user.uname"></s:fielderror>

    <hr/>

    用户密码错误显示:<s:fielderror fieldName="user.pwd"></s:fielderror>

    <hr/>

    action错误显示:<s:actionerror/>
</body>
           
  • 总结

    关键代码是addFieldError()方法和addActionError()方法,这俩个方法是用来添加错误信息。其中,addFieldError()用来添加与字段相关的错误信息,如用户名错误,addActionError()用来添加于Action所处理的业务相关的错误信息。在页面上,用

    <s:fielderror/>

    标签输出addFieldError()方法添加的错误信息,用

    <s:actionerror/>标签输出addActionError()方法添加的错误信息。

2、重写validate()方法实现验证

  • 用户输入信息页面
<body>
<s:form action="error02" method="post">

    <s:textfield name="userInfo.username" id="uname">用户名:</s:textfield>
    <s:password name="userInfo.userpwd" id="pwd">密码:</s:password>

    <s:submit value="提交"></s:submit>

</s:form>
</body>
           
  • action配置
<action name="error02" class="com.pb08.demo02.UserAction">
    <result>/jsp/08_使用ActionSupport编码实现验证/02_重写validate()方法实现验证01.jsp</result>
    <!--使用validate验证必须配置此result-->
    <result name="input">/jsp/08_使用ActionSupport编码实现验证/02_重写validate()方法实现验证02.jsp</result>
</action>
           
  • action类代码
、JavaBean代码略

、action类

public class UserAction extends ActionSupport {

    private UserInfo userInfo;

    @Override
    public String execute() throws Exception {
        System.out.println("进入execute方法");
        /*完成注册的业务*/
        if(!(userInfo.getUsername().equals(userInfo.getUserpwd()))) {
            this.addActionError("用户名或密码错误!");
        }
        System.out.println("完成注册的业务...");
        if(this.hasErrors()) {
            return INPUT;
        }
        System.out.println("登陆成功");
        return SUCCESS;
    }

    @Override
    public void validate() {
        System.out.println("进入validate方法");
        /*验证用户名*/
        if(null == userInfo.getUsername() || "".equals(userInfo.getUsername())) {
            System.out.println("用户名不能为空");
            this.addFieldError("user.uname", "用户名不能为空!");
        }

        /*验证密码*/
        if(null == userInfo.getUserpwd() || "".equals(userInfo.getUserpwd())) {
            System.out.println("密码不能为空");
            this.addFieldError("user.pwd", "密码不能为空");
        }

    }

    public UserInfo getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(UserInfo userInfo) {
        this.userInfo = userInfo;
    }

}
           
  • 错误页面
<body>
    <s:fielderror fieldName="user.uname"></s:fielderror>
    <s:fielderror fieldName="user.pwd"></s:fielderror>
    <s:actionerror />
</body>
           
  • 总结

    执行以上代码从控制台输出信息顺序来看,当进入action类后,首先会执行validate方法,如果validate方法没有添加错误,则会执行指定的action业务方法,这里默认是execcute,否则不会执行业务方法,最后还有一点需要注意,每次执行业务方法前,都会先执行一次validate方法。

3、使用validateXxx()方法实现验证

上面总结说了,使用validate()验证时,每次执行业务方法前都会执行validate()方法进行验证,如果只想对某个业务方法进行验证,可以使用validateXxx()方法来验证

  • 用户输入数据页面
<body>
<s:form action="error03" method="post">

    <s:textfield name="userInfo.uname" id="uname">用户名:</s:textfield>
    <s:password name="userInfo.pwd" id="pwd">密码:</s:password>

    <s:submit value="提交"></s:submit>

</s:form>
</body>
           
  • action配置
<action name="error03" class="com.pb08.demo03.UserAction" method="register">
    <result>/jsp/08_使用ActionSupport编码实现验证/03_使用validate方法实现验证01.jsp</result>
    <!--使用validateXxx验证必须配置此result-->
    <result name="input">/jsp/08_使用ActionSupport编码实现验证/03_使用validate方法实现验证02.jsp</result>
</action>
           
  • action类代码
public class UserAction extends ActionSupport {

    private UserInfo userInfo;

    public String register() {
        /*完成注册的业务*/
        System.out.println("完成注册的业务");
        if(!(userInfo.getUname().equals(userInfo.getPwd()))) {
            this.addActionError("用户名或密码错误");
        }

        if(this.hasErrors()) {
            return INPUT;
        }
        return SUCCESS;
    }

    public void validateRegister() {
        System.out.println("validateRegister" + userInfo.getUname() + "|" + userInfo.getPwd());
        if(null == userInfo.getUname() || "".equals(userInfo.getUname())) {
            System.out.println("用户名不能为空");
            this.addFieldError("user.uname", "用户名不能为空");
        }

        if(null == userInfo.getPwd() || "".equals(userInfo.getPwd())) {
            System.out.println("密码不能为空");
            this.addFieldError("user.pwd", "密码不能为空");
        }
    }

    public UserInfo getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(UserInfo userInfo) {
        this.userInfo = userInfo;
    }

}
           
  • 错误页面
<body>
    <s:fielderror fieldName="user.uname"></s:fielderror>
    <s:fielderror fieldName="user.pwd"></s:fielderror>
    <s:actionerror />
</body>
           
  • 总结

    执行以上代码可以看出validateXxx()方法的Xxx可以匹配业务方法名,如果业务方法名叫做abc,那么Xxx就是Abc,首字母大写。这样当调用指定名称的业务方法前只会调用与之匹配的validateXxx方法。

二、使用验证框架实现验证

使用验证框架进行验证后期维护无需修改代码,只需要修改配置文件

步骤:

1、编写JSP用户数据输入页面

2、编写Action类及其配置文件

3、在与Action类相同的目录下创建验证文件ActionName-validation.xml,其中ActionName与需要验证的Action类名相同

4、编写验证规则

代码示例:

  • action
<action name="house_*" class="com.bc.action.HouseAction" method="{1}">
    <result>/WEB-INF/jsp/house.jsp</result>
    //必须有input对应的页面
    <result name="input">/WEB-INF/jsp/house.jsp</result>
</action>
           
  • action类
//House类略

public class HouseAction extends BaseAction {

    private static final long serialVersionUID = L;

    private House house;

    public String house() throws Exception {
        return SUCCESS;
    }

    public String check() throws Exception {
        if("".equals(house.getTitle())) {
            return INPUT;
        }
        return SUCCESS;
    }

    public House getHouse() {
        return house;
    }

    public void setHouse(House house) {
        this.house = house;
    }

}
           
  • 验证框架xml代码

xml名称格式:action类名-要验证的action名-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="house.title">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>标题不能为空!</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">4</param>
            <param name="maxLength">20</param>
            <param name="trim">true</param>
            <message>标题必须为4至20个字符</message>
        </field-validator>
    </field>
    <field name="house.content">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>内容不能为空!</message>
        </field-validator>
    </field>
    <field name="house.address">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>地址不能为空!</message>
        </field-validator>
    </field>
    <field name="house.telNum">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>联系方式不能为空!</message>
        </field-validator>
    </field>
    <field name="house.date">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>日期不能为空!</message>
        </field-validator>
    </field>
</validators>
           
  • 页面
<s:form action="house_check" method="post" namespace="/">
    <s:textfield name="house.title" label="标题"/>
    <s:textarea name="house.content" label="内容"/>
    <s:textfield name="house.address" label="地点"/>
    <s:textfield name="house.telNum" label="联系电话"/>
    <s:textfield name="house.date" label="发布时间"/>
    <s:submit value="提交"/>
</s:form>
           

继续阅读