Sturts2学习笔记
二、类型转换
在用户输入过程中,一定会输入各种不同的类型,这就需要我们对数据进行一些必要的类型转换。
1、新建一个input.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>类型转化</title>
</head>
<body>
<h3><font color="red">坐标用逗号分隔开</font></h3>
<s:form action="typeConver">
<s:textfield name="point" label="坐标"></s:textfield>
<s:textfield name="age" label="年龄"></s:textfield>
<s:textfield name="name" label="昵称"></s:textfield>
<s:textfield name="graduation" label="毕业日期"></s:textfield>
<s:submit label="提交"></s:submit>
</s:form>
</body>
</html>
2、先处理坐标这个特殊的类型
先新建一个javabean保存坐标的两个值
package com.song.bean;
public class Point {
//坐标的两个值
private int x;
private int 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;
}
}
当然,我们可以自定义处理方式,这里使用struts2所提供的处理API
3、新建一个java类继承与DefaultTypeConverter类
PointConvert.java
package com.song.convert;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class PointConvert extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
// TODO Auto-generated method stub
return super.convertValue(context, value, toType);
}
}
convertValue()这个方法是用于转化类型的;其中 context这个是上下文,这里暂时没有用,Object value是从客户端传过来的值,Class toType是要转化的类型,既目标类型
4、现在实现convertValue()方法
package com.song.convert;
import java.util.Map;
import ognl.DefaultTypeConverter;
import com.song.bean.Point;
public class PointConvert extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if(Point.class==toType)//从客户端向服务器端提交
{
Point point = new Point();
//value是一个数组类型
String [] str = (String[])value;
//value为什么是数组类型呢?这是因为再表单中可以有相同的name,这样通过name得到的返回值就是数组形式
String [] points = str[0].split(",");
int x = Integer.parseInt(points[0]);
int y = Integer.parseInt(points[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;
}
}
5、写好了类型转化类。可是如何让程序知道改转化类的存在呢?这需要写一个properties文件来告诉程序该转化类的存在与功能。
这个properties文件的写法有一定的要求
(1)、改文件要和与jsp相对应的action类在同一包下
(2)、文件的名为 action类的名+”-conversion.properties”
(3)、文件的内容为
需要转化的属性=转化改属性的类
文件名: PointAction-conversion.properties
文件内容: point=com.song.convert.PointConvert
6、配置struts.xml文件
<action name="typeConver" class="com.song.action.PointAction">
<result name="success">/output.jsp</result>
</action>
7、将内容输出至output.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>类型转化</title>
</head>
<body>
坐标:<s:property value="point"/><br>
年龄:<s:property value="age"/><br>
昵称:<s:property value="name"/><br>
毕业时间:<s:property value="graduation"/>
</body>
</html>
<s:property value=””/>这个标签对应的表单中的get()方法
好!现在运行一下程序看看!
上面是的转化称之为局部类型转化,服务于特定的类型,如果一个程序中有多个同样的类型需要转化,那么就需要配置全局类型转化。
8、全局类型转化只需修改配置文件即可
(1)、文件名固定 xwork-conversion.properties
(2)、目录与web.xml文件再同一目录下
(3)、内容为:需要转化的类型所在包=用于转化的类
com.song.bean.Point=com.song.convert. PointConvert
这样便实现了全局类型转化!
9、再struts2中有一个类继承了DefaultTypeConverter,它使类型转化更加方便
新建一个类PointConvert2使其继承StrutsTypeConverter
package com.song.convert;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
import com.song.bean.Point;
public class PointConvert2 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map arg0, String[] value, Class arg2) {
//从客户端传来的
Point point = new Point();
String[] points = value[0].split(",");
int x = Integer.parseInt(points[0]);
int y = Integer.parseInt(points[1]);
point.setX(x);
point.setY(y);
return point;
}
@Override
public String convertToString(Map arg0, Object arg1) {
//传向客户端的
Point point = (Point)arg1;
int x = point.getX();
int y = point.getY();
StringBuffer sb = new StringBuffer();
sb.append("[[x=").append(x).append(", y =").append(y).append("]");
return sb.toString();
}
}
写到这里,只需要修改一下转化类的配置文件就可以了。