前言
表单输入校验是所有 Web 应用所必备的功能。表单输入校验分可以为客户端校验和服务器端校验。客户端校验一般使用 JavaScript 脚本实现,可以有效的进行数据校验,防止非法输入,可以减轻服务器压力,还能使用户得到良好的体验。服务器端校验至关重要,是阻止非法数据的最后防线。坚决不能以客户端校验代替服务器端校验。
Struts2 提供了输入校验功能,即包含服务器端校验,也包括客户端校验。
一、XML校验规则文件
1.示例环境
- 开发工具:MyEclipse 2017 CI
- JavaEE 版本:7.0
- Struts2 版本:2.5.22
2.示例说明
模拟系统用户新增功能,超级管理员在系统用户新增页面输入用户信息并保存。输入的信息打印在控制台,成功跳转到系统用户列表页面,失败(校验失败)返回到系统用户新增页面并显示错误信息。
3.示例实现
系统用户 Bean:为系统用户提供了4个属性,账号、密码、年龄、生日。
public class SysUser {
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 年龄
*/
private Integer age;
/**
* 生日
*/
private Date birth;
// 省略无参构造
// 省略setter和getter方法
// 省略toString方法
}
系统用户新增页面(WEB-INF/page/sysUser/add.jsp):提供表单录入系统用户信息,<s:fielderror />当检验失败显示错误信息。
<body>
<h3>系统用户添加页面 </h3>
<s:fielderror /><!-- 显示错误信息 -->
<form action="sysUser/save.action" method="post">
账号:<input type="text" name="sysUser.account" /><br/>
密码:<input type="password" name="sysUser.password" /><br/>
年龄:<input type="text" name="sysUser.age" /><br/>
生日:<input type="text" name="sysUser.birth" /><br/>
<input type="submit" value="添加" />
</form>
</body>
系统用户列表页面(WEB-INF/page/sysUser/list.jsp):保存成功后跳转到该页面,这里只提示新增成功提示信息。
<body>
系统用户新增成功! <br>
</body>
系统用户Action(SysUserAction.java):Action 需要继承 ActionSupport,其中有两个方法,分别是:
- add():该方法直接跳转到系统用户新增页面
- save():该方法用于保存系统用户信息,这里只是将前台录入信息进行打印
public class SysUserAction extends ActionSupport{
private SysUser sysUser;
public SysUser getSysUser() {
return sysUser;
}
public void setSysUser(SysUser sysUser) {
this.sysUser = sysUser;
}
/**
* 系统用户 - 添加页面
*
* @return
*/
public String add(){
return "success";
}
/**
* 系统用户 - 数据保存
*
* @return
*/
public String save(){
// 一些操作:例如,保存数据到数据库中
System.out.println(sysUser.toString());
return "success";
}
}
XML 校验规则文件(SysUserAction-save-validation.xml):为SysUserAction 指定一个 XML 校验规则文件,就可以利用 Struts2 的输入校验功能对这个 Action 进行校验。
文件名称格式
- 对 Action 中所有方法进行输入校验:ActionClassName-validation.xml
- ActionClassName:Action 的类名
- -validation:固定写法
- 对 Action 中指定方法进行输入校验:ActionClassName-ActionName-validation.xml,在Action的类名后跟: -Action名称
注意:XML 校验规则文件与 Action 类文件在相同的路径下。
我们将系统用户相关的操作写在一个 Action 中,所有对 Action 中所有方法进行输入校验不可取,应该选择对其指定方法进行输入校验。
SysUserAction-save-validation.xml 代码:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定校验配置文件的 DTD 信息 -->
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<!-- 校验配置文件根元素 -->
<validators>
<!-- 字段校验器配置风格:<field /> -->
<!-- 非字段校验器配置风格:<validator /> -->
<!-- 校验 sysUser对象中的account属性 -->
<field name="sysUser.account">
<!-- 账号必填 -->
<field-validator type="requiredstring">
<message>账号不能为空</message>
</field-validator>
<!-- 账号长度在2-20之间 -->
<field-validator type="stringlength">
<param name="minLength">2</param>
<param name="maxLength">20</param>
<message>账号长度在2-20之间</message>
</field-validator>
</field>
<!-- 其他属性校验 略 -->
</validators>
struts.xml 配置代码:需要注意的是输入校验失败后,与类型转换错误相似,会自动返回 input 的 Result。所以需要在配置文件中配置 input 的 Result。如果不配置,当输入校验失败,会报错。
<?xml version="1.0" encoding="UTF-8" ?>
<!--
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<!-- START SNIPPET: xworkSample -->
<struts>
<!-- SysUser - 系统用户 -->
<package name="sysUser" namespace="/sysUser" extends="struts-default">
<!-- 转发到添加页面 -->
<action name="add" class="com.liyf.action.SysUserAction" method="add">
<result name="success">/WEB-INF/page/sysUser/add.jsp</result>
</action>
<!-- 系统用户信息保存 -->
<action name="save" class="com.liyf.action.SysUserAction" method="save">
<result name="success">/WEB-INF/page/sysUser/list.jsp</result>
<result name="input">/WEB-INF/page/sysUser/add.jsp</result>
</action>
</package>
</struts>
<!-- END SNIPPET: xworkSample -->
4.示例测试
在浏览器访问系统用户添加页面,如下图所示:
输入系统用户信息,账号只输入1个字符串,使校验失败,如下图所示:
点击添加【按钮】提交,返回input视图并显示错误信息,如下图所示:
二、内置校验器
我们可以在 struts-core-2.5.22.jar 包中找到这些系统提供的校验器,如下图所示:
- required:检查字段是否不为空。
- requiredstring:检查一个字符串字段是否为非空且长度为> 0。(也就是说它不是“”)
- int:检查指定的整型是否在某个范围内。
- long:检查指定的长整型是否在某个范围内。
- short:检查指定的短整型是否在某个范围内。
- double:用于检查指定的双精度值是否在某个范围内。
- date:检查提供的日期是否在特定范围内。
- expression:基于提供的正则表达式进行验证的非字段验证器。
- fieldexpression:使用OGNL表达式验证字段。
- email:检查给定的字符串字段(如果不是空的)是否是有效的电子邮件地址。
- creditcard:检查给定的字段是否是有效的信用卡。
- url:检查给定字段是否为字符串和有效URL。
- visitor:用于校验action中的复合属性
- conversion:用于检查该字段是否发生转换错误。
- stringlength:检查字符串字段是否具有特定长度。
- regex:使用正则表达式验证字符串字段。
- conditionalvisitor:将只在表达式求值为true时将验证转发给VisitorFieldValidator。
三、其他说明
- 使用XML校验规则文件进行输入校验,好处可能就是不需要对程序代码做变动,只需要编写这个校验规则文件就可以了。
- 提到的两种配置校验规则的风格,他们的实现效果是一样的,只是风格不一样。其实可以从节点名称可以看出来,
<field />
,以字段为主;<validator />
,以校验器为主。
总结
知识辣么多,肿么可能都会。重要的是要知道有这么个东东。