day28_struts2(全天)のPPT学习——06 使用Struts2的输入校验
来源:互联网 发布:java入门视频百度网盘 编辑:程序博客网 时间:2024/04/30 08:39
day28_struts2(全天)のPPT学习——06 使用Struts2的输入校验.ppt
使用Struts2的输入校验
请求参数的输入校验
输入校验
- 客户端校验 过滤正常用户的误操作,通过JS代码完成
- 服务器端校验,整个应用阻止非法数据的最后防线
Struts2校验方式
- 手动完成输入校验
- 编写校验规则文件
- 基于Annotation的输入校验
手工验证(对action的所有方法进行校验)
Jsp页面:
- 用户名不能为null,”“
- 密码不能为null,”“并且密码的长度6-12之间
Action中
- 要继承ActionSupport
重写Validateable接口中的validate()方法,在该方法中完成验证
步骤如下
- validate()方法在其他的业务方法之前执行
验证出错转向的页面
struts.xml配置<result name="input">/validate/login.jsp</result>其中input转向是在Action中已经定义好的,public static final String INPUT="input";
- 什么时候表示验证出错(转向input所指向的页面)
- this.addFieldError(“sss”,”错误信息”);方法指向的是一个集合
- 当集合不为空时,转向错误页面
手工验证(对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]); }}
手动校验的流程
类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。
如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里,然后执行第3步。如果类型转换没有出现异常,则直接进入第3步。
系统通过反射技术调用action中的validateXxx()方法,Xxx为方法名。
调用action中的validate()方法。
经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
基于XML配置方式实现输入校验
建立Jsp页面,定义需求
- 用户名不能为null ,”“
- 密码不能为null, “” 并且密码的长度6-12之间
定义Action
要继承ActionSupport或者实现Validateable接口:
public class ValidateXmlAction extends ActionSupport{ private String username; private String psw; public String login(){ System.out.println("执行ValidateXmlAction login登录"); return "success"; }}
配置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>
配置验证的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>
- day28_struts2(全天)のPPT学习——06 使用Struts2的输入校验
- day28_struts2(全天)のPPT学习——05 Action接受请求参数.ppt
- 使用struts2的输入校验
- Struts2——输入校验
- ssh学习:struts2的输入校验
- struts2学习笔记(5)——输入校验
- struts2学习(14)——输入校验(2)
- Struts2 入门学习笔记(四)——输入校验
- Struts2.0学习笔记 — 输入校验(Validation)
- Struts2的 输入校验
- Struts2的输入校验
- struts2的输入校验
- Struts2的 输入校验 .
- Struts2的输入校验
- Struts2的输入校验
- Struts2的输入校验
- Struts2的输入校验
- JavaEE----使用Struts2的输入校验之手动编码校验
- iOS之#pragma mark的用法
- 并查集的两种写法
- day28_struts2(全天)のPPT学习——05 Action接受请求参数.ppt
- 设计模式之迭代器模式
- IoCompleteRequest的实现逻辑
- day28_struts2(全天)のPPT学习——06 使用Struts2的输入校验
- hadoop-2.X启动后用JPS命令查看,resourcemanger无法启动:地址已被使用
- Spring 4.x+Spring MVC 4.x+MyBatis 3.x 整合(四)Spring 3.1.0 整合
- HDU5183Negative and Positive (NP)(哈希表)
- POJ2965 The Pilots Brothers' refrigerator(枚举+思维题)
- 地址宏定义
- 通过jni实现c++和java互调
- LightOJ 1422 - Halloween Costumes(区间DP)
- The container 'Android Dependencies' references non existing library