一、类型转换器的应用场景

类型转换是OGNL的一部分,默认的八种基本类型、String、Date会使用类型转换,但是更复杂的类型转换就需要我们自定义了(虽然这个东西一般根本用不到),OGNL可以应用在很多领域,但是在web领域,因为在客户端到服务器端传输的只是字符串,所以这里就有一个需求收缩,我们的需求就变为完成String和复杂对象之间的互相转换。
在Struts2中的类型转换则是在客户端的请求参数往Action的成员属性中设置的时候会被调用。

二、如何使用?

1.理论部分

所有的类型转换器都要实现TypeConverter接口,Struts2有需求收缩,只满足 String<-->复杂对象 就可以了,所以它提供了一个抽象类叫做StrutsTypeConverter,我们自定义的类型转换器只要继承这个类然后实现它的两个抽象接口就可以了。
我们写完了这个类型转换器的代码,但是怎么才能让Struts2知道去使用它呢?这里分为了两种情况:

Action级别
在Action的同级别目录下放置“ActionName-conversion.properties”,在此文件使用“propertyName=typeConverterClassName”的格式为属性指定类型转换器。
比如:
文件名:PointAction-conversion.properties
内容:point=struts_practice_005.PointTypeConverter

全局级别
在类路径下放置“xwork-conversion.properties”,在此文件中使用“ObjectName=typeConverterClassName”的格式为对象指定类型转换器。
比如:
文件名:xwork-conversion.properties
内容:struts_practice_006.Circle=struts_practice_006.CircleTypeConverter

总结一下:
定义一个类型转换器分为两步:
1.继承StrutsTypeConverter,实现它的两个抽象方法。
2.写properties文件告诉Struts2应该如何使用。

2.实践部分

两个例子(Action级别类型转换器 & 全局级别类型转换器):

2.1 一个字符串到Point对象的转换。(使用Action级别)
结构如下:

Point:

/**
* 表示一个点
* @author CC11001100
*
*/
public class Point { private double x;
private double y; public Point() {
} public Point(double x, double y) {
super();
this.x = x;
this.y = y;
} @Override
public String toString() {
//toString--> (x,y)
return "("+x+","+y+")";
} public double getX() {
return x;
} public void setX(double x) {
this.x = x;
} public double getY() {
return y;
} public void setY(double y) {
this.y = y;
} }
Action:
import com.opensymphony.xwork2.ActionSupport;

public class PointAction extends ActionSupport {

    private Point point;

    @Override
public String execute() throws Exception { System.out.println(point); return super.execute();
} public Point getPoint() {
return point;
} public void setPoint(Point point) {
this.point = point;
} }
类型转换器PointTypeConverter :
import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

/**
* 完成 Point对象<-->String 的互相转换
*
* @author CC11001100
*
*/
public class PointTypeConverter extends StrutsTypeConverter { /**
* 这个方法完成从String-->Point的类型转换
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
if (values.length > 0) {
String s = values[0];
String ss[] = s.split(",");
if (ss.length != 2)
return null;
double x = Double.parseDouble(ss[0].substring(1, ss[0].length()));
double y = Double
.parseDouble(ss[1].substring(0, ss[1].length() - 1));
return new Point(x, y);
} else {
return null;
}
} /**
* 这个方法完成从Point-->String的转换
*/
@Override
public String convertToString(Map context, Object o) {
// 偷个懒,直接调用toString()
if (o != null)
return o.toString();
return null;
} }

配置PointAction-conversion.properties(Action级别):

point=struts_practice_005.PointTypeConverter

struts.xml:

<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="pointAction" class="struts_practice_005.PointAction">
<result >/result.jsp</result>
</action>
</package>
</struts>

前端页面:

<form action="pointAction" method="post">
<input type="text" name="point" />
<input type="submit" value="提交" />
</form>

结果当然是转换成功啦,可以看到控制台的打印结果:

前端页面的显示结果:

当客户端发来的请求参数point=(1,2)发送到服务器的时候,它设置之前会看一下是否给这个对象设置了类型转换器,如果设置了就交给类型转换器就可以了,所以这里是调用了PointTypeConverter的convertFromString()方法。

2.2 一个字符串到Circle对象的转换。(使用全局级别)

概览:

Circle:

/**
* 表示一个圆
*
* @author CC11001100
*
*/
public class Circle { // 圆的半径
private double r; public Circle() {
} public Circle(double r) {
super();
this.r = r;
} @Override
public String toString() {
// toString() --> "C:rxx"
return "C:r" + r;
} public double getR() {
return r;
} public void setR(double r) {
this.r = r;
} }

CircleAction:

import com.opensymphony.xwork2.ActionSupport;

public class CircleAction extends ActionSupport {

    private Circle circle;

    @Override
public String execute() throws Exception { return SUCCESS;
} public Circle getCircle() {
return circle;
} public void setCircle(Circle circle) {
this.circle = circle;
} }

CircleTypeConverter:

