Struts2 转换器
转换器
- 从一个 HTML 表单到一个 Action 对象,类型转换是从字符串到非字符串
- Http 没有 “类型” 的概念,每一项表单的输入只可能是一个字符串或一个字符串数组,在服务器端必须把 String 转换为特定的数据类型
- 在 struts2 中把请求参数映射到 action 属性的工作由 Parameters 拦截器负责,它是默认拦截器的一员,而且可以自动完成字符串和基本数据类型之间的转换
- 由此可以知道前面的案例中在不做任何处理的情况下也不会出异常,是因为我们在服务端所要的类型均为基本类型,parameters 拦截器为我们完成了我们该做的工作。
当服务器端所需要的不是基本类型时,Struts2 将会如何处理?
- 若 Action 没有实现 ValidationAware 接口:Struts2 在遇到类型转换错误的时候仍会调用其 Action 方法,就好像什么都没发生一样
- 若 Action 实现了 ValidationAware 接口:Struts2 在遇到类型转换错误的时候将不会继续调用 Action 方法,Struts2 将会检查相关的 action 元素的声明是否包含着一个 name=input 的 result,如果有 Struts2 将把控制权转交给那个 result 元素,若没有 result 元素 struts2 将会抛出一个 404 异常,提示找不到 name = input 的 result

实例
- 若 Action 类实现了 ValidationAware 接口,且含有 result 元素,那么当我们在一个类型为 Integer 的字段中输入一串字符串(比如 字母),Struts2 将会报错,如下


- 代码展示

- 如上所示,其中 Action 类 - Conversion 实现了 ActionSupport 也可以实现如 ValidationAware 接口的一样的效果是因为 ActionSupport 实现了 ValidationAware 接口

思考
- 如何自定义错误消息?
- 在对应的 Action 类所在的包中新建 ActionClassName.properties 文件,ClassName 即为包含着输入字段的 Action 类的类名
- 在属性文件中添加键值对以配置错误消息(invalid.fieldvalue.fieldName=message)
- 举例
- 在 Action 包下新建配置文件,输入对应字段要显示的错误消息,其输入的错误消息不可以直接输入汉字,可以在 eclipse 的 properties 文件中输入对应的汉字将会自动转换为如图的编码(不知道还有什么其他方法还望告知)


自定义类型转换器
上面所述的是在当我们输入错误的基本类型的数据的时候所要做的处理,那么当需要使用非基本类型的数据时,Parameters 不会帮我们自动转换我们该怎么办?
此时便需要我们自己去定义转换器,对对应的字段进行转换处理
自定义转换器实现步骤
实现 StrutsTypeConverter 类
配置类型转换器
基于字段的配置:
- 在字段所在的 Model(可能是 Action,可能是一个 JavaBean) 的包下新建一个 ModelClassName-c
onverter.properties
- 在字段所在的 Model(可能是 Action,可能是一个 JavaBean) 的包下新建一个 ModelClassName-c
在该文件中输入键值对:fieldName = 类型转换器的全类名
基于类型的配置
- 在 src 下建立 xwork-conversion.properties
- 键入:待转换的类型 = 类型转换器的全类名

如上,当将字段写在 Action 中,此时的配置文件就应该为 SelfConversion-converter.properties,当将 Action 中的字段包装为一个 Customer 类时,配置文件就与 Customer 在同一包下,且名为 Customer-converter.properties
配置文件内容均为(此例自定义转换器转换的是日期类型,即对字段生日的转换)
birth=com.self.conversion.SelfTypeConverter
实现 StrutsTypeConverter 类需要实现两个方法,如下

