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

类型转换是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. js兼容注意事项--仅供参考

    做BS开发就难免会用到javascript,而每个浏览器对javascript的支持有不同.这就需要我们程序员去兼容他们,不然有些浏览器就无法运行我们的代码.就会造来客户的投诉,如果让BoSS知道了, ...

  2. CSU 1337 搞笑版费马大定理(2013湖南省程序设计竞赛J题)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1337 解题报告:虽然x和y的范围都是10^8,但是如果a 是大于1000的话,那么a^3 ...

  3. UOJ#35 —— 后缀排序

    1.题目大意:后缀数组模板题 2.分析:汝佳的书上的代码的有bug,还有那个n是字符串长度+1,''也要加入排序的 存个模板QAQ #include <cstdio> #include & ...

  4. HTTP请求常见状态码

    HTTP状态码(HTTP Status Code) 一些常见的状态码为: 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码.代码 说明 100 (继续) 请求者应当继续提出请求. 服务 ...

  5. HDU 2819 隐式二分图匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=2819 这道题乍一看是矩阵变换题,估计用矩阵之类的也可以做 但是分析一下就可以知道 要凑成对角线都是1,题目允许行 ...

  6. hdu1520 树形dp Anniversary party

    A - Anniversary party Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  7. Python进程、线程

    Lock & RLock :用来确保多线程多共享资源的访问. Semaphore : 用来确保一定资源多线程访问时的上限,例如资源池. Event : 是最简单的线程间通信的方式,一个线程可以 ...

  8. VB中 ByRef与ByVal区别

    函数调用的参数传递有"值传递"和"引用传递"两种传递方式.如果采用"值传递",在函数内部改变了参数的值,主调程序的对应变量的值不会改变:如果 ...

  9. 蓝牙模块连接后出现ANR,日志记录

    11-25 16:29:48.433 14507-14561/myapplication.com.myblue W/MALI: glDrawArrays:714: [MALI] glDrawArray ...

  10. vs2013 内置IIS Express相关问题

    问题描述,以前做的程序迁移到vs2013后出现500.22问题. HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设 ...