/**
* 完成从 String<-->Circle 的互相转换.
* @author CC11001100
*
*/
public class CircleTypeConverter extends StrutsTypeConverter { @Override
public Object convertFromString(Map context, String[] values, Class toClass) {
if (values.length > 0) {
String s = values[0];
if(s.indexOf("C:r")==-1) return null;
s=s.substring(3,s.length());
double r=Double.parseDouble(s);
return new Circle(r);
} else {
return null;
}
} @Override
public String convertToString(Map context, Object o) {
if(o!=null) return o.toString();
return null;
} }

struts.xml

<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="circleAction" class="struts_practice_006.CircleAction">
<result >/result.jsp</result>
</action>
</package>
</struts>

xwork-conversion.properties:

struts_practice_006.Circle=struts_practice_006.CircleTypeConverter

前端:

<form action="circleAction" method="post">
<input type="text" name="circle" />
<input type="submit" value="提交" />
</form>

result.jsp:

<s:property value="circle" />
<s:debug />

输入:

输出:

<s:property value="circle" /> 得到的值使用了类型转换器,<s:debug />显示的ValueStack中的值没有使用类型转换器,证明:
给类型转换器的convertToString加点料。如下:

public class CircleTypeConverter extends StrutsTypeConverter {

    ...

    @Override
public String convertToString(Map context, Object o) {
if(o!=null) return o.toString()+"类型转换器";
return null;
} }

如图:


三、工作原理?

待更、

Struts2之类型转换器的更多相关文章

  1. struts2学习笔记之十一:struts2的类型转换器

    Struts2的类型转换器   如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString   注 ...

  2. struts2自定义类型转换器

    首先,何为struts2的类型转换器? 类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行相互转换. 一.大部分时候,使用struts2提供的类型转换器以及OGNL类型转换机 ...

  3. Struts2的类型转换器

    Struts2的类型转换器 如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString 注册类型转 ...

  4. Struts2初学 struts2自定义类型转换器

    一.问题的引出      Struts2的类型转换是基于OGNL表达式的,由于请求的参数都是字符串,而JAVA 本身属于强类型的的语言,这样就需要把请求参数字符串转换成其他类型.     Struts ...

  5. [JavaWeb基础] 013.Struts2 自定义类型转换器

    很多时候,我们在做web开发的时候经常要用到时间的转换器,Struts2给我们提供了一种类型转换器的接口.下面我们讲讲怎么实现吧. 1.首先我们要定义一个类型转换的类,继承自com.babybus.s ...

  6. Struts2:类型转换器

    常规的String,int能自动转换,但是,有些类型不是这么简单,比如输入字符串,但需要Date.自定义类型,因此需要自定义类型转换类型转换器分全局和局部按惯例,局部的优先级高于全局 需求: 1.输入 ...

  7. Struts2之类型转换器的使用

    一.学习案例:通过在输入页面(input.jsp)用同一个输入框同一时候输入username和password,通过类型转换器在输出页面(output.jsp)分别输出username和passwor ...

  8. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

  9. struts2 笔记02 文件上传、文件下载、类型转换器、国际化的支持

    Struts2的上传 1. Struts2默认采用了apache commons-fileupload  2. Struts2支持三种类型的上传组件 3. 需要引入commons-fileupload ...

随机推荐

  1. UOJ52——【UR #4】元旦激光炮

    1.题目大意:就是给你三个数组啦,然后让你找到其中的第K大,但是,不可以直接访问数组,必须通过一种函数,最后的分数 是看调用几次这个函数,100次以内10分,2000以内6分.... 2.分析:最开始 ...

  2. [codevs3729]飞扬的小鸟

    [codevs3729]飞扬的小鸟 试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果 ...

  3. OpenCV进阶之路:一个简化的视频摘要程序

    一.前言 视频摘要又称视频浓缩,是对视频内容的一个简单概括,先通过运动目标分析,提取运动目标,然后对各个目标的运动轨迹进行分析,将不同的目标拼接到一个共同的背景场景中,并将它们以某种方式进行组合.视频 ...

  4. android开发中获取<meta-data>数据

    在 AndroidManifest.xml 中,<meta-data>元素是一个键值对,往往被包含在<application> .<activity>.<se ...

  5. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  6. Java读取mat文件

    概述 使用ujmp中的jmatio模块读取.mat文件到java程序中. 其实,ujmp主要是在模块core中实现了矩阵运算,其余模块都是复用了已有的开源库.模块jmatio是复用了已有的JMatIo ...

  7. iOS关于UILabel 基本属性 背景图片 背景色

    [代码] iOS关于UILabel 基本属性 背景图片 背景色 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  8. JavaScript——exec和match

    题目17:Read the following javascript code: var someText="web2.0 .net2.0";var pattern=/(\w+)( ...

  9. mysql grant ,User,revoke

    mysql的权限一直都都是很关心的重点,我知道的也只是很少的一部分,对于每个数据库我习惯创建一个一个用户,该用户只对自己从属的数据库产生进行操作,在一部分的程度上可以保护自己的数据库, 比如我有一个数 ...

  10. docker -v挂载数据卷网络异常的问题

    docker 删除容器并重新运行容器时报如下异常: docker: Error response from daemon: failed to create endpoint tomcat001 on ...