Struts2学习笔记(十三) 输入校验(上)

A-Level经济例题解析及练习Opportunity Cost 例题Question: Opportunity CostYou are selling your 1996 Mustang.  You have already spent $1000 on repairs. At the last minute, the transmission dies.  You can pay $600 to have it repaired, or sell the car “as is.”In each of the fol 阅读详情

验证器概述

一个健壮的Web应用程序必须确保用户输入是合法的。比如在注册用户的时候,将用处注册信息保存到数据库之前一般我们会判断用户输入的密码长度是否过短,或者用户的email地址格式是否正确。Strut2提供了一些内建的输入验证程序,通过使用他们,不需要变成即可实现对用户输入的校验,我们只需要在xml配置文件中做出声明就可以了,声明的内容包括,那么字段需要进行验证,在验证失败时应该把什么样的出错信息发送到浏览器等。

验证程序可以分为两大类别:字段验证器(Field validators)和非字段验证器(Non-field validator)。

字段验证程序与表单中的某个字段想关联,其验证行为发生在把一个值赋给一个动作属性之前。非字段验证程序(普通验证器)不与某个特定的字段相关联,他们用来测试某种特定的条件是否得到了满足。Struts2内建的验证器基本上都是字段验证器。Validation拦截器负责加载和执行已经注册的验证器,由于Validation拦截器是defaultStack拦截器栈中的一员,因此我们可以不用声明就可以直接使用内建的验证器(具体实现原理可以查看Validation拦截器源代码)。

使用验证器的步骤:

(1)   确定那些Action需要使用输入验证(验证器)

(2)   编译xml配置文件。命名格式如下:

ActionClass-validation.xml

ActionClass-ActionMethod-validation.xml

第一中格式比较常见。但是有时候我们的Action类中可能包含多个动作方法,而有时我们至于要对其中的一部分动作(方法)进行输入验证。比如我的User动作类包含add和edit两个动作方法,如果他们使用同样的输入校验规则,那么直接一个User-validation.xml就足够了,但是如果这两个动作方式使用的不是同一种验证策略,那么就需要我们为他们单独配置验证规则,User-add-validation.xml和User-edit-validation.xml。

(3)    确定验证失败时应该把用户定向到什么地方,这需要我们在定义一个名为input的Result,可以是专门为动作定义或者是全局Result。否则在输入校验失败时将会抛出异常,提示找不到”input”结果。

注:字段验证器和非字段验证器在产生的错误消息级别上也有所差异。字段验证器产生的验证错误信息就会作为Actin的field level错误信息,而非字段验证器的错误信息将会作为Action level的错误信息。并且对于用一字段,非字段验证器的优先级比字符按验证器的优先级高(与在配置文件中声明的顺序无关),如果一个非字段验证器声明为short-circuited(短路)的,那么它验证失败后不会再去执行该字段的字段验证器。

验证器的配置

验证程序配置工作的核心任务就是编写验证器配置文件。验证器配置使用的xml文件,首先我们需要引用与验证器配置相关的dtd文件,这个文件可以在xwork-core-2.3.1.2.jar下找到(xwork-validator-1.0.3.dtd)其中包含了我们的xml的DOCTYPE语句的格式:

<!DOCTYPE validators PUBLIC

       "-//Apache Struts//XWork Validator1.0.3//EN"

       "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

验证器配置文件的根元素是validators,<validators>元素可以有任意数量的<field>元素和<validator>元素。每一个<field>元素表示一个将被一个或多个字段验证器进行校验的表单字段。每个<validator>元素表示一个非字段验证器。下面我们动手做一个实例,使用验证器验证用户输入的用户名是否为空和验证用户输入的密码的长度。

UserAction.java

public class UserAction extends ActionSupport {

	private String userName;
	private String password;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String execute() throws Exception {

		return SUCCESS;
	}
}

UserAction-validation.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

        "-//Apache Struts//XWork Validator1.0.3//EN"

        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

   

    <field name="userName">

       <field-validator type="requiredstring">

           <param name="trim">true</param>

           <message>UserNamecannot be empty</message>

       </field-validator>

    </field>

   

    <field name="password">

       <field-validator type="requiredstring">

           <param name="trim">true</param>

           <message>passwordcannot be empty</message>

       </field-validator>

       <field-validator type="stringlength">

           <param name="minLength">6</param>

           <param name="maxLength">10</param>

           <message>the length ofpassword must between 6 and 10</message>

       </field-validator>

    </field>

   

