Struts2数据类型转换

JS写的图片局部动态截取 Javascript写的图片局部动态截取,不错 立即下载

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数据类型转换 NULL 博文链接:https://hanazawakana.iteye.com/blog/1681564 立即下载

相关推荐

javascript原始值和对象引用实例分析

主要介绍了javascript原始值和对象引用的方法,实例分析了javascript原始值和对象引用的功能、定义与相关技巧,需要的朋友可以参考下

struts2--数据类型转换

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

coolxing 148

Struts2基础学习之数据类型转换

我们在一个JSP表单中提交数据时,Struts2框架会将请求转发给Action处理,请求中经常会携带一些参数,Action中定义了表单中的一些字段,如果是基本的数据类型,或者是Java内置的一些数据类型,如int,String,Date等类型,Action会自动将请求中携带的字符串类型的参数转化成对应的int,String,Date等类型,但是,如果我们提交的表单数据中携带了自定义的数据类型,这时

记录技术,记录生活 982

Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串。也就是说服务器接收到的来自用户的数据只能是字符串或者是字符数组,而在Web应用的对象中,往往使用了多种不同的类型,如整数(int)、浮点数(float)、日期(Date)或者是自定义数据类型等。因此在服务器端必须将...

long_yu2的专栏 281

Struts2 类型转换和数据校验

学习内容Ø Struts 2类型转换Ø Struts 2数据校验能力目标Ø 熟悉Struts 2自带类型转换器Ø 能自定义类型转换器Ø 自定义输入校验功能Ø 熟悉Struts 2内置校验器本章简介Struts 2提供了功能强大的类型转换器来处理表现层数据,开发者可以利用Struts 2的类型转换机制来完成任意的类型转换。在应用开发中,对用户的输入进行校验是经常遇到的业务,Struts 2提供了多种

张晨光老师的播客 2371

(转)反射技术示例

using System;using System.Collections.Generic;using System.Text; namespace ReflectionDemo{    public class HelloWorld    {        private string strName = null;        public HelloWo

~~程序是门艺术,而我却在艺术之门之外~~ IT草根专栏 331

Java Bean与Map之间相互转化的实现

目录树 概述 Apache BeanUtils将Bean转Map Apache BeanUtils将Map转Bean 理解BeanUtils将Bean转Map的实现之手写Bean转Map 概述   Apache的BeanUtils Bean工具类很强大,基本涵盖了Bean操作的所有方法。这里的话我们就讲讲两个方面,一是Bean cover...

weixin_30246221的博客 164

模拟swagger抓出入参方法/序列化空对象自动生成对应的json/Class直接转json

swagger里面会自动生成入参和入参预览。 为了实现这种效果,我考虑过以下几个方案: 1.空对象->xml->json 对象在转xml的时候,会自动忽略没有赋值的字段,最后导致显示不全面 2.空对象->json 对象转json的时候,对应的字段会被转成null并显示出来,比如"Name"=null,而不是像swagger一样"Name"="String",而且在一个类里面嵌套另一个类的时候依旧会显示Null。比如会显示"UserInfo":Null,而不是像swagger一

千金少的博客 1714

Java 反射常用方法

Java反射常用的方法 (1)把List 转化为Map 场景:系统中有一个字典类,是一个实体类,如下(省略了getter,setter方法): Java代码 /** *DataDictionaryEntity */ @Entity @Table(name="t_dictionary") publicclas...

weixin_34037173的博客 143

5.继承相关的小知识

第5章内容个人觉得亮点不是很多。。。

机智的爆爆哥 471

Java反射技术详解

前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替代了,java反射有个开源框架jOOR相信很多人都用过,不过我们还是要学习发射的基础语法,这样才能自己写出优秀的框架,当然这里所讲的反射技术,是学习Android插件化技术、Hook技术等必不可...

黄林晴 24万+

Java中反射在项目中的应用

java的反射

helldoger的博客 461

C# 反射技术实现:对象转json,json转对象

namespace ConsoleApplication1 { class ReflectionTest { public static string Tojson(object obj) { StringBuilder builder = new StringBuilder("{"); Type ...

meng_xiaoxiao的博客 1305

什么是反射技术?

反射1、什么是反射技术?2、获取class对象的三种方式3.通过方式三:(此外还可以使用构造,构造可以指定参数---如String.class) 1、什么是反射技术? 动态获取指定类以及类中的内容(成员),并运行其内容。 应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象。这时可以根据配置文件的类全名去找对应的字节码文件,并加载进内存,并创建该类对象实例。这就需要使用反射技术完成 2...

qq_40472328的博客 711

反射技术示例

1.2 反射技术示例         下面是反射技术的示例,我们可以在程序去得时动态实例化对象,获得对象的属性,并调用对象的方法。using System;using System.Collections.Generic;using System.Text; namespace ReflectionDemo{    public class HelloWorld  

半亩方塘 727

反射技术

反射技术 Java反射是指在程序运行时获取已知名称的类或者已有对象相关信息的一种机制,包括类的方法,属性,父类等信息,还包括实例的创建和实例类型的判断等。可以动态获取到类中的各个方法等。 反射也是框架的灵魂,因此学习好反射对往后的框架学习很有帮助。可以多看看java API文档中反射各个方法的定义和使用 代码演示如下: 1.定义一个类 public class Person { priva...

An_person的博客 288

.net反射技术

反射技术反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。   1、.NET可执行应用程序结构   程序代码在编

水上漂的专栏 2432
上一篇: Struts2数据类型转换
下一篇: FIRST集、FOLLOW集 和 SELECT集
DR达仁
博客等级 码龄14年 29粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值