day28_struts2(全天)のPPT学习——06 使用Struts2的输入校验

来源:互联网 发布:java入门视频百度网盘 编辑:程序博客网 时间:2024/04/30 08:39

day28_struts2(全天)のPPT学习——06 使用Struts2的输入校验.ppt

使用Struts2的输入校验

请求参数的输入校验

  • 输入校验

    1. 客户端校验 过滤正常用户的误操作,通过JS代码完成
    2. 服务器端校验,整个应用阻止非法数据的最后防线
  • Struts2校验方式

    1. 手动完成输入校验
    2. 编写校验规则文件
    3. 基于Annotation的输入校验

手工验证(对action的所有方法进行校验)

  • Jsp页面:

    1. 用户名不能为null,”“
    2. 密码不能为null,”“并且密码的长度6-12之间
  • Action中

    1. 要继承ActionSupport
    2. 重写Validateable接口中的validate()方法,在该方法中完成验证

      步骤如下

      1. validate()方法在其他的业务方法之前执行
      2. 验证出错转向的页面

        struts.xml配置<result name="input">/validate/login.jsp</result>其中input转向是在Action中已经定义好的,public static final String INPUT="input";
      3. 什么时候表示验证出错(转向input所指向的页面)
        1. this.addFieldError(“sss”,”错误信息”);方法指向的是一个集合
        2. 当集合不为空时,转向错误页面

手工验证(对action的<所有方法>进行校验)

显示错误Jsp页面:
使用显示错误消息

