Struts温习(7)--自定义类型转换器一、概述??? ?在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框
Struts温习(7)--自定义类型转换器
一、概述?
?? ?在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制。?
?? ?Struts2的类型转换是基于OGNL表达式的,只要我们把HTML输入项(表单元素和其他GET/POET的参数)命名为合法的OGNL表达式,就可以充分利用Struts2的转换机制。?
?? ?除此之外,Struts2提供了很好的扩展性,开发者可以非常简单的开发自己的类型转换器,完成字符串和自定义复合类型之间的转换。总之,Struts2 的类型转换器提供了非常强大的表现层数据处理机制,开发者可以利用Struts2的类型转换机制来完成任意的类型转换。?
WEB应用接收到表单提交的数据都是String类型的,Struts2可方便的转换为 常规类型(数值,日期) / 自定义类型(User,Point类).
??如果转换中出现异常,conversionError拦截器会自动处理该异常.
二、 常规类型的转换 比如表单提交的信息有 用户名,生日, 年龄, Action中对应的数据类型分别是 String, Date, int. 没什么好说的, Struts2会自动完成. Struts2内建了常用的类型转换器,如String ,boolean,char,int,long,float,double,Date, 数组(假定元素是String类型), 集合(假定元素是String类型,用ArrayList封装)
三、页面中常用类型的OGNL表达式写法?? ? 在html表单中的文本框里输入的不管是数值类型还是字符类型,最后都是以String类传到后台。如果后台bean的属性是int、double、Date等,Struts就会自动把字符类型转换成相应的类型。?? ?Struts2中默认提供了一些内置的转换器,包括8个基本类型,Date,array数组,List,Map类。也可以自定义转换器。通过实现ogln.TypeConverter接口实现它的方法就可以定义其他类型的转换,不过还要配置相应的资源文件。其实那几个内置的转换器已经足够使用了,很少会专门定义一个转换器。?? ?基本数据类型转换器没有什么特殊要求,只要输入的值符合基本数据类型,它都会自动转换,否则会出现错误提示。比如对于int类型,前天就不能输入跟数字无关的字符。再来就是日期类型,默认好像是YY-MM-DD,比如2008-8-8,如果写成8-8-2008提交后就会出现错误提示。
?? ?对于Array数组,List,Map则需要配合OGNL表达式一起使用。比如后台有个属性是String [] name,在前台界面???<s:textfield name="names[0]" label="names"/>?? <s:textfield name="names[1]" label="names"/>?? <s:textfield name="names[2]" label="names"/>?
就会对这个数组赋值。List跟数组使用方式一样,但只针对不加泛型的基本数据类型的的List,如果加了泛型则是<s:textfield name="users[0].username" label="Usernames"/><s:textfield name="users[1].username" label="Usernames"/><s:textfield name="users[2].username" label="Usernames"/>比如User类中有个username属性,List<User> users这个属性对应上面的写法。
最后是Map的转换方式<s:textfield name="maidenNames['beth']" label="Maiden Name"/><s:textfield name="maidenNames['sharon']" label="Maiden Name"/><s:textfield name="maidenNames['martha']" label="Maiden Name"/>
[]里的值对应到Map中的Key
四、自定义类型转换器??实现TypeCoverter接口,或者继承DefaultTypeConverter实现类(该类实现了TypeCoverter接口),通过继承该实现类来实现自己的类型转换器。重写convertValue方法即可。?
?? ?为了简化类型转换器的实现,Struts2提供了一个StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了方法,并提供了2个不同转换方向的方法:Object?convertToString(Map context,String[] values,Class toClass)和String convertFromString(Map context,Object o)。?
?具体使用步骤:?1)注册应用??? ?实现了自定义类型转换器之后,将该类型转换器注册在Web应用中,Struts2框架才可以正常使用该类型转换器。?关于类型转换器的注册方式,主要有3中:?A、注册局部类型转换器:仅仅对某个Action的属性起作用。?B、注册全局类型转换器:对所有Action的特定类型的属性都会生效。?C、使用JDK1.5的注释来注册类型转换器:通过注释方式来生成类型转换器。?
2)局部类型转换器??? ?提供如下格式的文件?文件名: ?ActionName-conversion.properties ?内容:多个propertyName(属性名)=类型转换器类(含包名),如 ?date=com.aumy.DateConverter?存放位置:和ActionName类相同路径。?
3)全局类型转换器??? ?提供如下格式的文件?文件名: ?xwork-conversion.properties?内容: ? 多个“复合类型=对应类型转换器”项组成,如 ?java.Util.Date=com.aumy.DateConverter?存放位置:WEB-INF/classes/目录下。?
应用示例先看几个实体类?User.java
?Gender.java?业务处理UserAction.java?局部类型转换器,与UserAction.java在同一目录UserAction-conversion.properties?info.jsp?error.jsp?总结Struts2中的类型转换器??1) Struts2中内置了一些常用的类型转换器:可以把客户端提交的String数据转换成对应类型的数据。?? ? a) 基本类型?? ? b) java.util.Date:?? ? c) 数组和列表??2) 自定义类型转换器:??? ? a) 继承自org.apache.struts2.util.StrutsTypeConverter类??public abstract Object convertFromString(Map context, String[] values, Class toClass);?? ? ? ?context:OGNL上下文的Map对象?? ? ? ?values :需要转换的字符串数组?? ? ? ?toClass:要转换的目标类型??public abstract String convertToString(Map context, Object o);?? ? ? ? context:OGNL上下文的Map对象?? ? ? ? o:需要转换的对象?? ? b) 注册:以全局方式?? ? ? ? ? ? ? ? ? ?在应用程序的classpath下创建一属性文件,名为:xwork-conversion.properties?? ? ? ? ? ? ? ? ? ?文件内容:待转换类型的全限定名=类型转换器类的全限定名??3) 转换Set:?? ? 0) Action中的Set属性需要进行初始化:如:?? ? ? ?private Set<User> userSet = new HashSet<User>();?? ? a) 添加针对某个Action的转换器配置文件:ActionName-conversion.properties 如:?? ? ? ?UserAction-conversion.properties?? ? ? ??? ? b) 在这个文件中添加:Action的Set属性的相关配置?? ? ? ?Element_属性名=Set中的元素类型的全限定名 ? ? ? ? ? ? ? ? #指定Set中的元素类型?? ? ? ?KeyProperty_属性名=Set中的元素类型中的某个属性 ?#指定Set的索引字段?? ? ? ? ? ? ? ? ? 如下示例:?? ? ? ?Element_userSet=com.qiujy.domain.User?? ? ? ?KeyProperty_userSet=id?? ? ? ??? ? c) JSP页面: <input type="text" name="Set属性名.makeNew[0].属性名"/>?? ? ? ? ? ? ? ? ? ?如:<input type="text" name="userSet.makeNew[0].loginname"/>