struts2的输入检验
一、输入校验简介
一个健壮的Web应用程序必须确保用户输入是合法的。比如在注册用户的时候,将用处注册信息保存到数据库之前一般我们会判断用户输入的密码长度是否过短,或者用户的email地址格式是否正确。
验证程序可以分为两大类别:字段验证器(Field validators)和非字段验证器(Non-field validator)。
字段验证用户程序与表单中的某个字段想关联,其验证行为发生在把一个值赋给一个动作属性之前。例如输入的用户名不满足要求(如要求全英文却含有中文),则在属性赋值之前,就会提示输入不符合要求。这通常是由客户端通过javascript来完成验证。
非字段验证程序(普通验证器)不与某个特定的字段相关联,他们用来测试某种特定的条件是否得到了满足,这一版是由服务器完成验证的。例如用户名注册时检测到用户名已被其他人注册,则提示更换用户名。
Struts2内建的验证器基本上都是字段验证器。Validation拦截器负责加载和执行已经注册的验证器,由于Validation拦截器是defaultStack拦截器栈中的一员,因此我们可以不用声明就可以直接使用内建的验证器。
二、输入校验的实现
数据校验包含两种方式,第一种是手动编码完成数据校验方式,第二种是通过配置文件完成数据校验方式。
1、手动编码校验方式
开发的步骤
步骤一: 封装数据
步骤二: 实现校验Action ,必须继承ActionSupport 类
步骤三: 覆盖validate方法,完成对Action的业务方法数据校验 this.addFieldError。该方法由(ActionSupport提供)
步骤四: 在jsp中 通过 <s:fieldError/> 显示错误信息
例如Action编写可以如下所示:
//省略的导入包语句
public class RegistAction extends ActionSupport
{
private String name;
private String pass;
private int age;
private Date birth;
//省略了get和set方法
public void validate() //重写validate方法
{
System.out.println("进入validate方法进行校验" + name == null);
//要求用户名必须包含test子串
if(!name.contains("test"))
{
addFieldError("user" ,
"您的用户名必须包含test!");//添加到系统的FieldError中
}
}
}
jsp页面如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<title>请输入您的注册信息</title>
</head>
<body>
<H1>请输入您的注册信息</H1>
错误提示信息:<s:fielderror/>
<FORM METHOD="POST" ACTION="regist.action">
用户名:<INPUT TYPE="text" NAME="name"><br>
密 码:<INPUT TYPE="text" NAME="pass"><br>
年 龄:<INPUT TYPE="text" NAME="age"><br>
生 日:<INPUT TYPE="text" NAME="birth"><p>
<INPUT TYPE="submit" value="注册">
</FORM>
</body>
</html>
除此之外,struts2无需做其他处理。只需要在struts.xml中配置input所指向的逻辑视图即可。因为struts2一旦发现FieldError不为空,就会自动跳转到input逻辑视图。并通过 <s:fieldError/> 显示错误信息。
以上我们通过覆盖validate方法完成数据校验是针对的是Action中所有的方法进行校验。我们可以也可以针对Action中某个方法完成校验。实现原理类似于Action的动态实现。我们可以为Action设计一个validateXxx方法,其中Xxx是Action要处理的逻辑方法。
例如可以在在Action中编写一个方法,方法名是validateAdd(),只用于校验add方法。再编写一个validateSave(),只用于校验save的方法。
可以把上面的RegistAction改成如下形式:
public class RegistAction extends ActionSupport
{
private String name;
private String pass;
private int age;
private Date birth;
//省略了get和set方法
public String regist()
{
return SUCCESS;
}
public void validate()
{
System.out.println("进入validate方法进行校验" + name == null);
//要求用户名必须包含leegang子串
if(!name.contains("test"))
{
addFieldError("user" ,
"您的用户名必须包含test!");
}
}
public void validateRegist()
{
System.out.println("进入validateRegist方法进行校验" + name == null);
//要求用户名必须包含yeeku子串
if(!name.contains("name"))
{
addFieldError("user" ,
"您的用户名必须包含name!");
}
}
}
除此之外,还必须在struts.xml文件中指定校验方法。
<action name="regist" class="lee.RegistAction" method="regist">
<result name="input">/regist.jsp</result>
<result>/show.jsp</result>
</action>
通过上述配置,指定了regist方法来处理名为regist的Action请求。这样,用户提交数据时,不仅validate方法会进行数据校验,validateRegist也会进行数据校验。而且validateRegist优先执行。
2、通过XML配置文件的方式完成数据的校验
xml配置校验原理 : 将很多校验规则代码已经写好,只需要在xml中定义数据所使用校验规则就可以了
开发的步骤
步骤一 :编写jsp
步骤二 :编写Action 继承ActionSupport 或者 实现 Validateable 接口
步骤三 :封装请求参数,使用xml校验 必须提供get方法
步骤四 :编写校验规则xml文件
具体的配置文件相关标签和属性详解
<validators>
<field name="password">
<!-- 校验器类型 -->
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
<!-- 规定密码的长度 -->
<field-validator type="stringlength">
<param name="minLength">3</param>
<param name="maxLength">8</param>
<message>密码在3-8位之间</message>
</field-validator>
</field>
<validators>
如果是针对Action中所有的方法进行校验,则配置方法如下:
在Action所在的包中创建一个XML文件,命名规则:Action类名-validation.xml。并且需要引入指定的DTD的约束:xwork-core-2.3.15.3.jar/xwork-validator-1.0.3.dtd
如果是针对Action中某个的方法进行校验,则配置方法如下:
在Action所在的包中创建一个XML文件,命名规则:Action类名-方法对应的访问路径-validation.xml。引入DTD文件等。例如:RegistAction-regist-validation.xml
3、Struts2框架提供的XML校验规则
一般而言,每个struts2框架的校验器都有一个fieldName的属性值,可以用来设置校验器的类型时非字段类型还是字段类型。不指定该属性值时默认是字段校验器,即服务器端完成校验。
例如输入密码的非字段验证器配置如下:
<validators> <!-- 校验器类型 -->
<validator type="requiredstring">
<!-- 设置校验器类型为非字段校验器 -->
<param name="fieldName">password</param>
<message>密码不能为空</message>
</validator>
<validators>
常见的校验器如下:
* 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指定最大值)
struts2的输入检验的更多相关文章
- (十三)struts2的输入校验
输入校验是web应用必须处理的问题,要防止用户的误输入和恶意非法输入.struts2给我们提供了非常强大的输入校验体系. 输入校验分为客户端校验和服务器端校验.一般开发中两者都用,但是服务端校验必须使 ...
- Struts2的输入校验(2)——客户端校验
Struts2的输入校验(2) --客户端校验 Struts2客户端校验的使用: (1)使用Struts2的标签生成输入页面的表单: (2)为该<s:form>元素添加validate=& ...
- Struts2的输入校验(1)——校验规则文件的编写
Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: ...
- Struts2的输入验证
一.概述: ① Struts2的输入验证 –基于 XWorkValidation Framework的声明式验证:Struts2提供了一些基于 XWork Validation Framework的内 ...
- Struts2框架(8)---Struts2的输入校验
Struts2的输入校验 在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验: 客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻 ...
- JavaWeb框架_Struts2_(六)----->Struts2的输入校验
1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...
- struts2系列(二):struts2参数传递错误、struts2的输入错误验证
一.struts2参数传递错误 1. 基本数据类型的传递最好使用包装类,原因是struts 2.1之后使用基本数据类型如果参数为空会报错2. 日期参数的传递最好定义一个区域的属性(定义locale), ...
- struts2(三) 输入校验和拦截器
前面知道了struts2的架构图和struts2的自动封装表单参数和数据类型自动转换,今天来学struts2的第三第四个东西,输入校验和拦截器, --WH 一.输入校验 在以前我们写一个登录页面时,并 ...
- java之struts2之数据检验
1.使用struts2时,有时候需要对数据进行相关的验证.如果对数据的要求比较严格,或对安全性要求比较高时,前端 js 验证还不够, 需要在后端再进行一次验证,保证数据的安全性. 2.struts2提 ...
随机推荐
- Codevs 数字三角形 问题合集
1220 数字三角形 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得 ...
- LeetCode OJ--Subsets II
https://oj.leetcode.com/problems/subsets-ii/ 求一个集合的子集,但集合中有重复元素. 求子集的问题,对应着数的二进制,相当于对二进制的一个遍历. #incl ...
- HOJ - 2543最小费用流
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2543 这个题目挺有意思. 自己扣了一会儿,发现图挺好建,就把(u,v,f,w) 拆成(u,v,f,0) ...
- python 中各种数据类型的排序问题
list #按照list的第二键值排序 disP2P = [[1,2,3],[2,3,4],[4,5,6]] disP2P = sorted(disP2P,key = lambda x:x[2]) s ...
- (49)C# npoi-word
//新建段落 XWPFParagraph p1 = doc.CreateParagraph(); //对齐方式 p1.SetAlignment(ParagraphAlignment.LEFT); p1 ...
- git 撤回上一次commit中某一个不想添加的文件
1. 假设我们修改了文件a,同时修改了IDE的配置文件b 2.此时我们只想添加文件a到commit中,却不小心将b也添加进去了 3.那么怎么撤回呢? 4.第一种方法 :重新提交commit 5. 第二 ...
- Codeforces Gym 100203I I WIN 最大流
原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 首先寻找每个I,然后枚举形状,如果匹 ...
- Kalendae使用总结
2019-03-06 16:50:18 git官方教程:https://github.com/Twipped/Kalendae js.css:https://pan.baidu.com/s/1Ye-d ...
- 【webpack2】-- 入门与解析
每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档. webpack是基于node的.先安装最新的node. 1.初始化 安装node后,新建一个目录,比如ht ...
- 设置NSZombieEnabled和MallocStackLogging
在XCode.4以上版本号中,设置NSZombieEnabled和MallocStackLogging 1.点击XCode的Product菜单.选择Edit Scheme...选项 2.选择左側的Ru ...