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

类型转换是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. 关于python 序列 深拷贝

    如果要在循环内修改正在迭代的序列(例如,复制所选的项目),建议首先制作副本.迭代序列不会隐式地创建副本.使用切片就可以很容易地做到: >>> >>> for w i ...

  2. python解释器快捷键

    13. 交互式输入的编辑和历史记录 某些版本的 Python 解释器支持编辑当前的输入行和历史记录,类似于在 Korn shell 和 GNU Bash shell 中看到的功能.这是使用GNU Re ...

  3. dispaly:table-cell,inline-block,阐述以及案例

    display:table 此元素会作为块级表格来显示(类似 <table>),表格前后带有换行符.dispaly:table-row 此元素会作为一个表格行显示(类似 <tr> ...

  4. 一、 Java的值传递和引用传递

    如果参数类型是原始类型(基本类型),那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的.如果在函数中改变了副本的值不会改变原始的值. 如果参数类型是引用类型,那么 ...

  5. git分支管理策略

    http://www.ruanyifeng.com/blog/2012/07/git.html https://www.digitalocean.com/community/tutorials/how ...

  6. ubuntu安装文件比较工具Meld

    Meld是一款可视化的文件及目录对比(diff) / 合并 (merge) 工具,通过它你可以对两个或三个文件/目录进行对比,并以图形化的方式显示出它们的不同之处,同时还提供编辑及合并功能,另外还支持 ...

  7. Python核心编程这本书的一些错误

    <Python核心编程第二版>这本书比<Python基础教程第二版修订版>详细很多,丰富了很多细节,虽然它是一本经典的入门书,但我发现还是存在一些明显的错误.在面向对象编程这一 ...

  8. CentOS 7部署flume

    CentOS 7部署flume 准备工作: 安装java并设置java环境变量,在`/etc/profile`中加入 export JAVA_HOME=/usr/java/jdk1.8.0_65 ex ...

  9. volley post非json格式数据并获取json数据

    在使用JsonObjectRequest时无法post非json格式的数据,因而采用StringRequest获取到相应的数据后再转为json格式的数据. //这里的上下文需要讨论 private s ...

  10. 在VS中MFC、ATL与WIN32有什么联系或区别?

    有时候遇到一些初学者问我这个问题:在VS中使用MFC和ATL与使用WIN32有什么联系或区别?通俗来说,win32是通过调用windows api去实现需要的功能.而MFC和ATL是封装好的类库,包含 ...