类型转换器
1、引入
在Struts2中,请求参数类型不仅可以是String,还可以是其它类型。
如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,
则birthday接收到的不是字符串“1949-10-1”,而是日期类型。
但,需注意的是,对于基本数据类型,需将其定义为包装类型。
实例:请求参数值的类型-- typeconverter
Step1:编写index.jsp与show.jsp
Step2:编写Birthday_Action
Step3:编写web.xml与struts.xml

新建web项目工程源码文档目录如下:

Birthday_Action.java源码如下:

package actions;

import java.util.Date;

public class Birthday_Action {
private Date birthday; public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String execute(){
System.out.println("--------birthday------"+birthday);
return "success";
}
}

index.jsp源码如下:

<%@ page pageEncoding="utf-8"%>

<html>
<head> <title>login.jsp</title> </head> <body>
<form action="birthday.action"> 中华人名共和国的建国日期是:
<input type="text" name="birthday"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

show.jsp源码如下:

<%@ page pageEncoding="utf-8" isELIgnored="false"%>

<html>
<head> <title>show page</title> </head> <body>
中国人民共和国的建国日期是:${birthday} </body>
</html>

web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="one" extends="struts-default"> <action name="birthday" class="actions.Birthday_Action">
<result>/show.jsp</result>
</action> </package>
</struts>

部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/



