1. 项目树形图如下:
在昨天的基础上,今天学习了局部类型转换,新增加了几个文件,分别是input.jsp; output.jsp; PointAction.java;
Point.java; PointConverter.java; PointAction-converter.properties;

2. 代码部分:
2.1 input.jsp:
</head> <h3><font color="red">使用逗号将point的两个坐标分隔开</font></h3> <body> <s:form action="pointConverter"> <s:textfield name="username" label="username"></s:textfield> <s:textfield name="point" label="point"></s:textfield> <s:textfield name="date" label="birthday"></s:textfield> <s:textfield name="age" label="age"></s:textfield> <s:submit name="submit"></s:submit> </s:form> </body>
2.2 Point.java:
package com.test.bean;
public class Point
{
private int x;
private int y;
}
PS: getter and setter here are omited for save spaces
2.3 PointAction.java:
public class PointAction extends ActionSupport
{
private Point point;
private int age;
private String username;
private Date date;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
为了节省篇幅,上述的各个属性的getter,setter方法就再次省略,但是在真正的项目代码中显然必不可少!
2.4:PointAction-converterProperties
point=com.test.converter.PointConverter
2.5: struts.xml:
</action> <action name="pointConverter" class="com.test.action.PointAction"> <result name="success">/output.jsp</result> </action>
2.6: PointConverter.java:
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[] str= (String[])value;//向下类型转换!!
String[] paramValue = str[0].split(",");
int x=Integer.parseInt(paramValue[0]);
int y=Integer.parseInt(paramValue[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;
}
}
3. 注意事项:
3.1 properties文件的建立:
在建立类型转换的properties文件的时候,首先要明确,是要转换哪一个Action文件中的那一个变量,从而,在建立属性文件时,此文件的名称必须按照《此ACTION类名+‘-conversion.properties’》的格式,并且建立在此Action所在的包下
例如,在上例中,我们是想对PointAction中的Point进行类型转换,所以,我们在PointAction.java所在的包:
com.test.Action包下,建立名字为PointAction-conversion.properties的文件。
3.2 PointConverter代码解释:
首先,此类继承了,DefaultTypeConverter类,并且我们重写了 Public Object convertValue(Map context, Object value, Class toType)函数,
其中函数中的参数toType是用来判断,类型转换的方向。
if(Point.class == toType) 表示,要将要转换成Point类型(也就是将客户端传来的String转成Point)
if(String.class==toType) 表示,转换的目标类型为String(也就是将某Object转换成显示在客户端的String类型)
String[] str= (String[])value;为什么将Value要看做是一个String的数组,而不看成单一的一个String类型变量,是因为,虽然在Input.jsp文件中,point传回来的只是一个String变量,但是,估计到整个开发的环境如果很庞大的话,难免会有多个叫做Point的空间,会在同一个.jsp文件中,也就是会同一时间有多个Point往服务器传值,所以,写成一个String数组来接受,是有一定道理的(这个部分是结合视频老师中的描述,和自己的猜想得到的,不一定正确,如果有高人发现错误,或者有更精确的见解,欢迎拍砖,指点!)
3.3 整个运作的流程:
1. 首先,用户在客户端的界面上输入 按格式要求的数据。如图:
2. A. 在input.jsp文件中,找到Action=“pointConverter”
B. 然后结合struts.xml文件中的“
<action name="pointConverter" class="com.test.action.PointAction">”进入PointAction.java文件。
C. 通过结合input.jsp中的name属性后面的字符串与PointAction类中的每一个set方法的方法名对应的机制,将页面传来的字符串值,setter给对应的变量。但是因为,客户端传来的都是String类型的,严格意义上讲,只有在setUsername(String user)的时候不用类型转换,不过,struts已经包含一些非常基础的默认的方法,来进行一些基本的stirng<--->int; String<--->date等等之间的转换,所以在这里我们需要手动添加的类型转换只有private point;
例如,当流程刚转入到PointAction的时候:
struts帮助我们,将input.jsp中的<s:textfield name="username" label="username">和PointAction.java中代码public void setPoint(Point point)的两处红色标记,从而进行匹配。然后,同时回去查找com.test.Action的包中,是否存在有PointAction开头的conversion.properties文件。
找到后,进入此文件,查找是哪个属性需要类型转换,根据代码:
point=com.test.converter.PointConverter一看,发现是point变量,从而进入=号右边的文件,继续执行,类型转换。将转换好的格式存入Point point对象中。
等到,Action执行完execute函数,跳转到output.jsp时,又通过上述介绍的比对方是,将.jsp文件中的name属性和getter方法getXXX的XXX进行比较,将服务器的值传回给jsp,当然在执行getter的时候,同样会查询是否有类型转换。方法,以此类推。
4. 最后显示结果 如图: