Struts2中的类型转换
1. Struts2中的类型转换
我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种。所以,我们需要类型转换!
在Struts2中,类型转换的概念除了用于将界面传递过来的字符串转换为特定的类型(convertFromString)之外,还可以用于将特定的类型转换为字符串(即当我们在JSP中要把某种类型的对象呈现的时候,要将它转换为字符串来显示)(converterToString)。
在Struts2中,支持全局类型转换和局部类型转换两种方式。所谓全局类型转换,即在所有的action/model中,都用同一个类型转换器来转换某种特定类型的对象;而局部类型转换,意思就是针对某个action/model中的属性所定义的特定的类型转换器。
如何编写类型转换器?
不管是全局类型转换,还是局部类型转换,其转换器的编写方法是相同的!只要继承StrutsTypeConverter,重写其中的方法即可。
全局类型转换
即针对整个系统中同样类型的属性定义转换器
只需:
1、 在类路径的根目录下定义xwork-conversion.properties文件
2、 在文件中用这样的格式声明哪个类型使用哪个转换器:
a) 属性类型的全路径类名=转换器的全路径类名
3、 Struts2将能自动发现这个文件,并根据其中的定义,对特定的类型调用你指定的类型转换器进行类型转换
比如Point类型:
| 
 package cn.com.leadfar.model; public class Point { private int left; private int right; public int getLeft() { return left; } public void setLeft(int left) { this.left = left; } public int getRight() { return right; } public void setRight(int right) { this.right = right; } }  | 
针对Point类型的转换器:
| 
 package cn.com.leadfar.struts2.actions; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import cn.com.leadfar.model.Point; public class PointConverter extends StrutsTypeConverter { @Override public Object convertFromString(Map context, String[] value, Class toType) { //TODO 前提条件判断 String p = value[0]; String[] ps = p.split(","); int left = Integer.parseInt(ps[0]); int right = Integer.parseInt(ps[1]); Point point = new Point(); point.setLeft(left); point.setRight(right); return point; } @Override public String convertToString(Map context, Object point) { Point p = (Point)point; return p.getLeft()+"-"+p.getRight(); } }  | 
xwork-conversion.properties文件的内容如下:
| 
 cn.com.leadfar.model.Point=cn.com.leadfar.struts2.actions.PointConverter  | 
局部类型转换
即针对某个Action或Model的属性定义的转换器
1、在与Action/Model类同一个包下面,定义 Action/Model类名-conversion.properties 文件
2、文件内部用这样的格式来声明哪个属性需要用哪个类型转换器:
属性名=转换器的全路径类名
比如:对于java.util.Date类型,我们可以声明不同的类使用不同的类型转换器
| 
 package cn.com.leadfar.model; import java.util.Date; public class User { private Date endDate; public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } }  | 
| 
 package cn.com.leadfar.struts2.actions; import java.util.Date; import cn.com.leadfar.model.Point; import cn.com.leadfar.model.User; import com.opensymphony.xwork2.ModelDriven; public class UserAction implements ModelDriven{ private User user; private Date beginDate; @Override public Object getModel() { if(user == null){ user = new User(); } return user; } public String add(){ return "success"; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public Date getBeginDate() { return beginDate; } public void setBeginDate(Date beginDate) { this.beginDate = beginDate; } }  | 
假设我们希望UserAction类中的beginDate属性和User类中endDate属性,分别使用不同的类型转换器,如下所示:
| 
 package cn.com.leadfar.struts2.actions; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class BeginDateConverter extends StrutsTypeConverter { private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); @Override public Object convertFromString(Map context, String[] value, Class toType) { String d = value[0]; try { return format.parse(d); } catch (ParseException e) { e.printStackTrace(); } return null; } @Override public String convertToString(Map context, Object date) { return format.format(date); } }  | 
| 
 package cn.com.leadfar.struts2.actions; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class EndDateConverter extends StrutsTypeConverter { private SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); @Override public Object convertFromString(Map context, String[] value, Class toType) { String d = value[0]; try { return format.parse(d); } catch (ParseException e) { e.printStackTrace(); } return null; } @Override public String convertToString(Map context, Object date) { return format.format(date); } }  | 
那么,我们需要在User类的包:cn.com.leadfar.model下面,创建一个文件,命名如下:
User-conversion.properties,文件的内容如下:
| 
 endDate=cn.com.leadfar.struts2.actions.EndDateConverter  | 
