Struts2输入校验(编码方式)
struts2对用户输入数据的校验方法有两种方式,一种是通过编码的方式,另一种则是通过使用XML配置方式。
主要介绍struts2编码方式的输入校验,结合实例进行说明。
代码结构:
关键代码:
RegistAction.javapackage com.alfred.regist.action; import java.text.SimpleDateFormat;
import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class RegistAction extends ActionSupport { private static final long serialVersionUID = 1L; private static final SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd"); private String username;
private String password;
private String repassword;
private Integer age;
private Date birthday;
private Date graduation; public String toRegist() {
System.out.println("run toRegist");
return SUCCESS;
} @Override
public void validate() {
System.out.println("run validate");
this.addActionMessage("进行输入校验");
if (username == null || username.trim().length() < 2
|| username.trim().length() > 5) {
this.addFieldError("username", "用户名格式错误");
}
if (password == null || password.trim().length() < 3
|| password.trim().length() > 6) {
this.addFieldError("password", "密码格式错误");
}
if (repassword == null || !password.equals(repassword)) {
this.addFieldError("repassword", "确认密码需与密码相同");
}
if (age == null || age < 20 || age > 100) {
this.addFieldError("age", "年龄错误");
}
if (birthday == null) {
this.addFieldError("birthday", "出生日期不能为空");
}
if (graduation == null) {
this.addFieldError("graduation", "毕业日期不能为空");
}
if (birthday != null && graduation != null
&& (graduation.compareTo(birthday) < 0)) {
this.addFieldError("birthday", "出生日期不能小于毕业日期");
}
if (this.hasFieldErrors()) {
this.addActionError("action 产生了error");
}
} public void validateToRegist() {
if (this.hasFieldErrors()) {
System.out.println("already check field");
}
System.out.println("run validateToRegist");
} 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 getRepassword() {
return repassword;
} public void setRepassword(String repassword) {
this.repassword = repassword;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Date getGraduation() {
return graduation;
} public void setGraduation(Date graduation) {
this.graduation = graduation;
} }
regist.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<!--
校验规则:
username 2~5位
password 3~6位
repassword 与password一致
age 20~100岁
birthday 大于2007-01-20
graduation 大于出生日期
-->
<s:actionmessage cssStyle="color:red" />
<s:actionerror cssStyle="color:green;" />
<s:fielderror cssStyle="color:blue;" />
===============
<br />
<s:form action="regist">
<s:textfield label="username" id="username" name="username"></s:textfield>
<s:password label="password" id="password" name="password"></s:password>
<s:password label="repassword" id="repassword" name="repassword"></s:password>
<s:textfield label="age" id="age" name="age"></s:textfield>
<s:textfield label="birthday" id="birthday" name="birthday"></s:textfield>
<s:textfield label="graduation" id="graduation" name="graduation"></s:textfield>
<s:submit value="submit"></s:submit>
</s:form>
</body>
</html>
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>
<package name="default" extends="struts-default">
<action name="regist"
class="com.alfred.regist.action.RegistAction" method="toRegist">
<result name="success">WEB-INF/jsp/main.jsp</result>
<result name="input">regist.jsp</result>
</action>
</package>
</struts>
RegistAction.properties:
struts2的ActionSupport提供了validate这种输入校验方法用于对用户输入的数据进行检验,在将用户数据传递到具体的action处理方法(toRegist)前会先调用validate方法进行输入校验,同时用户也可以自己定义对应方法(toRegist)的校验方法(validateToRegist),另外,struts2也提供了内置类型转换功能(例如:传递一个非数字给age(Integer),传递非日期类型给birthday(Date)),调用顺序:内置类型转换->validateToRegist->validate->toRegist
如果未定义特地的处理方法(toRegist)将使用默认的execute方法,这时如果想要定制检验方法,可以自定义一个validateExecute方法进行检验,将validate方法空实现。
当struts2用户输入数据传递到后台进行内置类型转换时,如果转换失败,默认的提示信息如下:
这时如果我们想要定制提示信息可以在对应的Action的目录下添加一个Action类名.properties文件(RegistAction.properties)更改默认的提示信息,命名方式为:invalid.fieldvalue.检验对象=提示信息 如:invalid.fieldvalue.birthday=出生日期格式错误,因为properties文件对中文需转换为Unicode编码,所以最好使用IDE自带的properties文件编辑模式,会自动将对应的中文转换为Unicode编码。
修改默认提示信息后:
struts2中的检验错误默认两种:ActionError、FieldError。其中ActionError是Action级别的错误,FieldError是属性错误。可以通过addActionError和addFieldError添加这两类检验错误的提示信息,addFieldError有两个参数,分别是:属性名、提示信息。展示页面可以通过struts2标签<s:actionerror />显示ActionError,<s:fielderror />显示FieldError。另外,如果展示页面使用struts2的标签容纳属性输入,那么该属性的检验错误信息会默认显示在对应属性标签上。
以下是实例程序的实际运行效果:
原理解析:
ActionSupport双继承了Validateable和ValidationAware接口,validate()是Validateable接口中的方法,我们继承Validateable接口,实现validate()就可以在调用Action的execute()方法之前,执行validate()方法进行数据检验。
ActionSupport中有一个属性对象validationAware ,用于存放错误信息:
private final ValidationAwareSupport validationAware = new ValidationAwareSupport();
public void addActionError(String anErrorMessage) {
validationAware.addActionError(anErrorMessage);
}
public void addActionMessage(String aMessage) {
validationAware.addActionMessage(aMessage);
}
public void addFieldError(String fieldName, String errorMessage) {
validationAware.addFieldError(fieldName, errorMessage);
}
而ValidationAwareSupport对象中,错误信息实际是存放在几个集合中:
private Collection<String> actionErrors;
private Collection<String> actionMessages;
private Map<String, List<String>> fieldErrors;
private Map<String, List<String>> internalGetFieldErrors() {
if (fieldErrors == null) {
fieldErrors = new LinkedHashMap<String, List<String>>();
}
return fieldErrors;
}
public synchronized void addFieldError(String fieldName, String errorMessage) {
final Map<String, List<String>> errors = internalGetFieldErrors();
List<String> thisFieldErrors = errors.get(fieldName);
if (thisFieldErrors == null) {
thisFieldErrors = new ArrayList<String>();
errors.put(fieldName, thisFieldErrors);
}
thisFieldErrors.add(errorMessage);
}
public synchronized boolean hasActionErrors() {
return (actionErrors != null) && !actionErrors.isEmpty();
}
public synchronized boolean hasFieldErrors() {
return (fieldErrors != null) && !fieldErrors.isEmpty();
}
public synchronized boolean hasErrors() {
return (hasActionErrors() || hasFieldErrors());
}
Struts2输入校验(编码方式)的更多相关文章
- Struts2输入校验
1.编写校验规则文件 (<ActionName>-validation.xml),文件放在Action类文件相同的路径下校验失败返回input的result. <vali ...
- Struts2 输入校验(使用编码方式)
一.Struts输入校验 1.创建register.jsp <%@ page language="java" contentType="text/html; cha ...
- Struts2输入校验(XML方式)
本章主要介绍struts2的XML配置方式输入校验.以下将结合一个实例程序进行说明. 代码结构: 关键代码: RegistAction.javapackage com.alfred.regist.ac ...
- 笔记:Struts2 输入校验
Struts2的输入校验包含了客户端校验和服务器端校验,通过编写校验规则文件来实现输入校验,需要增加 Convention 插件,将 struts2-convention-plugin-2.3.31. ...
- Struts2 输入校验 第四弹
ActionSupport 里面有一个validate.可以重写里面你的方法. 校验执行流程: 1)首先进行类型转化 2)然后进行输入校验(执行validate方法) 3)如果在上述过程中出现了任何错 ...
- JavaWeb框架_Struts2_(六)----->Struts2的输入校验
1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...
- struts2对action中的方法进行输入校验(2)
struts2输入校验流程: 1.类型转换器对请求參数运行类型转换,并把转换后的值赋给aciton中的属性 2.假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext, ...
- Struts 2(五):输入校验 & 校验框架
第一节 Struts2输入校验 1.1 输入校验的重要性 输入校验分为客户端校验和服务器端校验.客户端校验用来过滤用户的错误操作,一般使用JavaScript代码实现.服务器端校验用来防止非法用户的恶 ...
- java中的字符编码方式
1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...
随机推荐
- 前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
input标签用于接收用户输入.可以利用input 可以做登录页面 input标签是行内块标签 <input> 元素会根据不同的 type 属性,变化为多种形态. name属性:表单点击提 ...
- 帝国cms内容关键字自动加链接且设置内容关键字只替换一次
网站上线前先设置一些内部链接对后期的优化排名很有帮助,帝国cms也可以设置文章中的关键字自动加链接,但是要注意一下关键词替换次数,最好是1次. 怎么操作呢?分两步完成 1.帝国cms文章关键字自动加链 ...
- composer安装其实可以很简单 两行命令就解决了
最近接了一个cakephp项目,就想着用composer安装实施,因为Composer 可以方便地帮你安装项目中声明所依赖的外部工具库(libraries).之前没有接触过,相对比较陌生,但是相信ph ...
- HTML5(Canvas Vedio Audio 拖动)
1.Canvas (在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字) HTML5 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成. 标签只是图形 ...
- vue/cli 3.0 font-size随屏幕大小变化而变化 rem设置
在安装cube-ui框架时 安装成功后在[E:\WWW\xxx\node_modules\vue-cli-plugin-cube-ui\generator\rem\index.js]修改remUnit ...
- python的join用法
1.使用方式: 字符串.join(序列) date = "".join(["2018-12-28", "00:00:00"])
- vue监听滚动事件 实现某元素吸顶或者固定位置显示
https://blog.csdn.net/wang1006008051/article/details/78003974 1.监听滚动事件 利用VUE写一个在控制台打印当前的scrollTop, 首 ...
- (转)以太坊 钱包 创建 导入 Keystore
最近闲来无事 研究了下以太坊钱包 下边分享下 准备工作 : 需要用到的加密:BIP32 BIP39 BIP44 SCRYPT 加密算法 githab地址 https://github.com/Nova ...
- MyBatis SpringMVC映射配置注意
applicationContext.xml中要配置 <!-- MyBatis 的 sqlSessionFactory --> <bean id="sqlSessionFa ...
- git revert 撤销merge的动作
在执行完git merge提交以后,通常会merge过的分支的提交记录都带过来,比如A分支merge到了B分支,那么B分支上肯定有A分支的提交记录,如果此时要回退这个merge动作,是产生一条reve ...