struts2(三) 输入校验和拦截器

      前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器,

                      --WH

一、输入校验

     在以前我们写一个登录页面时,并没有限制用户的输入,不管用户输入什么,我们都存入数据库中,很显然这是不行的,我们需要检测用户输入的文本是否合法,是否符合我们需要的文本格式,符合菜放行,而struts2中就有这种功能,能帮我们在服务器段进行判断,比如用户名不能为空,年龄只能在0-100之间等。现在我们就来说说如何使用struts2中的校验功能把。

     分为两种,编程式校验和配置校验(XML配置校验)

     1.1编程式校验,

        对action中所有方法都执行校验

        实现Validateable接口,重写其中的validate方法,因为我们的action继承自actionSupport,actionsupport帮我们实现了这接口,所以我们只需要重写validate方法即可。

              

          在这里使用了一个addFieldError("xxx","yyy"); 将错误信息存起来,等回到页面在显示出来,如何显示呢?如果使用的是s标签提交的表单,那么该会自动显示出来,如果不是,则需要手动将其输出,<s:fielderror fieldName="xxx">. 并且如果使用了,addFieldError中存有了信息,则不会在前往原先action所需要跳转的页面,而是找到result为input的结果码对应的页面。所以,如果需要使用它,那么在struts.xml中应该编写一个结果码为input的代码。

              为什么需要input结果码等?原因是这种输入校验依靠了两个拦截器,如图所示

              

              这种数据检验都是在数据进行类型转换之后做的事情,从图中的几个拦截器就可以看先后执行顺序,也可以解释为什么需要input结果码了。

          对单个方法或指定方法进行数据校验。

              上面这种对所有方法校验有些不符合我们的要求,因为并不是每个方法都需要提交表单参数过来的,所以struts2中有两种办法解决这个问题。

              1、还是对所有方法进行校验,不过可以将我们不需要使用校验的方法上用注解@SkipValidation进行跳过即可。

              2、指定校验某个方法, 比如validateAdd()这就只校验add方法, validateLogin() 值校验login方法,以这样的格式进行命名,就是对特定方法进行校验了。

                   例子就不需要举了,太简单了。注意一点,指定某个方法校验会在公共校验方法之前被调用,也就是说会先执行validateXXX(),然后在执行validate()方法。

           

      1.2、xml配置校验。

           要求:

              1、必须实现validateable接口,actionsupport已经实现了,所以我们只需要直接继承actionsupport即可 

              2、action中必须为属性提供getXXX、setXXX方法,因为代码校验是在Action本类中来完成校验,这说明我们可以直接使用本类的private属性,但如果使用XML配置方式校验,这需要使用校验框架的代码来完成校验工作,那么校验框架需要调用Action的getXXX()方法来获取被校验的属性,所以一定要为被校验的属性提供getXXX()方法

        

           创建校验配置文件

              命名规范:

                   actionClass-actionName-validation.xml  

                        actionClass:action的类名

                        actionName:action的访问名称,及在struts.xml中配置的,<action name="">

                        validation.xml:固定后缀名。 

                   比如:Demo02Action-Demo02Action_add-validation.xml    这种是对特定方法进行校验

              路径:必须与action同包下

                    

              校验文件的DTD:在xwork-core-x.x.x.jar中找到xwork-validator-x.x.x.dtd,打开它,内部会有一段DTD,我们把它copy过来,放到我们的校验文件中

              编写校验配置文件:

                  

               校验规则有很多,在xwork-core-xxx.jar/com.opensymphony.xwork2/validator/validators/default.xml中就能够找到所有的校验规则。

                  

                    

                  如果想要查看某个校验规则如何使用的话,看源码,然后打开Javadoc进行查看,其中会有例子让我们查看的。比如,我需要查看requiredstring的使用方法。

                     复制requiredstring的class

                         

                     按shift+ctrl+t对该类进行查找。

                          

                    查看文档

                            

                      文档中会给出很详细的注释,看不懂例子中的参数,就往上看参数的解释。这样就会用了。

        1.3、总结校验器的使用

              如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了,不过到后面应该都有其他更方便的校验方法,而不会使用struts2内置的这些校验。

