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中的类型转换的更多相关文章

  1. Struts2中的类型转换与复杂对象配合使用

    form 标签可以被映射到一个属性的属性 manager.java package com.atguigu.struts2.model; import java.util.Date; public c ...

  2. Struts2中的类型转换失败

    类型转换失败: 若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生一样. 若 Action ...

  3. struts2异常处理及类型转换

    一.struts2对异常的处理 1.自定义局部异常: <action> <exception-mapping result="sonException" exce ...

  4. Struts2中的数据类型转换

    Struts2对数据的类型转换 一.Struts2中自带类型转换拦截器 Struts2内部提供了大量转换器,用来完成数据类型转换的问题,有如下 * boolean 和 Boolean * char和 ...

  5. Struts2中Date日期转换的问题

      今天跑程序的时候莫名其妙的出现了下面的一个异常: java.lang.NoSuchMethodException:com.ca.agent.model.mybatis.ApprovalInforC ...

  6. struts2学习笔记(3)——struts2的局部类型转换

    今天又学到了一个新的东西,就是struts2的类型转换. 为什么要类型转换? 今天我就要传一个点的坐标给你,保存时用一个自定义的Point类来保存. 因为在表单里面传过去的是字符串,如“12,23”, ...

  7. 在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .

    笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 声明:本文参考Strut ...

  8. Struts2中的校验框架

    Struts2提供的客户端校验 尽管这种支持比较弱,但采用Struts2中的客户端校验时需要注意以下几点 1..将<s:form validate="true">的va ...

  9. Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解

    1) struts-default.xml 这个文件是struts2框架默认加载的配置文件.它定义struts2一些核心的bean和拦截器. <?xml version="1.0&qu ...

随机推荐

  1. UVa 101 (模拟) The Blocks Problem

    题意: 有n个木块及n个木块堆,初始状态是第i个木块在第i个木块堆上.对应有四种操作,然后输出最终状态. 分析: 用一个vector<int>模拟一个木块堆,进行相应操作即可. #incl ...

  2. Windows 下目录及文件向Linux同步

    本文解决的是Windows 下目录及文件向Linux同步的问题,Windows向 Windows同步的请参考:http://www.idcfree.com/article-852-1.html 环境介 ...

  3. [NOIP2013]转圈游戏

    题目描述 Description n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 ...

  4. Ubuntu firefox falsh

    Ubuntu下为Firefox安装Adobe Flash Player   使用环境:     OS:Ubuntu 12.04 LTS     Browser: Firefox 12.0     Ad ...

  5. 在Mac上通过Sublime、Skim编辑LaTeX

    转自:http://painterlin.com/2014/08/10/Using-LaTeX-with-Sublime-and-Skim-for-Mac.html Sublime Text是一款非常 ...

  6. Vmware Ubuntu 虚拟机与Windows主机共享文件夹

    概述: 1.安装Vmware tool 2.设置共享文件夹并选择总是连接 3.运行命令挂载共享文件夹 前两步很简单,第三步在root权限下运行命令:mount -t vmhgfs .host:/ /m ...

  7. OpenSSH 密钥管理:RSA/DSA 认证(转载)

    我们中有许多人把优秀的 OpenSSH用作古老的 telnet 和 rsh 命令的替代品,OpenSSH 不仅是安全的而且是加密的. OpenSSH 更加吸引人的特性之一是它能够使用基于一对互补的数字 ...

  8. VirtualBox NAT方式与主机互相通信

    之前说过,桥接方式适合在统一的网络环境中使用(一样的网关和许可). 如果网络环境发生改变,那就难堪了 -- 这就是我遇到的问题,公司里每人的IP都是固定的. 解决办法,改为NAT网络地址转换模式. 但 ...

  9. 实现Linux下的ls -l命令

    基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...

  10. android studio 真机调试

    1.使用usb连接电脑,打开开发者选项,打开usb调试. 2.不能使用仅充电,修改为媒体设备(MTP) 3.如果无法连接可以使用豌豆荚或者金山手机助手连接. 4.运行android程序即可. 5.如果 ...