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提 ...
随机推荐
- 乘法逆元__C++
在开始之前我们先介绍3个定理: 1.乘法逆元(在维基百科中也叫倒数,当然是 mod p后的,其实就是倒数不是吗?): 如果ax≡1 (mod p),且gcd(a,p)=1(a与p互质),则称a关于模p ...
- 一款手机端的日历插件ICalendar.js
我的网盘:http://pan.baidu.com/s/1jIib2Ay
- LeetCode OJ--Binary Tree Postorder Traversal
http://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 树的后序遍历,可以使用递归,也可以使用栈,下面是栈的实现代码 #inc ...
- AC日记——城市 洛谷 P1401
题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...
- Codeforces 599E Sandy and Nuts(状压DP)
题目链接 Sandy and Nuts 题意大概就是给出限制条件求出在该限制条件下树的种数. #include <bits/stdc++.h> using namespace std; # ...
- CDOJ 92 Journey LCA乱搞
原题链接:http://acm.uestc.edu.cn/#/problem/show/92 题意: 给你一棵树,然后在树上连接一条边.现在有若干次询问,每次问你两个点(u,v)之间的距离在加那条边之 ...
- Linux环境下编译JDK
环境准备 操作系统,ubuntu-14.04.6-desktop-amd64.iso,下载地址:http://59.80.44.100/releases.ubuntu.com/14.04/ubuntu ...
- Ubuntu 16.04下使用Wine安装文件比对工具Beyond Compare 4
说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 下载: (链接 ...
- Maven转换成Eclipse/Idea/MyEclipse工程,以及配置Web工程
Eclipse/MyEclipse: //Jar mvn eclipse:eclipse mvn eclipse:myeclipse //Web mvn eclipse:eclipse -Dwtpve ...
- FastDFS 使用经验分享
原文:http://www.ttlsa.com/fastdfs/fastdfs-experience-sharing/ 应用背景 文件被上传到FastDFS后Storage服务端将返回的文件索引(FI ...