`
diaoaa
  • 浏览: 18635 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Struts2数据类型转换

 
阅读更多

strtus数据类型转换

对于前台界面向后台传送的数据,strtus2可以帮助我们自动的转换其中的一些,包括:java中8中原生数据类型以及像String、Date等常见数据类型,但对于自定义的数据类型还需要我们自己写转换器进行转换。

1、对于原生数据类型的转换

前台界面提交的表单:

 <form action="user">
   		姓名:<input type="text" name="username" /><br/>
   		年龄:<input type="text" name="age" /><br/>
   		生日:<input type="text" name="birthday" /><br/>
   		身高:<input type="text" name="stature"/><br/>
   		<input type="submit" value="submit" />
   </form>
struts.xml配置文件:
<struts>
	<package name="struts2" extends="struts-default">
		<action name="user" class="com.dr.action.UserAction" method="method1">
			<result name="success">/result.jsp</result>
		</action>
	</package>
</struts>
UserAction方法:(属性名与表单name可以不一致,但set方法名必须一致,但一般情况下我们都是让属性名与name一致,自动生成get&set方法)
public class UserAction extends ActionSupport{

	private String username;
	private int age;
	private Date birthday;
	private float stature;

	/*
	 * 此处省略get & set 方法
	 * 注意set方法名需要和表单中的name名一致,
	 * 否则,struts无法自动完成类型转换
	 * */
	
	public String method1(){
		
		return SUCCESS;
	}
}
result.jsp输出数据类型转换的结果:
   <body>
  	姓名:${requestScope.username }<br/>
   	年龄:${requestScope.age}      <br/>
   	生日: ${requestScope.birthday }<br/>
   	身高:${requestScope.stature }<br/>
  </body>
运行,访问前台界面:





result输出的结果:

姓名:dr
年龄:20
生日: Sat Jul 31 00:00:00 GMT+08:00 1993
身高:176.0
显然,这里对于String、int、Date以及float型的变量是Struts2自动帮助我们的转换的。

2、自定义数据类型的转换

1)基于ognl的转换

但是,对于上面的例子,如果我们在生日框内只输入年份,而不是按照上述格式输入,就会报错,无法完成转换;抑或我们想把前台传来的数据转成我们自定义的数据类型,struts2就不能自动帮助我们完成,这时就需要我们自己编写转换器完成转换。

对于前台提交的表单:(输入:dr;20;1993;176

<h2>姓名;年龄;出生年份;身高 (数据之间用分好;隔开)</h2>
  	 <form action="user2">
   		userinfo:<input type="text" name="user" /><br/>
   		<input type="submit" value="submit" />
   	</form>
struts.xml配置文件中:
<action name="user2" class="com.dr.action.UserAction2" method="method1">
		<result name="success">/result2.jsp</result>
	</action>


User对象:
public class User {

	private String username;
	private int age;
	private Date birthday;
	private float stature; //此处省略了get&set方法 }

UserAction2中我们希望直接转成User对象过来,当然我们可以利用request.getparameter()方法,解析字符串,但这样显然跟我们使用struts2的初衷相违,这里我们利用ognl自定义一个类型转换器,使数据进入action方法的时候是以一个user对象。

自定义User类型转换器UserConverter:(继承了ognl的DefaultTypeConverter类,重写了它的convertValue方法,把前台数据转换成目标数据)

public class UserConverter extends DefaultTypeConverter{

	/**
	 * value:前台框架传过来的数据
	 * toType:需要转换成的目标对象类型
	 */
	@Override
	public Object convertValue(Map context, Object value, Class toType) {
		if(User.class == toType){ //由前台向后台转换
			String[] str = (String[])value;
			String userinfo = str[0];
			StringTokenizer st = new StringTokenizer(userinfo,";");
			String username = st.nextToken();
			int age = Integer.parseInt(st.nextToken());
			String birthday = st.nextToken();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
			Date birth = null;
			try {
				 birth = sdf.parse(birthday);
			} catch (ParseException e) {
				e.printStackTrace();
			}
			String firstStature = st.nextToken();
			float stature = Float.parseFloat(firstStature);
			User user = new User();
			user.setUsername(username);
			user.setBirthday(birth);
			user.setStature(stature);
			user.setAge(age);
			return user;
		}else if(String.class == toType){	//从后台向前台转换
			User user = (User)value;
			String userinfo = "username: "+user.getUsername()+",age: "+user.getAge()+
							  "birthday: "+user.getBirthday()+",stature: "+user.getStature();
			return userinfo;
		}
		return null;
	}
}
这样只是定义了转换类,还需要一个属性文件告诉struts2,何时去调用这个转换,我们在action的同级目录下建一个UserAction2-conversion.properties的文件,里面的内容是:user=com.dr.converter.UserConverter 。说明:文件名必须是相应的Action名+conversion.properties,形式:xxx-conversion.properties,内容中:key:action中需要转换的属性名,value是转换器的包名,格式必须完全一致。

所以,在UserAction2中我们直接使用User类:(运行可以进入action类的时候,已经是user对象,而不需要再次转换)

public class UserAction2 extends ActionSupport{

	private User user;
	/*
	 * 此处省略get & set 方法
	 * */
	
	public String method1(){
		System.out.println("username: "+user.getUsername());
		System.out.println("age: "+user.getAge());
		System.out.println("birthday: "+user.getBirthday().toString());
		System.out.println("stature: "+user.getStature());
		return SUCCESS;
	}
}
前台的输出界面:
userinfo: username: dr,age: 20birthday: Fri Jan 01 00:00:00 GMT+08:00 1993,stature: 176.0

2)基于struts2的类型转换(其实就是对上面ognl转换的一个包装)

其实,struts2也提供了自定义的类型转换,我们再建一个转换器UserConverter2:
public class UserConverter2 extends StrutsTypeConverter {

	@Override
	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
		String[] str = (String[])arg1;
		String userinfo = str[0];
		StringTokenizer st = new StringTokenizer(userinfo,";");
		String username = st.nextToken();
		int age = Integer.parseInt(st.nextToken());
		String birthday = st.nextToken();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
		Date birth = null;
		try {
			 birth = sdf.parse(birthday);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		String firstStature = st.nextToken();
		float stature = Float.parseFloat(firstStature);
		User user = new User();
		user.setUsername(username);
		user.setBirthday(birth);
		user.setStature(stature);
		user.setAge(age);
		return user;
	}

	@Override
	public String convertToString(Map arg0, Object arg1) {
		User user = (User)arg1;
		String userinfo = "username: "+user.getUsername()+",age: "+user.getAge()+
						  "birthday: "+user.getBirthday()+",stature: "+user.getStature();
		return userinfo;
	}

}
这里我们继承了struts2的一个StrutsTypeConverter,实现它的两个抽象方法,方法内容就是我们之前的if和else的内容,所以,我们知道这两个方法一个负责前台到后台的转换,一个负责后台到前台的转换,只不过这里不需要我们判断,其实这是因为strtus2在底层包装的时候已经做了判断,我们只需重写即可。

我们不妨看看strutsTypeConverter的源码:

public abstract class StrutsTypeConverter extends DefaultTypeConverter {
    public Object convertValue(Map context, Object o, Class toClass) {
        if (toClass.equals(String.class)) {
            return convertToString(context, o);
        } else if (o instanceof String[]) {
            return convertFromString(context, (String[]) o, toClass);
        } else if (o instanceof String) {
            return convertFromString(context, new String[]{(String) o}, toClass);
        } else {
            return performFallbackConversion(context, o, toClass);
        }
    }
	.....
}

真想大白。。

还有一种全局的类型转换区别在于,属性文件是xwork-conversion.properties,放在src目录下,内容中:key=类名(含包名),value和以前一样








分享到:
评论

相关推荐

    struts2数据类型转换器

    这篇博客“Struts2数据类型转换器”可能深入探讨了这个主题,虽然具体的细节无法在此给出,但我们可以根据Struts2中数据类型转换的工作原理来展开讨论。 在Java Web开发中,用户通过表单提交的数据通常是字符串形式...

    struts2数据类型转换

    ### Struts2 数据类型转换详解 #### 一、引言 在Web开发中,特别是使用Struts2框架进行开发时,数据类型转换是一项至关重要的功能。由于Web应用程序的基础通信协议HTTP仅支持字符串形式的数据传输,因此,服务器端...

    SSH之Struts2数据类型转换

    SSH之Struts2数据类型转换国际化及文件上传下载

    struts2.1数据类型转换2

    struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2struts2.1数据类型转换2

    struts2学习笔记3数据类型转换

    struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换struts2学习笔记3数据类型转换

    struts2自定义数据类型转换练习

    本练习主要关注如何在Struts2中实现自定义的数据类型转换,以满足特定业务需求。 首先,我们需要了解Struts2的数据转换机制。当用户提交表单数据时,Struts2会通过ActionContext获取到这些数据,并尝试将其转换为...

    struts2学习笔记三(第3讲.Struts2的类型转换)

    类型转换在处理用户提交的数据时非常关键,它允许Struts2自动将请求参数转换为Java对象的属性。 在Struts2中,类型转换主要由`Converter`接口实现,它的主要职责是将HTTP请求参数转换为Action类的属性。当我们在...

    struts2自定义类型转换器

    Struts2作为一款流行的Java Web框架,提供了强大的数据绑定和类型转换功能,使得开发者能够更加便捷地处理HTTP请求与Action类之间的数据交互。在实际开发中,有时我们需要对默认的类型转换器进行扩展,以满足特定的...

    struts2 类型转换器

    Struts2通过自定义类型转换器,能够自动将这些字符串转换为相应的数据类型。 在描述中提到的博客链接(由于实际无法访问,以下内容基于Struts2类型转换器的通用知识)通常会详细解释如何创建和注册自定义类型转换器...

    Struts2 ConverterType类型转换 案例源码

    默认情况下,Struts2会根据Action类中属性的数据类型尝试进行自动转换。如果默认转换器无法处理特定类型的转换,我们可以编写自定义的Converter并将其注册到Struts2的配置中。在这个例子中,我们需要将用户输入的...

    struts2简单实例(类型转换)

    通过运行这个实例,初学者可以了解到Struts2如何处理数据类型转换,以及如何在实际项目中应用。此外,这也是理解Struts2框架工作原理和MVC模式的一个好起点。在深入学习Struts2的过程中,你还会遇到拦截器...

    Struts2自定义类型转换

    在Web开发中,数据类型转换是一项常见的需求,特别是在用户输入的数据与后端处理的数据类型不一致时。Struts2框架提供了强大的类型转换机制,允许开发者自定义类型转换器,以满足特定业务逻辑的需求。本文将深入探讨...

    STRUTS2类型转换

    Struts2是一个流行的Java web开发框架,其核心是Action,而类型转换是Struts2处理用户输入数据的一个重要环节。Struts2内置了多种类型转换,可以将HTTP请求中的字符串数据转换为各种基本类型和复杂类型,如日期、...

    实验4 Struts2的类型转换与OGNL表达式语言.doc

    Struts2支持多种内置的数据类型转换,同时也允许开发人员自定义类型转换规则。 **1.1 内置类型转换** Struts2提供了丰富的内置类型转换器,可以自动地将用户提交的数据转换为所需的Java数据类型,如`String`、`...

    Struts2类型转换(一)----常规类型,自定义类型,错误处理

    Struts2框架内建了一套完整的类型转换器,能够自动处理常见数据类型,如String、Integer、Double等。例如,当用户通过表单提交一个字符串"123",Struts2会自动将其转换为Integer类型。这一过程主要由`ognl....

    struts2的类型转换详解

    Struts2 自带了一系列内置的类型转换器,能够处理常见的数据类型转换,包括但不限于: 1. 字符串(String) 2. 布尔值(boolean / Boolean) 3. 字符(char / Character) 4. 整数(int / Integer), 浮点数(float / Float)...

    Struts处理类型转换错误,如时间转换

    在处理用户输入时,Struts2框架需要将请求参数转换为对应的Java对象属性,这个过程就涉及到类型转换。然而,当用户输入的数据格式不正确时,就会出现类型转换错误,例如在尝试将字符串转换为日期时。本篇文章将深入...

Global site tag (gtag.js) - Google Analytics