zoukankan      html  css  js  c++  java
  • struts2的输入校验

    在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。

    对于输入校验struts2提供了两种实现方法:

    1,采用手工编写代码实现,在action中通过重写validate()方法实现,validate()方法会校验action中所有与execute()方法签名相同的方法,但是action要继承ActionSupport类。

    package control.center;

    import java.util.regex.Pattern;

    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    public class PersonAction extends ActionSupport{

     private String username;
     private String mobile;
     
     public String getUsername() {
      return username;
     }
     public void setUsername(String username) {
      this.username = username;
     }
     public String getMobile() {
      return mobile;
     }
     public void setMobile(String mobile) {
      this.mobile = mobile;
     }
     public String update()
     {
      ActionContext.getContext().put("message","更新成功");
      return "message";
     }
     public String save()
     {
      ActionContext.getContext().put("message","保存成功");
      return "";
     }
     @Override
     public void validate() {
      if(this.username==null||"".equals(this.username.trim()))
      {
       //向FieldError对象中加入错误信息
       this.addFieldError("username", "用户名不能为空");
      }
      if(this.mobile==null||"".equals(this.mobile.trim()))
      {
         this.addFieldError("mobile", "手机号不能为空"); 
      }else
          if(Pattern.compile("^1[358]\\d{9}").matcher(this.mobile).matches())
          {
          this.addFieldError("mobile", "手机号格式不正确");
          }
      super.validate();
     }
    }

    <struts>
        <package name="employee" namespace="/control/center" extends="struts-default">
            <action name="message_*" class="control.center.HelloWordAction" method="{1}">
                 <result name="message">/WEB-INF/pages/message.jsp</result>
            </action>
        </package>
    </struts>

    通过validateXxx()方法实现,validateXxx()只会校验action中方法名为Xxx的方法,其中Xxx的第一个字母大写。

    public void validateUpdate() {
      if(this.username==null||"".equals(this.username.trim()))
      {
       //向FieldError对象中加入错误信息
       this.addFieldError("username", "用户名不能为空");
      }
      if(this.mobile==null||"".equals(this.mobile.trim()))
      {
         this.addFieldError("mobile", "手机号不能为空"); 
      }else
          if(Pattern.compile("^1[358]\\d{9}").matcher(this.mobile).matches())
          {
          this.addFieldError("mobile", "手机号格式不正确");
          }
      super.validate();
     }

    输入校验流程:

    表单提交数据后,struts2调用类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性;如果在执行类型转换的过程中出现异常,系统会将异常信息保存在ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,不管类型转换器是否出现异常,系统都会通过反射技术先调用action中的validateXxx()方法,Xxx为方法名;最后调用action中的valiedate()方法,如果系统中的fieldErrors存在错误信息,系统自动将请求转发至input视图中,如果系统中fieldErrors没有任何错误信息,系统将执行action中的处理方法。

    在类型转换出现异常,或者验证出错了那么fieldErrors中则有数据。

    2,基于xml配置方式实现

    使用基于xml配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName-validation.xml,其中ActionClassName为action的简单类名,-validate为固定写法。

    package control.center;

    import java.util.regex.Pattern;

    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    public class PersonAction extends ActionSupport{

     private String username;
     private String mobile;
     
     public String getUsername() {
      return username;
     }
     public void setUsername(String username) {
      this.username = username;
     }
     public String getMobile() {
      return mobile;
     }
     public void setMobile(String mobile) {
      this.mobile = mobile;
     }

    }

    xml配置文件:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE validators PUBLIC
            "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
            "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

    <validators>
        <field name="username">
           <!-- field-validator 指定校验器 并向校验器中注入值 -->
            <field-validator type="requiredstring">
                <param name="trim">true</param>
                <message>用户名不能为空</message>
            </field-validator>
        </field>
        <field name="mobile">
            <field-validator type="requiredstring">
                <message>手机号不能为空</message>
            </field-validator>
            <!-- 正则校验器 -->
             <field-validator type="regex">
                <param name="expression"><![CDATA[^1[358]\d{9}]]></param>
                <message>手机号不能为空</message>
            </field-validator>
        </field>
    </validators>

    struts2配置文件:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

    <struts>
        <package name="employee" namespace="/control/center" extends="struts-default">
            <action name="message_*" class="control.center.HelloWordAction" method="{1}">
                 <result name="input">/index.jsp</result>
                 <result name="message">/WEB-INF/pages/message.jsp</result>
            </action>
        </package>
    </struts>

    jsp页面使用jstl显示错误信息。

    通过xml配置文件对指定方法进行校验:

    当校验文件的取名为ActionClassName-validation.xml时,会对action中的所有处理方法实现输入验证,如果你只需要对action中的某个action方法实现校验,那么校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称。

    然后再校验文件中配置好校验信息即可。

  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1965800.html
Copyright © 2011-2022 走看看