Struts2 类型转换详解

1,基于OGNL类型转换

1普通对象类型转换(struts2 内部自动转换)

public class TypeTo {
        //该对象为 转换对象
	private User user;

	public String execute(){
		return Action.SUCCESS;
	}
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
}


public class User {
	private String name;
	private String pass;
	
	public User() {
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
}
//配置action
<action name="tt" class="com.wang.typeto.TypeTo">
	<result name="success">/TypeTo/show.jsp</result>
</action>


//提交界面
<s:form action="tt">
	<s:textfield name="user.name" label="username"/>
	<s:textfield name="user.pass" label="password"/>      
	<s:submit value="getTo" />
</s:form>


//展示界面
<h1>Type To</h1>
<hr>
<s:property value="user.name"/></br>
<s:property value="user.pass"/>

2Map集合属性类型

private Map<String, User> users;

public Map<String, User> getUsers() {
	return users;
}

public void setUsers(Map<String, User> users) {
	this.users = users;
}
//提交表单(部分)
<!-- user['key'].属性 形式 为 action属性进行赋值  -->
<s:textfield name="users['one'].name" label="username1"/>
<s:textfield name="users['one'].pass" label="password1"/>  
<s:textfield name="users['two'].name" label="username2"/>
<s:textfield name="users['two'].pass" label="password2"/>      
<s:submit value="getTo" />

<!-- show -->
<!-- 获取Aciton 中属性值也通过  user['key'].属性 形式-->
<s:property value="users['one'].name"/></br>
<s:property value="users['one'].pass"/></br>
<s:property value="users['two'].name"/></br>
<s:property value="users['two'].pass"/></br>

3List集合类型

private List<User> users;
	
	
public List<User> getUsers() {
	return users;
}

public void setUsers(List<User> users) {
	this.users = users;
}
<!-- user[索引].属性 -->
<s:textfield name="users[0].name" label="username1"/>
<s:textfield name="users[0].pass" label="password1"/>  
<s:textfield name="users[1].name" label="username2"/>
<s:textfield name="users[1].pass" label="password2"/>      
<s:submit value="getTo" />


<!-- show -->
<s:property value="users[0].name"/></br>
<s:property value="users[0].pass"/></br>

4当集合类型List或Map未指定泛型类型时:指定类型转换

List:

//未指定泛型(通过局部类型转换文件指定 泛型 格式 ActionName-conversion.properties 放在该       Action相同位置)
private List user; 
	
public List getUser() {
	return user;
}

public void setUser(List user) {
	this.user = user;
}

创建*.properties文件放在对应Action下面(TypeTo-conversion.properties)

# format: Element_<ListPropName>=<ElementType> 
# <ListPropName> is property name of List
# <ElementType> is genericity type
Element_users=com.wang.vo.User

Map:

private Map users;

public Map getUsers() {
	return users;
}

public void setUsers(Map users) {
	this.users = users;
}

创建*.properties文件放在对应Action下面(TypeTo-conversion.properties)

# Map format:
# 	Key_<MapPropName>=<KeyType>
#	Element_<MapPropName>=<ValueType>
# 	<MapPropName> is property name of Map
#	<KeyType> is key of Map
#	<ValueType> is value of Map
Key_users=java.lang.String
Element_users=com.wang.vo.User

 

2,自定类型转换器

(将一个字符串转换成复合对象)

实际上类型转换时依据OGNL框架中 TypeConverter接口 ,自定义类型转化器可实现该接口 ,但接口方法过于复杂,struts2提供了个DefaultTypeConverter实现类 ,可以继承他重写convertValue()方法来自定义类型转换器。(该方法需要实现双向转化此处不做举例)此处讲解其子类(抽象类)StrutsTypeConverter 类

	private User user;
	  
  	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
public class UserConverter extends StrutsTypeConverter{

	/**
	 * 将String转换成复合类型
	 * context : 转换环境上下文
	 * values  : 需要转换的参数 为数组 因为游览器端可以进行多选项提交
	 * toClass : 目标类型
	 */
	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) { 
		User user = new User();
		//User user = (User)toClass.newInstance();
		String[] userValues = values[0].split(",");
		user.setName(userValues[0]);
		user.setPass(userValues[1]);
		return user;
	}