手工验证(对action的<指定方法>进行校验

  • validate()方法会校验action中所有与execute方法签名相同的方法。
  • 要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中
    方法名为Xxx的方法。其中Xxx的第一个字母要大写。
  • 当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败
    信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统
    的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。
  • 在input视图中可以通过显示失败信息。

  • validateXxx()方法使用例子:
    public String add() throws Exception{
    return “success”;
    }
    对应的验证方法
    public void validateAdd(){
    //验证代码
    }
    在ValidationInterceptor拦截器中可以看到以validate开始的方法

底层代码(ValidationInterceptor拦截器)

protected void doBeforeInvocation(ActionInvocation invocation) throws Exception{    Object action invocation.getAction();    ActionProxy proxy = invocation.getProxy();    try{        PrefixMethodInvocationUtil.invokePrefixMethod(invocation,new String[]{VALIDATE_PREFIX,ALT_VALIDATE_PREFIX});    }}public static void invokePrefixMethod(ActionInvocation actionInvocation,String[] prefixes){    Object action = actionInvocation.getAction();    String methodName = actionInvocation.getProxy().getMethod();    if(methodName == null){        //if null returns (possible according to the docs),use the default execute        methodName = DEFAULT_INCOCATION_METHODNAME;    }    Method method = getPrefixedMethod(prefixes,methodName,action);    if(method != null){        method.invoke(action,new Object[0]);    }}

手动校验的流程

  1. 类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

  2. 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。

  3. 系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。

  4. 调用action中的validate()方法。

  5. 经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。

基于XML配置方式实现输入校验

  1. 建立Jsp页面,定义需求

    • 用户名不能为null ,”“
    • 密码不能为null, “” 并且密码的长度6-12之间
  2. 定义Action

    • 要继承ActionSupport或者实现Validateable接口:

      public class ValidateXmlAction extends ActionSupport{    private String username;    private String psw;    public String login(){        System.out.println("执行ValidateXmlAction login登录");        return "success";    }}
  3. 配置struts.xml文件

    • 验证出错转向的页面
    • struts.xml配置/validate/loginxml.jsp
      其中input转向是在action中已经定义好的.

      <action name="validateXmlAction_*" class="cn.itcast.validate.ValidateXmlAction" method="{1}">    <result name="success">/validate/success.jsp</result>    <result name="input">/validate/login.jsp</result></action>
  4. 配置验证的xml文件

    • 验证的xml文件的规范在xwork-core-2.3.1.1.jar包下的:xwork-validator-1.0.3.dtd
    • 验证文件的命名

    • * 在这个校验文件中,对action中字符串类型的username属性进行验证,
      首先要求调用trim()方法去掉空格,然后判断用户名是否为空。
      * 该文件需要和action类放在同一个包下,文件的取名应遵守
      ActionClassName-validation.xml规则,其中ActionClassName为action
      的简单类名,-validation为固定写法。
      * 例如:如果Action类为cn.itcast.validate.ValidateXmlAction. 那么该文件
      的取名应为:ValidateXmlAction-validation.xml
      * ValidateXmlAction-validation.xml为文件的配置如下


5.

    <validators>: 根元素     <field>:指定action中要校验的属性,name属性指定将被验证的表单字段的名字    <field-validator>:指定校验器, type 指定验证规则         上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求          的校验器,这些校验器的定义可以在xwork-2.x.jar中的          com.opensymphony.xwork2.validator.validators下的default.xml中找到。    <param>:子元素可以向验证程序传递参数    <message>:子元素为校验失败后的提示信息,如果需要国际化,可以为message               指定key属性,key的值为属性文件中的key。    <validators>        <!--             validator:生命验证规则             *name:验证规则的唯一名称             *class:验证规则对应类的完整路径            -->        <validator name="required" class="...."/>        <validator name="requiredstring" class="...."/>        <validator name="int" class="...."/>        <validator name="long" class="...."/>        <validator name="short" class="...."/>        <validator name="double" class="...."/>        <validator name="date" class="...."/>        <validator name="expression" class="...."/>        <validator name="fieldexpression" class="...."/>        <validator name="email" class="...."/>        <validator name="required" class="...."/>        <validator name="regex" class="...."/>        ...........    </validators>

struts2提供的校验器列表

系统提供的校验器如下:required (必填校验器,要求被校验的属性值不能为null)requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)stringlength(字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)regex(正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)conversion(转换校验器,指定在类型转换失败时,提示的错误信息)visitor(用于校验action中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性)expression(OGNL表达式校验器,它是一个非字段校验器, expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)

ValidateXmlAction-validation.xml配置

<validators>    <!-- 指定Action中要校验的属性,name属性指定将被验证的表单字段的名字-->    <field name="username">        <!-- 指定校验器,type指定校验规则            required:验证输入的字段不能为空(本例的需求是用户名不能为空)            requiredstring:对应的是com.opensymphony.xwork2.validator.validators.RequiredStringValidator类        -->        <field-validator type="requiredstring">            <!-- trim是RequiredStringValidator类中的属性,运行时通过set方法赋值-->            <param name="trim">true</param>            <!-- 错误信息-->            <message><![CDATA[(XML)用户名不能为空]]></message>        <field-validator>    </field>    <field name="psw">        <field-validator type="requiredstring">            <param name="trim">true</param>            <message><![CDATA[(XML)密码不能为空]]></message>        </field-validator>        <!--正则表达式校验器            validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"        -->        <field-validator type="regex">            <param name="expression"><![CDATA[^[a-zA-Z0-9](6,12)$]]></param>            <message><![CDATA[(XML)密码长度应该为6-12位之间]]></message>        </field-validator>    </field></validators>



1.基于RequiredStringValidator类中的trim属性的配置

 <field name="username">    <field-validator type="requiredstring">       <param name="trim">true</param>//这里的trim对应下面类的setTrim方法       <message><![CDATA[用户名不能空!!!!!]]></message>    </field-validator>  </field>public class RequiredStringValidator extends FieldValidatorSupport {    private boolean doTrim = true;    public void setTrim(boolean trim) {        doTrim = trim;    }public void validate(Object object) throws ValidationException {        String fieldName = getFieldName(); //username        Object value = this.getFieldValue(fieldName, object);   //"  "            String s = (String) value;              if (doTrim) {                s = s.trim();            }            if (s.length() == 0) {                addFieldError(fieldName, object);            }        }    }}

2.基于 RegexFieldValidator类中的expression属性的配置

 <field-validator type="regex">        <param name="expression"><![CDATA[^[a-zA-Z0-9]{6,12}$]]></param>        <message><![CDATA[密码的长度应该在6-12之间]]></message> </field-validator>public class RegexFieldValidator extends FieldValidatorSupport {    private String expression="^[a-zA-Z0-9]{6,12}$";        public void setExpression(String expression) {        this.expression = expression;    }    public void validate(Object object) throws ValidationException {        String fieldName = getFieldName();  //psw         Object value = this.getFieldValue(fieldName, object);  //aa        Pattern pattern;        pattern = Pattern.compile(expression);        String compare = (String) value;        if ( trim ) {            compare = compare.trim();        }        Matcher matcher = pattern.matcher( compare );        if (!matcher.matches()) {            addFieldError(fieldName, object);        }    }}

校验器案例

required  必填校验器<field-validator type="required">       <message>性别不能为空!</message></field-validator>requiredstring  必填字符串校验器<field-validator type="requiredstring">       <param name="trim">true</param>       <message>用户名不能为空!</message></field-validator>stringlength:字符串长度校验器<field-validator type="stringlength">    <param name="maxLength">10</param>    <param name="minLength">2</param>    <param name="trim">true</param>    <message><![CDATA[产品名称应在2-10个字符之间]]></message></field-validator>int:整数校验器<field-validator type="int">    <param name="min">1</param>    <param name="max">150</param>    <message>年龄必须在1-150之间</message></field-validator>date: 日期校验器<field-validator type="date">    <param name="min">1900-01-01</param>    <param name="max">2050-02-21</param>    <message>生日必须在${min}到${max}之间</message></field-validator>url:  网络路径校验器<field-validator type="url">    <message>传智播客的主页地址必须是一个有效网址</message></field-validator>email:邮件地址校验器<field-validator type="email">    <message>电子邮件地址无效</message></field-validator>regex:正则表达式校验器<field-validator type="regex">     <param name="expression"><![CDATA[^13\d{9}$]]></param>     <message>手机号格式不正确!</message></field-validator>fieldexpression : 字段表达式校验<field-validator type="fieldexpression">       <param name="expression"><![CDATA[(password==repassword)]]></param>       <message>两次密码输入不一致</message></field-validator>

基于XML配置方式对指定action方法实现输入校验

  • 当校验文件的取名为ActionClassName-validation.xml时,会对 action中的所有处理方法实施输入验证。
  • 如果你只需要对action中的某个action方法实施校验,那么,校验文件的取名应为:ActionClassName-ActionName-validation.xml,其中ActionName为struts.xml中action的名称。例如:在实际应用中,常有以下配置:

    <action name="user_*" class="cn.itcast.action.UserAction" method="{1}">    <result name="success">/WEB-INF/page/message.jsp</result>    <result name="input">/WEB-INF/page/addUser.jsp</result></action>

    UserAction中有以下两个处理方法:

    public String add() throws Exception{   ....}public String update() throws Exception{   ....}
  • 要对add()方法实施验证,校验文件的取名为: UserAction-user_add-validation.xml
  • 要对update()方法实施验证,校验文件的取名为: UserAction-user_update-validation.xml

基于XML校验的一些特点

当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:

1。AconClassName-validation.xml2。ActionClassName-ActionName-validation.xml
  • 系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于处理方法的校验。
  • 如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则。
  • 当action继承了另一个action,父类action的校验文件会先被搜索到。假设UserAction继承BaseAction, UserAction在struts.xml的配置如下:

    <action name="user" class="cn.itcast.action.UserAction" method="{1}">    .....</action>
  • 访问上面名为user的action,系统先搜索到BaseAction-validation.xml, BaseAction-user-validation.xml,接着搜索到UserAction-validation.xml, UserAction-user-validation.xml。校验规则是这四个文件的总和。

编写校验文件时,不能出现帮助信息

在编写ActionClassName-validation.xml校验文件时,如果出现不了帮助信息,可以按下面方式解决:

    windwos->preferences->myeclipse->files and editors->xml->xmlcatalog

点“add”,在出现的窗口中的location中选“File system”,然后在xwork-2.1.2解压目录的src\java目录中选择xwork-validator-1.0.3.dtd,回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd


自定义验证规则

  • 自定义验证程序必须实现 Validator 接口.
  • Validation 拦截器负责加载和执行各种验证程序. 在加载了一个验证程序之后, 这个拦截器将调用那个验证程序的 setValidatorContext 方法, 把当前的 ValidatorContext 对象传递给它, 这使程序员可以访问当前 Action. 接下来, Validation 拦截器将调用 validate 方法并把需要验证的对象传递给它. validate 方法是编写一个自定义的验证程序时需要覆盖的方法.
  • ValidatorSupport 和 FieldValidatorSupport 实现了 Validator 接口
    若需要普通的验证程序, 可以继承 ValidatorSupport 类
    若需要字段验证程序, 可以继承 FieldValidatorSupport 类
    若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性
  • 注册验证程序: 自定义验证器需要在类路径里的某个 validators.xml 文件里注册:验证框架首先在根目录src下找validators.xml文件,没找到validators.xml文件, 验证框架将调用默认的验证设置,即default.xml里面的配置信息.
  • 位于com.opensymphony.xwork2.validator.validators 包下

    需求:自定义一个 age 的验证器, 使 age 不能小于 01、 在jsp页面增加一个组件  <s:textfield name="age" />2、在action中增加private Integer age属性3、自定义验证规则public class AgeValidate extends FieldValidatorSupport {/** * object 表示当前执行的action对象 *     object  cn.itcast.validate.ValidateXmlAction@12dcb8c */public void validate(Object object) throws ValidationException {  System.out.println("object  "+object);  //获取字段的名称  age  String fieldName=this.getFieldName();  //获取字段的值  Object fieldValue=this.getFieldValue(fieldName, object);  System.out.println(fieldName  +"  "+fieldValue);  if(fieldValue instanceof Integer){  Integer age=(Integer)fieldValue;  if(age<0){         this.addFieldError(fieldName, object);  } }}}4、在工程的src下新建validators.xml文件,在文件中增加如下内容该xml文件采用的规范在xwork-core-2.1.6.jar包下的xwork-validator-config-1.0.dtd<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC        "-//OpenSymphony Group//Xwork Validator Config 1.0//EN"        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd"><validators>    <validator name="age" class="cn.itcast.validate.AgeValidate"/></validators>5、在ValidateXmlAction-validation.xml文件中增加如下内容<field name="age">    <field-validator type="age">        <message><![CDATA[年龄不能为负数]]></message>    </field-validator></field>
0 0
原创粉丝点击