前言
数据校验几乎是每个应用都要做的工作。用户输入的数据,发送到服务器端,天知道用户输入的数据是否是合法的,是否为恶意输入。所以一个健壮的应用系统必须对用户的输入进行校验,将非法的输入阻止在应用之外,防止这些非法的输入进入系统,从而保证系统的稳定性、安全性。
我们都知道,为了更好的用户体验,以及更高的效率,现在的web应用都存在以下两重数据校验:
- 客户端数据校验
- 服务器端数据校验
对于客户端数据校验主要是通过javascript代码来完成;而对于服务器端数据校验是整个应用阻止非法数据的最后防线,主要通过在应用中编程实现。
struts2框架为了减轻开发人员的工作量,提高工作效率,在数据校验这方面也下了很大功夫,那么struts2是如何完成数据校验的呢?(由于struts2框架的客户端校验能力较弱,不予总结,这篇文章主要总结struts2框架的服务器端数据校验功能)
编写校验规则文件
我们都知道数据校验都是一些繁琐的代码,为了从这些繁琐的代码中抽身出来,struts2框架提供了基于配置文件的数据校验,只需要编写校验规则文件即可,校验规则文件指定每个表单域应该满足怎样的规则。
下面通过一个demo示例来说说struts2框架的输入校验。
前台页面:
1
2
3
4
5
6
7
8
9
|
<body>
<form action= "login" method= "post" >
用户名:<input type= "text" name= "name" /><s:fielderror fieldname= "name" /><br>
密码:<input type= "password" name= "password" /><s:fielderror fieldname= "password" /><br>
年龄:<input type= "text" name= "age" /><s:fielderror fieldname= "age" /><br>
生日:<input type= "text" name= "birthday" /><s:fielderror fieldname= "birthday" /><br>
<input type= "submit" value= "提交" />
</form>
</body>
|
后台action处理代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
public class loginaction extends actionsupport
{
private string name;
private string password;
private int age;
private date birthday;
private string tip;
public void setname(string name)
{
this .name = name;
}
public string getname()
{
return name;
}
public void setpassword(string password)
{
this .password = password;
}
public string getpassword()
{
return password;
}
public void setage( int age)
{
this .age = age;
}
public int getage()
{
return age;
}
public void setbirthday(date birthday)
{
this .birthday = birthday;
}
public date getbirthday()
{
return birthday;
}
public void settip(string tip)
{
this .tip = tip;
}
public string gettip()
{
return tip;
}
public string execute() throws exception
{
// 这里简化了操作
return success;
}
}
|
通过上面的action代码可以看到,我并没有为添加任何的字段校验代码,而我们只需要编写一个校验文件,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<?xml version= "1.0" encoding= "utf-8" ?>
<!-- 指定校验配置文件的dtd信息 -->
<!doctype validators public "-//apache struts//xwork validator 1.0.2//en"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd" >
<!-- 校验文件的根元素 -->
<validators>
<!-- 校验action的name属性 -->
<field name= "name" >
<!-- 指定name属性必须满足必填规则 -->
<field-validator type= "requiredstring" >
<param name= "trim" > true </param>
<message>必须填入名字</message>
</field-validator>
<!-- 指定name属性必须匹配正则表达式 -->
<field-validator type= "regex" >
<param name= "regexexpression" ><![cdata[(\w{ 4 , 25 })]]></param>
<message>您输入的用户名只能是字母和数字,且长度必须在 4 到 25 之间</message>
</field-validator>
</field>
<!-- 校验action的password属性 -->
<field name= "password" >
<field-validator type= "requiredstring" >
<param name= "trim" > true </param>
<message>必须输入密码</message>
</field-validator>
<field-validator type= "regex" >
<param name= "regexexpression" ><![cdata[(\w{ 4 , 25 })]]></param>
<message>您输入的用户名只能是字母和数字,且长度必须在 4 到 25 之间</message>
</field-validator>
</field>
<!-- 校验action的age属性 -->
<field name= "age" >
<field-validator type= "int" >
<param name= "min" > 1 </param>
<param name= "max" > 150 </param>
<message>年龄必须在 1 到 150 之间</message>
</field-validator>
</field>
<!-- 校验action的birthday属性 -->
<field name= "birthday" >
<field-validator type= "date" >
<param name= "min" > 1900 - 01 - 01 </param>
<param name= "max" > 2050 - 02 - 21 </param>
<message>生日必须在 ${min}到${max}之间</message>
</field-validator>
</field>
</validators>
|
struts2的校验文件规则与struts1的校验文件设计方式不同,struts2中每个action都有一个校验文件,因此该校验文件的文件名应该遵守如下规则:
1
|
<action名字>-validation.xml
|
前面的action名是可以改变的,后面的-validation.xml部分总是固定的,且该校验文件应该被保存在与action class文件相同的路径下。
与类型转换失败相似的是,当输入校验失败后,struts2也是自动返回名为"input"的result,因此需要在struts.xml文件中配置名为"input"的result。
国际化提示信息
对于校验失败的情况下,就需要给用户提示错误信息,那么现在就出现了个问题,在多语言环境下,如何正确的提示对应语言的提示信息呢?像上面那样直接在校验文件中写死可不行。为了国际化提示信息,为message元素指定key属性,该key属性指定是国际化提示信息对应key。
例如,上述的校验文件,可以大致写成这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- 校验action的name属性 -->
<field name= "name" >
<!-- 指定name属性必须满足必填规则 -->
<field-validator type= "requiredstring" >
<param name= "trim" > true </param>
<message key= "name.required" />
</field-validator>
<!-- 指定name属性必须匹配正则表达式 -->
<field-validator type= "regex" >
<param name= "regexexpression" ><![cdata[(\w{ 4 , 25 })]]></param>
<message key= "name.regex" />
</field-validator>
</field>
|
内建校验器
在上面的校验文件中,可以看到这样的语句:
1
2
3
|
<field-validator type= "requiredstring" >
<field-validator type= "regex" >
...
|
这里的type属性值就是校验器。在struts2框架内部提供了大量的内建校验器,这些内建的校验器可以满足大部分应用的校验需求,我们只需要使用这些校验器即可。
我们可以使用解压缩工具打开xwork-core-2.3.24.1.jar文件,在xwork-core-2.3.24.1.jar\com\opensymphony\xwork2\validator\validators路径下可以找到一个default.xml文件,这个文件就是struts2默认的校验器注册文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
<?xml version= "1.0" encoding= "utf-8" ?>
<!doctype validators public
"-//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 name= "required" class = "com.opensymphony.xwork2.validator.validators.requiredfieldvalidator" />
<!-- 必填字符串校验器 -->
<validator name= "requiredstring" class = "com.opensymphony.xwork2.validator.validators.requiredstringvalidator" />
<!-- 整数校验器 -->
<validator name= "int" class = "com.opensymphony.xwork2.validator.validators.intrangefieldvalidator" />
<!-- 长整数校验器 -->
<validator name= "long" class = "com.opensymphony.xwork2.validator.validators.longrangefieldvalidator" />
<!-- 短整数校验器 -->
<validator name= "short" class = "com.opensymphony.xwork2.validator.validators.shortrangefieldvalidator" />
<!-- 双精度浮点数校验器 -->
<validator name= "double" class = "com.opensymphony.xwork2.validator.validators.doublerangefieldvalidator" />
<!-- 日期校验器 -->
<validator name= "date" class = "com.opensymphony.xwork2.validator.validators.daterangefieldvalidator" />
<!-- 表达式校验器 -->
<validator name= "expression" class = "com.opensymphony.xwork2.validator.validators.expressionvalidator" />
<!-- 字段表达式校验器 -->
<validator name= "fieldexpression" class = "com.opensymphony.xwork2.validator.validators.fieldexpressionvalidator" />
<!-- 电子邮件校验器 -->
<validator name= "email" class = "com.opensymphony.xwork2.validator.validators.emailvalidator" />
<!-- url校验器 -->
<validator name= "url" class = "com.opensymphony.xwork2.validator.validators.urlvalidator" />
<!-- visitor校验器 -->
<validator name= "visitor" class = "com.opensymphony.xwork2.validator.validators.visitorfieldvalidator" />
<!-- 转换校验器 -->
<validator name= "conversion" class = "com.opensymphony.xwork2.validator.validators.conversionerrorfieldvalidator" />
<!-- 字符串长度校验器 -->
<validator name= "stringlength" class = "com.opensymphony.xwork2.validator.validators.stringlengthfieldvalidator" />
<!-- 正则表达式校验器 -->
<validator name= "regex" class = "com.opensymphony.xwork2.validator.validators.regexfieldvalidator" />
<validator name= "conditionalvisitor" class = "com.opensymphony.xwork2.validator.validators.conditionalvisitorfieldvalidator" />
</validators>
<!-- end snippet: validators- default -->
|
关于这些校验器的具体使用,这里就不一一举例了。
总结
这篇文章对struts2框架中的校验器进行了简单的总结,对于这里说的校验器,基础的是如何使用,而最重要的是掌握struts2校验器这种思想,将写代码来做的事情,通过配置来完成,这种方法很值得我们借鉴,在我们学习其它框架中,我们也会碰到这种方式。学习,痛并快乐着。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://www.jellythink.com/archives/297