文档章节

Struts2---输入验证

jj_soft
 jj_soft
发布于 2016/06/04 15:24
字数 1566
阅读 12
收藏 1

1. Struts2 的验证

1). 验证分为两种:

> 声明式验证*
 需要解决的问题如下:
  >> 确定对哪个 Action 或 Model 的那个字段进行验证
  >> 使用什么验证规则
  >> 如果验证失败, 转向哪一个页面, 显示是什么错误消息

> 编程式验证

2). 声明式验证的示例:helloworldI.

I . 先明确对哪一个 Action 的哪一个字段进行验证: age

II. 编写配置文件:ActinName-validation.xml(名字书写规则,验证规则如何写吧)
> 把 struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example 下的 Login-validation.xml 文件复制到当前 Action 所在的包下
> 把该配置文件改为: 把 Login 改为当前 Action 的名字.
> 编写验证规则: 参见 struts-2.3.15.3/docs/WW/docs/validation.html 文档即可.示例如下:

1 <field name="age">
2 <field-validator type="int">
3 <param name="min">20</param>
4 <param name="max">50</param>
5 <message>^^Age needs to be between ${min} and ${max}</message>
6 </field-validator>
7 </field>

 

> 在配置文件中可以定义错误消息: 就是<message>标签定义的内容,就是返回的错误消息

III. 若验证失败, 则转向 input 的那个 result. 所以需要配置 name=input 的 result
<result name="input">/validation.jsp</result>

IV. 如何显示错误消息呢 ?

> 若使用的是非 simple, 则自动显示错误消息.
> 若使用的是 simple 主题, 则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)

${fieldErrors.age[0] } 
OR
<s:fielderror fieldName="age"></s:fielderror>*

  > 该错误消息可以国际化吗. 可以,使用<message>标签的key属性,可以为Message的内容从其它文件指定,从文件指定的话,也就是可以实现国际化啦

  <message key="error.int"></message>.

  再在 国际化资源文件 中加入一个键值对: error.int=^^^Age needs to be between ${min} and ${max}

3). 注意: 若一个 Action 类可以应答多个 action 请求, 多个 action 请求使用不同的验证规则, 怎么办 ?

> 为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName(请求时的Action配置名)-validation.xml

> 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用. 可以把各个 action 公有的验证规则
配置在其中. 但需要注意的是, 只适用于某一个 action 的请求的验证规则就不要这里再配置了.

 

4). 声明式验证框架的原理:

> Struts2 默认的拦截器栈中提供了一个 validation 拦截器

> 每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器.
该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml
例如required这类型的验证器就是com.opensymphony.xwork2.validator.validators.RequiredFieldValidator
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

5). 短路验证: 若对一个字段使用多个验证器, 默认情况下会执行所有的验证. 若希望前面的验证器验证没有通过, 后面的就不再验证, 可以使用短路验证

<!-- 设置短路验证: 若当前验证没有通过, 则不再进行下面的验证 -->short-circuit="true"就是短路验证,默认是等于false
<field-validator type="conversion" short-circuit="true">
<message>Conversion Error Occurred</message>
</field-validator>

<field-validator type="int">
<param name="min">20</param>
<param name="max">60</param>
<message key="error.int"></message>
</field-validator>

6). 若类型转换失败, 默认情况下还会执行后面的拦截器, 还会进行 验证. 可以通过修改 ConversionErrorInterceptor 源代码的方式使
当类型转换失败时, 不再执行后续的验证拦截器, 而直接返回 input 的 result

修改 ConversionErrorInterceptor 源代码的方式:就是新建一个和ConversionErrorInterceptor类一样的类,注意包名也要 一至,这样Struts2会根据就近原则优先使用,然后再特定的位置加上一下代码

Object action = invocation.getAction();
if (action instanceof ValidationAware) {
ValidationAware va = (ValidationAware) action;

if(va.hasFieldErrors() || va.hasActionErrors()){
return "input";
}
}

7). 关于非字段验证: 不是针对于某一个字段的验证.

