Struts2 有两种方式实现服务端验证
(一)使用ActionSupport编码实现验证
1)在action中进行验证
if("".equals(user.getName())||user.getName()==null);
this.addFailderror("user.name","msg") return INPUT;
2)重写validate()
if(........)
3)使用validate+方法名()
<s:fielderror cssStyle"color:red;" />
显示方法addFailderror("user.name","msg")传递的信息
<s:actionerror cssStylr="color:red;" />
显示方法addActionError("msg")传递的错误信息
接受参数时,也会调用validate()方法,若出现错误,则不继续执行业务方法。
(二)验证框架 ******格式源文件包中的xworks-validator-x.x.x.dtd文件
使用该方法需要action配置文件中配置<result name="INPUT"></>的项
1)编写jsp数据输入页面
2)编写Action类及其配置文件
3)在Action类同目录下创建验证文件ActionName-validation.xml
4)编写验证规则
(xworks-validator-1.0.3.dtd下的内容)
<!ELEMENT validators (field|validator)+>
<!ELEMENT field (field-validator+)>
<!ATTLIST field
name CDATA #REQUIRED
>
<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator
type CDATA #REQUIRED
short-circuit (true|false) "false"
>
<!ELEMENT validator (param*, message)>
<!ATTLIST validator
type CDATA #REQUIRED
short-circuit (true|false) "false"
>
<!ELEMENT param (#PCDATA)>
<!ATTLIST param
name CDATA #REQUIRED
>
<!ELEMENT message (#PCDATA|param)*>
<!ATTLIST message
key CDATA #IMPLIED
>
实际效果:
<validators>
<!--不能为空-->
<field name="user.name">
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>
<!--限制长度-->
<field-validator type="stringLength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>长度${minLength}~${maxLength}间</message>
</field-validator>
</field>
<!--正则表达式-->
<field name=" ">
<field-validator type="regex">
<param name="regexExpression" ><![CDATA[^1[358]\d{9}$]]></param>
<message>...</message>
</field-validator>
</field>
validator的file类型:
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器
若想对某一业务方法配置验证规则:
编写ActionName(Action类名)-alias(Action的路径名)-validation.xml;
顺序验证:
Action父类-validation.xml->
Action父类-alias-validation.xml->
Action类-validation.xml->
Action类-alias-validation.xml
表单验证可看详细:http://www.open-open.com/lib/view/open1414135851762.html
拦截器: Struts核心
递归?
做一些Action执行前的预处理
将控制交给后续拦截器或返回结果字符串
做一些Action执行后的处理
//进行下一个拦截
String result = invocation.invoke();
return result;
<interceptors>
<interceptor name=" " class=" " />
<interceptor-stack name=" " >
<interceptor-ref name=" |(或分隔) " />
</interceptor=stack>
</interceptor>
<!--默认拦截器引用-->
<default-interceptor-ref name=" " />
<action name=" " class=" ">
<interceptor-ref name=" " />
</action>
拦截器的实现方法:
一、实现Interceptor接口
1)void init()
2)void destory()
3)String intercept(ActionInvocation ai) throws Exception
二、继承AbstractInterceptor抽象类
提供了init() 和 destory()
只需实现intercept()方法
三、继承MethodFilterInterceptor类
1)指定拦截方法
2)指定不拦截的方法
拦截器栈有多个<interceptor-ref>谁在前,谁先起作用
拦截器起作用的顺序,先<action<再本包,再父包。
过滤器与拦截器的区别:
1)拦截器用于拦截对Action请求,而过滤器几乎可以过滤所有的请求
2)拦截器中可以获取Action的当前执行状态,而过滤器不可以
3)过滤器是Servlet中概念,在web.xml中配置;拦截器是Struts2/Webwork中概念,在struts.xml中配置
拦截器和过滤器
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