Struts2基础学习(四)—类型转换器和数据校验
一、自定义类型转换器
1.概述
Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器。Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定义类型转换器必须实现
ongl.TypeConverter。

2.编写类型转换器
(1)实现TypeConverter接口,实现一个方法
public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
(2)继承DefaultTypeConverter类,重写一个方法
public Object convertValue(Map<String,Object> context,Object value,Class toType)
(3)继承StrutsTypeConverter类重写两个方法
public Object convertFromString(Map context,String[] values,Class toClass)
public String convertToString(Map context,Object o)
java.util.Date类型的属性可以接收格式为2009-07-20的请求参数值。但如果我们需要接收格式为20091221的请求参数,我们必须定义类型转换器,否则struts2无法自动完成类型转换。
第一种:继承DefalutTypeConverter类
public class DateConvert extends DefaultTypeConverter{
@Override
public Object convertValue(Map<String,Object> context,Object value,Class toType){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try{
//String--->Date
if(toType == Date.class){
String[] params = (String[])value;
return sdf.parseObject(params[0]);
}
else if(toType == String.class){ //Date--->String
Date date = (Date)value;
return sdf.format(date);
}
}catch(ParseException e){
e.printStackTrace();
}
return super.convertValue(context,value,toType);
}
}
第二种继承StrutsTypeConverter类
public class DateConvert2 extends StrutsTypeConverter{
private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
//String--->Date
@Override
public Object convertFromString(Map context,String[] values,Class toClass){
if(toClass == Date.class){
try{
String date = values[0];
return sdf.parse(date);
}catch(ParseException e){
e.printStackTrace();
}
}
return null;
}
//Date--->String
@Override
public String convertToString(Map context,Object o){
if(o instanceof Date){
return sdf.format(o);
}
return null;
}
}
3.注册类型转换器
(1)局部注册
针对的是表单中某个字段生效。分为属性驱动方式和模型驱动方式两种。
属性驱动的方式
注意: 在Action所在的包下创建一个文件,文件的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。birthday=com.kiwi.convert.DateConvert2
模型驱动的方式
注意: 在实体类所在的包下创建一个文件,文件的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。
(2)全局注册
针对整个项目所有的日期类型都会生效。
在src的目录下,创建一个xwork-conversion.properties
例如: java.util.Date=cn.itcast.demo3.MyDateConverter
4.类型转换的错误处理
(1)当发生类型转换错误的时候,根据报错的信息提示,没有提供input类型的结果视图。那可以在<action>标签中配置input结果视图。
(2)如果Struts2的类型转换器执行类型转换时出现错误,该拦截器将负责将对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中。
(3)使用类型转换中的错误处理用户定义Action必须继承ActionSupport。
(4)在自定义类型转换器中,异常必须抛出不能捕获,conversionError会处理该异常,然后转入名为input的逻辑视图。
(5)在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息
invalid.fieldvalue.属性名= 错误信息
index.jsp
<s:form action="personAction">
<s:textfield label="用户名" name="username"></s:textfield>
<s:textfield label="密 码" name="password"></s:textfield>
<s:textfield label="年 龄" name="age"></s:textfield>
<s:textfield label="生 日" name="birthday"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
struts.xml
<action name="personAction" class="com.kiwi.action.PersonAction">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
结果:

二、数据校验
1.概述
数据校验分为前台校验和后台校验两种方式:
(1) JavaScript可以在前台完成校验,但是这种方式主要是提升用户的体验,通过可以绕行的方式进入到后台程序中。
(2) 后台的数据校验,在Servlet/Action中需要做数据的校验(必须要做的校验)。
Struts2提供了两种校验方式:
(1)手动编码校验。
(2)配置文件校验。
2.手动编码校验
开发步骤:
步骤一: 封装数据。
步骤二: 实现校验Action ,必须继承ActionSupport 类。
步骤三: 覆盖validate方法,完成对Action的业务方法 数据校验 this.addFieldError (ActionSupport提供)。
步骤四: 在jsp中 通过 <s:fieldError/> 显示错误信息。
(1)针对Action所有的方法进行校验
让Action继承ActionSupport类,重写ActionSupport类中的validate()方法,在该方法中完成数据校验。
//针对所有Action进行校验
@Override
public void validate(){ //用户名为空
if(StringUtils.isEmpty(person.getUsername())){ addFieldError("username","用户名不能为空");
}
//密码不能为空
if(StringUtils.isEmpty(person.getPassword())){ addFieldError("password","密码不能为空");
} }
(2)针对Action某个方法进行校验
手动在Action中编写一个方法,方法名称是validate方法名称() 例如: public void validateAdd(){ }
public String save(){
System.out.println("save()......");
return NONE;
}
// 针对save方法进行校验
public void validateSave(){
// 用户名为空
if(StringUtils.isEmpty(person.getUsername())){
addFieldError("username","用户名不能为空");
}
// 密码不能为空
if(StringUtils.isEmpty(person.getPassword())){
addFieldError("password","密码不能为空");
}
}
注意:
(1)编写的是Action都需要继承ActionSupport类。
(2)代码校验不适用于大型项目,流程数据复杂时,开发量和维护量都会很大。
3.配置文件校验
(1)针对Action中所有的方法进行校验
在Action所在包中创建一个XML文件,命名规则: Action类型-validation.xml。
PersonAction-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"> <validators> <field name="username">
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>
</field> <field name="password">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator> <field-validator type="stringlength">
<param name="minLength">3</param>
<param name="maxLength">12</param>
<message>密码长度必须在3~12之间</message>
</field-validator> </field> </validators>
(2)针对的是Action的某个方法进行校验
在Action所在包创建一个XML文件,命名规则: Action类名-方法名-validation.xml
4.Struts2提供的内置校验器列表

