您的位置:首页 > 编程语言 > Java开发

二、Struts 2的类型转换---1.Struts 2中实现自定义的类型转换

2009-01-11 21:06 337 查看
Struts2的类型转换
1.传统的类型转换过程。
传统的类型转换过程直接通过servlet取得用户的输入参数,然后翻到Bean中,然后可以直接通过servlet生成输出。大致实现过程如下。
publicclassRegistextendsHttpServlet
{
publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException
{
request.setCharacterEncoding("GBK");
Stringname=request.getParameter("username");
Stringpass=request.getParameter("pass");
StringstrAge=request.getParameter("age");
StringstrBirth=request.getParameter("birth");

intage=Integer.parseInt(strAge);
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-DD");
Datebirth=null;
try
{
birth=sdf.parse(strBirth);
}
catch(Exceptione)
{
e.printStackTrace();
}
UserBeanuser=newUserBean(name,pass,age,birth);

response.setContentType("text/html;charset=GBK");
PrintWriterout=response.getWriter();
out.println("<html><head><title>");
out.println("类型转换页面");
out.println("</title></head><body>");
out.println("<h1>类型转换页面</h1>");
out.println(user.getName()+"<br>");
out.println(user.getPass()+"<br>");
out.println(user.getAge()+"<br>");
out.println(user.getBirth()+"<br>");
out.println("</body></html>");
}

publicvoiddestroy()
{
super.destroy();
}
}

正如上面代码,我们先从HttpServletRequest中取出用户输入的参数,然后做一些简单的类型转换后用这些参数去初始化UserBean,UserBean是一个带默认构造函数的POJO。然后是生成输出。显然这样的过程比较繁琐。而且这些步骤都是很程式化的。接下来,我们看以下Struts2的类型转换器。

2.Struts2中基于OGNL的类型转换器
Struts2的类型转换器实际上是基于OGNL实现的。我们先看一下OGNL中提供的TypeConverter接口。
该接口定义如下:
publicinterfaceTypeConverter{
publicObjectconvertValue(Mapcontext,Objecttarget,Membermember,StringpropertyName,ObjecttoType);
}
该接口还有一个实现类:DefaultTypeConverter,我们可以通过继承该类来实现自己的类型转换器。
要继承DefaultTypeConverter类需要重写convertValue方法。
以下是一个示例:

publicclassUserConverterextendsDefaultTypeConverter
{
publicObjectconvertValue(Mapcontext,Objectvalue,ClasstoType)
{
if(toType==User.class)
{
String[]params=(String[])value;
Useruser=newUser();
String[]userValues=params[0].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
returnuser;

}
elseif(toType==String.class)
{
Useruser=(User)value;
return"<"+user.getName()+","+user.getPass()+">";
}
returnnull;
}
}
我们看到上面的UserConverter继承自DefaultTypeConverter并重写了convertValue方法。在convertValue方法中先判断toType是一个User类还是一个String。如果是User,意思就是说要转换得目标类型是User,反之则转换成String。如此,实现User和String之间的相互转换。
上面的实现逻辑并不复杂。那么如何让系统自动去完成这个转换逻辑呢。答案时通过约定的配置文件,把这个转换类和User类联系起来。
根据作用范围的不同分为局部类型转换器和全局类型转换器两种。
⑴局部类型转换器
局部类型转换器的转换逻辑只作用于单个Action的某些属性类。
这个文件的命名规则如下:
ActionName-conversion.properties:ActionName是需要转换器生成的Action的类名,后面的-conversion.properties为固定部分。
这个文件的配置方式也是key-value对。形式如下:
propertyName=类型转换器类

比如说我们有个LoginAction的Action类,此类中有一个User类的对象user。我们的输入参数是一个以“,”分割的包含User类各属性的String,需要通过上面的UserConverter把输入参数转换成我们需要的User类对象。
那么我们建立一个名为LoginAction-conversion.properties的文件,此文件内容如下。
user=abc.UserConverter
此文件要和LoginAction.class放在同一目录下,既WEB-INF/classes/abc路径下。
如果LoginAction里还有一个User类的对象customer,那么我们再加一行配置语句:
customer=abc.UserConverter
可见局部类型转换器设置的一个Action中每一个对象对应的转换器,如果一个类有多对象则要没个对象都设置一次。显然很麻烦。如果我们想设置User类和UserConverter直接对应起来那么就可以使用全局类型转换器
⑵全局类型转换器
注册一个全局类型转换器要提供一个名为xwork-conversion.properties文件,该文件的内容为”复合类型=对应类型转换器”。仍然是上面的例子。
建立一个xwork-conversion.properties文件,放在WEB-INF/classes目录下。配置内容如下。
lee.User=lee.UserConverter
该全局类型转换器将会对所有User类型属性起作用。

3.通过StrutsTypeConverter抽象类实现类型转换器
StrutsTypeConverter是DefaultTypeConverter的子类。该类中已经重写了convertValue()方法。
publicabstractclassStrutsTypeConverterextendsDefaultTypeConverter{
publicObjectconvertValue(Mapcontext,Objecto,ClasstoClass){
if(toClass.equals(String.class)){
returnconvertToString(context,o);
}elseif(oinstanceofString[]){
returnconvertFromString(context,(String[])o,toClass);
}elseif(oinstanceofString){
returnconvertFromString(context,newString[]{(String)o},toClass);
}else{
returnperformFallbackConversion(context,o,toClass);
}
}
protectedObjectperformFallbackConversion(Mapcontext,Objecto,ClasstoClass){
returnsuper.convertValue(context,o,toClass);
}
publicabstractObjectconvertFromString(Mapcontext,String[]values,ClasstoClass);
publicabstractStringconvertToString(Mapcontext,Objecto);
}


还是那前面的例子来说,我们要实现UserConverter只需要重写convertFromString()和convertToString()两个方法就可以了。如下:
publicclassUserConverterextendsStrutsTypeConverter{

publicObjectconvertFromString(Mapcontext,String[]values,ClasstoClass){
Useruser=newUser();
String[]userValues=values[0].split(",");
user.setName(userValues[0]);
user.setPass(userValues[1]);
returnuser;
}

@Override
publicStringconvertToString(Mapcontext,Objecto){
Useruser=(User)o;
return"<"+user.getName()+","+user.getPass()+">";
}
}
上面的代码应该很容易理解,所以不多解释了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: