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为基础。

  1. package com.test.converter;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Map;
  5.  
  6. import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
  7. import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
  8.  
  9. public class DateTimeConverter extends DefaultTypeConverter {
  10.  
  11. private DateFormat[] dateFormat={
  12. new SimpleDateFormat("yyyy-MM-dd"),
  13. new SimpleDateFormat("yyyy/MM/dd"),
  14. new SimpleDateFormat("yy-MM-dd")
  15. };
  16. private DateFormat[] timeFormat={
  17. new SimpleDateFormat("HH:mm:ss"),
  18. new SimpleDateFormat("HH:mm"),
  19. };
  20. @Override
  21. public Object convertValue(Map<String, Object> context, Object value, Class toType) {
  22. if(toType.equals(java.sql.Date.class))
  23. {
  24. String[]parameterValues=(String[])value;
  25. for(DateFormat format:dateFormat)
  26. {
  27. try{
  28. return new java.sql.Date(format.parse(parameterValues[0]).getTime());
  29.  
  30. }
  31. catch(ParseException e){} catch (java.text.ParseException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35. }
  36. }
  37. else if(toType.equals(java.sql.Time.class))
  38. {
  39. String[]parameterValues=(String[])value;
  40. for(DateFormat format:timeFormat)
  41. {
  42. try{
  43. return new java.sql.Time(format.parse(parameterValues[0]).getTime());
  44.  
  45. }
  46. catch(ParseException e){} catch (java.text.ParseException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. else if(toType.equals(java.util.Date.class))
  53. {
  54. String[]parameterValues=(String[])value;
  55. for(DateFormat format:dateFormat)
  56. {
  57. try{
  58. return format.parse(parameterValues[0]);
  59.  
  60. }
  61. catch(ParseException e){} catch (java.text.ParseException e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }
  65. }
  66. }
  67. else if(toType.equals(String.class))
  68. {
  69. if(value instanceof java.sql.Date){
  70. return dateFormat[0].format((java.sql.Date)value);
  71. }
  72. else if(value instanceof java.sql.Time)
  73. {
  74. return timeFormat[0].format((java.sql.Time)value);
  75. }
  76. else if(value instanceof java.util.Date)
  77. {
  78. return dateFormat[0].format((java.util.Date)value);
  79. }
  80. }
  81. return super.convertValue(context, value, toType);
  82. }
  83.  
  84. }

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. web集成高德地图

    1.使用高德地图API需到官网添加一个Key,http://lbs.amap.com/dev/key/app 2.页面头引入 <div id="addressMap"> ...

  2. ABP框架系列之三:(Entity Framework Integration-实体框架集成)

    ASP.NET Boilerplate can work with any O/RM framework. It has built-in integration with EntityFramewo ...

  3. python模块:time

    # encoding: utf-8 # module time # from (built-in) # by generator 1.145 """ This modul ...

  4. Windows激活客户端 已停止工作

    win+r 进入运行 slmgr /ipx 新的sn slmgr /ato

  5. 分享Pos函数(比FastPos还要快)

    ): Integer; ): Integer; 主要用途是搜索字符串中第n个Substr. 经过测试,这2个函数的速度比直接用Pos+Copy快好几倍(如果字符串够长,可能10几倍) 比Pos+Del ...

  6. Delphi控件cxGrid 如何动态创建列?

    方法一: var i: Integer; Column: TcxGridDBColumn; cxView: TcxGridDBTableView; begin cxView := Self.Level ...

  7. 9.2 翻译系列:数据注解特性之---Column【EF 6 Code First系列】

    原文链接:http://www.entityframeworktutorial.net/code-first/column-dataannotations-attribute-in-code-firs ...

  8. Spring集合注入

    1.集合注入 上一篇博客讲了spring得属性注入,通过value属性来配置基本数据类型,通过<property>标签的 ref 属性来配置对象的引用.如果想注入多个数据,那我们就要用到集 ...

  9. Python selenium + Firefox启动浏览器

    Python selenium 的运用 from selenium import webdriver # from selenium.webdriver.firefox.firefox_profile ...

  10. iOS调用QQ发起临时会话

    iOS调用QQ发起临时会话 iOS调用qq前先判断是否安装qq, 之后通过OpenURL打开对用的qq NSURL *url = [NSURL URLWithString:@"mqq://& ...