代码举例(将获取的字段转换为 Date 类型,以及转换回去)
public class SelfTypeConverter extends StrutsTypeConverter {
private DateFormat dateFormat; public SelfTypeConverter() {
System.out.println("Constructs...");
} public DateFormat getDateFormat() {
if (dateFormat == null) {
ServletContext servletContext = ServletActionContext.getServletContext();
String pattern = servletContext.getInitParameter("pattern");
return new SimpleDateFormat(pattern);
}
return dateFormat;
} @Override
public Object convertFromString(Map map, String[] strings, Class aClass) {
System.out.println("Succ");
if (aClass == Date.class) {
if (strings != null && strings.length > 0) {
String value = strings[0];
try {
return getDateFormat().parseObject(value);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return null;
} @Override
public String convertToString(Map map, Object o) {
if (o instanceof Date) {
Date date = (Date) o;
return getDateFormat().format(date);
}
return null;
}
} web.xml 文件
<context-param>
<param-name>pattern</param-name>
<param-value>yyyy-mm-dd hh:mm:ss</param-value>
</context-param>
自定义转换器和默认的转换器出错的处理方式是一样的,这里就不再叙述。到此就是转换器的内容,还望指出问题所在,谢谢!
Struts2 转换器的更多相关文章
- Struts2转换器配置和用法
struts转换器:在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制. 一.类型转换的意义 对于一个 ...
- Struts2转换器
为什么进行类型转换 在基于HTTP协议的Web应用中 客户端请求的所有内容都以文本编码方式传输到服务器端 服务器端的编程语言却有着丰富的数据类型 继承StrutsTypeConverter抽象类 继承 ...
- Struts2(接受表单参数)请求数据自动封装和数据类型转换
Struts2请求数据自动封装: (1)实现原理:参数拦截器 (2)方式1:jsp表单数据填充到action中的属性: 普通的成员变量,必须给set,get可以不给的. 注意点,A ...
- 8.Struts2类型转换器
类型转换器1.引入在Struts2中,请求参数类型不仅可以是String,还可以是其它类型.如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,则birthday接收到的 ...
- 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...
- Struts2:类型转换器
常规的String,int能自动转换,但是,有些类型不是这么简单,比如输入字符串,但需要Date.自定义类型,因此需要自定义类型转换类型转换器分全局和局部按惯例,局部的优先级高于全局 需求: 1.输入 ...
- struts2学习笔记之十一:struts2的类型转换器
Struts2的类型转换器 如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString 注 ...
- Struts2框架的自定义类型转换器
前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...
- struts2类型转换器、 类型转换错误 以及INPUT view
1.1.1 Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 ...
随机推荐
- 复习HTML+CSS(2)
n 项目符号嵌套编号思路 标签的内容(文本.项目符号.表格.图片等)必须放在最底层标记中. n 图片标记(行内元素,单边标记) l 语法:<img 属性 = "值"&g ...
- Android自定义圆形图片工具类(CTRL+C加CTRL+V直接使用)
先贴一下工具类的代码!可直接复制粘贴 public class RoundImageView extends ImageView { private Paint mPaint; //画笔 privat ...
- 基于session认证 相亲小作业
基于session认证 相亲小作业 用户登录 如果男用户登录,显示女生列表 如果女用户登录,显示男生列表 urls ===========================urls========== ...
- 南京邮电大学java程序设计作业在线编程第二次作业
王利国的"Java语言程序设计第2次作业(2018)"详细 作业结果详细 总分:100 选择题得分:60 1. 表达式9==8&&3<7的运算结果是( ) ...
- vue 插值,v-once,v-text, v-html
引入Vue.js ,通过script形式,vue官网语法记录 创建vue应用,数据和 DOM 已经被建立了关联,所有东西都是响应式的 1:插值 缺点:让你的网速慢,或者数据加载失败时,会在浏览器中直接 ...
- PHP面向对象-看父类调用子类方法
大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...
- jdk 动态代理源码分析
闲来无事,撸撸源码 使用方法 直接看代码吧.. package com.test.demo.proxy; import java.lang.reflect.InvocationHandler; imp ...
- [HNOI2016]序列
题目描述 给定长度为n的序列:a1,a2,...,an,记为a[1:n].类似地,a[l:r](1<=l<=r<=N)是指序 列:al,al+1,...,ar-1,ar.若1< ...
- UVALive - 3942:Remember the Word
发现字典里面的单词数目多且长度短,可以用字典树保存 f[i]表示s[i~L]的分割方式,则有f[i]=∑f[i+len(word[j])] 其中word[j]为s[i~L]的前缀 注意字典树又叫前 ...
- hihocoder 1249(2015ACM/ICPC北京)
题意: 给你一块正方形的土地,里面有矩形的草地,要求把土地分成两份,满足以下两个条件 1.两边的绿洲,左边>=右边,差值尽可能的小 2.在满足1的情况下分给左边的土地尽快能的多 而且绿洲不会出现 ...