基于覆盖validate方法的表单校验

Action类一般都继承ActionSupport类。

通过覆盖ActionSupport类的validate方法即可在自己的Action类中校验输入项的值。

校验动作类中的所有方法

UserAction类

package com.struts2.action.example;import java.io.Serializable;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport implements Serializable {private static final long serialVersionUID = 7553541763848145723L;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;}public String add() {System.out.println("执行了user的add方法");return SUCCESS;}public String update() {System.out.println("执行了user的update方法");return SUCCESS;}//对动作类中的所有方法进行验证@Overridepublic void validate() {//验证方法。只考虑不符合条件的if(username==null||"".equals(username.trim())){addFieldError("username", "用户名不能为空");}if(password==null||!password.matches("\\w{6,16}")){addFieldError("password", "密码不能为空且必须是6~16位的大小写字母或数字");}}}

校验动作类中的指定方法

将上面动作类的validate方法改写如下

public void validateAdd() {if (username == null || "".equals(username.trim())) {addFieldError("username", "用户名不能为空");}if (password == null || !password.matches("\\d{3,6}")) {addFieldError("password", "密码不能为空且必须是3~6位的数字");}
}

即指定只校验add方法。

形如public void validateXxx()的方法,即为校验指定Xxx方法,Xxx代表的是要验证的动作方法名,要把动作方法名的首字母变为大写。

struts.xml内容

<package name="validation" namespace="/validation" extends="struts-default"><action name="user_*" class="com.struts2.action.example.UserAction" method="{1}"><result name="success">/WEB-INF/jsp/success.jsp</result><result name="input">/{1}User.jsp</result></action>
</package>

name=user_*,为使用通配符的方式访问动作类中指定的方法

method={1},为使用占位符的方式获取通配符中的方法名

addUser.jsp内容

<form action="${pageContext.request.contextPath}/validation/user_add.action" method="post">用户名:<input type="text" name="username" value="${param.username }"/><s:fielderror fieldName="username"/><br/>密码:<input type="password" name="password" value="${param.password }"/> <s:fielderror fieldName="password"/><br/><input type="submit" value="保存"/>
</form>

访问地址http://localhost:8080/Struts2/addUser.jsp

直接点提交按钮提示如下:

按validation方法里的逻辑填写正确的输入项后,控制台输出结果如下:

成功通过了验证,并执行了Action类的add方法。

基于xml文件的表单校验

校验动作类中的所有方法

把动作类的validate方法注释掉,并添加UserAction-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">
<!-- 基于配置文件的表单验证
1,动作类中指定的方法进行验证:配置文件名:动作类名-动作名(配置文件中的动作名)-validation.xml,
如,UserAction-user_add-validation.xml2,验证动作类中的所有方法:配置文件名:动作简单类名-validation.xml,如,UserAction-validation.xml--> <validators><validator type="requiredstring"><param name="fieldName">username</param><message>用户名不能为空!</message></validator><field name="password"><field-validator type="requiredstring">             <message>密码不能为空!</message></field-validator><field-validator type="regex">          <param name="regex"><![CDATA[\w{6,16}]]></param><message>密码可以为6~16位数字和字母的组合!</message></field-validator></field></validators>

普通校验和字段校验

普通校验

eg:

<validator type="requiredstring"><param name="fieldName">username</param><message>用户名不能为空!</message>
</validator>

字段验证

一般比普通验证更可取,因为可设置多个字段验证器

<field name="username"><field-validator type="requiredstring"><message>用户名不能为空!</message></field-validator><field-validator type="email">                          <message>用户名必须邮箱账号!</message></field-validator>
</field>

校验动作类中的指定方法

只要把上面的校验文件名改成UserAction-user_add-validation.xml即可。

其中user_add匹配struts.xml文件中的user_*

xml校验配置文件名的写法

以下两种写法有共同的验证效果

<actionClass>-validation.xml
<actionClass>-<actionAlias>-validation.xml

我们可将常见(共同)的校验写在<actionClass>-validation.xml中,更具体的上下文内容写在<actionClass>-<actionAlias>-validation.xml中,
框架将验证这两个验证配置文件中可用的验证器。如果两个验证配置文件中定义了一样的验证器,那么当验证不通过时,将发现2个错误,这是由于struts2框架将合并发现在两个验证配置文件中的验证信息。

已定义的验证器

在com/opensymphony/xwork2/validator/validators/default.xml文件中定义。

包括:

  1. conversion validator
  2. date validator
  3. double validator
  4. email validator
  5. expression validator
  6. fieldexpression validator
  7. int validator
  8. regex validator
  9. required validator
  10. requiredstring validator
  11. short validator
  12. stringlength validator
  13. url validator
  14. visitor validator
  15. conditionalvisitor validator

Action类的验证器是怎样被找到

struts2框架将搜索action的继承树寻找这个action类默认校验的接口和父类。

