(温故而知新)之Struts2(类型转化)分析

虾米哥 阅读:161 2021-03-31 22:11:57 评论:0

一、Struts2 类型转换介绍

 

类型转换:解析HTTP请求参数,将Http请求参数赋值给Action的属性;比如:

<s:form action="valid" >  
 <s:textfield label="用户名" name="name"></s:textfield>   
<s:password label="密码" name="password"></s:password>   
<s:textfield label="年龄" name="age"></s:textfield>    
<s:submit value="提交"></s:submit> 
</s:form>
此处将名为name、password、age的值赋值给Action的属性,类型转换是指这个赋值过程中可能出现的类型不一致问题而做出的转换,因为HTTP参数都是字符串类型的;

因此从String类型的age参数传给int类型的age属性时,就需要类型转换,当然这些struts2框架已经做完了,开发人员不需要自行处理;

Struts2已经内建了对于String和基本类型的类型转换,比如String<-->int 、String<-->boolean等;

Action属性一定要有getter和setter方法! 


Struts2提供了强大的类型转换支持,不仅提供了内置的类型转换器,还可以自定义类型转换器,以满足自定义需求;

Struts2类型转换还支持OGNL表达式,只需要在表单控件的name属性使用ognl表达式即可,比如表单控件的name属性为user.name,则此控件的数据将进入赋值给Action的user属性中的name属性;(重点)



二、自定义类型转换器


1.继承DefaultTypeConverter


 
如果我们自定义一个类型转换器,第一种方法是继承DefaultTypeConverter,并重写  public Object convertValue(ActionContext context,Object value,Class toType);
这个函数的功能是 完成双向转换,即从 String数组 转到Action属性及Action属性转到String;需要注意的是从 String数组转到Action属性 ,而不是String转到Action属性; 如果只有一个字符串,则取params[0] 即可;

因此一般此函数的模板代码如下:
public Object convertValue(Map<String, Object> context, Object value, 
			Class toType) { 
		if(toType==String.class){ 
			...... 
			return String; 
		} 
		else if(toType==Action属性.class){ 
			String params[] = (String[])value;//必须是字符串数组 
			....... 
			return Action属性; 
		} 
		return null; 
	}
完成自定义类型转换器编写后,如果需要使用此转换器,就需要配置,通常有两种配置方法:
1.局部类型转换文件中配置,仅对特定的Action的特定属性有效,比如在Action1中有aa属性,则仅对Action1的aa属性有效;
2.全局类型转换文件中配置,对某个类型都有效;比如对Person注册了类型转换器,则对任何Person和String的转换都有效;


全局类型转换文件命名为: xwork-conversion.properties,通常放在WEB-INF\classes下;
文件内容如:attributeName=ConvertClass ,比如aa=org.convert.Converter1
attributeName表示属性名称, convertClass表示转换器的实现类;
局部类型转换文件命名为:ActionName-conversion.properties,放在特定Action的目录下;
文件内容如: typeName=ConvertClass,比如 org.person.Person = org.convert.Converter2
 
注意:typeName表示转换 类型,convertClass表示转换器的实现类;

 

2.继承StrutsTypeConverter


StrutsTypeConverter是DefaultTypeConverter的子类,DefaultTypeConverter的类型转换器是在一个函数中进行双向转换,而继承StrutsTypeConverter的类型转换器则是将两个方向分别用两个函数实现:
	@Override 
	public Object convertFromString(Map context, String[] values, Class toClass) { 
 
	} 
 
	@Override 
	public String convertToString(Map context, Object o) { 
 
	} 

代码示例:UserConverter.java

package com.slbbs.strutsconverter; 
 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Map; 
import java.text.ParseException; 
import org.apache.struts2.util.StrutsTypeConverter; 
 
import com.slbbs.domain.User; 
 
public class UserConverter extends StrutsTypeConverter { 
 
	@Override 
	public Object convertFromString(Map context, String[] value, Class toClass) { 
		// TODO Auto-generated method stub 
		String params[] = (String[])value;   
	    String[]values = params[0].split("\\,");   
	    User user = new User(); 
	    user.setUsername(values[0]); 
	    user.setPassword(values[1]); 
	    user.setSex(Integer.parseInt(values[2])); 
	    user.setBirthday(StrToDate(values[3])); 
	    user.setDepartmentId(Long.parseLong(values[4])); 
	    user.setPositionId(Long.parseLong(values[5])); 
	    user.setOfficePhone(values[6]); 
	    user.setMobilePhone(values[7]); 
	    user.setHomePhone(values[8]); 
	    user.setEmail(values[9]); 
	    user.setUpdateTime(StrToDate(values[10]));	     
		return user; 
	} 
 
	@Override 
	public String convertToString(Map context, Object o) { 
		// TODO Auto-generated method stub 
		User user = (User)o;   
		return user.getUsername()+","+user.getPassword()+","+user.getSex()+","+user.getBirthday()+","+user.getDepartmentId()+","+user.getPositionId()+","+user.getOfficePhone()+","+user.getMobilePhone()+","+user.getHomePhone()+","+user.getEmail()+","+user.getUpdateTime(); 
	} 
	 
	/** 
	* 瀛楃涓茶浆鎹㈡垚鏃ユ湡 
	* @param str 
	* @return date 
	*/ 
	public static Date StrToDate(String str) { 
	   
	   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
	   Date date = null; 
	   try { 
	    date = format.parse(str); 
	   } catch (ParseException e) { 
	    e.printStackTrace(); 
	   } 
	   return date; 
	} 
 
} 

xwork-conversion.properties
user = com.slbbs.strutsconverter.UserConverter

截图:



声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
关注我们

一个IT知识分享的公众号