今天又学到了一个新的东西,就是struts2的类型转换。

为什么要类型转换?

今天我就要传一个点的坐标给你,保存时用一个自定义的Point类来保存。

因为在表单里面传过去的是字符串,如“12,23”,要把它存进Point类,就必须进行类型转换。将字符串用“,”截取,然后第一部分赋值给x,后一部分赋值给y。

首先设计输入页input.jsp

<s:form action="converter">
<s:textfield name="point" label="point"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:textfield name="date" label="date"></s:textfield>
<s:textfield name="username" label="username"></s:textfield>
<s:submit></s:submit>
</s:form>

定义一个Point类(限于篇幅,省略了set和get方法):

package cn.tshining.beans;

public class Point {

    private int x;
private int y; }

定义一个Action(ConverterAction),继承ActionSupport,在这里同样省略了set和get方法

private Point point;
private int age;
private Date date;
private String username; public String execute() throws Exception {
return SUCCESS;
}

设计输出页(output.jsp)

point:<s:property value="point"/><br/>
age:<s:property value="age"/><br/>
date:<s:property value="date"/><br/>
username:<s:property value="username"/><br/>

配置struts.xml

<action name="converter" class="cn.tshining.action.ConverterAction">
<result name="success">/output.jsp</result>
</action>

接下来重点便是怎么样写转换类!

struts提供了一些类型转换功能,只用继承这些类,override转换方法就可以了。这里使用ognl的DefaultTypeConverter类,override其convertValue方法即可。

public class PointConverter extends DefaultTypeConverter {

    @Override
public Object convertValue(Map context, Object value, Class toType) { if (Point.class == toType) {
Point point = new Point(); String[] str = (String[]) value;
String[] p = str[0].split(",");
int x = Integer.parseInt(p[0]);
int y = Integer.parseInt(p[1]); point.setX(x);
point.setY(y); return point;
} else if (String.class == toType) {
Point point = (Point) value; StringBuilder sb = new StringBuilder(); sb.append("[ x = ").append(point.getX() ).append(" , y = ").append(point.getY() ).append(
" ] ");
return sb.toString();
}
return null; } }

此方法中value是一个字符串数组(是数组!),toType是要转换的类型,有两种形式,一种是从客户端到服务器,从字符串转换为自定义类型,另一种是从自定义类型到字符串。

写完后基本上大功告成,但是还有一个问题,struts2怎么知道什么东西要做类型转换?要用什么来转?

这个就要用到properties文件了。该文件需要和Action类放在同一个目录中。而且命名也是有要求的。

在这里,这个文件名是ConverterAction-conversion.properties

内容为:

point=cn.tshining.converter.PointConverter

文件名“-”前和定义的Action是一样的,后面是固定的-conversion.properties,内容中“=”前是在Action中定义的需要转换的属性名,后面是转换的类名。

如此配置,即可完成struts2中的局部类型转换。

为什么是局部?因为这要做,每个properties文件只能转换一种类型,如果有多种类型需要转换,就要定义多个properties文件。

分析一下这个程序的工作流程:

首先用户从客户端发送数据,struts2拦截用户请求。

然后转发到ConverterAction,ConverterAction在调用set方法时,读取到properties配置文件,发现point属性需要做类型转换,然后将用户输入的point数据交给PointConverter类做类型转换。

PointConverter做完数据类型转换后,返回Point对象,ConverterAction调用set方法将point对象赋值给point字段。

接着ConverterAction执行execute方法,返回“success”,struts2将结果转发至output.jsp。

在output.jsp中输出point字段时,再次调用PointConverter类,将自定义类型转换成字符串输出。

在此例中比较复杂的是对这个工作流程的理解。

另外在ConverterAction的execute方法中返回的也不是一个字符串,而是一个常量,建议用这个常量,这样可以帮助理解,免得误以为可以返回任意字符串。

原地址:http://blog.csdn.net/fanghao16/article/details/4713188

