在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验:
客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻服务器的负担,但是客户端校验并不是安全的,简单来讲就是防君子防不了小人。
服务器端校验:最大特点就是数据安全,但是如果只有服务器端校验,会大大增加服务器端的负担。
所以一般在我们开发中,是客户端和服务器端校验相结合作用的。
那这篇文章,我只讲服务器端校验,在Struts2支持两种校验方式:
代码校验 :在服务器通过编辑java代码完成数据校验
配置校验: xml配置校验 通过xml配置文件完成数据的校验
(1)代码校验:
代码校验分为三个步骤:
步骤一、封装数据
步骤二、实现要校验的Action 必须继承ActionSupport
步骤三、覆盖Validate方法 然后完成业务逻辑数据的校验
用户界面 register.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<%@ page language= "java" import = "java.util.*" pageEncoding= "UTF-8" %> <%@ taglib uri= "http://java.sun.com/jsp/jstl/core" prefix= "c" %> <%@ taglib uri= "/struts-tags" prefix= "s" %> <html> <head> <title>用户注册</title> </head> <body style= "text-align: center;" > <table align= "center" width= "50%" > <tr> <td style= "color: red" > <!-- <s:fielderror></s:fielderror> --> <!-- 这里是显示错误的地方 --> </td> </tr> </table> <form action= "${pageContext.request.contextPath }/login" method= "post" > 用户名:<input type= "text" name= "username" ><br><br> 密 码:<input type= "text" name= "password" ><br><br> 确认密码:<input type= "text" name= "password2" ><br><br> <input type= "reset" value= "清空" > <input type= "submit" value= "注册" > </form> </body> </html> |
struts.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > <struts> <!-- 配置常量信息 --> <constant name= "struts.devMode" value= "true" ></constant> < package name= "struts2" extends = "struts-default" > <action name= "login" class = "com.study.Login.RegisterAction" > <result name= "success" >/success.jsp</result> <!-- 在input视图中可以通过<s:fielderror/>显示失败信息 --> <result name= "input" >/register.jsp</result> </action> </ package > </struts> |
RegisterAction.java
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
|
import com.opensymphony.xwork2.ActionSupport; public class RegisterAction extends ActionSupport{ private String username; private String password; private String password2; //这里我通过set方法封装数据 public void setUsername(String username) { this .username = username; } public void setPassword(String password) { this .password = password; } public void setPassword2(String password2) { this .password2 = password2; } @Override public String execute() throws Exception { return NONE; } //在服务器端需要完成对数据的校验 @Override public void validate() { //测试是否得到属性值,证实已经得到 System.out.println(username+ "---" +password+ "---" +password2); if (username== null || username.length()< 6 || username.length()> 20 ){ //把错误信息保存到字段中 this .addFieldError( "username" , "有户名输入不合法" ); } if (password== null || password.length()< 6 || password.length()> 20 ){ //把错误信息保存到字段中 this .addFieldError( "password" , "密码输入不合法" ); } else if ( password2== null || password2.length()< 6 || password2.length()> 20 ){ this .addFieldError( "password2" , "密码输入不合法" ); } else if (!password.equals(password2)){ this .addFieldError( "password2" , " 两次密码不一致" ); } super .validate(); } } |
运行结果:
(2)框架校验
框架校验也就是通过XML配置方式进行数据校验 ,这也是我们在企业开发的主流校验。
XML校验原理: 将很多规则代码已经写好只需要在xml文件中定义需要使用的校验规则即可。,所以大大减少了我们的开发时间。
我先把步骤写一下:
步骤一:编写JSP
步骤二:编写Action 继承ActionSupport或者Validateable接口
步骤三:封装请求参数
步骤四:编写xml校验规则文件
Xml校验文件的命名规则: Action类名-validation.xml 对Action中所有的方法都执行校验
举例命名规则RegisterAction-validation.xml
同时要满足:Xml校验文件和Action类要在同一包下
步骤一: register.jsp
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
65
66
67
68
69
70
71
72
|
<%@ page language= "java" import = "java.util.*" pageEncoding= "UTF-8" %> <%@ taglib uri= "http://java.sun.com/jsp/jstl/core" prefix= "c" %> <%@ taglib uri= "/struts-tags" prefix= "s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > <html> <head> <title>用户注册</title> </head> <body style= "text-align: center;" > <table align= "center" width= "50%" > <tr> <td style= "color: red" > <s:fielderror></s:fielderror> </td> </tr> </table> <form action= "${pageContext.request.contextPath }/login.action" method= "post" > <table width= "60%" > <tr> <td>用户名</td> <td> <input type= "text" name= "username" > </td> </tr> <tr> <td>密码</td> <td> <input type= "password" name= "password" > </td> </tr> <tr> <td>确认密码</td> <td> <input type= "password" name= "password2" > </td> </tr> <tr> <td>年龄</td> <td> <input type= "text" name= "age" > </td> </tr> <tr> <td>邮箱</td> <td> <input type= "text" name= "email" > </td> </tr> <tr> <td>生日</td> <td> <input type= "text" name= "birthday" > </td> </tr> <tr> <td>毕业日期</td> <td> <input type= "text" name= "graduation" > </td> </tr> <tr> <td> <input type= "reset" value= "清空" > </td> <td> <input type= "submit" value= "注册" > </td> </tr> </table> </form> </body> </html> |
步骤二:RegisterAction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public class RegisterAction extends ActionSupport implements ModelDriven<User>{ //手动创建一个对象 private User user = new User(); @Override public String execute() throws Exception { return NONE; } public User getModel() { return user; } } |
步骤三:封装请求参数
上面手动校验的案例我是用set方法封装数据,那这里我采用的是使用ModelDriven接口,对请求数据进行封装,
在之前我讲过封装数据的三种方法不清楚的可以看下这篇文章:Struts框架(6)---action接收请求参数
User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.Date; public class User { private String username; private String password; private String password2; private Integer age; private String email; private Date birthday; private Date graduation; /* * 给属性提供get和set方法 */ } |
步骤四:RegisterAction-validation.xml
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
|
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd" > <validators> <!--dtd约束在xwork-core-**.jar包中 --> <field name= "username" > <field-validator type= "requiredstring" > <param name= "trim" > true </param> <message>用户民不能为空</message> </field-validator> <field-validator type= "stringlength" > <param name= "minLength" > 6 </param> <param name= "maxLength" > 15 </param> <message>有户名长度必须在 ${minLength} 和 ${maxLength}之间 </message> </field-validator> </field> <field name= "password" > <field-validator type= "requiredstring" > <param name= "trim" > true </param> <message>密码不能为空</message> </field-validator> <field-validator type= "stringlength" > <param name= "minLength" > 6 </param> <param name= "maxLength" > 15 </param> <message>密码必须在 ${minLength}和${maxLength}之间 </message> </field-validator> </field> <field name= "password2" > <field-validator type= "fieldexpression" > <param name= "expression" ><![CDATA[password==password2]]></param> <message>两次密码不一致</message> </field-validator> </field> <field name= "age" > <field-validator type= "required" > <param name= "trim" > true </param> <message>年龄不能为空</message> </field-validator> <field-validator type= "int" > <param name= "min" > 1 </param> <param name= "max" > 150 </param> <message>年龄必须在 ${min} 和 ${max}之间</message> </field-validator> </field> <field name= "email" > <field-validator type= "email" > <message>不是一个合法的邮箱地址</message> </field-validator> </field> <field name= "birthday" > <field-validator type= "date" > <param name= "min" > 2001 - 01 - 01 </param> <param name= "max" > 2003 - 12 - 31 </param> <message>生日必须在 ${min} 和${max}之间</message> </field-validator> </field> </validators> |
struts.xml不需要任何改变,和之前一样就可以了
运行结果:
如果你觉得提示错误的位置有点丑,那你可以运用Struts2的<s:form>标签,效果会更好
现在两种方式都讲了,现在对xml配置的要点一些知识要点进行归纳。
xml校验文件详解:
<validators>: 根元素
<field>:指定action中要校验的属性,name属性指定将被验证的表单字段的名字
<field-validator>:指定校验器, type 指定验证规则
上面指定的校验器requiredstring是由系统提供的,系统提供了能满足大部分验证需求
的校验器,这些校验器的定义可以在xwork-2.x.jar中的
com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<param>:子元素可以向验证程序传递参数
<message>:子元素为校验失败后的提示信息,如果需要国际化,可以为message
指定key属性,key的值为属性文件中的key。
struts2校验规则:
系统提供的校验器如下:
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指定最大值)
conversion(转换校验器,指定在类型转换失败时,提示的错误信息)
visitor(用于校验action中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性)
expression(OGNL表达式校验器,它是一个非字段校验器, expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中)
最后讲一个细节:
编写校验文件时,不能出现帮助信息
在编写ActionClassName-validation.xml校验文件时,如果出现不了帮助信息,可以按下面方式解决:
windwos->preferences->myeclipse->files and editors->xml->xmlcatalog
点“add”,在出现的窗口中的location中选“File system”,然后在xwork-2.1.2解压目录的src\java目录中选择xwork-validator-1.0.3.dtd,
回到设置窗口的时候不要急着关闭窗口,应把窗口中的Key Type改为URI 。Key改为http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd
以上所述是小编给大家介绍的Struts2的输入校验实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/qdhxhz/archive/2017/03/13/6538727.html