欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

8.Struts2类型转换器

发布时间:2025/3/13 编程问答 29 豆豆
生活随笔 收集整理的这篇文章主要介绍了 8.Struts2类型转换器 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

类型转换器
1、引入
在Struts2中,请求参数类型不仅可以是String,还可以是其它类型。
如,定义一个请求参数birthday为Date类型,给其赋值为1949-10-1,
则birthday接收到的不是字符串“1949-10-1”,而是日期类型。
但,需注意的是,对于基本数据类型,需将其定义为包装类型。
实例:请求参数值的类型-- typeconverter
Step1:编写index.jsp与show.jsp
Step2:编写Birthday_Action
Step3:编写web.xml与struts.xml

新建web项目工程源码文档目录如下:

 Birthday_Action.java源码如下:

package actions;import java.util.Date;public class Birthday_Action {private Date birthday;public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String execute(){System.out.println("--------birthday------"+birthday);return "success";} }

 index.jsp源码如下:

<%@ page pageEncoding="utf-8"%><html><head><title>login.jsp</title></head><body><form action="birthday.action">中华人名共和国的建国日期是:<input type="text" name="birthday"/><br/><input type="submit" value="提交"/></form></body> </html>

 show.jsp源码如下:

<%@ page pageEncoding="utf-8" isELIgnored="false"%><html><head><title>show page</title></head><body>中国人民共和国的建国日期是:${birthday}</body> </html>

 web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app>

 struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><package name="one" extends="struts-default"><action name="birthday" class="actions.Birthday_Action"><result>/show.jsp</result></action></package> </struts>

 部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/

 


 

 


当在表单中填入1949-10-1时,提交,便可看到Sat Oct 01 00:00:00 CST 1949的显示结果。
说明,Struts2将1949-10-1作为Date类型接收了。
若在表单中填入的是19491001时,发现也可看到相应的结果,但,控制台报错: java.lang.NoSuchMethodException: actions.BirthdayAction.setBirthday([Ljava.lang.String;) 错误信息指,没有发现形参为String类型的setBirthday方法。即,将19491001当作了String,而非Date 输入地址: http://127.0.0.1:8080/typeconverter/

 


 


 

 

 那么,如何能够让Struts2将19491001当作Date类型?

更一般化地讲,如何将某种非基本类型的请求参数值,让Struts2直接当作该非基本类型,而非当作String类型? 此时就需要使用类型转换器。 类型转换器 自定义类型转换器类,是继承自com.opensymphony. xwork2.conversion.impl.DefaultTypeConverter类的。在使用时,一般需要覆盖其父类的方法 public Object convertValue(Map<String, Object> context, //OGNL表达式上下文Object value, //待转换的值Class toType //要转换为的类型 )

 注意:定义convertValue方法时需要注意,其转换一般是定义为双向的。

实例步骤: 在上例中定义类型转换器类:                           typeconverters.Date_String_Converter           需要注意第二个参数value,若转换方向为从请求到action,则value为字符串数组。因为请求中是允许携带多个同名参数的,而这时的这个同名参数,其实就是数组。 Struts2为了兼顾到这种多个同名参数的情况,就将从请求到action方向的转换的value指定为了String[],而非String。 在定义好类型转换器后,需要注册该转换器,用于通知Struts2框架在遇到指定类型变量时,需调用类型转换器。

 具体解决方法:

在原有代码基础上新建继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类的String_Date_Converter.java。

 

 

 String_Date_Converter.java完成源码如下:

package typeconverters;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map;import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;public class String_Date_Converter extends DefaultTypeConverter {@Overridepublic Object convertValue(Map<String, Object> context, Object value,Class toType) {//MM代表两位数的月,不可以小写,小写mm就成了两位数的分SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");try {if(toType==Date.class){String[] params=(String[]) value;//将字符串解析为日期类型return sf.parseObject(params[0]);}else if(toType==String.class){//注意这里导入import java.util.Date;Date date=(Date)value;//将日期类型格式化为指定格式的字符串return sf.format(date);}} catch (ParseException e) {// TODO Auto-generated catch block e.printStackTrace();}return null;}} 根据注册方式的不同及其应用范围的不同,可以将类型转换器分为两类: 1.局部类型转换器 2.全局类型转换器 局部类型转换器 局部类型转换器,仅仅对指定Action的指定属性起作用。 注册方式: 在Action类所在的包下放置名称为如下格式的属性文件: ActionClassName-conversion.properties文件。 其中ActionClassName是Action类名,-conversion.properties是固定写法。 就本例而言,该注册文件的名称应为BirthdayAction-conversion.properties 。 此文件的内容也遵循一种格式:                            属性名称=类型转换器的全类名             对于本例而言,文件中的内容为:         birthday=typeconverters.Date_String_Converter 注册方式: 在actions包中新建属性文件BirthdayAction-conversion.properties。 全局类型转换器 全局类型转换器,会对所有Action的指定类型的属性生效。 注册方式: 在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。 该文件的内容格式为:待转换的类型=类型转换器的全类名。 局部类型转换器 具体方法: 在actions包中新建属性文件BirthdayAction-conversion.properties。 局部类型转换器注册成功!

重新部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/


 

注意:这时候1949-10-01提交就会错误,要想实现19491001和1949-10-01都可用,只需多定义几个转换器即可。

 全局类型转换器:

注册方式: 在WEB-INF/classes下,即在src目录下放置名称如下的属性文件xwork-conversion.properties。 该文件的内容格式为:待转换的类型=类型转换器的全类名。

 

 

 

 

 


 

重新部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/typeconverter/

 

转载于:https://www.cnblogs.com/xingyunblog/p/4008105.html

与50位技术专家面对面20年技术见证,附赠技术全景图

总结

以上是生活随笔为你收集整理的8.Struts2类型转换器的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。