详解Struts2的类型转换

1.内置的转换器

  • String和boolean、Boolean:完成字符串与布尔值之间的转换
  • String和char、Character:往常字符串与字符之间的转换
  • String和int、Integer:完成字符串与整型之间的转换
  • String和long、Long:完成字符串与长整型值之间的转换
  • String和double、Double:完成字符串与双精度浮点值的转换
  • String和float、Float:完成字符串和单精度浮点之间的转换
  • String和Date:完成字符串和日期类型之间的转换,可以接收yyyy-MM-dd格式字符串
  • String和数组:可以将多个同名参数,转换到数组中
  • String和Map、List:支持将数据保存到List或者Map集合

2.基于OGNL的类型转换


public class User
{
	private String name;
	private String pass;

	//name属性的setter和getter方法
	public void setName(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return this.name;
	}

	//pass属性的setter和getter方法
	public void setPass(String pass)
	{
		this.pass = pass;
	}
	public String getPass()
	{
		return this.pass;
	}
}

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>利用OGNL的进行类型转换</title>
</head>
<body>
<h3>利用OGNL的进行类型转换</h3>
<s:form action="login">
	<!-- 该表单域封装的请求参数名为user.name -->
	<s:textfield name="user.name" label="用户名"/>
	<!-- 该表单域封装的请求参数名为user.pass -->
	<s:textfield name="user.pass" label="密码"/>
	<tr>
		<td colspan="2"><s:submit value="转换" theme="simple"/>
		<s:reset value="重填" theme="simple"/></td>
	</tr>
</s:form>
</body>
</html>

public class LoginAction implements Action
{
	//Action类里包含一个Map类型的参数
	//Map的value类型为User类型
	private Map<String , User> users;
	private String tip;

	//users属性的setter和getter方法
	public void setUsers(Map<String , User> users)
	{
		this.users = users;
	}
	public Map<String , User> getUsers()
	{
		return this.users;
	}
	
	//tip属性的setter和getter方法
	public void setTip(String tip)
	{
		this.tip = tip;
	}
	public String getTip()
	{
		return this.tip;
	}

	public String execute() throws Exception
	{
		//在控制台输出Struts 2封装产生的List对象
		System.out.println(getUsers());
		//根据Map集合中key为one的User实例来决定控制逻辑
		if (getUsers().get("one").getName().equals("crazyit.org")
			&& getUsers().get("one").getPass().equals("leegang") )
		{
			setTip("登录成功!");
			return SUCCESS;
		}
		else
		{
			setTip("登录失败!!");
			return ERROR;
		}
	}
}

对应的:


<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>直接封装成Map</title>
</head>
<body>
<h3>直接封装成Map</h3>
<s:form action="login">
	<s:textfield name="users['one'].name" label="第one个用户名"/>
	<s:textfield name="users['one'].pass" label="第one个密码"/>
	<s:textfield name="users['two'].name" label="第two个用户名"/>
	<s:textfield name="users['two'].pass" label="第two个密码"/>
	<tr>
		<td colspan="2"><s:submit value="转换" theme="simple"/>
		<s:reset value="重填" theme="simple"/></td>
	</tr>
</s:form>
</body>
</html>


3.指定集合元素的类型


4.自定义类型转换器

Struts 2提供了一个StrutsTypeConverter的抽象类,这个抽象类是DefaultTypeConverter类的子类。开发时可以直接继承这个类来进行转换器的构建。通过继承该类来构建类型转换器,可以不用对转换的类型进行判断,

convertValue方法的作用:

该方法负责完成类型的双向转换,为了实现双向转换,我们通过判断toType的类型即可判断转换的方向。toType类型是需要转换的目标类型,如:当toType类型是User类型时,表明需要将字符串转换成User实例;当toType类型是String类型时,表明需要把User实例转换成字符串类型。通过toType类型判断了类型转换的方向后,我们就可以分别实现两个方向的转换逻辑了。实现类型转换器的关键就是实现conertValue方法,该方法有三个参数:

第一个参数 context:类型转换的上下文

第二个参数 value:需要转换的参数

第三个参数 toType:转换后的目的类型

public class UserConverter extends DefaultTypeConverter 
{
	//类型转换器必须重写convertValue方法,该方法需要完成双向转换
	public Object convertValue(Map context
		, Object value, Class toType)
	{
		//当需要将字符串向User类型转换时
		if (toType == User.class )
		{
			//系统的请求参数是一个字符串数组
			String[] params = (String[])value;
			//创建一个User实例
			User user = new User();
			//只处理请求参数数组第一个数组元素,
			//并将该字符串以英文逗号分割成两个字符串
			String[] userValues = params[0].split(",");
			//为User实例赋值
			user.setName(userValues[0]);
			user.setPass(userValues[1]);
			//返回转换来的User实例
			return user;
		}
		else if (toType == String.class )
		{
			//将需要转换的值强制类型转换为User实例
			User user = (User) value;
			return "<" + user.getName() + ","
				+ user.getPass() + ">";
		} 
		return null ;
	} 
}