二、拦截器

      2.1、什么是拦截器?

        现在应该都知道了,前面说表单提交参数自动封装时就提到了好几种拦截器,而上面说校验数据也提到了两种拦截器,基本上我们也知道拦截器的作用是啥了,就是在到达action之前做的很多处理,提前帮我们做事情的一种机制,而我们并不需要编写这些拦截器,因为struts2已经帮我们写好了常用的一些拦截器,并且有个defaultStack的拦截器栈,我们使用的action就经过struts2提供的这个默认拦截器栈。其中有18个,也就是说,如果不修改默认拦截器栈,那么每次我们访问action,都会经过这18个拦截器栈,我们来看看哪18个,

      2.2、struts2的默认拦截器栈(18个拦截器)  

            

          找到defaultStack。

                

          其中我们应该了解很多个了,277行,i18n用来做国际化,281行,modeDriven用来数据封装的,282行fileUpload,上传下载的,285行staticParams用来获取静态参数的,287行params用做数据封装的,290行conversionError标识数据类型转换异常处理的,291行,validation用来做输入校验的 292行workflow用来检测<filederror>是否有值,有值则跳到input结果码对应的页面。 其他的还没讲到到后面我都会一一讲解清楚的,先大概了解一下。

      2.3、自定义拦截器

          大多数功能的拦截器struts2都已经帮我们写好了,但是有一些,我们需要自己在往其中功能,那就必须自定义拦截器了。自定义拦截器很简单,就分两步即可。

          第一步:编写拦截器类,继承AbstractInterceptor类。(它帮我们实现了Interceptor接口)

              

          第二步:注册拦截器

              在struts.xml中注册

                  在<package>声明拦截器

                  在<action>中引用拦截器

                

              但是一般不用这种,因为Struts2有这么一种机制,一旦为Action指定了拦截器,那么就不会再为这个Action执行默认拦截器了,即defaultStack这个拦截器栈中的拦截器都不会执行,也就是说,这个Action没有输入校验、没有参数注入、没有国际化、没有…,这是不行的,所以我们需要在这个<action>元素中再引用defaultStack拦截器栈。

              

              这种虽然达到了我们的效果,但是非常麻烦,因为只有一个action,如果有十几个action呢?需要为每个action配置默认拦截器栈和自定义拦截器,所以使用最后一种方案。

              终极方案。创建一个拦截器栈,将默认拦截器栈和自定义拦截器加入其中,然后将struts2的默认拦截器栈修改为我们新构建的拦截器栈。

              

三、总结

     了解了struts2中数据校验的功能和struts2中的18个拦截器,还有如何自定义拦截器这些操作,个人感觉还是没有难度的,现在只是在学习知识,学会这个知识点,等后面使用struts2来写一个小的demo,就会将所有零碎的知识点整合到一起。好好努力。           

                  

时间: 2024-11-05 13:43:56

struts2(三) 输入校验和拦截器的相关文章

Struts2学习(三)———— 输入校验和拦截器

一.输入校验 在以前我们写一个登录页面时,并没有限制用户的输入,不管用户输入什么,我们都存入数据库中,很显然这是不行的,我们需要检测用户输入的文本是否合法,是否符合我们需要的文本格式,符合菜放行,而struts2中就有这种功能,能帮我们在服务器段进行判断,比如用户名不能为空,年龄只能在0-100之间等.现在我们就来说说如何使用struts2中的校验功能把. 分为两种,编程式校验和配置校验(XML配置校验) 1.1编程式校验, 对action中所有方法都执行校验 实现Validateable接口,

struts2第四天——拦截器和标签库

