Struts2基础学习(四)—类型转换器

一、自定义转换器

1.概述

     Struts2提供了常规类型转换器,可以用于常用数据类型的转换,但如果目标类型是一个特殊类型,则需要自定义转换器。Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定义类型转换器必须实现
ongl.TypeConverter。

    

 

2.编写类型转换器

(1)实现TypeConverter接口,实现一个方法

    public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);

(2)继承DefaultTypeConverter类,重写一个方法

	public Object convertValue(Map<String,Object> context,Object value,Class toType)

(3)继承StrutsTypeConverter类重写两个方法

public Object convertFromString(Map context,String[] values,Class toClass)
public String convertToString(Map context,Object o)

 

     java.util.Date类型的属性可以接收格式为2009-07-20的请求参数值。但如果我们需要接收格式为20091221的请求参数,我们必须定义类型转换器,否则struts2无法自动完成类型转换。

第一种:继承DefalutTypeConverter类

public class DateConvert extends DefaultTypeConverter{

	@Override
	public Object convertValue(Map<String,Object> context,Object value,Class toType){

		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

		try{
			//String--->Date
			if(toType == Date.class){
				String[] params = (String[])value;
				return sdf.parseObject(params[0]);
			}
			else if(toType == String.class){ //Date--->String
				Date date = (Date)value;
				return sdf.format(date);
			}
		}catch(ParseException e){
			e.printStackTrace();
		}

		return super.convertValue(context,value,toType);
	}
}

第二种继承StrutsTypeConverter类

public class DateConvert2 extends StrutsTypeConverter{

	private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

	//String--->Date
	@Override
	public Object convertFromString(Map context,String[] values,Class toClass){

		if(toClass == Date.class){
			try{
				String date = values[0];
				return sdf.parse(date);
			}catch(ParseException e){
				e.printStackTrace();
			}
		}
		return null;
	}

	//Date--->String
	@Override
	public String convertToString(Map context,Object o){

		if(o instanceof Date){
			return sdf.format(o);
		}

		return null;
	}
}

 

3.注册类型转换器

(1)局部注册

     针对的是表单中某个字段生效。分为属性驱动方式和模型驱动方式两种。

      属性驱动的方式

     注意: 在Action所在的包下创建一个文件,文件的格式是:Action类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。birthday=com.kiwi.convert.DateConvert2

      模型驱动的方式

     注意: 在实体类所在的包下创建一个文件,文件的格式是:实体类名-conversion.properties文件,该文件中配置要转换数据的字段和对应的转换器全路径。

 

(2)全局注册

     针对整个项目所有的日期类型都会生效。

     在src的目录下,创建一个xwork-conversion.properties      

     例如: java.util.Date=cn.itcast.demo3.MyDateConverter

 

4.类型转换的错误处理

(1)当发生类型转换错误的时候,根据报错的信息提示,没有提供input类型的结果视图。那可以在<action>标签中配置input结果视图。

(2)如果Struts2的类型转换器执行类型转换时出现错误,该拦截器将负责将对应错误封装成表单域错误(FieldError),并将这些错误信息放入ActionContext中。

(3)使用类型转换中的错误处理用户定义Action必须继承ActionSupport。

(4)在自定义类型转换器中,异常必须抛出不能捕获,conversionError会处理该异常,然后转入名为input的逻辑视图。

(5)在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息

         invalid.fieldvalue.属性名= 错误信息

 

index.jsp

<s:form action="personAction">

        <s:textfield label="用户名" name="username"></s:textfield>
        <s:textfield label="密 码" name="password"></s:textfield>
        <s:textfield label="年 龄"  name="age"></s:textfield>
        <s:textfield label="生 日" name="birthday"></s:textfield>

        <s:submit value="提交"></s:submit>
    </s:form>

struts.xml

		<action name="personAction"  class="com.kiwi.action.PersonAction">
			<result name="success">/success.jsp</result>
			<result name="input">/index.jsp</result>
		</action>

结果:

     

时间: 2024-08-26 05:18:15

Struts2基础学习(四)—类型转换器的相关文章

Struts2基础学习总结(二)

Struts2基础学习总结(二)---struts.xml参数 1.常量 使用<constant name="" value=""></constant>元素进行描述 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Strut

Struts2基础学习总结

Struts2基础学习总结(一)---入门 Struts 2: Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互.Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架.其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大.Struts2以WebWork为核心,采用拦

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

前言:对于java的基本数据类型及一些系统类(如Date类.集合类),Struts2提供了内置类型转换功能,但是也有一定的限制.所以就演示出自定义类型转换器 一.应用于局部类型转换器 eg.用户登录出生日期只能用2016-06-09的方式才能转化成功,那么2016/06/09就不能转换成功所以就引出来我们的自定义类型转换器 1首先我们将做准备工作 1)login.jsp注册页面 <%@ page language="java" import="java.util.*&q

自定义struts2中action参数类型转换器

DateAction.java中代码如下: package com.itheima.action; import java.util.Date; public class DateAction { private Date time; public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public String execute() { return "succes

Struts2基础学习(三)&mdash;Result和模型驱动

一.result      Action处理完用户请求后,将返回一个普通的字符串,整个普通字符串就是一个逻辑视图名,Struts2根据逻辑视图名,决定响应哪个结果,处理结果使用<result>元素配置.      局部结果: 将<result>作为<action>子元素配置.      全局结果: 将<result>作为<global-results>元素的子元素配置.      配置<result>元素要指定两个属性.      n

Spring基础学习(四)&mdash;AOP

一.AOP基础 1.基本需求      需求: 日志功能,在程序执行期间记录发生的活动. ArithmeticCalculate.java public interface ArithmeticCalculate{ public int add(int a,int b); public int sub(int a,int b); public int mul(int a,int b); public int div(int a,int b); } ArithmeticCalculateImpl.

Hibernate基础学习(四)&mdash;对象-关系映射(上)

一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中的记录的对应关系,对象的OID和数据库表的主键对应,为了保证OID的唯一性和不可变性,应该让Hibernate,而不是应用程序来为OID赋值.     Hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段.代理主键通常为整型,因为整型比字符串要节省更多数据库空间.     在

Struts2基础学习(六)&mdash;文件的上传和下载

一.文件的上传 1.单个文件上传      Struts2使用拦截器完成了文件的上传,而且底层使用的也是FileUpload开源组件. 客户端注意事项: (1)method="post" (2)enctype="multipart/form-data" (3)<intput type="file" name="photo">   在Action编写文件上传时,需要定义三个属性. (1)文件类型File,属性名与表单

CSS基础学习四:元素选择器

在上一篇的博客中我们已经熟悉CSS语法,对于CSS代码格式也有了一些认识.下面我就来说一下CSS代码式: 选择器名称 { 属性名:属性值:属性名:属性值:......} 属性与属性之间用分号隔开:属性与属性值直接使用冒号连接:如果一个属性有多个属性值的话,那么多个属性值用空格隔开. 上述提到了我这一篇博客所要说的主题,就是选择器.选择器就是指定CSS语法要作用的标签,那个标签的名称 就是选择器. 基本的选择器可分为三种: a)html标签名选择器:使用的是html的标签名,又叫元素选择器. b)