struts2学习笔记(3)——struts2的局部类型转换的更多相关文章

  1. struts2学习笔记(4)——数据类型转换

    回过头来看昨天的那个例子. 在昨天的例子中,只转换了一个Point类,如果想转换多个Point类怎么办呢?在昨天的例子上面做一个小的修改. 首先在input.jsp页面中修改几个输入框. <s: ...

  2. struts2学习笔记--使用struts2插件实现ajax处理(返回json数据)

    贴一个简单的例子,通过jquery的post调用action,定义一个对象User,有name和age属性,实例化几个对象,以json的格式返回到jsp,在前台页面显示出来,模拟用户列表. 导入相关j ...

  3. struts2学习笔记之六:struts2的Action访问ServletAPI的几种方式

    方法一:通过ActionContext访问SerlvetAPI,这种方式没有侵入性 Action类部分代码 import com.opensymphony.xwork2.ActionContext; ...

  4. Struts2学习笔记(一):Struts2开发环境的配置

    一.Struts2应用所需的jar文件. 开发struts2应用需要依赖的jar文件在解压目录下的lib文件夹里面.开发struts2程序最少需要的jar文件为:struts2-core-2.xx.j ...

  5. struts2学习笔记2 -struts2的开发步骤和工作原理

    struts2的开发步骤: 1.先定义一个能发送请求的页面,可以是链接,也可以是表单(form) 2.开发action类,struts2对action并没有过多的要求,只要求: a 推荐实现actio ...

  6. Struts2学习笔记⑧

    今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...

  7. Struts2学习笔记①

    Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...

  8. Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)

    Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...

  9. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

随机推荐

  1. js 字符串“123”,变成整数123,不用parseInt 函数

    var s = "123"; console.log(s.charAt(0)*100+s.charAt(1)*10+s.charAt(2)*1);

  2. ADO.NET笔记——带参数的查询防止SQL注入攻击

    相关知识: 把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数 ...

  3. Java应用短信猫

    首先确定短信猫正常连接到主机,并安装SIM卡.先用超级终端测试短息猫能不能用.安装minicom:#sudo apt-get install minicom安装完成后,执行#sudo minicom ...

  4. 用委托在listbox中异步显示信息,解决线程间操作无效,从不是创建控件的线程访问它

    //创建一个委托,是为访问listbox控件服务的. public delegate void UpdateTxt(string msg); //定义一个委托变量 public UpdateTxt u ...

  5. 如何使用NET Reactor为您的.Net(C#,VB.Net) 源代码加密

    前言 VS开发的源代码安全性,是很多开发者头痛的事情.于是保护好源代码便成了开发者们最关心的事情之一了. 在网上搜一搜,很多有不少的第三方工具可以为源代码加密.加密方式不外乎就是混淆,加壳. 理论上, ...

  6. 【Qt】QSettings读写注册表、配置文件【转】

    简述 一般情况下,我们在开发软件过程中,都会缓存一些信息到本地,可以使用轻量级数据库sqlite,也可以操作注册表.读写配置文件. 关于QSettings的使用前面已经介绍过了,比较详细,见“更多参考 ...

  7. 解析php开发中的中文编码问题

    其实php开发中的中文编码并没有想像的那么复杂,虽然定位和解决问题没有定规,各种运行环境也各不尽然,但后面的原理是一样的. 了解字符集的知识是解决字符问题的基础. PHP程序设计中中文编码问题曾经困扰 ...

  8. Python开发【第一篇】Python基础之函数递归

    函数递归 递归的本质: 就是一个函数调用另外一个函数. def d(): return '123' def c(): r = d() return r def b(): r = c() return ...

  9. plateform_driver_register和plateform_device_register区别

    设备与驱动的两种绑定方式:在设备注册时进行绑定及在驱动注册时进行绑定. 以一个USB设备为例,有两种情形: (1)先插上USB设备并挂到总线中,然后在安装USB驱动程序过程中从总线上遍历各个设备,看驱 ...

  10. iOS应用的真机调试

    必须条件:99美元的帐号,没有这个就不用再往下看了. 首先,登录到http://developer.apple.com/devcenter/ios/index.action,如果已经购买了iPhone ...