Struts2学习教程之输入校验示例详解

2025-05-29 0 37

前言

数据校验几乎是每个应用都要做的工作。用户输入的数据,发送到服务器端,天知道用户输入的数据是否是合法的,是否为恶意输入。所以一个健壮的应用系统必须对用户的输入进行校验,将非法的输入阻止在应用之外,防止这些非法的输入进入系统,从而保证系统的稳定性、安全性。

我们都知道,为了更好的用户体验,以及更高的效率,现在的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>您输入的用户名只能是字母和数字,且长度必须在425之间</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>您输入的用户名只能是字母和数字,且长度必须在425之间</message>

</field-validator>

</field>

<!-- 校验action的age属性 -->

<field name="age">

<field-validator type="int">

<param name="min">1</param>

<param name="max">150</param>

<message>年龄必须在1150之间</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校验器这种思想,将写代码来做的事情,通过配置来完成,这种方法很值得我们借鉴,在我们学习其它框架中,我们也会碰到这种方式。学习,痛并快乐着。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对快网idc的支持。

原文链接:https://www.jellythink.com/archives/297

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Struts2学习教程之输入校验示例详解 https://www.kuaiidc.com/111942.html

相关文章

发表评论
暂无评论