一、转换自定义类的基本方法
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框架的学习中,`Action`接口与`ActionSupport`类是核心组件,用于处理用户请求并返回相应的结果。本篇笔记将深入探讨这两个关键概念,以及它们在实际开发中的应用。 首先,`Action`接口是Struts2框架中...
### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...
在实际项目中,Struts2可以处理类型转换、文件上传下载、拦截器(Interceptor)防止重复提交等问题。Interceptor是Struts2中的重要特性,它允许在Action执行前后插入额外的处理逻辑,如登录验证、日志记录等。深入...
### Struts2学习笔记知识点概览 #### 一、环境搭建 **1.1 Struts2简介** - **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序...
在本篇“Struts2学习笔记三”中,我们将聚焦于Struts2的类型转换这一核心特性。类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`...
Struts2是一个强大的MVC(Model-View-Controller)框架,它在Java Web开发中广泛使用,提供了丰富的功能和灵活性。下面将详细讲解Struts2的一些核心知识点。 **一.Struts2核心文件:struts.xml配置** Struts2的...
在"Struts2学习笔记四(第4讲.Struts2的类型转换续)"中,我们将会深入探讨Struts2中的类型转换机制,这是一个核心特性,用于处理Action类属性与HTTP请求参数之间的数据类型转换。 在HTTP请求中,数据通常是字符串...
在使用Struts2_2.1.6版本时可能会遇到中文乱码的问题。解决方法包括设置正确的字符编码和在web.xml中配置过滤器以处理输入流的字符编码。 #### 五、Struts模块包含 Struts支持模块化开发,允许将应用划分为多个...
以上内容是Struts2学习笔记的概述,涵盖了Struts2的基础概念、发展历程、使用方法以及核心组件OGNL的介绍。深入学习Struts2将有助于提升Java Web开发能力,更好地理解和构建MVC架构的应用程序。
本课程笔记主要涵盖了Struts2的基础概念、核心功能及其工作流程。 首先,Struts2的处理流程是通过一系列的组件协作完成的,包括Filter Dispatcher(过滤器调度器)、Action、Interceptor(拦截器)和Result。当用户...
### Struts2学习笔记 #### 一、Struts2配置文件详解 在深入理解Struts2框架之前,我们首先需要了解其核心配置文件——`struts.xml`。 **1. struts.xml配置** ```xml <!DOCTYPE struts PUBLIC "-//Apache ...
01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...
本笔记将深入探讨Struts2的核心概念、发展历程、使用方法以及与OGNL(Object-Graph Navigation Language)的结合应用。 **一、Struts2概述** 1.1 为什么要用Struts 在Java Web开发中,Struts2作为MVC框架,能够...