自己定义验证器——用Struts2框架以框架师的思维灵活做好该事情
面对的问题:自己定义一个18位身份验证器。编写验证器。在validators.xml文件里进行注冊、在验证配置文件里使用?
第一部分:理解Struts2中自带的验证器
第二部分:如何通过server(后台)。再次对前台的数据进行验证
第三部分:用Struts2来自己定义验证器(问题解决方式)
第一部分:理解Struts2中自带的验证器
Struts2框架中自带的后台server验证分为两种:声明式验证和编程式验证
u 声明式验证(重点)
Ø 对哪个 Action 或 Model 的那个字段进行验证
Ø 使用什么验证规则
Ø 假设验证失败, 转向哪一个页面, 显示是什么错误消息
u 编程式验证
声明式验证(重点)具体分析:
1、先明白对哪一个 Action 的哪一个字段进行验证: 比方说“age”字段。
2、编写配置文件:
>把 struts-2.3.15.3\apps\struts2-blank \WEB-INF\src\java\example 下的 Login-validation.xml 文件拷贝到当前 Action 所在的包下。
>把该配置文件改为: 把Login 改为当前 Action 的名字,比方本例用的到。例如以下文件.
E:\Java开发的工具包\struts2.X 开源工具包\struts-2.3.15.1\apps\struts2-blank\WEB-INF\src\java\example具体信息 |
<!DOCTYPE "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators> <field <field-validator <message </field-validator> </field> <field <field-validator <message </field-validator> </field> </validators> |
>编写验证规则: 參见 struts-2.3.15.3/docs/WW/docs/validation.html文档就可以(帮助文档——非常有用的文档).
11. short validator 13. url validator |
单击date validator进入对应的页面——例如以下图所看到的:
拷贝对应的文件进行TestValidationAction-validation.xml配置文件里
> 在配置文件里能够定义错误消息:
<fieldname="age">
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<message>Age needs to be between ${min}and ${max}</message>
</field-validator>
</field>
> 该错误消息也能够国际化操作,具体请參看曾经写的blog《用Struts2进行中英文一键切换——包括具体的源码解析及Struts2国际化原理的理解》。
在TestValidationAction-validation.xml文件里加入例如以下信息 |
<field-validator <param <param <message </field-validator> |
再在国际化资源文件里(src/i18n.properties)增加一个键值对: error.int=Age needs to be between ${min}and ${max}
3、若验证失败, 则转向 input 的那个 result. 所以须要配置 name=input 的 result
在src/struts.xml文件里加入例如以下信息: |
<action <result>/success.jsp</result> <!-- 若验证失败转向的 input --> <result </action> |
类com.atguigu.struts2.validation.app.TestValidationAction的内容 |
4、怎样显示错误消息呢 ?
u 若使用的是非 simple(主要是指Struts2中JSP页面《展现出》中主题的设置,一般默认的为XHTML主题。该文件在源码中的位置为:
\WebContent\WEB-INF\lib\struts2-core-2.3.15.3.jar\template.simple), 则自己主动显示错误消息。
u 若使用的是simple主题, 则须要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)
<!-- 要求年龄必须在 20-50 <s:form Age: <s:textfield <%-- ${fieldErrors.age[0] } --%> <s:fielderror <s:submit></s:submit> </s:form> |
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
5、关键点理解:若一个 Action 类能够应答多个 action 请求, 多个 action 请求使用不同的验证规则, 怎么办 ?
u 为每个不同的 action 请求定义其相应的验证文件: ActionClassName-AliasName-validation.xml
u 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依旧会发生作用. 能够把各个 action 公有的验证规则配置在当中. 但须要注意的是, 仅仅适用于某一个 action 的请求的验证规则就不要这里再配置了.
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
6、短路验证: 若对一个字段使用多个验证器, 默认情况下会运行全部的验证. 若希望前面的验证器验证没有通过, 后面的就不再验证, 能够使用短路验证。
<!-- 针对 age <field <!-- 设置短路验证: <field-validator <message>^Conversion Error Occurred</message> </field-validator> <field-validator <param <param <message </field-validator> </field> |
7、 若类型转换失败, 默认情况下还会运行后面的拦截器, 还会进行验证. 能够通过改动 ConversionErrorInterceptor源码的方式使当类型转换失败时, 不再运行兴许的验证拦截器, 而直接返回input的result。
详细过程例如以下: 1、 通过Struts-default.xml文件里找到conversionError拦截器,查看对应的信息。例如以下所看到的:<interceptor 2、 通过Ctrl + Shift + T,输入StrutsConversionErrorInterceptor追踪到该方法。之后追踪到该方法的父类ConversionErrorInterceptor。 3、 在自己创建的项目src先创建com.opensymphony.xwork2.interceptor包,之后创建ConversionErrorInterceptor.java的Java类。 4、 将追踪到的com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.java源码复制到刚好创建的文件里。 之后再加入例如以下语句。 |
8、关于非字段验证: 不是针对于某一个字段的验证.
(src\com.atguigu.struts2.validation.app) |
<!-- 測试非字段验证 --> <validator <param <message>Password is not equals to password2</message> </validator> |
(WebContent\validation.jsp) |
Password: <s:password Password2: <s:password |
( src\com\atguigu\struts2\validation\app\TestValidationAction.java) 在该方法中加入password和password2两个属性,及对应的get和set方法。 |
public private String private String public String getPassword() { return } public this.password = password; } public String getPassword2() { return } public this.password2 = password2; } } |
细节注意:显示非字段验证的错误消息, 使用 s:actionerror 标签: (单独一行即可了)<s:actionerror/>
9、不同的字段使用相同的验证规则, 并且使用相同的响应消息 ?
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
第二部分:如何通过server(后台)。再次对前台的数据进行验证
、声明式验证框架的原理:
u Struts2 默认的拦截器栈中提供了一个 validation 拦截器
u 每一个详细的验证规则都会相应详细的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器.
u 该文件位于 com.opensymphony.xwork2.validator.validators下的default.xml
<interceptor <interceptor <interceptor <interceptor <interceptor <interceptor <interceptor <interceptor <interceptor class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/> <interceptor <interceptor <interceptor <interceptor <interceptor <interceptor <interceptor |
第三部分:如何用Struts2来自己定义验证器(具体原理阐述)
I、整个流程步骤简单介绍:
A. 自己定义的验证器都须要实现 Validator.(相当于一个JavaBean)
B. 能够选择继承 ValidatorSupport 类或 FieldValidatorSupport 类
C. 若希望实现一个一般的验证器, 则能够继承 ValidatorSupport
D. 若希望实现一个字段验证器, 则能够继承 FieldValidatorSupport
E. 详细实现能够參考眼下已经有的验证器(Struts2自带的验证器).
F. 若验证程序须要接受一个输入參数, 须要为这个參数添加一个对应的属性
II、在配置文件里配置验证器(验证配置文件载入顺序):
A. 默认情况下, Struts2 会在 类路径的根文件夹下载入 validators.xml
文件. 在该文件里载入验证器.
该文件的定义方式同默认的验证器的那个配置文件一样,能够參看其进行书写: 默认文件位于 com.opensymphony.xwork2.validator.validators 下的 xwork-default.xml |
B. 若类路径下没有指定的验证器, 则从com.opensymphony.xwork2.validator.validators 下的 default.xml 中的验证器载入
III. 自己定义一个18位身份验证器。编写验证器,在validators.xml文件里进行注冊、在验证配置文件里使用?
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvbmd3ZW43NzEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> |
步骤一:书写18位身份证的JavaBean类代码: |
/** * 身份证第十八位(效验码)的计算方法 位数分别乘以不同的系数,从第一位到第十七位的系数分别为: * 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 。看余数是多少?余数可能是 * 0, 1, 2 , 3, 4, 5, 6, 7, 8, 9, 10,这十一位数字,其分别相应的最后一位身份证号码为: * 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 * */ public final final private public IDCard() {} public if (idcard.length() == 15) { idcard = uptoeighteen(idcard); } if (idcard.length() != 18) { return } String verify = idcard.substring(17, 18); if (verify.equals(getVerify(idcard))) { return } return } /** 位身份证。效验码的计算 * * 身份证第十八位(效验码)的计算方法 位数分别乘以不同的系数,从第一位到第十七位的系数分别为: * 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ,看余数是多少?余数可能是 * 0, 1, 2 , 3, 4, 5, 6, 7, 8, 9, 10,这十一位数字,其分别相应的最后一位身份证号码为: * 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 */ public String getVerify(String eightcardid) { int remaining = 0; if (eightcardid.length() == 18) { eightcardid = eightcardid.substring(0, 17); } if (eightcardid.length() == 17) { int sum = 0; for (int i = 0; i < 17; i++) { String k = eightcardid.substring(i, i + 1); ai[i] = Integer.parseInt(k); } for (int i = 0; i < 17; i++) { sum = sum + wi[i] * } remaining = sum % 11; } return remaining == 2 ? } /** 位的新的身份证号码 位) 位:地区编码 日出生的人编码——千年虫问题) 位:出生月和日,不足两位的高位补零 位是性别识别码,男性为奇数,女性为偶数。 * */ public String uptoeighteen(String fifteencardid) { String eightcardid = fifteencardid.substring(0, 6); eightcardid = eightcardid + "19"; eightcardid = eightcardid + fifteencardid.substring(6, 15); eightcardid = eightcardid + getVerify(eightcardid); return eightcardid; } public String idcard1 = "350211197607142059"; String idcard2 = "350211197607442059"; IDCard idcard = new IDCard(); System.out.println(idcard.Verify(idcard1)); System.out.println(idcard.Verify(idcard2)); } } |
步骤二:一个18位身份验证器的Java类 |
package com.atguigu.struts2.validation.app; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; public @Override public //1. 获取字段的名字和值 String fieldName = getFieldName(); Object value = this.getFieldValue(fieldName, object); //2. 验证 IDCard idCard = new IDCard(); boolean result = idCard.Verify((String)value); //3. 若验证失败, if(!result){ addFieldError(fieldName, object); } } } |
步骤三:书写validators.xml配置文件(能够參看com.opensymphony.xwork2.validator.validators 下的 default.xml 中的配置文件。进行改动) |
<? xml <!DOCTYPE "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <!-- START SNIPPET: validators-default --> <validators> <validator </validators> |
步骤四:页面展现层的代码: |
<s:actionerror/> idCard: <s:textfield <s:fielderror <s:submit></s:submit> |
这样就实现了server后台验证身份证的程序验证器已经部署完毕。 |
自己定义验证器——用Struts2框架以框架师的思维灵活做好该事情的更多相关文章
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
- Struts(二十五):自定义验证器
编程验证 Struts2提供了一个Validateable接口,可以使用Action类实现这个接口以提供编程验证: ActionSupport类已经实现了Validateable接口. public ...
- 自定义基于XML的验证器
a.编写一个类,继承FieldValidatorSupport类. b.在public void validate(Object object)编写你的验证逻辑 不符合要求的就向fieldErrors ...
- TP5 自定义验证器
TP内置验证功能提供两种验证方法 验证器(推荐) $validate = Validate::make([ 'id' => 'require|integer', ]); if ($validat ...
- flask 自定义验证器(行内验证器、全局验证器)
自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...
- form——验证器Validators
form表单最大的作用就是验证功能了,通过cleaned_data清洗,我们可以获取传来的值,通过参数.验证器.自定义验证方法,我们可以做到很多的验证. 验证器可用于在不同类型的字段之间重用验证逻辑. ...
- ThinkPHP6.0学习笔记-验证器
验证器 By:Mirror王宇阳 验证器定义 验证器的使用,必须定义它:系统提供了一条命令直接生产一个验证器类: php think make:validate User 自动再应用目录下生成一个va ...
- 基于struts2框架-自定义身份证号验证器
自定义拦截器的步骤: 1.定义一个验证器的类: > 自定义的验证器都需要实现 Validator接口. > 可以选择继承 ValidatorSupport 或 FieldValidato ...
- struts2验证器
1. Struts2 的验证(note6,struts2-8) 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >&g ...
随机推荐
- java中的编译时与运行时
----?基础知识 -- 编译时 编译器将源代码翻译成机器能够读懂的代码,如java中就是翻译成jvm能够读懂的字节码文件.简单说,编译时就是机器帮我们检查代码是否有出现语法错误,关键字写错之类的 ...
- AES/DES 可逆性加密算法 -- java工具类
package com.lock.demo.service; import org.apache.tomcat.util.codec.binary.Base64; import javax.crypt ...
- 「问题思考」python的递归中return返回none
代码: #求最大公约数 def gcd(x,y): if x < y: swap = x x = y y = swap if x%y == 0: return y else: gcd(y,x%y ...
- Android开发——程序锁的实现(可用于开发钓鱼登录界面)
1. 程序锁原理 1.1 实现效果: 在用户打开一个应用时,若此应用是我们业务内的逻辑拦截目标,那就在开启应用之后,弹出一个输入密码的界面,输入密码正确则进入目标应用.若不输入直接按返回键,则直接返回 ...
- idea 中使用 出现 svn: E155036
在idea中使用svn checkout时 svn出现如上错误. 原因本地的工作副本太旧.command line进入本地工作副本的根目录,执行svn upgrade后 重启idea就可以了.
- 【HTML/XML 3】XML 简介,来源
导读:在标记语言出现之前,计算机中的数据一直都是以神秘的二进制在进行处理,但是,标记语言的出现,慢慢的改变了这种认识.那么,标记语言都经过了什么样的发展呢?它又有什么用处呢? 一.追根溯源(XML的产 ...
- 简单的Fleury算法模板
假设数据输入时采用如下的格式进行输入:首先输入顶点个数n和边数m,然后输入每条边,每条边的数据占一行,格式为:u,v,表示从顶点u到顶点v的一条有向边 这里把欧拉回路的路径输出了出来: 手写栈: #i ...
- iOS 混合变换旋转 CGAffineTransform
在ios 中, Core Graphics 提供了一系列的函数可以在一个变换的基础上做深层次的变换,如果做一个既要缩放又要旋转的变换,以下的方法比较实用. CGAffineTransformScale ...
- 【搜索引擎】Solr最新安装以及通过关系型数据库(MySQL,Oracle,PostgreSQL)导入数据
版本号 最新的solr版本 : Solr 8.1.1下载地址:https://lucene.apache.org/solr/downloads.html solr-8.1.0.tgz for Linu ...
- Baby Step Giant Step model
******************************************** */ #include <stdio.h> #include <string.h> # ...