Struts2的校验器详解/验证框架详解/校验框架详解

文章目录

  • 简介
  • 使用校验器步骤
  • 演示案例
  • 常用校验器
    • required
    • requiredstring
    • stringlength
    • regex
    • int
    • double
    • fieldexpression
    • email
    • url
    • date
    • conversion
    • visitor
    • expression
  • 参考

简介

Struts2 的校验器是在后端对前端提交的数据进行校验,在调用 Action 的指定方法前会先调用校验器的有关方法,校验通过才会调用 Action 指定的方法,校验不通过则会调用 Action 的方法 input(),该方法返回字符串“input”。

校验不通过会将有关的提示信息存储到 Action 对象中的成员变量 validationAware 中(这个成员变量继承自 ActionSupport),然后再调用 Action 的方法 input()(这个方法继承自 ActionSupport),该方法返回字符串“input”。

控制器再将请求转发给名为“input”的 JSP 页面。

使用校验器步骤

1.先写前端页面 JSP

写页面时要确定哪些字段的数据需要校验,在需要校验的字段旁边添加标签 <s:fielderror/>,如下所示:

 <tr>td>邮箱:</td><td><input type="text" name="email"/></td><%--使用<s:fielderror/>标签输出对应字段的错误信息,属性fieldName指定出现错误信息的字段名称--%><td><s:fielderror fieldName="email"/></td>
</tr>

2.写 Action

Action 的属性名称要和前端页面的字段名称保持一致。自定义的 Action 必须继承自 ActionSupport。

3.struts.xml 对 Action 配置

 <action name="register" class="priv.lwx.struts2.validator.web.RegisterAction"><result name="success">success.jsp</result><!--校验失败后,struts2会把页面转到名为"input"的页面中--><result name="input">register.jsp</result>
</action>

4.创建校验器配置文件

首先确定调用哪个 Action 需要校验请求参数的数据。

例如,调用名称为 register 的 Action 需要校验页面表单项的数据,那么就需要在 Action 所在的包目录下创建一个校验器配置文件,并且该配置文件的取名规则为:Action 类的名称-Action 的名称-validation.xml

Action 的名称:struts.xml 文件中标签 <action/> 的属性 name 的值

例如,下面的 action:

<action name="register" class="priv.lwx.struts2.validator.web.RegisterAction"><result name="success">success.jsp</result><!--校验失败后,struts2会把页面转到名为"input"的页面中--><result name="input">register.jsp</result>
</action>

访问 register,需要校验表单数据,那么就可以创建名为 RegisterAction-register-validation.xml 的配置文件。并将该配置文件存放在 RegisterAction 所在的包目录下。Maven 项目在开发时,只能将配置文件存放在目录 resources 下,因此需要将该配置文件存放在目录 resources 中相对应的包目录下,所以你要先在目录 resources 目录下创建和 RegisterAction 的包目录结构相同的目录,再将配置文件存放在对应的包目录下,如下图所示:
在这里插入图片描述

如果配置文件命名为 RegisterAction-validation.xml,则只要访问类 RegisterAction 就会去调用校验器。

校验器调用顺序:
按下面的顺序加载解析校验器配置文件,调用相应的校验器。
先加载 action类名-validation.xml,然后加载 action类名-name属性值-validation.xml 文件。

5.校验器配置

先指定被校验的字段,再指定校验器。谁被校验,由谁来校验!这是【字段 → 校验器】配置风格

例如:

  <!-- 属性name指定被校验的字段名称,这里对字段email进行校验 --><field name="email"><!-- 属性type指定校验器名,requiredstring:非空字符串校验器 --><field-validator type="requiredstring"><!--校验不通过,标签<message/>中的文本会作为标签<s:fielderror/>所输出的HTML标签的文本,显示在页面中--><message>邮箱不能为空</message></field-validator><!-- 一个字段可以配置多个校验器,email:邮箱格式校验器 --><field-validator type="email"><message>邮箱格式不正确</message></field-validator></field>

先指定校验器,再指定被校验的字段。由谁来校验,来校验谁!这是【校验器 → 字段】配置风格。

例如:

<validator type="校验器名"><param name="fieldName">需要被校验的字段</param><param name="参数名">参数值</param><!--校验不通过在页面显示的提示信息 --><message>提示信息</message>
</validator>

演示案例

项目结构图如下:
在这里插入图片描述

