5.1 struts2内建的类型转化器
以下类型的值可以自动进行转化
boolean、char、int、long、float、double、Date
5.2 自定义类型转换器
通过继承DefaultTypeConverter来实现自定义的类型转换器,然后重写此类的convertValue方法
5.3局部类型转换器
关于类型转化器的注册方式,主要有如下三种。
·注册局部类型转换器:局部转换器仅仅对某个action的属性起作用。
·注册全局类型转换器:全局类型转换器对所有的Action的特定类型的属性都会生效。
·使用JDK1.5的注释来注册类型转换器:通过注释方式生成类型转换器
转换器文件名格式:
actionName-conversion.properties:actionName是需要转换器生效的Action的类名,后面的-conversion.properties为固定的
此文件应该与action类.class放在相同位置。
下面编写一个实例用来转换一个Point类型的值(局部类型转换器)
对于个Point类型的对象转换流程是:
当输入时为String类型
从客户端到服务端类型为Point型
从服务端返回客户端类型为String型
实例:
新建一个Struts2的 Web项目
1.导入相应的Struts2的核心Jar包
2.修改web.xml
3.编写JSP页面 input.jsp 用来输入需要类型转换的值
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>Insert title here</title>
</head>
<body>
<s:form action="pointConversion">
<s:textfield name="point" label="point"></s:textfield>
<s:textfield name="name" label="name"></s:textfield>
<s:textfield name="age" label="age"></s:textfield>
<s:submit label="submit"></s:submit>
</s:form>
</body>
</html>
4.编写Point类 com.test.bean.Point
package com.test.bean;
public class Point {
private int x, y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
5.编写Action类:com.test.action.PointAction
package com.test.action;
import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.Point;
public class PointAction extends ActionSupport {
private Point point;
private String name;
private int age;
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String execute() throws Exception {
return SUCCESS;
}
public void setAge(int age) {
this.age = age;
}
}
6.编写Struts.xml
<?xml version="1.0" encoding="GBK"?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<!-- struts是Struts 2配置文件的根元素 -->
<struts>
<package name="Struts2" extends="struts-default">
<action name="pointConversion" class="com.test.action.PointAction">
<result name="success">/out.jsp</result>
</action>
</package>
</struts>
7.编写类型转化处理类 come.test.converter.PointConverter
package com.test.converter;
import java.util.Map;
import com.test.bean.Point;
import ognl.DefaultTypeConverter;
public class PointConverter extends DefaultTypeConverter {
public Object convertValue(Map context, Object value, Class toType) {
if (Point.class == toType) {
Point point = new Point();
String[] str = (String[]) value;
String[] p = str[0].split(",");
int x = Integer.parseInt(p[0]);
int y = Integer.parseInt(p[1]);
point.setX(x);
point.setY(y);
return point;
}
if (String.class == toType) {
Point point = (Point)value;
int x = point.getX();
int y = point.getY();
String result = "x=" + x + "y=" + y;
return result;
}
return null;
}
}
8.编写属性文件 com.test.action.PointAction-conversion.properties
point=com.test.converter.PointConverter
9.编写out.jsp 用于显示类型转化后的值
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
point:<s:property value="point"/><br>
name:<s:property value="name"/><br>
age:<s:property value="age"/><br>
</body>
</html>
此实例的类型转化流程分析:
1.当提交表单时根据action的值去struts.xml寻找值相等的name属性
2.由class属性值对应的com.test.action.PointAction类去处理请求
3.com.test.action.PointAction类中根据表单中提交过来的属性去调用各自的set方法
4.调用set方法之前会先判断这个属性是否有自定义的一个类型转化文件,如果没有直接调用set方法
如果有就进入此文件(com.test.action.PointAction-conversion.properties)
5.找到相应的属性及转化类后进入此类( come.test.converter.PointConverter)
6.判断转化方向根据转化代码进行转化然后返回给PointAction进行转化后的赋值
7.执行excute方法根据得到的字符串进入相应的处理页面通过调用get方法把具体值显示此页面(out.jsp)
8.如果发现有自定义类型文件则会进入自定义类型转化处理类判断返回的值要转化为什么类型
9.转化后返回到get方法中
10.在页面(out.jsp)显示相应的值。