<validator type="expression">
<param name="expression"><![CDATA[password==password2]]></param>
<message>Password is not equals to password2</message>
</validator>

显示非字段验证的错误消息, 使用 s:actionerror 标签: <s:actionerror/>

8). 不同的字段使用同样的验证规则(实际还是要配置一个验证规则,只是验证规则相同,错误消息通过key来指向同一条错误消息), 而且使用同样的响应消息 ?

还记得国际化那个?:(国际化文件定义的东西,任何页面,Action,JavaBean,都会可以获取 的)在JSP页面咋们使用<s:text>标签,或者是OGNL表达式,

在Action中咋们使用的是getText()方法,而${getText(fieldName)} 实际上就是使用OGNL表达式来获取的,首先调用栈顶的getText()方法,然后再用EL表达式打印

error.int=${getText(fieldName)} needs to be between ${min} and ${max}

age=年龄
count=数量

详细分析参见 PPT 159.

9). 自定义验证器:

I. 定义一个验证器的类

> 自定义的验证器都需要实现 Validator.
> 可以选择继承 ValidatorSupport 或 FieldValidatorSupport 类
> 若希望实现一个一般的验证器, 则可以继承 ValidatorSupport
> 若希望实现一个字段验证器, 则可以继承 FieldValidatorSupport

> 具体实现可以参考目前已经有的验证器.

  验证器实现时的流程:

//1. 获取字段的名字和值(获取需要验证的字段的名字和值)
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object);

//2. 验证(自己编写验证JAVA类,然后调用该验证类的方法)
IDCard idCard = new IDCard();
boolean result = idCard.Verify((String)value);

//3. 若验证失败, 则 ...
if(!result){
//返回一条错误消息 addFieldError(fieldName,
object); }

> 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性

 

II. 在配置文件中配置验证器

> 默认情况下下, Struts2 会在 类路径的根目录下加载 validators.xml 文件. 在该文件中加载验证器.
该文件的定义方式同默认的验证器的那个配置文件: 位于 com.opensymphony.xwork2.validator.validators 下的 default.xml

> 若类路径下没有指定的验证器, 则从 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的验证器加载

III. 使用: 和目前的验证器一样.

IV. 示例代码: 自定义一个 18 位身份证验证器

© 著作权归作者所有

jj_soft
粉丝 1
博文 96
码字总数 74097
作品 0
广州
程序员
私信 提问
3.2 Struts2基本应用及工作流程

 struts2流程 *.action-->web.xml(过滤器)-->struts.xml-->Action.java-->JSP等 3.2.1 简单Struts 2实例开发 1.建立一个Web项目 命名为“Struts2” 2.添加Struts 2框架支持 用MyEclipse......

JerryPan
2016/02/20
1K
1
struts2-validate

输入验证 ValueStack/OGNL 三个拦截器 1:输入验证 验证用户名是否输入,验证密码是否符合要求... 验证的方式: 1:脚本验证 - JS验证,这种验证很容易就可以让黑客跳过。 2:服务器验证 在S...

CarlDing
2016/06/23
25
0
.Java程序员从笨鸟到菜鸟之(四十一)细谈struts2(五)action基础知识和数据校验

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 一:首先看一下struts2中action的实现方式: 1.建立普通的pojo类:这种方式能够实现简单的action功能,但str...

长平狐
2012/11/12
85
0
Struts2 OGNL 漏洞!

这文章有漏洞影响到百度,所以先发百度,修补后,正在和剑心商量小范围群发各个互联网安全团队,结果老外也研究出,并且直接爆出这个文章的最终POC。想想刚好明天我生日,发了,庆祝吧。身在...

T_kress
2013/11/23
971
1
关于struts2中的拦截器和登陆验证

今天给几个热爱JAVA的同学们讲了Struts2的一些知识,重点讨论了其最具价值的拦截器。 不知道大家还记不记得,在《Struts2之服务器端验证》里我说过这样一句话“在到达Login Action之前,验证已...

长平狐
2012/11/12
3.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部