register.jsp的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--引用struts2标签库--%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><s:head/><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>注册</title>
</head>
<body>
<form action="register1.action" method="post"><table><tr><td>邮箱:</td><td><input type="text" name="email"/></td><%--使用<s:fielderror/>标签输出对应字段的错误信息,属性fieldName指定出现错误信息的字段名称--%><td><s:fielderror fieldName="email"/></td></tr><tr><td>密码:</td><td><input type="password" name="password"/></td><td><s:fielderror fieldName="password"/></td></tr><tr><td>重复密码:</td><td><input type="password" name="repassword"/></td><td><s:fielderror fieldName="repassword"/></td></tr><tr><td>电话:</td><td><input type="text" name="phone"/></td><td><s:fielderror fieldName="phone"/></td></tr><tr><td><input type="submit" value="提交"/></td><td></td><td></td></tr></table>
</form>
</body>
</html>

success.jsp的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>注册成功</title>
</head>
<body>
欢迎你 ${email}
</body>
</html>

RegisterAction 的代码如下:

package priv.lwx.struts2.validator.web;import com.opensymphony.xwork2.ActionSupport;/*** description** @author liaowenxiong* @date 2022/5/31 18:43*/public class RegisterAction extends ActionSupport {// 页面中需要校验的字段必须和Action的属性一一对应private String email;private String password;private String repassword;private String phone;public String execute() throws Exception {return SUCCESS;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRepassword() {return repassword;}public void setRepassword(String repassword) {this.repassword = repassword;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}
}

struts.xml 的配置如下:

<?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.i18n.encoding" value="UTF-8"/><package name="default" namespace="/" extends="struts-default"><!-- http://localhost:8080/sv/register.jsp --><action name="register" class="priv.lwx.struts2.validator.web.RegisterAction"><result name="success">success.jsp</result><!--校验失败后,struts2会把页面转到名为"input"的页面中--><result name="input">register.jsp</result></action></package>
</struts>

RegisterAction-validation.xml 的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC"-//Apache Struts//XWork Validator 1.0.2//EN""http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!--配置校验器-->
<validators><!-- 属性name指定被校验的字段名称,这里对字段email进行校验 --><field name="email"><!-- 属性type指定校验器名,requiredstring:非空字符串校验器 --><field-validator type="requiredstring"><!--校验不通过,标签<message/>中的文本会作为标签<s:fielderror/>所输出的HTML标签的文本,显示在页面中--><message>邮箱不能为空</message></field-validator><!-- 一个字段可以配置多个校验器,email:邮箱格式校验器 --><field-validator type="email"><message>邮箱格式不正确</message></field-validator></field><field name="password"><field-validator type="requiredstring"><message>密码不能为空</message></field-validator><!-- stringlength:字符串长度校验器 --><field-validator type="stringlength"><!-- 通过校验器参数来添加和设置校验规则,minlength:最小长度 --><param name="minLength">6</param><message>密码长度不能少于6位</message></field-validator></field><!-- 校验两次密码是否一致,使用fieldexpression校验器。expression参数指定判断用的表达式--><field name="repassword"><field-validator type="fieldexpression"><!-- 表达式要写在<![CDATA[]]>内 --><param name="expression"><![CDATA[repassword==password]]></param><message>两次密码不一至</message></field-validator></field><!-- 校验电话格式,使用regex正则表达式校验器,regexExpression参数指定正则表达式 --><field name="phone"><field-validator type="regex"><!-- 注意!2.3.15前的版本使用expression参数 --><param name="regexExpression"><![CDATA[\d{11}]]></param><message>电话号码格式不正确</message></field-validator></field>
</validators>

常用校验器

Struts2 提供了大量的内置校验器,你可以在 xwork-core-2.1.6.jar 的 com.opensymphony.xwork2.validator.validators 下的 default.xml 中查看所有的内置校验器。

required

必填校验器,要求field的值不能为null。

requiredstring

必填字符串校验器,要求field的值不能为null,并且长度大于0

参数说明
trim指定在校验字符串长度之前是否去除字符串前后的空格。

stringlength

字符串长度校验器,要求field的值的长度必须在指定的范围内,否则校验不通过。

参数说明
minLength指定最小长度。
maxLength指定量大长度。
trim指定在校验字符串长度之前是否去除字符串前后的空格。

regex

正则表达式校验器,校验field的值是否与指定的正则表达式相匹配。

参数说明
expression指定正则表达式(2.3.15版用regexExpression)。
caseSensitive指定进行正则表达式匹配时是否区分大小写。

int

整数校验器,要求field的值必须是整型数值,且数值必须在指定的范围内。