	//将复合类型转换成String类型
	@Override
	public String convertToString(Map context, Object o) {
		User user = (User)o;
		return "[" + user.getName() + "," + user.getPass() + "]";
	}
	
}

 TypeTo-conversion.properties配置文件(此配置为局部Action配置只对单个Action起作用)

# Type Conversion format:
#	<propName>=<ConverterClass>
#	<propName> is property name of Action
#	<ConverterClass> is Transformation processing class
user=com.wang.typeto.UserConverter

.jsp

<s:textfield name="user"/>
<s:submit value="getTo" />
<s:property value="user.name"/></br>
<s:property value="user.pass"/></br>
<s:property value="user" />

 

{全局类型转换器配置:不是对特定Action有效而是对特定类型有效果}需要创建 xwork-conversion.properties文件 放在WEB-INF/classes下面即可

# format :
#<proType>=<ConvertClass>
com.wang.vo.User=com.wang.typeto.UserConverter.java

 

关于Action中Set集合属性使用

        //无序集合
	private Set users;
	
	public Set getUsers() {
		return users;
	}

	public void setUsers(Set users) {
		this.users = users;
	}

自定义类型转换类

public class UserConverter extends StrutsTypeConverter{

	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		Set result = new HashSet();
		for(String value:values){
			User user = new User();
			String[] userValues = value.split(",");
			user.setName(userValues[0]);
			user.setPass(userValues[1]);
			result.add(user);
		}
		return result;
	}

	@Override
	public String convertToString(Map context, Object o) {
		if(Set.class == o.getClass()){
			Set users = (Set)o;
			String result = "[";
			for(Object obj: users){
				User user = (User)obj;
				result += "<" + user.getName() + "," + user.getPass() + ">";
			}
			return result+="]";
		}
		return "";
	}
}

TypeTo-conversion.properties配置文件

# Type Conversion format:
#	<propName>=<ConverterClass>
#	<propName> is property name of Action
#	<ConverterClass> is Transformation processing class
users=com.wang.typeto.UserConverter

# Specify Set identifier 
# Set format:
#	KeyProperty_<SetPropName>=<keyProName>
#	<propName> is property name of Action
#	<keyProName> is Set elements' element
KeyProperty_users=name

.jsp

<s:textfield name="users"/>
<s:textfield name="users"/>
<s:submit value="getTo" />



<!-- 特别注意此处的圆括号 Set集合专用 List Map 使用方括号 圆括号里面(name)为Set元素唯一标识 前面类型转换器和配置文件 进行设置的  -->
<s:property value="users('wang').name"/></br>
<s:property value="users('wang').pass"/></br>

 

2,类型转换中的错误处理

自定义类型转换类 重写convertFromString()  

        @Override
	public Object convertFromString(Map context, String[] values, Class toClass) { 
		...
                //由于某些原因抛出类型转换异常
		throw new TypeConversionException();
	}

应为类型转换错误最终action将result将返回"input"

 

配置TypeTo-conversion.properties(类型转换器)

users=com.wang.typeto.UserConverter

对应Action

public class TypeTo extends ActionSupport {
	
	private User users;
	  
  	public User getUsers() {
		return users;
	}

	public void setUsers(User users) {
		this.users = users;
	}
	
	public String execute(){
		return Action.SUCCESS;
	}
}

 

配置struts.xml文件配置input结果对应.jsp

        <!-- 设置src/in_zh_CN.properties 文件为全局的国际化资源文件  -->
        <constant name="struts.custom.i18n.resources" value="in" />
        <package name="TT" extends="struts-default">
		<action name="tt" class="com.wang.typeto.TypeTo">
			<result name="success">/TypeTo/show.jsp</result>
			<result name="input">/input.jsp</result>
		</action>
	</package>

 src/in_zh_CN.properties 全局国际化资源文件

xwork.default.invalid.fieldvalue={0}字段转换错误

typeto.jsp

<s:form action="tt">
    <s:textfield name="users"/>
    <s:submit value="getTo" />
</s:form>

input.jsp

<s:fielderror/>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值