<!-- required 必填校验器 -->
<field-validator type="required">
<message>性别不能为空!</message>
</field-validator> <!-- requiredstring 必填字符串校验器 -->
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空!</message>
</field-validator> <!-- stringlength:字符串长度校验器 -->
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLength">2</param>
<param name="trim">true</param>
<message><![CDATA[产品名称应在2-10个字符之间]]></message>
</field-validator> <!-- int:整数校验器 -->
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年龄必须在1-150之间</message>
</field-validator> <!-- date: 日期校验器 -->
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>生日必须在${min}到${max}之间</message>
</field-validator> <!-- url: 网络路径校验器 -->
<field-validator type="url">
<message>一个有效网址</message>
</field-validator> <!-- email:邮件地址校验器 -->
<field-validator type="email">
<message>电子邮件地址无效</message>
</field-validator> <!-- regex:正则表达式校验器 -->
<field-validator type="regex">
<param name="expression"><![CDATA[^13\d{9}$]]></param>
<message>手机号格式不正确!</message>
</field-validator> <!-- fieldexpression : 字段表达式校验 -->
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(password==repassword)]]></param>
<message>两次密码输入不一致</message>
</field-validator>
Struts2基础学习(四)—类型转换器和数据校验的更多相关文章
- Struts2基础学习2
Struts2基础学习2 项目结构,测试页面与实体类 <%@ page language="java" contentType="text/html; charse ...
- Python基础学习四
Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...
- Struts2基础学习总结
引用自:http://www.cnblogs.com/jbelial/archive/2012/05/10/2486886.html Struts 2是在WebWork2基础发展而来的. 注意:str ...
- struts2 基础学习
Struts 2是在WebWork2基础发展而来的. 注意:struts 2和struts 1在代码风格上几乎不一样. Struts 2 相比Struts 1的优点: 1.在软件设计上Struts ...
- Struts2之自定义局部类型转换器、全局类型转换器
Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用 ...
- Struts2基础学习(一)—初识Struts2
目录 一.什么是Struts2 二.搭建Struts2的开发环境 三.Struts2的配置文件 四.MVC模式 一.什么是Struts2 Struts2是一个非常优秀的MVC框架,由传统 ...
- Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发
一.标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBa ...
- Struts2框架的自定义类型转换器
前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...
- Struts2基础学习(三)—Result和数据封装
一.Result Action处理完用户请求后,将返回一个普通的字符串,整个普通字符串就是一个逻辑视图名,Struts2根据逻辑视图名,决定响应哪个结果,处理结果使用<result&g ...
随机推荐
- java集合框架05——ArrayList和LinkedList的区别
前面已经学习完了List部分的源码,主要是ArrayList和LinkedList两部分内容,这一节主要总结下List部分的内容. List概括 先来回顾一下List在Collection中的的框架图 ...
- 2017-2-23 C#基础 for循环
循环语句主要有:for;while;foreach.最常用的是for循环.for循环的四要素:初始条件:循环条件:循环体:状态改变.for循环的顺序是:初始条件--循环条件--循环体--状态改变.br ...
- C++ traits技术浅谈
前言 traits,又被叫做特性萃取技术,说得简单点就是提取"被传进的对象"对应的返回类型,让同一个接口实现对应的功能.因为STL的算法和容器是分离的,两者通过迭代器链接.算法的实 ...
- web计时机制——performance对象
前面的话 页面性能一直都是Web开发人员最关注的领域.但在实际应用中,度量页面性能的指标,是提高代码复杂程度和巧妙地使用javascript的Date对象.Web Timing API改变了这个局面, ...
- MegaCli 安装过程
首先说下自己遇到的坑: 百度搜索了一篇关于安装 MegaCli 的文章,于是乎就开始安装,装完之后获取不到 raid 的信息,后来发现是版本问题,就又搜索了一堆文章,最后搞定了 [root@web-0 ...
- Selenium 使用过程遇到问题随笔
最近正在学习Selenium,自学是比较难的,也很感谢网络环境中,各位大大的博文帮助. 也希望在此能够记录一下从小白学习使用selenium测试的过程,也希望能对别人有所帮助. 关于环境部署,以及入门 ...
- Mac OSX Sierra WiFi connecting problem
吐槽一下,苹果的质量管控越来越差了. Mac OSX Sierra有时突然或升级后会遇到wifi不停重连连不上问题,现象为不停地连接wifi. 网上有人说删除 /Library/Preferences ...
- Spring-boot 最小demo
POM 文件,注意红色部分: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...
- 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 648 Solved: 273[Submit][ ...
- 1270: [BeijingWc2008]雷涛的小猫
1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 905 Solved: 430[Submit][ ...