jsp提交的数据全部是String类型,Struts2也是通过request.getParameter(name)取得String类型的数据,并通过拦截器将String转换成各种类型的数据,然后通过get、set方法设置到action对应的属性,默认的转换器不能满足需求,需要自定义类型转换。

数据类型转换都需要实现ognl.TypeConverter接口,一般直接继承DefaulrTypeConverter类,并实现convertValue()方法。convertvalue()有3个参数,参数value为待转换的数据,参数toType为要转成的类型,参数context为上下文,参数value为request.getparameter(name)返回的String[]类型的对象,而不是String。类型转换分为两类:局部类型转换器:对某个action转换类型起作用。全局类型转换器:对所有action转换类型起作用.

一、局部类型转换

1.1 普通Action中的类型转换
配置文件存放目录:Action同级目录;
配置文件名:Action名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:Action属性名=转换器包路径

1.2 基于模型驱动的类型转换
配置文件存放目录:模型同级目录;
配置文件名:模型名-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:模型属性名=转换器包路径

二、全局类型转换
配置文件存放目录:项目根目录;
配置文件名:work-conversion.properties文件
转换器:自定义转换器实现TypeConverter接口,可以直接继承StrutsTypeConverter来实现;
内容:要转换的类型包路径=转换器包路径
注意:若在模型驱动情况下,即配置了Action的类型转换器又配置了对应模型的转换器,此时只会选择模型转换器;

三、实现

1.不管是局部还是全局类型转换,转换器都是一样的,只是配置文件不一样,所以先实现转换器,这里还是以MyStruts2为基础。

package com.test.converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException; public class DateTimeConverter extends DefaultTypeConverter { private DateFormat[] dateFormat={
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yy-MM-dd")
};
private DateFormat[] timeFormat={
new SimpleDateFormat("HH:mm:ss"),
new SimpleDateFormat("HH:mm"),
};
@Override
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
if(toType.equals(java.sql.Date.class))
{
String[]parameterValues=(String[])value;
for(DateFormat format:dateFormat)
{
try{
return new java.sql.Date(format.parse(parameterValues[0]).getTime()); }
catch(ParseException e){} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else if(toType.equals(java.sql.Time.class))
{
String[]parameterValues=(String[])value;
for(DateFormat format:timeFormat)
{
try{
return new java.sql.Time(format.parse(parameterValues[0]).getTime()); }
catch(ParseException e){} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else if(toType.equals(java.util.Date.class))
{
String[]parameterValues=(String[])value;
for(DateFormat format:dateFormat)
{
try{
return format.parse(parameterValues[0]); }
catch(ParseException e){} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
else if(toType.equals(String.class))
{
if(value instanceof java.sql.Date){
return dateFormat[0].format((java.sql.Date)value);
}
else if(value instanceof java.sql.Time)
{
return timeFormat[0].format((java.sql.Time)value);
}
else if(value instanceof java.util.Date)
{
return dateFormat[0].format((java.util.Date)value);
}
}
return super.convertValue(context, value, toType);
} }

2.配置

普通Action中的类型转换:user.birthDay=com.test.converter.DateTimeConverter

基于模型驱动的类型转换:birthDay=com.test.converter.DateTimeConverter

全局类型转换:java.util.Date=com.test.converter.DateTimeConverter

这里还是新增一个User,时间格式是/也是能输出

Struts2之类型转换的更多相关文章

  1. Struts2自定义类型转换,和处理类型转换错误

    Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...

  2. Struts2的类型转换

    Struts2的类型转换 类型转换的作用: HTTP请求都是字符串类型,需要把这些字符串类型转化成相应的数据类型,使得Web应用的控制组件可以使用. 1.內建的类型转换器 Struts2可以完成大多数 ...

  3. 关于Struts2的类型转换详解

    详细出处参考:http://www.jb51.net/article/35465.htm 一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构 ...

  4. Struts2的类型转换机制

    Struts2的类型转换机制 在基于HITP 协胆的Web 应用中,客户端〈浏览器〉和服务器之间传输的都是字符串形式的数据,换句话说,服务器接收到的用户数据只能是字符串或字符数组, 但在服务器端的Ja ...

  5. java之struts2之类型转换

    在使用servlet开发中,表单中提交的数据到servlet后都是字符串类型,需要程序员手动进行类型转换. 但是到struts2后,基本数据类型struts2都可以转换.但是如果是自定义类型,stru ...

  6. (十二)struts2的类型转换

    所有的MVC框架,都属于表现层的解决方案,都需要负责收集用户请求参数,并将请求参数传给应用的控制器组件. 这时问题出现了,所有的请求参数都是字符串类型数据,因此MVC框架必须具备将这些字符串请求参数转 ...

  7. Struts2日期类型转换

    针对日期类java.util.Date进行类型转换,要求客户端使用"yyyy-MM-dd","yyyy/MM/dd"中的任意一种输入,并以"yyyy- ...

  8. Struts2 日期类型转换

    针对日期类java.util.Date进行类型转换,要求客户端使用"yyyy-MM-dd","yyyy/MM/dd"中的任意一种输入,并以"yyyy- ...

  9. Struts2笔记——类型转换

     概述 * 从一个HTML 表单到一个Action 对象, 类型转换是从字符串到非字符串.     >HTTP 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组. 在服 ...

  10. Struts2的类型转换(上)

    传统的类型转换.(略) Struts2中提供了内置的基本的类型转换器,可以实现基本类型的自动转换,包括: Integer, Float, Double, Decimal Date and Dateti ...

随机推荐

  1. 【APP测试(Android)】--用户体验

  2. 常用screen参数

    摘自:https://www.cnblogs.com/webnote/p/5749675.html screen -S yourname -> 新建一个叫yourname的sessionscre ...

  3. 嵌入式FIFO核的调用

    本次设计源码下载地址:http://download.csdn.net/detail/noticeable/9915523 课程目标:学习调用quartus II 软件的FIFO(先进先出)IP核,并 ...

  4. Ubuntu 安装 chrome浏览器

    按下 Ctrl + Alt + t 键盘组合键,启动终端. 输入以下命令: sudo wget http://www.linuxidc.com/files/repo/google-chrome.lis ...

  5. java之vector详细介绍

    1 vector介绍 Vector简介 Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口 ...

  6. 简单的异步函数async/await例子

    function resolveAfter2Seconds(x){ return new Promise(resolve => { setTimeout(() => { resolve(x ...

  7. 简单登录注册实现(Java面向对象复习)

    简单登录注册的实现(面向对象的复习) 需求: 设计用户类,包含用户名和密码两个属性 设计LoginDemo类设计用户登录方法 用户有三次登录机会,如果连续三次登录失败则退出程序 功能实现页面:     ...

  8. Go语言标准库之JSON编解码

    Go语言标准库之JSON编解码 基本的类型 Go语言中的数据类型和JSON的数据类型的关系 bool -> JSON boolean float64 -> JSON numbers str ...

  9. CSS 常用技巧

    概述 相信大家在写css属性的时候,会遇到一些问题,比如说:垂直对齐,垂直居中,背景渐变动画,表格宽度自适应,模糊文本,样式重置,清除浮动,通用媒体查询,自定义选择文本,强制出现滚动条,固定头部和页脚 ...

  10. 一个关于margin-top的问题

    两个 此时内部div的样式为 当我把margin选中 如图所示: 我想要的效果是子div离父div有一个20px的间隙,但显然现在不是我想要的结果, 然后就开始查资料: 这个“问题”……它是CSS2. ...