`
yueyan945
  • 浏览: 6214 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts2学习笔记2_转换器的使用

阅读更多
一、转换自定义类的基本方法

1.1 新建2个自定义的类
package com.test.bean;
/**
* 三维点(x,y,z)
*/
public class Point {	
	private Integer x;
	private Integer y;
	private Integer z;	
	//  setter和getter
}

package com.test.bean;
/**
* 矩形(height,width)
*/
public class Rectangle {
	private Integer height;
	private Integer width;
	//  setter和getter
}


1.2 新建Action,添加属性
public class TestAction extends ActionSupport {

	private Integer intNumber;    //整数
	private Float floatNumber;	//小数
	private Date date;		//时间
	private Point point;		//自定义的点
	private Rectangle rectangle;	//自定义的矩形
	// setter和getter
	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
}

1.3 输入输出页面(JSP)
input.jsp:
<h3>转换器的使用</h3>
<s:form action="test" method="post">
   	<s:textfield name="intNumber" label="整数" />
   	<s:textfield name="floatNumber" label="浮点数" />
   	<s:textfield name="date" label="时间" />
   	<s:textfield name="point" label="三维坐标(x,y,z)" />
   	<s:textfield name="rectangle" label="矩形(h,w)" />
   	<s:submit value="提交" />
</s:form>

output.jsp:
<h3>转换后的结果</h3>
整数:<s:property value="intNumber" /><br>
浮点数:<s:property value="floatNumber" /><br>
时间:<s:property value="date" /><br>
三维点:<s:property value="point" /><br>
矩形:<s:property value="rectangle" />

省略标签的导入

1.4 web.xml中配置filter,struts.xml配置action 省略........

2.1 新建转换器,继承ognl.DefaultTypeConverter
package com.test.converter;
public class PointConverter extends DefaultTypeConverter {

	@Override
	public Object convertValue(Map context, Object value, Class toType) {
		if(Point.class==toType){   //目标类型为Point类型
			Point point = new Point();
			String[] strs = (String[])value;   //页面上传过来的是String数字
			String[] params = strs[0].split(",");  //假设规定以,分隔坐标
			Integer x = Integer.valueOf(params[0]);
			Integer y = Integer.valueOf(params[1]);
			Integer z = Integer.valueOf(params[2]);
			point.setX(x);
			point.setY(y);
			point.setZ(z);
			return point;
		}	
		if(String.class==toType){  	//目标类型为String类型
			Point point = (Point)value;
			//将对象以字符串返回
			StringBuilder sb = new StringBuilder()	
				.append("[x=").append(point.getX())
				.append(",y=").append(point.getY())
				.append(",z=").append(point.getZ()).append("]");
			return sb.toString();			
		}
		return null;
	}
}
package com.test.converter;
public class RectangleConverter extends DefaultTypeConverter {

	@Override
	public Object convertValue(Map context, Object value, Class toType) {
		if(Rectangle.class==toType){    //目标类型为Rectangle类型
			Rectangle rectangle = new Rectangle();
			String[] strs = (String[])value;	//页面上传过来的是String数组
			String[] params = strs[0].split(",");	//假设规定以,分隔高和宽
			Integer height = Integer.valueOf(params[0]);
			Integer width = Integer.valueOf(params[1]);
			rectangle.setHeight(height);
			rectangle.setWidth(width);
			return rectangle;
		}	
		if(String.class==toType){
			Rectangle rectangle = (Rectangle)value;
			//将对象以字符串返回
			StringBuilder sb = new StringBuilder()
				.append("[heigh=").append(rectangle.getHeight())
				.append(",width=").append(rectangle.getWidth()).append("]");
			return sb.toString();			
		}
		return null;
	}	
}

2.2 struts2如何调用我们的转换器?
在Action的同目录下建立对应的XxxxAction-conversion.properties  XxxxAction的名字对应Action类的名字,比如这里为 TestAction-conversion.properties:

#对属性进行转换注册(其实是setter和getter方法)
point=com.test.converter.PointConverter
rectangle=com.test.converter.RectangleConverter

2.3 测试



eg:如果Action中有多个point属性和rectangle属性,则在properties中
添加:
point2=com.test.converter.PointConverter
point3=com.test.converter.PointConverter
...

问题:如果有很多Action,这些Action中又有很多需要进行转换的类,岂不是要写很多properties?


二、使用全局的properties
在src目录下建立 xwork-conversion.properties :
com.test.bean.Point=com.test.converter.PointConverter
com.test.bean.Rectangle=com.test.converter.RectangleConverter

注释掉TestAction-conversion.properties (使用 #),运行效果一样

三、转换器继承StrutsTypeConverter

3.1 放弃convertValue方法

3.2 实现方法:
public Object convertFromString(Map map, String[] strs, Class toType) {
	// 直接把String数组 转换成 toType类型
}
public String convertToString(Map map, Object obj) {
	// 直接把 obj 转换成 String类型
}


四、集合类型的转换
4.1 Action中:
package com.test.action;
public class TestAction extends ActionSupport {
	private Integer intNumber; //整数
	private Float floatNumber;	//小数
	private Date date;		//时间
	private List<Point> point;	//自定义的点集合
	private Rectangle rectangle;	//自定义的矩形
	//  setter和getter

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
}


4.2 转换器中:
package com.test.converter;
public class PointConverter extends StrutsTypeConverter {	

	public Object convertFromString(Map map, String[] strs, Class toType) {
		Point point = null;
		List<Point> list = new ArrayList<Point>();
		for (int i = 0; i < strs.length; i++) {
			point = new Point();
			String[] params = strs[i].split(",");
			Integer x = Integer.valueOf(params[0]);
			Integer y = Integer.valueOf(params[1]);
			Integer z = Integer.valueOf(params[2]);
			point.setX(x);
			point.setY(y);
			point.setZ(z);
			list.add(point);
		}
		return list;
	}
	
	public String convertToString(Map map, Object obj) {
		List<Point> list = (List<Point>)obj;
		Point point = null;
		StringBuilder sb = new StringBuilder().append("[");
		for (int i = 0; i < list.size(); i++) {
			point = list.get(i);
			sb.append(i+1).append(" x=").append(point.getX())
			.append(",y=").append(point.getY())
			.append(",z=").append(point.getZ());
		}
		sb.append(" ]").toString();
		//System.out.println(sb);
		return sb.toString();	
	}	
}


4.3 input.jsp页面:
<s:textfield name="point" label="三维坐标(x,y,z)" />
<s:textfield name="point" label="三维坐标(x,y,z)" />
<s:textfield name="point" label="三维坐标(x,y,z)" />


4.4 使用局部的properties,TestAction-conversion.properties

point=com.test.converter.PointConverter




五、不使用转换器进行转换

5.1 使用对象类型的属性:
	 private Point point;


5.2 修改input.jsp页面,output页面不变
<s:textfield name="point.x" label="x" />
<s:textfield name="point.y" label="y" />
<s:textfield name="point.z" label="z" />

5.3 在Point类中重写toString方法
	public String toString(){
		StringBuilder sb = new StringBuilder()
		.append("[x=").append(x).append(",y=").append(y).append(",z=").append(z).append("]");
		return sb.toString();
	}


eg: struts2会通过反射去创建Point类(必须有空的构造方法),然后通过反射调用setter方法赋值;输出页面上会调用实例的toString方法
分享到:
评论

相关推荐

    【张冰Struts2学习笔记】0201_Action接口与ActionSupport类

    在Struts2框架的学习中,`Action`接口与`ActionSupport`类是核心组件,用于处理用户请求并返回相应的结果。本篇笔记将深入探讨这两个关键概念,以及它们在实际开发中的应用。 首先,`Action`接口是Struts2框架中...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    struts2学习笔记(完美总结)——转自OPEN经验库

    在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...

    struts2学习笔记.doc

    ### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...

    struts2学习笔记

    Struts2是一个强大的MVC(Model-View-Controller)框架,它在Java Web开发中广泛使用,提供了丰富的功能和灵活性。下面将详细讲解Struts2的一些核心知识点。 **一.Struts2核心文件:struts.xml配置** Struts2的...

    struts2学习笔记四(第4讲.Struts2的类型转换续)

    在"Struts2学习笔记四(第4讲.Struts2的类型转换续)"中,我们将会深入探讨Struts2中的类型转换机制,这是一个核心特性,用于处理Action类属性与HTTP请求参数之间的数据类型转换。 在HTTP请求中,数据通常是字符串...

    Struts2学习笔记2012

    在使用Struts2_2.1.6版本时可能会遇到中文乱码的问题。解决方法包括设置正确的字符编码和在web.xml中配置过滤器以处理输入流的字符编码。 #### 五、Struts模块包含 Struts支持模块化开发,允许将应用划分为多个...

    Struts2学习笔记

    以上内容是Struts2学习笔记的概述,涵盖了Struts2的基础概念、发展历程、使用方法以及核心组件OGNL的介绍。深入学习Struts2将有助于提升Java Web开发能力,更好地理解和构建MVC架构的应用程序。

    struts2课程笔记

    本课程笔记主要涵盖了Struts2的基础概念、核心功能及其工作流程。 首先,Struts2的处理流程是通过一系列的组件协作完成的,包括Filter Dispatcher(过滤器调度器)、Action、Interceptor(拦截器)和Result。当用户...

    struts2学习笔记!

    ### Struts2学习笔记 #### 一、Struts2配置文件详解 在深入理解Struts2框架之前,我们首先需要了解其核心配置文件——`struts.xml`。 **1. struts.xml配置** ```xml &lt;!DOCTYPE struts PUBLIC "-//Apache ...

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    Java相关课程系列笔记之十三Struts2学习笔记

    本笔记将深入探讨Struts2的核心概念、发展历程、使用方法以及与OGNL(Object-Graph Navigation Language)的结合应用。 **一、Struts2概述** 1.1 为什么要用Struts 在Java Web开发中,Struts2作为MVC框架,能够...

Global site tag (gtag.js) - Google Analytics