struts2用户校验解析和源码

 

struts2用户校验解析和源码

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

1. 采用手工编写代码实现。

2. 基于XML配置方式实现。

二  首先介绍一下手动的编写代码

         手动的用户校验分为对action中所有方法进行校验和指定的方法进行校验

1. 对action中所有方法都进行校验的

(1)       首先是一个登入的页面:

  <body>

    <div>

    <form action="${pageContext.request.contextPath}/csdn/login.action" method="post">

        用户名:<input type="text" name="uname"/><br/>

        密码:<input type="text" name="upass"/>

        <input type="submit" value="登入"/>

    </form>

    </div>

  </body>

 

2.在struts.xml中的配置

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <package name="validate" extends="struts-default" namespace="/csdn">

       <action name="login" class="cn.csdn.hr.action.LoginAction">

           <result name="success">../index.jsp</result>

           <result name="input">/WEB-INF/error.jsp</result>

       </action> 

    </package>

</struts>

 

从配置中可以看出当访问到struts.xml后,会跳到LoginAction中去进行校验,校验的.为LoginAction.java,首先来接收传过来的参数并赋值

 

3.校验action

package cn.csdn.hr.action;

 

import com.opensymphony.xwork2.ActionSupport;

 

public class LoginAction extends ActionSupport {

 

    private static final long serialVersionUID = 1L;

    private String uname;

    private String upass;

 

    public LoginAction() {

       super();

       // TODO Auto-generated constructor stub

    }

 

    public String getUname() {

       return uname;

    }

 

    public void setUname(String uname) {

       this.uname = uname;

    }

 

    public String getUpass() {

       return upass;

    }

 

    public void setUpass(String upass) {

       this.upass = upass;

    }

 

    //进行校验信息

    public void validate () {

       System.out.println("正在校验信息、、、、、");

       if ("".equals(uname) || uname == null) {

           // 添加错误信息

           this.addFieldError("msg", "用户名不能为空");

       }

       if ("".equals(upass) || upass == null) {

           // 添加错误信息

           this.addFieldError("msg", "密码不能为空");

       }

    }

    //成功并返回

    public String execute() throws Exception {

       // TODO Auto-generated method stub

       System.out.println("进行业务登录操纵的处理. 默认的......");

       System.out.println("用户名:" + uname + "密码 :" + upass);

       return SUCCESS;

    }

}

总结:简单的总结一下运行的流程:当从jsp页面中输入用户名之后会跳到struts.xml,根据strtus.xml的指定掉到响应的action中,在为uname和upass赋值之后会执行validate方法,来进行校验,在用户名和密码都输入的情况下校验成功,后执行execute方法成功返回index.jsp页面 ,如果,没有输入任何值,会把错误的信息添加到addFieldError中,并将请求转发到result的input视图中去执行错误的页面进行提示。

 

4.指定方法输入校验

这是全局的action校验,如果是指定的某个方法进行校验,就在action标签中添加一个method的属性,来制定跳转执行的方法。并且在action中写的格式必须是vallidateXxx,意思是如果method=”login”,那么校验的方法为vallidateLogin(),当然,指定之后就不会再执行execute默认的方法。如果校验正确,是去执行login()成功返回,如果校验不正确,返回到错页面去提示

 

5.这个运行的校验全过程:

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

(2)如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。

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

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

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

  基于XML配置方式

1.     实现对action的所有方法进行输入校验

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

 

在LoginAction-validation.xml中的校验为:

<?xml version="1.0" encoding="GBK"?>

<!DOCTYPE validators PUBLIC

        "-//Apache Struts//XWork Validator 1.0.3//EN"

        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

    <!--field指定要校验的属性 -->

    <field name="uname">

       <!-- 指定校验器 -->

       <field-validator type="stringlength">

           <!-- 调用trim()方法去掉空格 -->

           <param name="trim">true</param>

           <param name="minLength">10</param>

           <param name="maxLength">20</param>

           <message>用户名不能过长,必须在5-10个字符之间</message>

       </field-validator>

    </field>

    <field name="upass">

       <!-- 指定正则表达式校验器 -->

       <field-validator type="regex">

           <!-- 调用trim()方法去掉空格 -->

           <param name="trim">true</param>

           <param name="caseSensitive">true</param>

           <param name="expresion"><![CDATA[(\w{4,15})]]></param>

           <message>必须是字符和数组的组合,并且长度在4-15之间</message>

       </field-validator>

    </field>

</validators>

 

从以上可以看出校验的内容,<message>为错误信息提示

 

2. 基本对指定的action中的xml中的配

也就是在struts.xml中用通配符配置传过来的值,在action中有相同的方法进行接收和校验,在xml中为:

<action name="login_*" class="cn.csdn.hr.action.LoginAction" method="{1}">

           <result name="success">../index.jsp</result>

           <result name="input">/WEB-INF/error.jsp</result>

</action> 

 

Struts2提供的校验器的列表为:

系统提供的校验器如下:

required (必填校验器,要求field的值不能为null)

requiredstring (必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

stringlength(字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

regex(正则表达式校验器,检查被校验的field是否匹配一个正则表达式.expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)

int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)

double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

fieldexpression(字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)

email(邮件地址校验器,要求如果field的值非空,则必须是合法的邮件地址)

url(网址校验器,要求如果field的值非空,则必须是合法的url地址)

date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

conversion(转换校验器,指定在类型转换失败时,提示的错误信息)

visitor(用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性)

expression(OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)

 

 

 

总结:我们从以上的看到有手动的校验,也有基于xml的,他们执行的顺序为:先执行strut.xml,再执行指定包下的xml,即是从外到内执行的。

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

1。AconClassName-validation.xml

2。ActionClassName-ActionName-validation.xml

系统寻找到第一个校验文件时还会继续搜索后面的校验文件,当搜索到所有校验文件时,会把校验文件里的所有校验规则汇总,然后全部应用于action方法的校验。如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则。

当action继承了另一个action,父类action的校验文件会先被搜索到。

假设UserAction继承BaseAction:

<action name="user" class="cn.itcast.action.UserAction" method="{1}">

</action>

访问上面action,系统先搜索父类的校验文件:BaseAction-validation.xml, BaseAction-user-validation.xml,接着搜索子类的校验文件: UserAction-validation.xml, UserAction-user-validation.xml。应用于上面action的校验规则为这四个文件的总和。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值