Struts2的数据验证

来源:互联网 发布:手动榨汁机好用么 知乎 编辑:程序博客网 时间:2024/05/16 11:46

1.验证方式

数据验证有两种方式:

第一种:客户端验证

第二种:服务器端验证

2.1编程式验证

 这种方式,要求action必须继承ActionSupport

在代码中编写验证规则

 a.针对动作类中的所有方法进行验证

 在动作类中覆盖public void validate(这是ActionSupport的方法)

那么我们如果检测到错误后要做什么处理了,一般是提示一个字段不能为空,等等。struts2也为我们提供了一个存放错误消息的map,键是属性名,value是错误消息.

@Overridepublic void validate() {// TODO Auto-generated method stubsuper.validate();if(StringUtils.isEmpty(user.getName())){addFieldError("name", "用户名不能为空");}}

addFieldError就是我们存放错误消息的map集合


之前,再写a的标题的时候,写到是对所有方法的验证,那我们现在再写一个请求到某个方法,看下验证会不会起作用。

public String findAll(){return SUCCESS;}

 <action name="findAll" class="com.yu.web.action.HelloAction" method="findAll"></action>

<a href="${pageContext.request.contextPath}/findAll.action">查看所有用户名</a>

说明其对所有的方法都其作用了,这样就会有问题,在不需要验证的方法中,有被验证了.

b.解决上述问题

第一种:在其不需要验证的方法上加@SkipValidate

@SkipValidationpublic String findAll(){return SUCCESS;}

第二种:如果一个action有很多种方法,那么如果只有一个需要验证,那么对于不需要验证的方法要加很多的@SkipValidate,显然是不方便的,Struts2也提供了一种只表示这个方法验证的方式:validate+方法名(方法名首字母要大些)

public void validateSaveUser() {// TODO Auto-generated method stubsuper.validate();if(StringUtils.isEmpty(user.getName())){addFieldError("name", "用户名不能为空");}}



编程式验证有一定的缺点,就是硬编码,所有的验证都要写代码来验证

2.2声明式验证(一般使用这种验证)

声明式验证是通过xml来解决的,需要验证时,就编写xml文件,不需要就不编写

a.针对所有的动作进行验证

编程规则:在动作类所在包中,建一个ActionClassName-validation.xml文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC  "-//Apache Struts//XWork Validator 1.0.3//EN"  "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">  <!-- 先导入dtd约束 --> <validators> <!-- 要验证的字段 -->  <field name="name">  <!--指定验证器验证什么  -->  <field-validator type="requiredstring">  <!--有误显示的结果  -->  <message>请输入用户名</message>  </field-validator>  </field> </validators>

b.针对动作类中某个动作进行验证

编程规则:在动作类所在的包中,建一个名称为ActionClassName-ActionName.xml文件


2.3struts2常用的声明式验证器

 2.3.1位置

xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml

2.3.2验证器注入参数

对于设置的一些验证,想做一些改变,比如前面的requiredstring是去空格的,我们想不去空格,就可以给它注入一个参数

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC  "-//Apache Struts//XWork Validator 1.0.3//EN"  "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">  <!-- 先导入dtd约束 --> <validators> <!-- 要验证的字段 -->  <field name="name">  <!--指定验证器验证什么  -->  <field-validator type="requiredstring">  <!--依赖注入的方式设置其参数  -->  <param name="trim">false</param>  <!--有误显示的结果  -->  <message>请输入用户名</message>  </field-validator>  </field> </validators>

第二种编写其声明式验证的方法,验证写在外面,字段写里面

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC  "-//Apache Struts//XWork Validator 1.0.3//EN"  "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">  <!-- 先导入dtd约束 --> <validators>  <!--指定验证器验证什么  -->  <validator type="requiredstring">   <!-- 要验证的字段 -->  <param name="fieldname">name</param>  <!--依赖注入的方式设置其参数  -->  <param name="trim">false</param>  <!--有误显示的结果  -->  <message>请输入用户名</message>  </validator> </validators>


3 国际化

3.1struts2使用国际化的条件

 首先,我们要知道,在Struts2中,所有的消息提示都是基于国际化的。

  其次,要想在Struts2中使用国际化,动作类必须继承ActionSupport类。

a.配置全局资源包,所有包都可以使用

在struts2中配置

 <constant name="struts.custom.i18n.resources" value="com.yu.web.resources.message"></constant>

b.配置包范围的资源

配置名称的规范:

package_语言代码_国家代码.properties(固定的),只为这个资源包中的内容或者其子包服务

c.局部消息资源包(只为动作类)

资源包名称命名规范:动作类名称_语言代码_国家代码.properties,以此种命名方式的资源包,只为动作类服务。

d.struts2中的资源搜素顺序

局部资源消息包——>包范围资源消息包——>全局资源消息包

2.读取资源包中的内容

a.在动作类中读取

struts2提供了一个textprovider来读取资源文件,所以我们只需继承ActionSupport(继承了textprovider)

public String findAll(){               //查找key值                String str=getText("country");System.out.println(str);return SUCCESS;}
如果没有找到此key,那么就显示key值
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="/struts-tags" prefix="s"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>  </head>  <body>  <!--借助struts标签  -->  <s:text name="country"></s:text>用户列表  </body></html>

显示结果:

如果没有经过action,那么显示就是全局资源包的内容,否则,按顺序搜索显示内容

b.指定读取的资源包

<!--设定国际化的文件名  -->        <s:i18n name="com\yu\web\action\package_zh_CN">        <s:text name="country"></s:text>        </s:i18n>

资源包不存在,按搜索顺序搜素


0 0
原创粉丝点击