总结

  1. 当用户按下注册表单提交按钮,Struts2将用户的输入传送到Action或javabean的实例字段。然后,Struts2会自动执行validate方法。如果有任何的if语句为真,Struts2将自动调用其addFieldError方法(我们的Action类继承扩展了ActionSupport)添加错误信息。
    如果有任何错误已被添加那么Struts2将不会进行调用execute方法。Struts2框架将返回“input”作为调用Action后的结果。
  2. 形如UserAction-validation.xml验证文件必须和起动作类放在同一包下,否则不起作用。
  3. 当使用字段验证时,字段验证语法总是更可取比使用普通验证语法,因为它有利于根据字段字段校验分组。这是非常方便特别是如果一个字段需要有许多字段验证,这几乎总是如此。
  4. Action类中的validate方法优先于execute方法当被struts框架调用时,若验证出错,将返回“input”,如验证通过,则调用execute方法并返回execute方法的返回值。

以上。。。

struts2学习之表单校验的两种方式相关推荐

  1. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

  2. python表单提交的两种方式_详解flask表单提交的两种方式

    一.通用方式 通用方式就是使用ajax或者$.post来提交. 前端html ... data Submit &nbsp 将操作绑定 $(document).ready(function() ...

  3. php表单传值哪几种方式,PHP表单传值的方式有哪些?

    本篇文章主要给大家介绍PHP表单传值的两种方式,一种是通过$_GET变量 .另一种是通过$_POST变量.(相关推荐:<PHP教程>) 下面我们就结合具体的PHP代码示例给大家介绍,PHP ...

  4. 自我总结和学习表单提交的几种方式 (一)

    最近总是记不住表单提交的几种方式,并且各种方式的适应场景也不知道,干脆来总结一次,当再学习过程. 首先从最简单的开始练手: [1]纯form表单形式,无js和ajax ,提交路径有action决定,方 ...

  5. jquery ajax提交表单数据的两种方式

    jquery ajax提交表单数据的两种方式 转载于:https://www.cnblogs.com/zhujiabin/p/4912364.html

  6. Form 表单提交的几种方式

    简单的总结一下form表单提交的几种方式: 1.最简单的方式 就用form的submit提交方式,这种提交方式是不需要回调函数的    这种方式最近到一个form提供action路径后台接受就可以 & ...

  7. Struts2-表单验证的两种方式

    1. Struts2中的输入校验 2. 编码方式校验   1) Action一定要继承自ActionSupport   2) 针对某个要进行校验的请求处理方法编写一个 public void vali ...

  8. EXCEL数据有效性前置校验的两种方式

    背景: 生活中经常用excel作为模板供用户批量录入数据,然后在上传系统,等到系统校验有问题后,用户又要下载进行修改重新上传,这样比较麻烦,所以如何把问题数据的发现阶段前置到用户录入的阶段,那么有问题 ...

  9. onsubmit阻止表单提交的一种方式

    最近做移动开发,一下从后台转移到前端了,之前写了一年的java代码,现在天天搞jQ  css html ,肯定有点不习惯,不过现在已经适应了,写页面还是挺好玩的. 言归正传,今天遇到的就是怎么阻止表单 ...

最新文章

  1. SystemCenter2012SP1实践(5)SCVMM管理HyperV
  2. 如何在Android手机上进行Google Map的开发。
  3. mysql 后十条_mysql几十条常用命令归纳总结
  4. dede文章调用时过滤调 body里面的style属性和值
  5. Spring5的通信报文
  6. java有没有number数据类型_Java基本数据类型之Number
  7. java 工厂模式的写法_java简单工厂模式是什么
  8. 跟2G说再见?这些IoT“钉子户”表示做不到……
  9. ims系统 呈现服务器,基于IMS的呈现服务器的设计与实现
  10. javascript 模块化(一)——SeaJS
  11. 使用vue实现四级联动
  12. iOS定位获取城市名
  13. 耳机插入电脑的,耳机接口,却没有声音的 解决方法
  14. 高质量的博客评论外链有用么?
  15. 团队任务1:第一次团队会议
  16. OpenCV-细化算法(thinning algorithm)描绘出轮廓的中心线
  17. Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
  18. 目标检测入坑指南3:VGGNet神经网络
  19. 线程wait和notify方法
  20. css渐变效果的实现

热门文章

  1. 西北电力外送争夺战 竞争将更加激烈
  2. 硝酸硫胺素-市场现状及未来发展趋势
  3. Java笔记名晨总结08-类和对象 - 中级
  4. 来客推开源电商系统部署环境
  5. 【Maven进阶三】 Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4……
  6. 从ofo小黄车谈人性
  7. 在matlab中三维表面采用,在Matlab中插入三维圆柱体的表面
  8. 华为云devops认证考试课堂笔记3
  9. 1.宏电工控机使用心得
  10. Day 169/200 Vue3 如何设置定时器以及清除定时器?