当在表单中填入1949-10-1时,提交,便可看到Sat Oct 01 00:00:00 CST 1949的显示结果。
说明,Struts2将1949-10-1作为Date类型接收了。
若在表单中填入的是19491001时,发现也可看到相应的结果,但,控制台报错:
java.lang.NoSuchMethodException: actions.BirthdayAction.setBirthday([Ljava.lang.String;)
错误信息指,没有发现形参为String类型的setBirthday方法。即,将19491001当作了String,而非Date。
输入地址:
http://127.0.0.1:8080/typeconverter/



 那么,如何能够让Struts2将19491001当作Date类型?

更一般化地讲,如何将某种非基本类型的请求参数值,让Struts2直接当作该非基本类型,而非当作String类型?
此时就需要使用类型转换器。
类型转换器
自定义类型转换器类,是继承自com.opensymphony.
xwork2.conversion.impl.DefaultTypeConverter类的。在使用时,一般需要覆盖其父类的方法
public Object convertValue(
Map<String, Object> context, //OGNL表达式上下文
Object value, //待转换的值
Class toType //要转换为的类型
)

 注意:定义convertValue方法时需要注意,其转换一般是定义为双向的。

实例步骤:
在上例中定义类型转换器类:
                          typeconverters.Date_String_Converter
          需要注意第二个参数value,若转换方向为从请求到action,则value为字符串数组。因为请求中是允许携带多个同名参数的,而这时的这个同名参数,其实就是数组。
Struts2为了兼顾到这种多个同名参数的情况,就将从请求到action方向的转换的value指定为了String[],而非String。
在定义好类型转换器后,需要注册该转换器,用于通知Struts2框架在遇到指定类型变量时,需调用类型转换器。

具体解决方法:

在原有代码基础上新建继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类的String_Date_Converter.java。

String_Date_Converter.java完成源码如下:

package typeconverters;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; public class String_Date_Converter extends DefaultTypeConverter { @Override
public Object convertValue(Map<String, Object> context, Object value,Class toType) {
//MM代表两位数的月,不可以小写,小写mm就成了两位数的分
SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");
try {
if(toType==Date.class){
String[] params=(String[]) value;
//将字符串解析为日期类型
return sf.parseObject(params[0]);
}else if(toType==String.class){ //注意这里导入import java.util.Date;
Date date=(Date)value; //将日期类型格式化为指定格式的字符串
return sf.format(date);
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }
根据注册方式的不同及其应用范围的不同,可以将类型转换器分为两类:
1.局部类型转换器
2.全局类型转换器
局部类型转换器
局部类型转换器,仅仅对指定Action的指定属性起作用。
注册方式:
在Action类所在的包下放置名称为如下格式的属性文件:
ActionClassName-conversion.properties文件。
其中ActionClassName是Action类名,-conversion.properties是固定写法。
就本例而言,该注册文件的名称应为BirthdayAction-conversion.properties 。
此文件的内容也遵循一种格式:
                           属性名称=类型转换器的全类名
            对于本例而言,文件中的内容为:
        birthday=typeconverters.Date_String_Converter
注册方式:
在actions包中新建属性文件BirthdayAction-conversion.properties。
全局类型转换器
全局类型转换器,会对所有Action的指定类型的属性生效。
注册方式:
在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。
该文件的内容格式为:待转换的类型=类型转换器的全类名。
 
局部类型转换器
具体方法:
在actions包中新建属性文件BirthdayAction-conversion.properties。
局部类型转换器注册成功!

重新部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/


注意:这时候1949-10-01提交就会错误,要想实现19491001和1949-10-01都可用,只需多定义几个转换器即可。

 全局类型转换器:

注册方式:
在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。
该文件的内容格式为:待转换的类型=类型转换器的全类名。
 


重新部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/

8.Struts2类型转换器的更多相关文章

  1. struts2类型转换器、 类型转换错误 以及INPUT view

    1.1.1    Struts2中的类型转换器 Struts2内置了常见数据类型多种转换器 boolean 和 Boolean char和 Character int 和 Integer long 和 ...

  2. Struts2类型转换器

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

  3. Struts2基础学习(四)—类型转换器和数据校验

    一.自定义类型转换器 1.概述      Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器.Struts2 类型转换器实际上都是基于OG ...

  4. 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】

    一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...

  5. Struts2:类型转换器

    常规的String,int能自动转换,但是,有些类型不是这么简单,比如输入字符串,但需要Date.自定义类型,因此需要自定义类型转换类型转换器分全局和局部按惯例,局部的优先级高于全局 需求: 1.输入 ...

  6. struts2学习笔记之十一:struts2的类型转换器

    Struts2的类型转换器   如何实现Struts2的类型转换器? * 继承StrutsTypeConverter * 覆盖convertFromString和convertToString   注 ...

  7. Struts2框架的自定义类型转换器

    前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出 ...

  8. Struts2之类型转换器

    一.类型转换器的应用场景 类型转换是OGNL的一部分,默认的八种基本类型.String.Date会使用类型转换,但是更复杂的类型转换就需要我们自定义了(虽然这个东西一般根本用不到),OGNL可以应用在 ...

  9. Struts2之自定义类型转换器

    Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...

随机推荐

  1. 不能链接云服务器mysql

    如果报host'' 不允许连接MySQL服务器  1130 错误的话如果你的3306端口打开了,也把user 里的host改为% 还是不行的话,请记得更改 站点域名设置,和你服务器相同,端口一致.

  2. 一鼓作气 博客--第七篇 note7

    面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  3. 【codevs】刷题记录→_→(推荐看!)

    注:本文是我原先在csdn内写的一篇博文,现转到这里,两篇博文尽量同时更新. //#include<iostream->shuati> //define 为什么刷  学长☞hzwer ...

  4. CocoaPods pod install

    加参数可以提升更新的速度 方法1: pod install --verbose --no-repo-update pod update --verbose --no-repo-update 方法2: ...

  5. PostgreSQL 与 MySQL 相比,优势何在?

    一. PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃.断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统 ...

  6. 剑指Offer面试题:15.反转链表

    一.题目:反转链表 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点. 链表结点定义如下,这里使用的是C#描述: public class Node { public in ...

  7. MySQL 提高Insert性能

    插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开 ...

  8. Python yield与实现

    Python yield与实现  yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭 ...

  9. 2013 duilib入门简明教程 -- 响应按钮事件(4)

        上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI;     也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介 ...

  10. WPF入门教程系列十九——ListView示例(一)

    经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能.从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Windo ...