struts2的输入校验
1.输入校验的概述
输入校验是对用户的输入是否是按照开发者的意愿的校验
2.输入校验的必要性
由于web的开放性,输入校验会直接影响了系统的稳定性。因为不能保证每个用户的属于都会按照开发者的意图来输入相关的数据,而且有的用户还会恶意输入写非法数据来进行测试和破坏。
3.客户端校验和服务器校验
(1) 客户端校验:一般的开发者都是在客户端使用JS脚本进行对用户的客户端输入校验。但是呢,这也会有一定的问题。一般来说这是对大多数的用户都是可行的,但是还是会有一些及其聪明的或者有一定的“洁癖”的用户来说是不有任何作用的。比如:用户给浏览器设置了禁止运行脚本语言。
所以为了保护服务器,我们通常的需要在客户端与服务器同时的进行数据输入校验。客户端校验虽然是对大部分的用户起作用,但是这样也会帮着我们大大的减少服务器的压力;服务器校验是一保险动作,当极端的用户绕过客户端校验时候,服务器校验可以起到保护服务器的作用。同时服务器校验可以进行客户端本不能进行数据校验。
(2)服务器校验:利用struts2等框架技术进行校验等等。
一:在action类中进行数据输入检验
!:利用INPUT逻辑视图进行简单的数据转换检验:
当用户输入的数据数据类型不匹配时候,若在action中配置了INPUT的逻辑视图,则会自动的触发该视图。比如在注册的请求当中,age需要的数据类型是int,而用户在前台传过来的数据是String。在action中配置了INPUT的逻辑视图,则自动的触发该逻辑视图。讲得不是很清楚,可能使用代码还更容易懂。
封装数据的JavaBean类实例代码:
public class User implements Serializable {
private String name;
private String password;
private int age;
// 省略个属性的get/set方法
}
在action类中我们只接收参数,并不做任何的处理
public class FirstAction extends ActionSupport {
private User user;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return super.execute();
}
// 省去user的get/set方法
}
struts.xml的action配置
<action name="firstAction" class="com.usc.geowind.lilin.actions.FirstAction"
method="execute">
<!-- 结果指向 -->
<!-- name属性是指定接收的action返回来的字符串数值 -->
<result name="success">
/success.jsp
</result>
<!-- 配置输入校验错误INPUT逻辑处理视图 -->
<result name="input">
/register.jsp
</result>
<result name="fail">
/fail.jsp
</result>
</action>
当从前台传的数据age的值为int类型时候,能够成功的跳转到success.jsp页面,当输入age的参数不是int类型时候,返回到register.jsp页面并提示信息:
!!:在action类的execute等逻辑处理方法中输入检验:
当系统要求用户名不能为空或者是密码必须是6位及以上的要求时,利用返回INPUT方法检验数据的输入是否符合要求。但是使用此方法时候一定得注意:符合配定条件时候,一定得返回字符串,否则即使是判断条件成立,也不会发生效应的。
比如在上的基础上我们要求用户名不能为空,且密码不能少于六位。
我们只要改一下execute()方法就可。
@Override
public String execute() throws Exception {
if ((user.getName() == null || user.getName().equals("")) ||
(user.getPassword().trim().length() < 6)) {
return INPUT;
}
return SUCCESS;
}
!!!利用action类中的validate()方法进行输入检验:
如果数据量大了,代码就会很冗余而且会增加耦合度,所以一般开发当中不会使用该方法的。这时,就有了validate()方法的诞生。此方法返回任何值,达到判定的条件时候我们调用this.addFieldError()就会自动的触发INPUT逻辑视图。
以上一方法的例子为例。action中的方法只需做一下修改
@Override
public String execute() throws Exception {
return SUCCESS;
}
//在调用execute方法前,自动调用该方法进行数据检验。
//符合判定条件,this.addFieldError()直接触发执行INPUT逻辑视图,放弃执行execute方法
@Override
public void validate() {
if ((user.getName() == null || user.getName().equals("")) ||
(user.getPassword().trim().length() < 6)) {
this.addFieldError("Error", "输入有误");
}
}
值得注意的是,在此action类中,倘若有多个类似于execute的逻辑方法,不管是要调用哪一个逻辑方法,在调用逻辑方法前都会去调用validate()方法进行数据校对。
!!!!利用validateXxx()方法进行输入检验:
当我们在一个action类中写了多个类似于execute()的逻辑方法,但是我们要分别对不同的逻辑方法进行不同的数据校验或者是有部分逻辑方法进行数据校验。这时我们就不能使用validate()的方法进行统一校验了。这时我们可以使用validateXxx()方法分别对每个需要进行数据校验的逻辑方法进行教对。
当上面的例子多了一个go()的逻辑方法,而且我们调用的是go()方法并且只对其进行校对。我们的action类只要做一下修改其他不变。
@Override
public String execute() throws Exception {
return SUCCESS;
}
public String go() throws Exception{
return SUCCESS;
}
public void validateGo(){
System.out.println("---validateGo---");
if ((user.getName() == null || user.getName().equals("")) ||
(user.getPassword().trim().length() < 6)) {
this.addFieldError("Error", "输入有误");
}
}
二、基于struts2框架的校验器文件的校验方式。
有一定检验的码农来说,在action类中编写校验方法会显得类代码复杂臃肿也会增加代码的耦合度,一会该日后的维护增加不必要的压力。在使用struts2框架来说,这些都是需要尽量的避免。所以struts2提供了一种基于struts2框架的检验方式,是将校验规则保存在特定的文件中,似的action类与校验分离,从而提高系统的维护性课扩展性。
1.校验文件的配置:
校验文件需要与需要校验的类放在同一个文件目录下,且命名方式:ActionName-validation.xml或者是ActionName-alias-validation.xml (注解:ActionName:表示实际的Action类;alias:struts中配置action的名字)
2.校验器配置风格:
在struts2中提供了两种方式类配置校验器规则:字段与非字段式。两者没有本质的区别,只是在组织形式上方式不一样。字段式以字段优先,非字段式以校验器优先。
字段式校验器配置风格:先指定校验的属性:我来校验谁,由谁来校验!
<validators>
<filed name="被校验的字段"><!-- filed为基本元素 -->
<field-validator type="校验器类名"><!-- 指定校验类型 -->
<param name="参数名">参数值</param><!-- 指定参数 -->
<!-- 可以有多个参数 -->
<message key="I18Nkey">校验失败时候提示的信息</message>
</field-validator>
</filed>
<!-- 下一个要校验的代码 -->
</validators>
非字段校验器配置风格:先指定校验器:由谁来校验,来校验谁
<validator type="校验器名">
<param name="fieldName">需要被校验的字段</param>
<!--此处需要为不同校验器指定数量不等的校验规则 -->
<param name="参数名">参数值</param>
<!--校验失败后的提示信息 -->
<message>校验失败后的提示信息</message>
</validator>
参数比对:
required:必填校验器,要求field的值不能为null。
requiredstring:必填字符串校验器,要求field的值不能为null,并且长度大于0
属性——trim:指定在校验之前是否去除字段串前后的空格。
stringlength:字段长度校验器,要求fidle的值必须在指定的范围内,否则校验失败。
属性——minLength:指定最小长度。 maxLength:指定量大长度。 trim:指定在校验之前是否去除字段串前后的空格。
regex:正则表达式校验器,检查衩校验的field是否匹配一个正则表达式。
属性——expression:指定正则表达式(2.3.15版用regexExpression)。 caseSensitive:指定进行正则表达式匹配时是否区分大小写。
int:整数校验器,要求field的整数值 必须在指定范围内。
属性——min:指定最小值。 max指定最大值。
double:双精度浮点数校验器,要求field的双精度浮点数值必须在指定范围内。
属性——min:指定最小值。 max指定最大值。
fieldexpression:字段OGNL表达式校验器。要求field满足一个ognl表达式。
属性——expression:指定ognl表达式(表达式要写在 <![CDATA[]]> 内)。
email:邮件地址校验器。要求如果field的值非空,则必需是合法的邮件地址。
url:网址校验器。要求如果field的值非空,则必需是合法的 url 地址。
date:日期校验器,要求field的日期值必须在指定范围内
属性——min:指定最小值。 max指定最大值。
conversion:转换校验器,指定在类型转换失败时,提示错误信息。
visitor:用于校验action中的复合属性。它拽定一个校验文件用于校验复合属性中的属性。
expression:OGNL表达式校验器。要求field满足一个ognl表达式。该逻辑表达式基于ValueStack进行求值。该校验器不可用在字段校验器风格的配置中!
属性——expression:指定ognl表达式(表达式要写在 <![CDATA[]]> 内)。
实例:还是以上面的例子为例,在action类中撤销所有校验使用校验文件校验
字段检验:检验文件代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!-- 配置判定密码password的代码 -->
<field name="password">
<!-- 判定密码不能为空 -->
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
<!-- 设置密码长度 -->
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">15</param>
<message>密码长度必须是6--15位</message>
</field-validator>
</field>
<!-- 配置判定用户名name的代码 -->
<field name="name">
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>
</field>
<!-- 配置判定年龄age的代码 -->
<field name="age">
<field-validator type="int">
<param name="min">0</param>
<param name="max">120</param>
<message>年龄必须是在0--120之间</message>
</field-validator>
</field>
</validators>
非字段配置风格校验配置文件实例代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!-- 详情代码均以贴在iteye博客:http://gaosililin.iteye.com/admin/blogs/2268544/edit -->
<!-- 非字段类节气 -->
<validators>
<!-- 对用户名与密码校验不能为空 -->
<validator type="requiredstring">
<param name="filedName">name</param>
<param name="filedName">password</param>
<message>用户名密码不能为空</message>
</validator>
<!-- 对密码长度校验在6————15位之间 -->
<validator type="stringlength">
<param name="filedName">password</param>
<param name="min">6</param>
<param name="max">15</param>
<message>密码长度必须在6--15位</message>
</validator>
<!-- 年龄配置 -->
<validator type="int">
<param name="filedName">age</param>
<param name="min">0</param>
<param name="max">120</param>
<message>年龄必须在[0,120]之间</message>
</validator>
</validators>