日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

8.Struts2类型转换器

發布時間:2025/3/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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类型转换器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。