博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2之类型转换
阅读量:4648 次
发布时间:2019-06-09

本文共 4060 字,大约阅读时间需要 13 分钟。

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
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); }}
View Code

2.配置

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

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

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

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

转载于:https://www.cnblogs.com/5ishare/p/6618814.html

你可能感兴趣的文章
视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
查看>>
第五次作业
查看>>
织梦教程
查看>>
杭电多校 Harvest of Apples 莫队
查看>>
java 第11次作业:你能看懂就说明你理解了——this关键字
查看>>
C/C++心得-结构体
查看>>
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>
Python基础-time and datetime
查看>>
Linux epoll 笔记(高并发事件处理机制)
查看>>
shell脚本练习01
查看>>
WPF图标拾取器
查看>>
通过取父级for循环的i来理解闭包,iife,匿名函数
查看>>
HDU 3374 String Problem
查看>>
数据集
查看>>
[Leetcode] unique paths ii 独特路径
查看>>
HDU 1217 Arbitrage (Floyd + SPFA判环)
查看>>
IntelliJ idea学习资源
查看>>