strut2 的数据验证

时间:2022-11-12 23:38:53

数据验证

用户的输入验证,必须做,且工作量巨大。

1、验证的方式

客户端验证:javascript

服务端验证:逻辑验证(我们的代码)

注意:如果客户端和服务端二选一的话,服务器端的不能省。

实际开发中:客户端+服务端

2、Struts2的服务端验证

2.1、编程式验证

前提:

                                   动作类必须继承ActionSupport

                            在代码中编写验证规则。

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

在动作类中覆盖public void validate()方法。

 /**
* 在struts2的框架中,它也提供了一个Map<表单的字段名,错误提示>
* 我们要做的:
* 往map中存放错误信息
*
* 编程式验证:
* 1.动作类必须继承ActionSupport
* 2.重写validate方法
*
* validate方法会在动作方法执行之前,进行验证
*
* 当重写了validate方法,它会对动作类中的所用动作方法进行验证。
*/ public void validate(){
if(StringUtils.isEmpty(user.getUsername())){
//存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示
addFieldError("username", "请输入用户名");
}
}

动作类中复写的validate()

            但是,该验证方法会对动作类中的所有动作方法进行验证。

b、针对动作类中的某个动作方法进行验证

针对上面的问题,解决办法1:给不需要验证的动作方法添加一个@SkipValidation注解。  

 @SkipValidation
public String findAll(){
return SUCCESS;
}

解决方法一

                     解决办法2:validation方法遵守书写规范。

 /**
* 在struts2的框架中,它也提供了一个Map<表单的字段名,错误提示>
* 我们要做的:
* 往map中存放错误信息
*
* 编程式验证:
* 1.动作类必须继承ActionSupport
* 2.重写validate方法
*
* validate方法会在动作方法执行之前,进行验证
*
* 当重写了validate方法,它会对动作类中的所用动作方法进行验证。
* 解决验证所有动作方法的问题:
* 第一种方式:
* 使用@SkipValidation的注解
* 第二种方式:
* 定义验证方法的名称:validate+动作名称 动作名称的首字符还要大写
*/
public void validateRegister(){
if(StringUtils.isEmpty(user.getUsername())){
//存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示
addFieldError("username", "请输入用户名");
}
} }

解决方法二

解决办法1和解决办法2的使用时机:需要验证的动作方法少,用解决办法2。需要验证的方法多,用解决方式1。(简单一点:挑少的写)

所有编程式验证的弊端:硬编码。

2.2、声明式验证(推荐)

通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。

                            优势:解决了2.1编程式验证的弊端

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">
<!-- 当使用ActionClassName-validation.xml来命名文件时,它是一个动作类验证器。会验证动作类中的所有动作方法 -->
<validators>
<!-- 基于字段的声明式验证 -->
<!-- field中name属性指定的是表单name属性的取值 -->
<field name="username">
<!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
<field-validator type="requiredstring">
<message>用户名呢</message>
</field-validator>
</field>
</validators>

ActionClassName-validation.xml

注意:它是针对动作类中的所有动作方法。

b、针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-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">
<!-- 当使用ActionClassName-ActionName-validation.xml来命名文件时,它是一个指定动作方法的验证器。只会验证指定的动作方法 -->
<validators>
<!-- 基于字段的声明式验证 -->
<!-- field中name属性指定的是表单name属性的取值 -->
<field name="username">
<!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
<field-validator type="requiredstring">
<message>用户名必须存在</message>
</field-validator>
</field> <!-- 基于验证器的验证 -->
<validator type="requiredstring">
<!-- 以注入的方式,提供要验证的字段信息
setFieldName("password");
-->
<param name="fieldName">password</param>
<message>密码必须输入</message>
</validator>
</validators>

ActionClassName-ActionName-validation.xml

它是针对指定动作方法进行验证:

2.3、Struts2内置的常用声明式验证器

2.3.1位置:

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

 <?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"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<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 -->

default.xml

2.3.2、验证器注入参数

例如:我们使用requiredstring,默认是去空格,当我们不想去空格时,就可以给验证器注入参数。

      基于字段的:            

 <!-- 基于字段的声明式验证 -->
<!-- field中name属性指定的是表单name属性的取值 -->
<field name="username">
<!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
<field-validator type="requiredstring">
<!--给requiredstring的trim参数 通过 set方法注入参数-->
<param name="trim" >false</param>
<message>用户名必须存在</message>
</field-validator>
</field>

                                               另一种基于验证器的:

                                  

 <!-- 基于验证器的验证 -->
<validator type="requiredstring">
<!-- 以注入的方式,提供要验证的字段信息
setFieldName("password");
-->
<param name="fieldName">password</param>
<message>密码必须输入</message>
</validator>

                                              

3、常用验证器示例

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--导入struts2的标签库 --%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户注册,使用的是struts2的标签</title>
<s:head></s:head>
</head>
<body>
<s:actionerror/> <%--动作错误 --%>
<%--<s:fielderror /> 字段错误 --%>
<%--struts2的form标签,它提供了和原始html表单标签几乎一致的属性
action:请求的地址。直接写动作名称。不用写contextPaht
method:请求的方式。在这里不用写。struts2的form表单默认就是post
enctype:表单编码的MIME类型
--%>
<s:form action="addStudent.action">
<s:textfield name="username" label="用户名" />
<s:textfield name="age" label="年龄"/>
<s:textfield name="email" label="邮箱"/>
<s:textfield name="password" label="密码" />
<s:textfield name="repassword" label="确认密码"/>
<s:textfield name="score" label="成绩"/>
<s:textfield name="url" label="个人主页"/>
<%--list中的取值是生成一个list集合,并往集合中放入元素 --%>
<s:radio name="gender" list="{'男','女'}" label="性别"/>
<s:submit value="注册"/>
</s:form>
</body>
</html>

jsp页面

 <?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">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message>请输入用户名</message>
</field-validator>
</field> <field name="age">
<field-validator type="int">
<!-- 使用注入的方式,设置最大和最小值 -->
<param name="min">18</param>
<param name="max">100</param>
<message>请输入18-100之间的整数</message>
</field-validator>
</field> <field name="email">
<field-validator type="email">
<message>请输入正确的邮箱格式</message>
</field-validator>
</field> <field name="password">
<field-validator type="requiredstring">
<!-- 注入取消使用trim -->
<param name="trim">false</param>
<message>请输入密码</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">3</param>
<param name="maxLength">8</param>
<message>密码长度是3~8位的</message>
</field-validator>
</field> <!-- 确认密码和密码必须保持一致,是2个字段的事,所以要使用基于验证器的声明方式 -->
<validator type="expression">
<param name="expression">
<![CDATA[
password == repassword
]]>
</param>
<message>两次密码必须一致</message>
</validator> <field name="score">
<field-validator type="regex">
<param name="regex">
\d+
</param>
<message>请输出正确的成绩</message>
</field-validator>
</field> <field name="url">
<field-validator type="url">
<message>请输入正确的url地址</message>
</field-validator>
</field> <field name="gender">
<!-- required是一个只验证是否null的内置验证器,不会去除空格 -->
<field-validator type="required">
<message>请选择性别</message>
</field-validator>
</field>
</validators>

验证的xml文件

 <!-- 声明式验证器案例的动作类配置 -->
<action name="addStudent" class="com.itheima.web.action.StudentAction" method="addStudent" >
<result name="input">/student.jsp</result>
</action>

配置strut2.xml文件

运行结果: