为什么需要类型转换

在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端
但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boolean Date 等等
因此 当这些参数进入应用程序时 必须被转换成适合的服务器端编程语言的数据类型

在Servlet中 类型转换工作是由开发者自己完成的
比如我们在易买网里要把分页的信息pageIndex读取出来
String s=request.getParameter("pageIndex");
int pageIndex=Integer.parseInt(s);

类型转换的工作是必不可少的 重复性的. 如果有一个良好的类型转换机制 必将大大节省开发时间,提高开发效率

Struts2提供了强大的类型转换功能

1.内置转换器
对于大部分的常用类型 开发人员在开发过程中不需要自己编码实现类型转换 这是因为在Struts2框架爱中可以完成大多数常用的类型转换
//由内部提供的类型转换器完成
1.String 将 int long double boolean String数组或者java.util.Date类型转换为字符串
2.boolean/Boolean 在字符串和布尔值之间转换
3.char/Character 在字符串和字符之间进行转换
4.int/Integer float/Float long/Long double/Double
5.Date 在字符串和日期只见进行转换 具体输入输出格式与当前的local有关
6.数组和集合 在字符串数组和数组对象 几何对象之间进行转换

2.自定义类型转换器

pom.xml

(需要注意的是build节点 否则局部properties可能无法识别到)

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.3</version>
</dependency> <dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.14</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>

包结构如上

converter

//StrutsTypeConverter 继承自 DefaultTypeConverter
//DefaultTypeConverter 有一个实现类 XWorkConverter

@Inject
public void setObjectFactory(ObjectFactory factory) {
this.objectFactory = factory;
// note: this file is deprecated
loadConversionProperties("xwork-default-conversion.properties"); loadConversionProperties("xwork-conversion.properties");
} public String buildConverterFilename(Class clazz) {
String className = clazz.getName();
return className.replace('.', '/') + "-conversion.properties";
}

具体步骤

1.新建一个converter包,在包下创建类型转换器类,继承自抽象类StrutsTypeConvert
//实现两个方法
public Object convertFromString(Map context, String[] values, Class toClass)
//其中 context是OGNL上下文的Map对象
//value是需要转换的字符串值
//toType是要转换的目标类型

public String convertToString(Map context, Object object)
//object是要转换的对象

public class DataConverter extends StrutsTypeConverter {

    private final DateFormat[] dfs = {
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy-MM-dd")
}; public Object convertFromString(Map map, String[] strings, Class aClass) {
String data = strings[0];
for (int i = 0; i < dfs.length; i++) {
try {
return dfs[i].parse(data);
} catch (ParseException e) {
continue;
}
}
throw new TypeConversionException();
} public String convertToString(Map map, Object o) {
Date date = (Date) o;
return new SimpleDateFormat("yyyy年MM月dd日").format(date);
}
}

2.配置全局类型转换器或者特定类的类型转换器
//特定类
在Action所在的包下建立 类名-conversion.properties
配置: 特定类的属性名=类型转换器类的全名

//全局
在classpath下建立 xwork-conversion.properties
配置: 需要转换的数据类型的类的全名=类型转换器类的全名

3.处理类型转换错误
//需要启动StrutsConversionErrorInterceptor拦截器 它包含在defaultStrack拦截器栈中
(就是不用管)
//需要实现ValidationAware接口 但是ActionSupport实现了这个接口

//配置input结果映射
(失败result=input)
//用<s:filederror>接收

【学习笔记】Struts2 类型转换的更多相关文章

  1. [Struts2学习笔记] -- 自定义类型转换

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  2. Struts2 学习笔记19 类型转换 Part1

    现在来说一说类型转换,提到类型转换其实我们之前早已经用过了,在url传递参数的时候,我们传递过来的参数其实都是String类型的,在显示的时候都自动转换了,像这种简单的转换很好理解,我们要说的是,转换 ...

  3. Struts2学习笔记(七)——类型转换

    1.自动类型转换 Struts2内部提供大量类型转换器,用来完成数据类型转换问题: String和boolean.Boolean:完成字符串与布尔值之间的转换 String和char.Characte ...

  4. Struts2 学习笔记20 类型转换part2 写自己的转换器

    之前说的是调用Struts2的默认转换器,现在我们来说以下写自己的转换器,这个一般不常用,在访问不是自己写的类中可能用到.我们一点点来,因为写自己的转换器需要注意的东西还是很多的. 我们还是用之前的项 ...

  5. swift学习笔记之-类型转换

    //类型转换 import UIKit /*类型转换(Type Casting) 1.类型转换 可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 2.类型转换使用 is 和 as 操作符实 ...

  6. Struts2学习笔记--Struts2的体系结构

    1. Struts2体系结构 Struts是以前端控制器框架为主体的框架,用户的请求会通过控制器选择不同的Action类来执行具体的操作,在Action类中所有的Servlet对象(request.r ...

  7. (C/C++学习笔记) 七. 类型转换

    七. 类型转换 ● 隐式类型转换 隐式类型转换 implicit type conversions #include<iostream> using namespace std; void ...

  8. Struts2学习笔记——Struts2与Spring整合

      Struts2与Spring整合后,可以使用Spring的配置文件applicationContext.xml来描述依赖关系,在Struts2的配置文件struts.xml来使用Spring创建的 ...

  9. Struts2学习笔记——Struts2搭建和第一个小程序

    1.新建web项目 2.配置Struts2核心过滤器 (1)打开web.xml文件,做以下配置: <?xml version="1.0" encoding="UTF ...

  10. 【C#学习笔记】类型转换

    using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { " ...

随机推荐

  1. addTarget:self 的意思是说,这个方法在本类中

    addTarget:self 的意思是说,这个方法在本类中也可以传入其他类的指针*/

  2. Tomcat下的Server.xml配置文件详解

    自15年毕业到现在已经入行两年多了,一直以来没有深入的了解过tomcat的详细配置,只懂修改一下端口号.在网上找了些相关资料来支撑这篇文章,深入了解server.xml文件各配置的作用 <?xm ...

  3. MySQL Block Nested Loop and Batched Key Access Joins(块嵌套循环和批量Key访问连接)

    Block Nested-Loop and Batched Key Access Joins Batched Key Access (BKA) Join算法通过index和join buffer访问j ...

  4. React源码解析:setState

    先来几个例子热热身: ......... constructor(props){ super(props); this.state = { index: 0 } } componentDidMount ...

  5. [转]解决error: "net.ipv4.netfilter.ip_conntrack_max" is an unknown key错误

    今天在新买的vps上执行sysctl -p,报下面的错误:net.ipv4.ip_forward = 0net.ipv4.conf.default.rp_filter = 1net.ipv4.conf ...

  6. JavaScript 教程:对象

    JavaScript 对象是拥有属性和方法的数据.学过编程语言的都知道,此处不再详述! 1.对象的定义: <script> </script> 对象也可以先创建,再添加属性和属 ...

  7. linkin大话设计模式--常用模式总结

    linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...

  8. tomcat启动报错

    [toc]启动错误 does not exist or is not a readable directory 问题:tomcat启动报错:does not exist or is not a rea ...

  9. awk匹配以aaa开头,以bbb结尾的内容,同时aaa和bbb之间还包含ccc

    如果是匹配以A开头,以B结尾的内容,同时A和B之间还包含C的这种怎么做?比如 [root@localhost ~]#cat file aaa grge ddd bbb aaa gege ccc bbb ...

  10. 08_Python编码与解码

    一.编码的由来 因为计算机只能处理010101二进制数据,如果要处理文本,图像,视频等,需要我们把数据转换成01010二进制格式才能被计算机处理 最先出现的是ASCII,用8位一个字节来表示,成为单字 ...