Struts2系统学习(13)输入校验-采用手工编写代码实现校验

13. 输入校验

  在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。
  对于输入校验,struts2提供了两种实现方法:
  1. 采用手工编写代码实现。
  2. 基于XML配置方式实现。
  3. 采用Annotations配置方式实现(deprecated)。

  这一节,主要讨论采用手工编写代码实现校验。

13.1 对action所有方法进行校验

  通过重写validate() 方法实现, validate()方法会校验action中所有与execute方法签名相同public String xxx()的方法,即在调用action的execute等方法之前对用户的输入信息进行校验。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action需要继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result视图。在input视图中可以通过显示失败信息。
  案例一:对用户输入的用户名和手机号码进行校验。要求输入字段不能为空,手机号码符合要求。

  (1)用户输入界面input.jsp

<form action="/Struts2Study/day05_2/login.action" method="post">
        username:<input type="text" name="username"/><br>
        phone: <input type="text" name="phone"/><br>
        <input type="submit" value="注册">
</form>

  (2)LoginAction对用户输入进行校验

public class LoginAction extends ActionSupport{

    private String message;
    private String username;
    private String phone;

    // 省略了set和get方法

    public String execute() {
        this.message = "注册成功!";
        return "message";
    }

    /* ActionSupport类的validates()方法实现了默认的校验实现,但没有实质性的校验
     * 因此ActionSupport的子类需要覆盖这个方法以提供校验。
     */
    @Override
    public void validate() {

        if (this.username == null || "".equals(this.username)) {
            this.addFieldError("errormessage", "用户名不能为空!");
        }
        if (this.phone == null || "".equals(this.phone)) {
            this.addFieldError("errormessage", "号码不能为空!");
        } else {
            String regex ="^1[358]\\d{9}$";
            boolean phone = Pattern.compile(regex).matcher(this.phone).matches();
            if (!phone) {
                this.addFieldError("errormessage", "号码格式出错!");
            }
        }
    }
}

  (3)配置struts.xml

    <package name="day05-2" namespace="/day05_2" extends="struts-default">
            <action name="login" class="com.markliu.day05.interceptor.LoginAction" method="execute">
                    <result name="message">/pages/day05/message.jsp</result>
                    <result name="input">/pages/day05/input.jsp</result>
            </action>
    </package>

  如果验证失败,即validate()函数执行完,且设置类错误信息addFieldError(),则不会继续执行action中锁验证的方法,直接跳转到name为input的视图,此处重新转发到登录输入界面。

  (4)为input视图获取fielderror信息

<s:fielderror />

13.2 对action指定方法进行校验

  通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
  所以上述案例如果只针对save方法进行校验,则只提供validateSave()即可:

    public void validateSave() {

        if (this.username == null || "".equals(this.username)) {
            this.addFieldError("errormessage", "用户名不能为空!");
        }
        if (this.phone == null || "".equals(this.phone)) {
            this.addFieldError("errormessage", "号码不能为空!");
        } else {
            String regex ="^1[358]\\d{9}$";
            boolean phone = Pattern.compile(regex).matcher(this.phone).matches();
            if (!phone) {
                this.addFieldError("errormessage", "号码格式出错!");
            }
        }
    }

13.3 校验执行流程:

  1. 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
  2. 转换过程中若出现异常,则将异常信息保存到ActionContext中,conversionError拦截器将其添加到fieldError中。不管类型转换是否出现异常,都会进入第3步。
  3. 通过反射调用validateXxx()方法(自定义校验的方法)。
  4. 调用validate()。
  5. 如果未出现异常,则转入用户请求的处理方法,如果出现异常,则转入inout视图所指定的视图资源。

      注意:由于类型转换出现异常,也会将错误信息添加到fileErrors中,不管validateXxx()和validate()方法校验是否成功,都会跳转到input视图,所以如果应用中出现校验正确仍然跳转到input视图,则需考虑是否是类型转换异常。当然了,类型转换异常在后台console中还容易发现。

    转载请注明出处:http://blog.csdn.net/mark_lq/article/details/49804285

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunny Mornings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值