8.Struts2类型转换器
類型轉(zhuǎn)換器
1、引入
在Struts2中,請求參數(shù)類型不僅可以是String,還可以是其它類型。
如,定義一個請求參數(shù)birthday為Date類型,給其賦值為1949-10-1,
則birthday接收到的不是字符串“1949-10-1”,而是日期類型。
但,需注意的是,對于基本數(shù)據(jù)類型,需將其定義為包裝類型。
實例:請求參數(shù)值的類型-- typeconverter
Step1:編寫index.jsp與show.jsp
Step2:編寫B(tài)irthday_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>?部署發(fā)布,啟動tomcat,輸入地址:
http://127.0.0.1:8080/typeconverter/
?
?
?
當(dāng)在表單中填入1949-10-1時,提交,便可看到Sat Oct 01 00:00:00 CST 1949的顯示結(jié)果。
說明,Struts2將1949-10-1作為Date類型接收了。
若在表單中填入的是19491001時,發(fā)現(xiàn)也可看到相應(yīng)的結(jié)果,但,控制臺報錯: java.lang.NoSuchMethodException: actions.BirthdayAction.setBirthday([Ljava.lang.String;) 錯誤信息指,沒有發(fā)現(xiàn)形參為String類型的setBirthday方法。即,將19491001當(dāng)作了String,而非Date。 輸入地址: http://127.0.0.1:8080/typeconverter/
?
?
?
?
?那么,如何能夠讓Struts2將19491001當(dāng)作Date類型?
更一般化地講,如何將某種非基本類型的請求參數(shù)值,讓Struts2直接當(dāng)作該非基本類型,而非當(dāng)作String類型? 此時就需要使用類型轉(zhuǎn)換器。 類型轉(zhuǎn)換器 自定義類型轉(zhuǎn)換器類,是繼承自com.opensymphony. xwork2.conversion.impl.DefaultTypeConverter類的。在使用時,一般需要覆蓋其父類的方法 public Object convertValue(Map<String, Object> context, //OGNL表達式上下文Object value, //待轉(zhuǎn)換的值Class toType //要轉(zhuǎn)換為的類型 )?注意:定義convertValue方法時需要注意,其轉(zhuǎn)換一般是定義為雙向的。
實例步驟: 在上例中定義類型轉(zhuǎn)換器類: ????????????????????????? typeconverters.Date_String_Converter ????????? 需要注意第二個參數(shù)value,若轉(zhuǎn)換方向為從請求到action,則value為字符串?dāng)?shù)組。因為請求中是允許攜帶多個同名參數(shù)的,而這時的這個同名參數(shù),其實就是數(shù)組。 Struts2為了兼顧到這種多個同名參數(shù)的情況,就將從請求到action方向的轉(zhuǎn)換的value指定為了String[],而非String。 在定義好類型轉(zhuǎn)換器后,需要注冊該轉(zhuǎn)換器,用于通知Struts2框架在遇到指定類型變量時,需調(diào)用類型轉(zhuǎn)換器。?具體解決方法:
在原有代碼基礎(chǔ)上新建繼承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代表兩位數(shù)的月,不可以小寫,小寫mm就成了兩位數(shù)的分SimpleDateFormat sf=new SimpleDateFormat("yyyyMMdd");try {if(toType==Date.class){String[] params=(String[]) value;//將字符串解析為日期類型return sf.parseObject(params[0]);}else if(toType==String.class){//注意這里導(dǎo)入import java.util.Date;Date date=(Date)value;//將日期類型格式化為指定格式的字符串return sf.format(date);}} catch (ParseException e) {// TODO Auto-generated catch block e.printStackTrace();}return null;}} 根據(jù)注冊方式的不同及其應(yīng)用范圍的不同,可以將類型轉(zhuǎn)換器分為兩類: 1.局部類型轉(zhuǎn)換器 2.全局類型轉(zhuǎn)換器 局部類型轉(zhuǎn)換器 局部類型轉(zhuǎn)換器,僅僅對指定Action的指定屬性起作用。 注冊方式: 在Action類所在的包下放置名稱為如下格式的屬性文件: ActionClassName-conversion.properties文件。 其中ActionClassName是Action類名,-conversion.properties是固定寫法。 就本例而言,該注冊文件的名稱應(yīng)為BirthdayAction-conversion.properties 。 此文件的內(nèi)容也遵循一種格式: ?????????????????????????? 屬性名稱=類型轉(zhuǎn)換器的全類名 ??????????? 對于本例而言,文件中的內(nèi)容為: ??????? birthday=typeconverters.Date_String_Converter 注冊方式: 在actions包中新建屬性文件BirthdayAction-conversion.properties。 全局類型轉(zhuǎn)換器 全局類型轉(zhuǎn)換器,會對所有Action的指定類型的屬性生效。 注冊方式: 在WEB-INF/classes下,即在src目錄下放置名稱如下的屬性文件xwork-conversion.properties。 該文件的內(nèi)容格式為:待轉(zhuǎn)換的類型=類型轉(zhuǎn)換器的全類名。 局部類型轉(zhuǎn)換器 具體方法: 在actions包中新建屬性文件BirthdayAction-conversion.properties。 局部類型轉(zhuǎn)換器注冊成功!
重新部署發(fā)布,啟動tomcat,輸入地址:
http://127.0.0.1:8080/typeconverter/
?
注意:這時候1949-10-01提交就會錯誤,要想實現(xiàn)19491001和1949-10-01都可用,只需多定義幾個轉(zhuǎn)換器即可。
?全局類型轉(zhuǎn)換器:
注冊方式: 在WEB-INF/classes下,即在src目錄下放置名稱如下的屬性文件xwork-conversion.properties。 該文件的內(nèi)容格式為:待轉(zhuǎn)換的類型=類型轉(zhuǎn)換器的全類名。?
?
?
?
?
?
重新部署發(fā)布,啟動tomcat,輸入地址:
http://127.0.0.1:8080/typeconverter/
?
轉(zhuǎn)載于:https://www.cnblogs.com/xingyunblog/p/4008105.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的8.Struts2类型转换器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP之基本语法
- 下一篇: [Leetcode][JAVA] Reo