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

类型转换是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. c语言小知识点

    大一时学c语言,总结的一些自己感觉很零碎且容易忘的知识点,不对之处请指正 1.字符串不管中间是否有数值0,结尾一定有数值02.浮点类型的变量存储并不精确3.printf格式串自动右对齐,加负号左对齐4 ...

  2. Android入门之GPS定位详解

    一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个LocationManager. LocationManger locationMa ...

  3. java中二进制和流的相互转换

    流转二进制 public static byte[] toByteArray(InputStream in) throws IOException { ByteArrayOutputStream ou ...

  4. BZOJ1588——[HNOI2002]营业额统计

    1.题目大意:一个简单的treap模板题(我才不告诉你题目少一句话呢,看discuss去 2.分析:treap模板题 #include <cstdio> #include <cstd ...

  5. HTML页面关键词随机分布布局

    结合underscore-min.js,和D3.js 绘制HTML关键词随机分布 <!DOCTYPE html> <html> <head> <meta ch ...

  6. Extjs PROXY查询params无法传参,改用extraParams

  7. 解决ckeditor中文路径无法下载,无法显示图片问题

    使用ckfinder上传的文件如果是中文路径,下载的时候会找不到 假如使用tomcat服务器,找到tomcat目录>conf文件夹的server.xml>用查找找到Connector这个 ...

  8. Linux CAT与ECHO命令详解 <<EOF EOF

    Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: .一次显示整个文件. $ cat filename .从键盘 ...

  9. CentOS6.5安装Tab增强版:bash-completion

    CentOS6.5安装Tab增强版:bash-completion,可补全命令参数: 因为CentOS官方源并不带有bash-completion的包,所以,为了可用yum安装,增加epel的源, 首 ...

  10. JS插件之——ztree

    很牛逼的一个树形菜单,树形下拉框插件.一年前用过,很好用.今天又有机会拿过来用,温故一下基本点,nice!! 官方文档说明的非常详细,按照API慢慢看,耐心解读,自然就可以解惑了. 官方文档及其源码下 ...