Struts2中的数据类型转换
Struts2对数据的类型转换
一、Struts2中自带类型转换拦截器
Struts2内部提供了大量转换器,用来完成数据类型转换的问题,有如下
* boolean 和 Boolean
* char和 Character
* int 和 Integer
* long 和 Long
* float 和 Float
* double 和 Double
* Date 可以接收 yyyy-MM-dd 格式字符串
* 数组 可以将多个同名参数,转换到数组中
* 集合 支持将数据保存到 List 或者 Map 集合
当发生类型转换错误的时候,根据报错的信息提示,跳转input类型的结果视图。
* 说明如果程序出现异常,会跳转到input结果视图,那可以在<action>标签中配置input结果视图
在跳转的页面中也可以通过一个固定的标签来显示错误的信息:
* 可以先需要先引入Struts2的标签库,然后使用标签显示错误!
<%@ taglib prefix="s" uri="/struts-tags" %>
* <s:fielderror>,这是Struts2提供的标签,使用它显示错误的提示信息。
如果类型转换的拦截器中发生了错误,那么会把错误信息放在Struts2错误区域中(Struts2的错误区域分成两部分,一部分是字段错误,一部分是Actionc错误)
* 等执行到最后一个拦截器(workflow)时,workflow拦截器会去Struts2的错误区域中找是否存在错误。
* 如果存在错误,就跳转到input视图。
* 如果不存在错误,执行目标Action类中具体的方法。
二、自定义类型转换器
如果一些特殊的数据类型不能转换,那么需要自定义数据类型的转换器。
开发自定义类型转换的具体方法有三个:
1、实现TypeConverter接口,并实现一个方法
Object convertValue(Map<String,Object> context,Object target, Member member,String propertyName,Object value,Class toType);
因为这个方法太复杂,所以一般不会直接去实现这个接口,而采用下面继承的方法。
2、继承DefaultTypeConverter类,重写一个方法
Object convertValue(Map<String,Object> context,Object value,Class toType)
>可以完成双向转换
>context 类型转换环境的上下文
>value 需要转换的参数
>toType 目标类型
3、继承StrutsTypeConverter类,重写两个方法
* Object convertFromString(Map context,String[] values,Class toClass)
> 从字符串转换成具体类型
> values数组,存入的值就是用户输入的值
> toClass 要转换的数据的类型 如Date.class
* String convertToString(Map context,Object o)
> 把具体的类型转换成字符串
> o 代表的要转换的数据
类型转换的代码,以 1990/10/10 为例,自定义日期转换器,完成转换,下面这段代码是第二种方法,也就是继承了DefaultTypeConverter类。
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
// 根据toType判断 是请求封装 还是 数据回显
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
if (toType == Date.class) {
// 请求参数封装 (value是字符串)
String[] params = (String[]) value;
String strVal = params[0]; // 转换为 日期类型
try {
return dateFormat.parse(strVal);
} catch (ParseException e) {
e.printStackTrace();
}
} else {
// 回显(value是 Date)
Date date = (Date) value;
return dateFormat.format(date);
}
return null;
}
三、类型转换器的注册
如果仅仅编写了类型转换器,strus2并不知道何时使用它,需要进行注册。
1、局部注册:针对某个表单中的某个字段生效的!
* 属性驱动的方式:使用set方法接收数据
> 配置方法:在Action所在的包下创建一个文件,文件名的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
例如:birthday=cn.cxk.demo3.MyDateConverter
*模型驱动的方式:实现ModelDriven接口的方式
> 配置方法:在实体类所在的包下创建一个文件,文件名的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径
例如:birthday=cn.cxk.demo3.MyDateConverter
2、全局注册:针对整个项目的所有的日期类型都会生效的!
* 在src的目录下,创建一个xwork-conversion.properties(名称是固定的)。内容格式是:类型转换中的原类型名=类型转换中的目标类型名
> 例如:java.util.Date=cn.zlq.demo3.MyDateConverter
Struts2中的数据类型转换的更多相关文章
- Struts2中validate数据校验的两种常用方法
本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器. 1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...
- C语言中强制数据类型转换(转)
原文地址不详 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0-255(有些 ...
- Java中的数据类型转换
先来看一个题: Java类Demo中存在方法func0.func1.func2.func3和func4,请问该方法中,哪些是不合法的定义?( ) public class Demo{ float fu ...
- matlab中图片数据类型转换uint8与double
matlab中处理图像像素点数据: img1=double(imread('lenna.bmp')); matlab中imshow图片,要先转换成uint8: subplot(1,2,1),imsho ...
- 『无为则无心』Python基础 — 11、Python中的数据类型转换
目录 1.为什么要进行数据类型转换 2.数据类型转换本质 3.数据类型转换用到的函数 4.常用数据类型转换的函数 (1)int()函数 (2)float()函数 (3)str()函数 (4)bool( ...
- Struts2入门(三)——数据类型转换
一.前言 笔者一直觉得,学习一个知识点,你首先要明白,这东西是什么?有什么用?这样你才能了解.好了,不说废话. 1.1.类型转换为何存在?什么是类型转换? 在MVC框架中,都是属于表示层解决方案,都需 ...
- JavaScript中的数据类型转换
本文中提到的“原始值”指的是undefined,null,Boolean,string和number. 本文中的对象是native对象,宿主对象(浏览器定义的对象)按照各自的算法转换. JavaScr ...
- Struts2中的一个类型转换示例
1.写一个属性文件,里面写好需要转换的类型数据,xwork-conversion.properties,解释: xwork-conversion.properties表示对所有action中的指定数据 ...
- C#中的数据类型转换
数据类型在一定的条件下是可以相互转换的,如将int型数据转换成double型数据.C#允许使用两种转换方式:隐式转换和显式转换. 1.隐式转换 隐式转换:从类型A到类型B的转换可以在所有情况下进行,执 ...
随机推荐
- IP,子网掩码,网关,DNS的关系解析
IP地址: 是给每个连接在Internet上的主机分配的一个32bit地址. 地址有两部分组成,一部分为网络地址,另一部分为主机地址. IP地址分为A.B.C.D.E 5类.常用的是B和C两类. 网络 ...
- 【MFC】error RC2108: expected numerical dialog constant(转)
原文转自 http://blog.csdn.net/renyhui/article/details/23120469 [解决方案]在控件ID后面添加 "Static", SS_BI ...
- 34深入理解C指针之---通过字符串传递函数
一.通过字符串传递函数 1.定义:可以使用函数名(字符串)调用函数,也可以使用函数指针调用函数,将两者结合 2.特征: 1).在函数声明时使用函数指针 2).调用函数时使用函数名称(字符串) 3).可 ...
- linux 程序自动运行总结
1.开机启动时自动运行程序Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc ...
- 驱动12.移植dm9000驱动程序
1 确定相异性 1.1 选中网卡芯片nGCS4 1.2 确定相异性:基地址,中断号,设置时序(内存控制器BWSCON,BANKCONn) 1.3 修改相应的部分 2 测试DM9000C驱动程序:2.1 ...
- LeetCode OJ——Convert Sorted Array to Binary Search Tree
http://oj.leetcode.com/problems/convert-sorted-array-to-binary-search-tree/ 将一个升序的数组转换成 height balan ...
- 快速掌握RabbitMQ(五)——搭建高可用的RabbitMQ集群
RabbitMQ的集群是依赖erlang集群的,而erlang集群是通过.erlang.cookie文件进行通信认证的,所以我们使用RabbitMQ集群时只需要配置一下.erlang.cookie文件 ...
- 用LCT解一类动态图的问题
很显然,学过了LCT,大家一定都会用LCT来维护动态树结构了 那么,遇到图问题的时候,是不是也能用lct来解决呢? 解决图问题的时候,我们必须要仍然维护一棵树的形态,否则,lct是做不动的 那么下面来 ...
- C# 生成二维码(带Logo)
C# 生成二维码(带Logo) 第一种方式 我们需要引用 ThoughtWorks.QRCode.dll 生成带logo二维码(framework4.0以上) 下载地址:https://pan.ba ...
- PHP运行环境搭建
说明 我的百度百度云盘里面有apache24,PHP7.0,mysql5.6,如果需要的话可以直接下载: apache的环境我已经配置好了,将其解压到C盘根目录 相应绝对路径为C:\Apache24 ...