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. acdream 瑶瑶带你玩激光坦克 (模拟)

    瑶瑶带你玩激光坦克 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 256000/128000KB (Java/Others) Submi ...

  2. Java框架的思考

    目前的JAVA 企业级开发框架,我们常用的大致包括IOC AOP MVC ORM框架 1. IOC spring是一个非常棒的ico容器,其思想非常简单,用一个集合对象如MAP 来缓存对象(对象都是单 ...

  3. ejabberd源码流程梳理

    ejabberd的工程主要通过ejabberd.app 组织起来 ejabberd.erl : application:start(ejabberd). ejabberd_app.erl: Mod:s ...

  4. shell部分命令缩写

    bin = BINaries /dev = DEVices /etc = ETCetera /lib = LIBrary /proc = PROCesses /sbin = Superuser BIN ...

  5. Android学习过程

    0. Tutorial 1. 基础知识的书 2. 实践为主的书 3. 阅读开源项目 4. 自己做项目 5. 理论为主的书 6. 编程规范和技巧性的书 通过实例了解Android开发 组件:Activi ...

  6. Leetcode OJ : Repeated DNA Sequences hash python solution

    Total Accepted: 3790 Total Submissions: 21072     All DNA is composed of a series of nucleotides abb ...

  7. position属性

    所有主流浏览器支持position属性: 任何版本的ie浏览器都不支持属性值“inherit”. position属性规定元素的定位类型,任何元素都可以定位,不过绝对定位或固定元素会生成一个块级框,不 ...

  8. POJ 2429

    思路:a/n*b/n=lcm/gcd 所以这道题就是分解ans.dfs枚举每种素数情况.套Miller_Rabin和pollard_rho模板 //#pragma comment(linker, &q ...

  9. Vijos1404 遭遇战 最短路,dijkstra,堆

    P1404遭遇战 标签:[显示标签]     背景 你知道吗,SQ Class的人都很喜欢打CS.(不知道CS是什么的人不用参加这次比赛). 描述 今天,他们在打一张叫DUSTII的地图,万恶的恐怖分 ...

  10. Java Script after Douglas Crockford's Training (JSON father)

    有幸能参加大牛的培训,学到了很多东西,下面总结一下: 1.总的思想是每一门语言都有好有坏,我们要通过好的代码规范和其他一些方式去避免使用糟糠的那一部分.JS有很多缺点,但是也有很多优点,我们就用他的优 ...