参数说明
min指定最小值。
max指定最大值。

double

双精度浮点数校验器,要求field的值必须是double数值,并且数值必须在指定范围内。

参数说明
min指定最小值。
max指定最大值。

fieldexpression

OGNL 表达式校验器。要求 field 的值满足一个 ognl 表达式。

参数说明
expression指定ognl表达式(表达式要写在 <![CDATA[]]>内)。

email

邮件地址校验器。如果field的值非空,则必须符合邮箱地址格式的要求(即必须是合法的邮箱地址)

url

网址校验器。如果field的值非空,则必须符合url格式的要求(即必须是合法的URL地址)

date

日期校验器,要求field的值必须是日期类型的,且日期值必须在指定范围内

参数说明
min指定最小值。
max指定最大值。

conversion

转换校验器,指定在类型转换失败时,提示错误信息。

visitor

用于校验action中的复合属性。它指定一个校验文件用于校验复合属性中的属性。

expression

OGNL表达式校验器。要求 field 满足一个ognl表达式。该校验器不可用在【字段 → 校验器】风格的配置中!

参数说明
expression指定ognl表达式(表达式要写在 <![CDATA[]]> 内)。

参考

1.https://www.cnblogs.com/likailan/p/3302284.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

os引导程序boot 在根目录区寻找os加载程序文件loader 对应的根目录条目

【0】README 0.0&#xff09; source code from orange’s implemention of a os and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/boot.asm0.1&#xff09;本代码仅用于在 根目录区条目中寻找 与 boot代码定义的LoaderFileName…

lambda层保存模型出错_保存您的lambda,以备不时之需-保存到文件

lambda层保存模型出错介绍 简短的帖子&#xff0c;描述了如何将Java lambda持久化到文件中以在不同的过程中重复使用。 序列化Lambda Java 8中引入的Lambda使函数成为Java语言的一等公民&#xff08;几乎&#xff09;。 他们不需要专门的类来保存函数。 但是&#xff0c;这是如…

angular4更改表单中显示的值_angular4 Form表单相关

ng4中&#xff0c;有两种方式去声明一个表单一&#xff1a;Template-Driven Forms - 模板驱动式表单 [引入FormsModule]1.ngForm赋值[可以方便的获取表单的值]nameusername[(ngModel)]login.usernamerequired>Name is required.2.ngModel绑定[ngModel会自动关联表单控件na…

A20地址线问题

【0】README text description from Zhaojiong’s perfect analysis of Linux kernel . 【1】A20地址线问题&#xff08;干货来了&#xff09; 1981年8月&#xff0c;IBM公司最初推出的个人计算机IBM PC 使用的CPU 是 Intel 8088。在该微机中地址线只有20根&#xff08;A0~A1…

java观察者设计模式_Java中的观察者设计模式

java观察者设计模式在本教程中&#xff0c;我们将讨论Observer设计模式。 观察者模式有两个主要方面- 主题和观察者 。 当我们的系统有多个对象&#xff08;称为观察者&#xff09;时 &#xff0c;将使用一个模式&#xff0c;即依赖于一个特定对象&#xff08; 主体&#xff0…

MacOS好用的截图工具

iShot 可以截取长图 高级功能需要付费 jietu 可以截图、录gif、MP4等等&#xff0c;自定义区域、全屏或者窗口&#xff0c;简直不要太方便。 Shottr 介绍地址&#xff1a; https://sspai.com/post/71485 https://www.appinn.com/shottr-for-macos/ cleanshot x Snipaste X…

js截取url问号前面_js截取url问号后参数并转化为对象

题目&#xff1a;js截取url问号后参数并转化为对象&#xff1b;function urlToObj(str){var obj {};var arr1 str.split("?");var arr2 arr1[1].split("&");for(var i0 ; i < arr2.length; i){var res arr2[i].split("");obj[res[0]…

HashMap的学习

文章目录HashMap特点原理示意图常用方法遍历元素LinkedHashMapHashMap 特点 1.世界上查询速度最快的数据结构 2.增删速度也很快 3.加载因子是集合存放的元素数量和散列数组长度的比值&#xff0c;建议加载因子 0.75&#xff0c;超过会自动扩容并且重新散列&#xff08;旧的数…

特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS

【0】README text description from orange’s implemention of a os . 【1】特权级概述 当当前代码段试图访问一个段或者门时&#xff0c;目标段的DPL将会和 CPL 以及段或门选择子的RPL相比较&#xff0c;如何比较&#xff1a;&#xff08;这里是干货&#xff09; &#xf…