一.拦截器(interceptor)概述 struts2是个框架,里面封装了很多功能,封装的很多功能都是在拦截器里面. (属性封装.模型驱动等都是封装在拦截器里面) struts2里面封装了很多功能,有很多拦截器,每次执行一部分拦截器,比如一些默认拦截器等 默认拦截器的位置在 core的jar包的struts-default.xml里边<interceptor>标签里边 二.拦截器基本原理 拦截器在什么时候执行: 在action对象创建之后和action方法执行之前进行执行(使用在相关位置打断

struts2(六)拦截器机制

拦截器简述 拦截器是一组动态拦截Action调用的对象.拦截器的处理代码可以定义在action执行前或者执行后.同时,拦截器能够拦截一个Action的执行.拦截器可以将一些通用功能封装成可重用形式以供一个Action或多个 Actions使用. 拦截器必须是无状态的,原因是Struts 2不能保证为每一个请求或者Action创建一个实例,所以如果拦截器带有状态,会引发并发问题.不要使用在API提供的ActionInvocation之外的任何东西. 在概念上,interceptors相近于Serv

【struts2】预定义拦截器

1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个Struts-default.xml里面,因此我们需要到这个文件的struts-default包里去看一下.定义如下: 1 <interceptors> 2 <interceptor name="alias" class="com.opensymphony.xwor

走进Struts2(二) — Struts2的基石(拦截器)

拦截器(Interceptor)是Struts2的基石,拦截器的主要作用是在Action执行之前和Result执行之后进行一些特定功能的处理机制. 如图,拦截器是用来负责在Action执行之前和Result执行之后处理一些功能的类.每个不同的拦截器,它们分别执行不同的功能处理,而运行的时机就是在Action执行之前和Result执行之后,需要注意的是在执行Action之前和Result之后,拦截器的执行顺序是正好相反的. 一.拦截器的好处 1.简化Action的实现,可以把很多功能从Action

Struts2基础学习(五)&mdash;拦截器

一.概述 1.初识拦截器      Interceptor 拦截器类似前面学过的过滤器,是可以在action执行前后执行的代码,是我们做Web开发经常用到的技术.比如:权限控制.日志等.我们也可以将多个Interceptor 连在一起组成Interceptor 栈.     Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此在拦截器中如果使用类变量,要注意同步的问题.      注意:              (1

struts2学习笔记---自定义拦截器

什么是拦截器? struts2中拦截器分为Struts2定义好的拦截器和自定义的拦截器.其作用是在一个Action执行之前进行拦截,在Action执行之后又加入某些操作. 实现原理 当请求一个Action时,struts2会查找配置文件,并根据这个Action的配置实例化对应的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器. 拦截器的执行流程 1.对Action进行预处理.(正序执行) 2.拦截器自身决定该不该执行后续的拦截器(由invoke()方法的返回值决定).

Struts2请求数据处理及拦截器(二)

简介 以后如果没有特殊的要说,就在简介中介绍一下大概的知识点.今天主要学习封装请求参数及类型转换.用户输入校验.国际化.拦截器 Struts2封装请求参数的方式 方式一: Action 本身作为model对象,通过成员setter封装(一个名字为params的拦截器实现的) 产生疑问:使用第一种数据封装方式,数据封装到Action属性中,不可能将Action对象传递给 业务层 * 需要再定义单独JavaBean ,将Action属性封装到 JavaBean,得出第二种方式 方式二: 动作类和模型

Struts 2 类型转换器 输入校验 拦截器

Struts 2中内建了字符串类型和常见类型之间相互转换的转换器,能满足大多数转换需求,但不能完成字符串和User对象之间的转换. OGNL项目中有一个TypeConvert接口,这个接口是自定义类型转换器必须要实现的接口,OGNL还提供了一个实现类: DefaultTypeConverter,自定义类型转换器(UserConverter类)须重写DefaultTypeConverter类的convertValue()方法.该方法可以实现字符串和对象之前相互转换 注册局部类型转换器:注册局部类型