自己定义验证器——用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 ...
随机推荐
- j数组对象去重
var Arrlist = [ {name:"张三",age:25,time:"2018-07-30 17:45:13"}, {name:"赵六&qu ...
- 连接远程docker内的mysql(navicat)
拉取mysql镜像 docker pull mysql:5.6 查看mysql镜像 docker images | grep mysql 启动mysql容器 docker run -p 3306:33 ...
- Python数据可视化库-Matplotlib(二)
我们接着上次的继续讲解,先讲一个概念,叫子图的概念. 我们先看一下这段代码 import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.a ...
- JavaScript CSS 等前端推荐
推荐两个网站,JAVASCRIPT与前端相关,两边都可以玩,蛮方便的,然后全通后你拿个全英文版本的证书提升逼格. https://www.freecodecamp.org/ https://www.f ...
- BootStrap学习01框架搭建
中文文档:https://v3.bootcss.com/css/ 开发工具 WebStorm 一.新建项目08bootstrap 引入bootstrap-3.3.7,引入jQuery,引入holder ...
- NYOJ 239 月老的难题
月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福 ...
- 【二分贪心+精度问题】F. Pie
https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/F [题意] 给定n个已知半径的披萨,有m个人要分这n个披萨 要求每个人分到的面积 ...
- (在线工具)JSON字符串转换成Java实体类(POJO)
http://www.bejson.com/json2javapojo/ 付代码代码转换示例: public static FixMixedOrderResponse serialization(St ...
- 【BZOJ4475】子集选取(计数)
题意: 思路: #include<cstdio> #include<cstdlib> #include<iostream> #include<algorith ...
- php装饰者模式
php装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 示例: A.B.C编辑同一篇文章. class ...