表示User类中的endDate属性,使用EndDateConverter这个类型转换器。
然后,在UserAction类所在的包:cn.com.leadfar.struts2.actions下面,再创建一个文件,命名如下:
UserAction-conversion.properties,文件的内容如下:
| 
 beginDate=cn.com.leadfar.struts2.actions.BeginDateConverter  | 
表示UserAction类中的beginDate属性,使用BeginDateConveter这个类型转换器。
注意,在Struts1中只支持全局类型转换,而不支持局部类型转换!
Struts2中的类型转换的更多相关文章
- Struts2中的类型转换与复杂对象配合使用
		
form 标签可以被映射到一个属性的属性 manager.java package com.atguigu.struts2.model; import java.util.Date; public c ...
 - Struts2中的类型转换失败
		
类型转换失败: 若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生一样. 若 Action ...
 - struts2异常处理及类型转换
		
一.struts2对异常的处理 1.自定义局部异常: <action> <exception-mapping result="sonException" exce ...
 - Struts2中的数据类型转换
		
Struts2对数据的类型转换 一.Struts2中自带类型转换拦截器 Struts2内部提供了大量转换器,用来完成数据类型转换的问题,有如下 * boolean 和 Boolean * char和 ...
 - Struts2中Date日期转换的问题
		
今天跑程序的时候莫名其妙的出现了下面的一个异常: java.lang.NoSuchMethodException:com.ca.agent.model.mybatis.ApprovalInforC ...
 - struts2学习笔记(3)——struts2的局部类型转换
		
今天又学到了一个新的东西,就是struts2的类型转换. 为什么要类型转换? 今天我就要传一个点的坐标给你,保存时用一个自定义的Point类来保存. 因为在表单里面传过去的是字符串,如“12,23”, ...
 - 在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .
		
笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 声明:本文参考Strut ...
 - Struts2中的校验框架
		
Struts2提供的客户端校验 尽管这种支持比较弱,但采用Struts2中的客户端校验时需要注意以下几点 1..将<s:form validate="true">的va ...
 - Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解
		
1) struts-default.xml 这个文件是struts2框架默认加载的配置文件.它定义struts2一些核心的bean和拦截器. <?xml version="1.0&qu ...
 
随机推荐
- java惯用法转载
			
目录 实现: equals() hashCode() compareTo() clone() 应用: StringBuilder/StringBuffer Random.nextInt(int) It ...
 - JQuery focus()
			
跳转到登陆页面时可以使用focus方法 <input name="login_account"id="login_account"class=" ...
 - 劳动节BT5 aircrack-ng战记
			
劳动节最后一天没事,想捣鼓一下BT5破解无线wep/wpa,BT5+virtual box早已准备就绪,上网专门找了一些资料,并买了一个据评测很兼容的usb网卡tp-link wn722n,芯片代号A ...
 - maven 本地setting.xml配置
			
<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...
 - PHP生成各种验证码和Ajax验证
			
网址:http://www.helloweba.com/view-blog-191.html 源码下载地址: http://files.cnblogs.com/h07061108/php%E9%AA% ...
 - Tomcat普通用户部署教程(生产服务器)
			
1.环境准备 JDK安装 解压 tar xf tomcat-xx.tar.gz -C /data/soft cd /data/soft 重命名 mv tomcat-xx tom ...
 - android 链接蓝牙不稳定的解决建议
			
My workaround I scan BLE for a short period of time 3-4 seconds then I turn scan OFF for 3-4 seconds ...
 - Assigning Host USB device to a Guest VM
			
Example Assigning Host USB device to a Guest VM This example is based on qemu-kvm (0.15.0) as instal ...
 - POJ2778&HDU2243&POJ1625(AC自动机+矩阵/DP)
			
POJ2778 题意:只有四种字符的字符串(A, C, T and G),有M中字符串不能出现,为长度为n的字符串可以有多少种. 题解:在字符串上有L中状态,所以就有L*A(字符个数)中状态转移.这里 ...
 - python 安装第三方模块
			
在Python中,安装第三方模块,是通过setuptools这个工具完成的. 如果你正在使用Mac或Linux,安装setuptools本身这个步骤就可以跳过了. 如果你正在使用Windows,请首先 ...