</validators>

input.jsp

<body>

  <s:if test="hasFieldErrors()">

    <s:iterator value="fieldErrors"> 

        <font color="#FF0000"><s:property value="value[0]"/></font><br> 

    </s:iterator> 

  </s:if>

 

  <form action="user.action" method="post">

     username : <input type="text" name="userName"/><br/>

     password : <input type="password" name="password"/>

      <input type="submit" value="submit"/>

  </form>

  </body>

测试:

内建的验证器

在上面的实例中,我们不需要编写任何代码就可以实现对表单字段的验证,都是使用了Struts2内建实现的验证器。当然,这些内建的验证器肯定都是有相应的实现类的。下面是Struts2内建验证器的声明:

<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>

我们可以看到,我们刚才使用的required验证器对应的实现类是com.opensymphony.xwork2.validator.validators.RequiredFieldValidator,我们查看该类的源代码;

public class RequiredFieldValidator extends FieldValidatorSupport {

 

    public void validate(Object object) throwsValidationException {

        String fieldName = getFieldName();

        Object value = this.getFieldValue(fieldName, object);

 

        if (value == null) {

            addFieldError(fieldName, object);

        }

    }

}

其中只有一个validate方法,这个方式是每个验证器都有的方法,在这里我们可以清楚的看到这个验证器的实现。

其实只要实现了Validator接口的类都可以作为验证器,下面这张图显示了Struts2中验证器的继承层次:

关于内建验证器的使用,在上面的例子中已经学习了。如果是字段验证器,那么我们就需要在<field>元素中使用<field-validator>元素来声明一个字段验证器,每个验证器都必须具有一个<message>元素,里面的内容将会在验证失败时被呈现到表单输入界面。如果要给验证器传递参数,那么可以使用<param>子元素,需要注意的就是<param>元素的name属性需要和验证器实现类中定义的成员属性相对应,具体的可以在使用的时候查看手册。

对于非字段验证器,比如expression。配置的方式大致相同。我们在动手做一个实例吧,判断用户输入的两个数之间的大小关系。

NumberAction.java

public class NumberAction extends ActionSupport {

	private int max;
	private int min;

	public int getMax() {
		return max;
	}

	public void setMax(int max) {
		this.max = max;
	}

	public int getMin() {
		return min;
	}

	public void setMin(int min) {
		this.min = min;
	}
	
	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

}

NumberAction-validation.xml

<validators>

    <validator type="expression">

       <param name="expression">max > min</param>

       <message>max must begreater than min</message>

    </validator>

   

</validators>

input.jsp

<s:actionerror/>

  <form action="number.action" method="post">

      max: <input type="text" name="max"/><br/>

      min: <input type="text" name="min"/>

      <input type="submit" value="submit"/>

  </form>

测试:

需要注意的就是,非字段验证器在验证失败时会产生一条Action级别错误消息,而不再是字段级别的错误消息。

其他的内建验证器的使用方法大致相同,就不一一演示了。visitor验证器稍微复杂点,但也差不了多少。用到的时候再去查手册就可以了。

注:一般情况下优先使用字段验证器。



【MediaPipe实战】从零构建实时人脸关键点检测与表情分析系统 本文详细介绍了如何使用MediaPipe框架从零构建实时人脸关键点检测与表情分析系统。通过Python代码实现,系统能够精准检测468个3D人脸关键点,并实时分析用户表情,适用于智能交互应用。文章包含环境配置、核心实现、可视化技巧及性能优化等实战内容,帮助开发者快速掌握深度学习在计算机视觉中的应用。 阅读详情

相关推荐

单细胞测序数据整合

基于Seurat 联合harmony进行单细胞数据整合分析

G2530051386的博客 9789

使用Struts2验证框架实现输入校验

学习了《Struts2权威指南》中关于Struts2的输入校验,自己动手测试了一把,也遇到一些问题,在这里记录一下。直接看代码: login.jsp [xhtml] view plain copy %@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

xyjikl 774

Windows 下安装 Hermes Agent 完整教程(含踩坑记录)

不支持原生 Windows,必须通过 WSL2 (Windows Subsystem for Linux 2) 运行。WSL2 是 Windows 内置的 Linux 兼容层,可以在 Windows 上运行完整的 Linux 环境。

weixin_50191542的博客 4269