java设计模式 订阅模式_Java中的复合设计模式

java设计模式 订阅模式当我们必须使用对象的树状分层结构时&#xff0c;复合设计模式非常有用。 它使我们能够统一对待单个对象和对象组成。 它属于结构设计模式的范畴&#xff0c;因为它将对象组合成树形结构以表示部分整个层次结构。 UML表示形式&#xff1a; 复合模式的UM…

python 短网址_Python实现短网址ShortUrl的Hash运算实例讲解

本文实例讲述了Python实现短网址ShortUrl的Hash运算方法。分享给大家供大家参考。具体如下&#xff1a;shorturl实现常见的做法都是将原始Url存储到数据库&#xff0c;由数据库返回一个对应ID。以下要实现的是不用数据库支持就对原始URL进行shorturl hash。说到这里我们很容易想…

xml json 比较_JSON和XML:它们如何比较?

xml json 比较JSON和XML&#xff1a;它们如何比较&#xff1f; JSON和XML是两种人类可读的文本格式&#xff0c;多年来已成为竞争对手。 XML的目的是通过可选使用模式来存储和定义文档和数据。 JSON几乎完全相反-序列化格式的要求非常简单&#xff0c;可以放在信用卡背面。 但是…

HashSet的学习

文章目录HashSet特点常用方法增删改查性能分析LinkedHashSetHashSet 特点 1.不允许存储重复的元素 2.只允许存储一个 null 3.没有索引值&#xff0c;所以不能使用普通的 for 循环遍历集合元素&#xff0c;也没有与索引值相关的方法 4.是一个无序的集合&#xff0c;存储元素和…

为什么引入TSS

【0】README text description from orange’s implemention of a os and for complete code ,please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/p62.asm. 【1】 回忆——关于堆栈 通过调用门进行有特权级变换的转移——理论篇 &#xff08;1&#xff…

mysql 天数减1_mysql 日期操作 增减天数、时间转换、时间戳

MySQL datediff(date1,date2)&#xff1a;两个日期相减 date1 - date2&#xff0c;返回天数。select datediff(2008-08-08, 2008-08-01); -- 7select datediff(2008-08-01, 2008-08-08); -- -7一、MySQL 获得当前日期时间 函数1.1 获得当前日期时间(date time)函数&#xff1a…

jdk open jdk_JDK 14的迹象开始出现

jdk open jdkJDK 13当前处于Rampdown阶段1 &#xff08;RDP 1&#xff09;&#xff0c;计划在一周多一点的时间&#xff08;2019年7月18日&#xff09;进入Rampdown阶段2 &#xff08;RDP 2&#xff09;&#xff0c;并暂定于2019年9月17日正式上市。当然&#xff0c;这意味着是…

Java集合ArrayList的学习

文章目录特点常用的方法集合迭代器特点 1.集合只能存放对象&#xff0c;可以存储重复元素&#xff0c;不允许存储 null 2.集合存放的对象类型可以不一致 3.集合的长度可以改变&#xff0c;初始大小10&#xff0c;最大容量 Integer.MAX_VALUE - 8&#xff0c;满时扩容&#xff…

知识复习(LDT+TSS+GATE+INTERRUPT)

【1】README 1.0&#xff09;由于实现进程的切换任务&#xff0c;其功能涉及到 LDT TSS &#xff27;ATE INTERRUPT&#xff1b;下面我们对这些内容进行复习&#xff1b; 1.1&#xff09; source code from orange’s implemention of a os . 【2】知识复习&#xff08;LDTT…

arduinopn532模块_树莓派使用libnfc驱动ITEAD NFC PN532模块

libnfc是首个遵循GNU(自由工程项目)通用公共许可证针对所有人都完全免费的低级别NFC软件开发包和编程应用程序接口。它提供了完整的透明度且免费供大家使用。该库目前支持调制ISO / IEC14443 A和B&#xff0c;FeliCa&#xff0c;Jewel/Topaz标签及数据交换协议(P2P)作为目标和启…

jakarta ee_Jakarta EE的拟议命名空间

jakarta ee免责声明&#xff1a;这是我的个人观点&#xff0c;并不代表雇主的观点。 到目前为止&#xff0c;由于从Oracle迁移到Eclipse Foundation&#xff0c;每个人都知道我们需要将所有javax软件包名称重命名为其他名称。 &#xff08;供参考&#xff0c;请参阅附录A&…