5.基于Struts2 的自定义类型

Struts 2提供了一个StrutsTypeConverter的抽象类,这个抽象类是DefaultTypeConverter类的子类。开发时可以直接继承这个类来进行转换器的构建。通过继承该类来构建类型转换器,可以不用对转换的类型进行判断(和DefaultTypeConverter的区别)


6.注册类型转换器

6.1.注册局部类型转换器:局部类型转换器仅仅对某个Action起作用。

   局部类型转换器非常简单,只需要在相应的Action目录下新建一个资源文件。该资源文件名格式如下。ActionName-conversion.properties。其中ActionName表示需要进行转换的Action的类名,“-conversion.properties”字符串则是固定格式的。该文件也是一个典型Properties文件,文件由键值对组成:propertyName = 类型转换器类

如:name=util.NameConvert

name:表示要进行转换的属性

util.NameConvert:表示要进行转换的自定义类型转换器。

注意:该属性文件应该与ActionName.class放在相同位置。

  

6.2.注册全局类型转换器:对所有Action的特定类型的属性都会生效。

           全局类型转换器,必须提供一个xwork-conversion.properties文件。文件必须保存在classes目录下。该资源文件名格式如下:

     复合类型=对应的类型转换器 

     复合类型:指定需要完成类型转换的复合类

     对应的类型转换器:指定所指定类型转换的转换器。

 如:注册User类的全局类型转换器为:UserConverter

     cn.wjz.bean.User = cn.wjz.util.UserConverter



7.处理set集合

不常用

8.类型转换过程中错误处理

8.1处理类型转换错误

如果Struts2的类型转换器执行类型转换时出现错误,该拦截器将负责将对应的错误封装成表单域错误(fieldError),并将这些错误信息放入ActionContext中。

在进行类型转换中,如果出现错误将会提示错误信息。Struts 2默认提供了错误信息提示,但是这些错误信息提示不够友好,下面将介绍如何自定义错误信息来取代Struts 2的默认错误信息。

·定义全局类型转换错误处理信息:

 在应用的国际化资源文件中增加如下的信息:

 xwork.default.invalid.fieldvalue = key

key的值就是用户希望在页面中显示的提示信息。  例如:

#改变默认的类型转换失败后的提示信息

xwork.default.invalid.fieldvalue = {0}字段类型转换失败!!

因为包含非西欧字符,因此使用 native2ascii 命令处理

xwork.default.invalid.fieldvalue =

 {0}\u5b57\u6bb5\u7c7b\u578b\u8f6c\u6362\u5931\u8d25\uff01\uff01

在某些时候可能还需要对特定的字段指定特别的提示信息,此时可以提供该Action的局部资源文件,文件名:ActionName.properties , 在文件中增加如下一项:

     invalid.fieldvalue.属性名 =提示信息

#改变Action中birth属性类型转换错误后的提示信息

invalid.fieldvalue.birth = 生日信息必须满足yyyy-MM-DD格式,

使用 native2ascii 命令处理

invalid.fieldvalue.birth =

\u751f\u65e5\u4fe1\u606f\u5fc5\u987b\u6ee1

\u8db3yyyy-MM-DD\u683c\u5f0f

 8.2处理集合属性转换错误


9.类型转换的流程

 1、用户进行请求,根据请求名在struts.xml中寻找Action

 2、在Action中,根据请求域中的名字去寻找对应的set方法。找到后在赋值之前会检查这个属性有没有自定义的类型转换。没有的话,按照默认进行转换;如果某个属性已经定义好了类型转换,则会去检查在Action同一目录下的action文件名-conversion.properties文件。

 3、从文件中找到要转换的属性及其转换类。

 4、然后进入转换类中,在此类中判断转换的方向。我们是先从用户请求开始的,所以这时先进入从字符串到类的转换。返回转换后的对象。流程返回Action。

 5、将返回的对象赋值给Action中的属性,执行Action中的execute()

 6、执行完execute()方法,根据struts.xml的配置转向页面

 7、在jsp中显示内容时,根据页面中的属性名去调用相应的get方法,以便输出

 8、在调用get方法之前,会检查有没有此属性的自定义类型转换。如果有,再次跳转到转换类当中。

 9、在转换类中再次判断转换方向,进入由类到字符串的转换,完成转换后返回字符串。

 10、将返回的值直接带出到要展示的页面当中去展示



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值