深入Struts2学习(四)

处理结果类型 Struts2处理流程     用户请求 --> Struts2框架 --> 控制器(Aciton) --> Struts2框架 --> 视图资源 /success.jsp    result元素中name就是result元素的逻辑视图名称 /success.jsp    如果省略了name属性,系统将采用默认的name属性值,默认的name值是success     co

yewen1234的博客 243

浅谈python反序列化漏洞

0x01 python序列化与反序列化 Python 的序列化和反序列化是将一个类对象向字节流转化从而进行存储和传输,然后使用的时候再将字节流转化回原始的对象的一个过程。python中的序列化操作是通过pickle模块,而该模块主要包含l dumps将dict转化为str格式,loads将str格式转化为dict格式。 dump和load与文件操作结合起来, pickle.dump(obj, f...

Lethe's Blog 3219

UIPath 获取网页元素做遍历点击的实现

UIPath 获取网页元素做遍历点击的实现

geekqian的博客 1万+

框架之Struts2的使用(传参、获取参数及验证输入)

cn.scxh.struts包 User类: package cn.scxh.struts; import org.apache.log4j.Logger; import com.opensymphony.xwork2.ActionSupport; public class User extends ActionSupport { private static Logger log =

sxb956347789的博客 655

从点击图标到Activity亮屏:AMS、Zygote、ActivityThread的Binder协作之旅

Launcher通过Context调用 startActivity(),最终会通过 Activity.startActivity() 传递到 ActivityManager.getService(),获取AMS的Binder代理对象(IActivityManager)。这里的 attach() 方法通过Binder调用AMS的 attachApplication(),将新进程的 IApplicationThread 代理对象传递给AMS。这一步的Binder通信,是整个启动流程的关键转折点,值得细细品味。

大模型大数据攻城狮的专栏 1069

六、Struts2之输入校验

一、Struts2输入校验介绍   Struts2的输入校验和类型转换都是对请求参数进行处理。 输入校验顾名思义就是请求参数是否能够满足一定的要求;   客户端校验&服务器端校验 客户端校验是指在浏览器这端通过Javascript进行初步校验,为了减轻服务器端的负载; 服务器端校验是校验数据的最后一道防线;   在Struts2中,数据校验不需要写任何代码,只需要一个配置文件,配

xiazdong 1万+

100天精通Python(基础篇)——第22天:eval 函数基础以及危险警告

1. eval()函数的概念 2. eval()函数语法 3. 命名空间 4. 使用实例 1. 基本的数学运算 2. 字符串重复 3. 将字符串转换成列表 4. 将字符串转换成字典 5. 将字符串转成元祖 6. 与其它函数结合使用 7. globals参数案例 8. locals参数案例 5. eval函数的危险之处(重中之中)

努力让自己发光,对的人才能迎着光而来 15万+

备战2025数学建模国赛(算法46):多目标优化

本篇博客将深入浅出地介绍多目标优化的核心概念、主流算法,并重点结合一个数学建模竞赛的经典案例,提供完整的Python代码实现,助你在未来的竞赛中游刃有余。它通过寻找帕累托最优解集,完美地诠释了“鱼与熊掌不可兼得”的权衡思想,为最终决策提供科学依据。这些问题都包含多个相互冲突的目标,传统的单目标优化方法(如梯度下降、单纯形法)对此无能为力,因为它们无法同时优化多个目标。在数学建模竞赛中,我们面临的绝大多数问题都不是单一的“最好”,而是充满权衡与妥协的“最优”。记住,成功的建模不仅在于解出问题,更在于清晰地。

YOLO 283

Struts2 输入校验

为什么要有输入校验 为什么要有输入校验 输入校验也是所有Web应用必须处理的问题,因为Web应用的开放性, 网络上所有的浏览者都可以自由使用该应用,因此该应用通过输入页面收集的数据是非常复杂的,不仅会包含正常用户的误输入,还可能包含恶意用户的恶意输入。一个健壮的应用系统必须将这些非法输入阻止在应用之外,防止这些非法输入进入系统,这样才可以保证系统不受影响。 ...

venus321的博客 1443

组态王与SqlServer数据库交互总结

组态王可以与SqlServer、mysql、acess、oracle等数据库进行数据交互。 本文重点梳理了如何把组态王中的数据保存到SqlServer数据库中,并使用ADO控件对数据库中的数据进行查询。 一、数据存到SQL数据库 1.新建记录体 2、创建表格模板(用于创建数据库中的表格) 3、打开sqlserver,新建数据库 4、创建ODBC数据源 选择自己新建的数据库 5.使用SQLConnect函数连接数据库,SQLCraetTable函数用于在数据库中创建表格 6.使用

逍遥子的博客 2万+

Struts2 输入校验 实例讲解

信息基本校验对于每个web框架输入输入校验都是一个重要的部分,对用户输入的数据进行有效的过滤,是保持系统安全的一方面措施.Struts2也不例外,同样也提供了更简易的输入校验机制,Struts2提供的输入校验有两种方式,一种是硬编码的方式,一种是采用Struts2的输入校验框架进行校验,即采用XML配置的方式进行校验。下面我们看一上采集硬编码的方式如果校验:举例说明:需要对一个用户注册

lilp_ndsc的专栏 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Struts2的输入校验方式

Struts2的输入校验 输入校验的方式: 代码校验配置校验 xml配置校验(常用)注解配置校验 代码输入的校验: 覆盖ActionSupport的validate()方法,在这个方法中完成对参数的校验。validate方法会在参数封装之后,execute方法(也就是Action中定义的方法)执行之前执行。如果validate方法向fieldError中添加了

在路上 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Struts2:对Action中方法进行输入校验

在struts2中,我们可以实现对action的所有方法进行校验或对action的指定方法进行校验。对于输入校验,struts2提供了两种实现方法: 1.采用手工编写代码实现 2.基于XML配置方式实现**1.采用手工编写代码实现

静墨的博客 4632

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

struts2 输入校验

在struts2中,我们可以实现对action的所有方法进行校验或者对action的指定方法进行校验。 对于输入校验struts2提供了两种实现方法: 1. 采用手工编写代码实现。 2. 基于XML配置方式实现。 \ 手工编写代码实现对action中所有方法输入校验 通过重写validate() 方法实现, validate()方法会校验action中所有与execut

zcf396720的专栏 393

输入校验---struts2学习笔记

一. 基于验证框架的输入校验 (服务器端验证) 1. 编写校验配置文件:命名规则:action类名-validatin.xml.  2. 一个action对应多个逻辑处理方法:指定校验摸个特定方法的方式:  action类名-name属性名-validatin.xml.(name属性名:在strtus配置文件中的)  3. 配置文件存放位置:放在与Action相同的文件夹内。  4. 验

如果一个人只能做好那么很少的几件事情 那么就做自己喜欢做的事 1508

Struts2的输入校验

有哪些校验? 客户端校验:通过JavaScript 服务器端校验:校验代码 正则表达式基础 30分钟正则表达式t教程 Struts2服务器端校验 1、在execute中实现校验 public String execute()throws Exception{ //验证用户名 if("".equals(user.getUsername())){

Hepershade的专栏 953

struts2(七)输入校验

输入校验简述 由于Web应用的开放性,网络上所有浏览者都能够自由地使用该应用,这样该应用通过输入页面收集的数据可能很复杂,不仅会包含正常用户的误输入,还可能包含恶意用户的恶意输入。因此应用系统需要将这些非法输入阻止在应用之外。 异常输入,可能导致系统非正常中断,严重者会导致系统崩溃。应用程序需要正常处理表现层接受的各种数据,通常的做法是遇到异常输入时应用程序直接返回,提示浏览者必须重新输入,也就

泥陶匠 923

Struts的类型转换及输入校验(Struts2的输入校验)

Struts输入校验: (1)在Action类中处理方法进行校验,若没有指定方法就用execute()方法 (2)继承ActionSupport类,并重写其validate()方法实现输入校验 (3)应用struts2框架进行校验

qq_20453707的专栏 513

Struts2学习笔记之输入校验

Struts2学习笔记 第十一记:struts2输入校验 注:action内针对所有方法或指定方法名的校验。如果有验证方法必须在struts.xml中设置input视图,当未通过验证返回名称为input的视图 1、struts2的输入校验方式   方式一:采用手工编码实现   方式二:基于XML配置实现 2、采用手工编码实现    2-1、编写JSP表单输入:change.jsp

u012394231的专栏 570
上一篇: Struts2学习笔记(十三) 输入校验(上)
下一篇: Struts2学习笔记(十四) 输入校验(下)
jdluojing
博客等级 码龄17年 79粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值