当前位置:首页 > 开发 > 编程语言 > Struts2 > 正文

struts2--数据类型转换

发表于: 2011-11-20   作者:coolxing   来源:转载   浏览:
摘要: [coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]   html页面中每一个表单输入项都只能是字符串或者字符串数组, 服务端可能需要把String转换为特定的数据类型. 在struts2中, 由parameters拦截器负责请求参数的类型转换, 该拦截器是default-stack中的一员. parameters拦截器可以自动完成字符串到基本数据类型的

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]

 

html页面中每一个表单输入项都只能是字符串或者字符串数组, 服务端可能需要把String转换为特定的数据类型.

在struts2中, 由parameters拦截器负责请求参数的类型转换, 该拦截器是default-stack中的一员. parameters拦截器可以自动完成字符串到基本数据类型的转换.

在Action类中定义与请求参数同名的属性, 并为这些属性提供getter, setter方法, struts2便能自动接收请求参数, 然后调用setter方法赋值给相应的属性.

 

从字符串到基本数据类型的转换.

1. jsp代码:

<form action="${pageContext.request.contextPath}/converter/userAction_save.action" name="form1" method="post">
	编号:<input type="text" name="id"><br>
	姓名:<input type="text" name="userName"><br>
	<input type="submit" value="提交"><br>
</form>

2. Action类:

public class UserAction extends ActionSupport {
	private Integer id;
	private String userName;
	public String save(){
		System.out.println("id = " + id + ", username = " + userName);
		return "success";
	}
	//省略getter和setter方法...
}

 

 

从字符串到自定义javaBean的转换.

1. jsp代码:

<form action="${pageContext.request.contextPath}/converter/personAction_save.action" name="form1" method="post">
	姓名:<input type="text" name="person.name"><br>
	年龄:<input type="text" name="person.age"><br>
	<input type="submit" value="提交"><br>
</form>

2. Action类:

public class PersonAction extends ActionSupport {
	private Person person;
	public String save() {
		System.out.println("name = " + person.getName() + ", age = " + person.getAge());
		return "success";
	}
	//省略getter和setter方法...
}

 

 

从字符串到Collection集合的转换.

1. jsp代码:

<form action="${pageContext.request.contextPath}/converter/personsAction_save.action" name="form1" method="post">
	姓名:<input type="text" name="persons[0].name"><br>
	年龄:<input type="text" name="persons[0].age"><br>
	姓名:<input type="text" name="persons[1].name"><br>
	年龄:<input type="text" name="persons[1].age"><br>
	<input type="submit" value="提交"><br>
</form>

2. Action类:

public class PersonsAction extends ActionSupport {
	private Collection<Person> persons;
	public String save() {
		for (Person p : persons) {
			System.out.println("name = " + p.getName() + ", age = "
					+ p.getAge());
		}
		return "success";
	}
	//省略getter和setter方法...
}

 

 

自定义转换器. 当struts2提供的转换器无法满足需求时, 可以自定义一个转换器.

以"yyyy~Mm~dd"类型的字符串到java.util.Date类型的转换为例.

1. jsp表单:

<form action="${pageContext.request.contextPath}/converter/dateAction_save.action" name="form1" method="post">
	出生年龄:<input type="text" name="birthday"><br>
	<input type="submit" value="提交"><br>
</form>

2. Action类:

public class DateAction extends ActionSupport {
	private java.util.Date birthday;
	public String save() {
		System.out.println(birthday);
		return "success";
	}
	//省略getter和setter方法...
}

3. 自定义转换器:

public class DateConverter extends DefaultTypeConverter {

	/**
	 * @param context: Ognl上下文
	 * @param value: 要转化的字符串数组, 调用request.getParameterVaues("birthday")获得
	 * @param toType: 目的数据类型, 此时为java.util.Date.class
	 * @return: 方法的返回值将用于设置Action中的birthday属性
	 */
	@SuppressWarnings("unchecked")
	public Object convertValue(Map<String, Object> context, Object value,
			Class toType) {
		if (value instanceof String[] && toType == java.util.Date.class) {
			try {
				String[] str = (String[]) value;
				SimpleDateFormat sf = new SimpleDateFormat("yyyy~MM~dd");
				if (str[0] != null & str[0].matches("[0-9]{4}~[0-9]{2}~[0-9]{2}")) {
					return sf.parse(str[0]);
				}
			} catch (ParseException e) {
				e.printStackTrace();
				/*
				 * 在struts2中,处理类型转化错误的工作是由StrutsConversionErrorInterceptor拦截器完成.
				 * 如果类型转换过程中出现异常, 一定要再捕获后重新抛出.
				 * 如果错误的类型拦截器接收到异常,认为类型转化过程中出现了错误,转到input属性所指向的错误页面 .
				 * 如果错误的类型拦截器没有接收到异常,认为类型转化过程成功,这时转到成功页面.
				 */
				throw new RuntimeException(e);
			}
		}
		return null;
	}
}

4. 注册自定义的转换器: 在与当前action同级的目录创建ActionClassName-conversion.properties文件, 并在其中输入"action中的属性名称=类型转化器的全限定类名". 此时应该在DateAction类的同级目录下创建DateAction-conversion.properties文件, 输入的内容为:

birthday=cn.xing.converter.DateConverter

采用上述方式配置的转换器是局部转换器, 只对特定的Action有效. 如果想要注册全局转换器, 可以在src目录下新建xwork-conversion.properties文件, 输入的内容同上.

 

struts2--数据类型转换

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号