• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • struts2 自定義類型轉換器

    一、問題的引出
    Struts2的類型轉換是基于OGNL表達式的,由于請求的參數都是字符串,而JAVA 本身屬于強類型的的語言,這樣就需要把請求參數字符串轉換成其他類型。

    Struts2的類型轉換器都需要實現一個TypeConverter接口,該接口位于ognl.jar包內,也是就Struts2框架的轉換器使用了OGNL技術。該接口定義了一個convertValue()方法,實現該接口的類型轉換器實現類都需要重寫該方法來進行類型轉換。OGNL還提供了一個實現TypeConverter接口的類DefaultTypeConverter,開發者只要繼承該類,就可以開發類型轉換器的實現類。


    二、Struts2自定義類型轉換器分為局部類型轉換器和全局類型轉換器

    (1)局部類型轉換器
    如果頁面傳來一個參數reg.action?birthday=2010-11-12到后臺action,然后屬性用date類型是可以接收到的,但是如果傳的是20101112這樣類型的字符串,用date類型是獲取不到,并且會出現錯誤的,struts2提供了一種類型轉換器供我們使用。

    以下為局部類型轉換器的開發步驟
    a.首先要寫一個類來繼承DefaultTypeConverter
    b.然后覆蓋convertValue這個方法,在里面進行數據轉型
    c.在action類所在的包下放置ActionClassName-conversion.properties文件,ActionClassName是類名,后面的-conversion.properties是固定的寫法,
    如:HelloWorldAction-conversion.properties

    d.Properties文件里面的內容為:屬性名稱=類型轉換器的全類名(既包名.類名)

    如:birthday=com.ljq.type.converter.DateTypeConverter

    (2)全局類型轉換器
    如果業務需求所有的日期都要轉換,則可以使用全局類型轉換器,只要在src根目錄下面放置xwork-conversion.properties文件,并且properties文件中的內容為:
    待轉換的類型=類型轉換器的全類名
    如:java.util.Date = com.type.Converter.DateTypeConverter 即可


    代碼
    Action類

    package com.ljq.action;
    
    import java.util.Date;
    
    public class HelloWorldAction {
    // 日期
    private Date birthday;
    // 枚舉
    private Gender gender;
    
    public String execute() {
    return "success";
    }
    
    public Date getBirthday() {
    return birthday;
    }
    
    public void setBirthday(Date birthday) {
    System.out.println("birthday="+birthday);
    this.birthday = birthday;
    }
    
    // 自定義枚舉
    public enum Gender {
    MAN,WOMEN
    }
    
    public Gender getGender() {
    return gender;
    }
    
    public void setGender(Gender gender) {
    System.out.println("gender="+gender);
    this.gender = gender;
    }
    
    }

    日期類型轉換器

    package com.ljq.type.converter;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    
    /**
    * 日期自定義類型轉換器
    * 
    * @author jiqinlin
    *
    */
    public class DateTypeConverter extends DefaultTypeConverter {
    
    @SuppressWarnings("unchecked")
    @Override//其中,context是類型轉換環境的上下文,value是需要轉換的參數,toType 是轉換后的目標類型。
    public Object convertValue(Map<String, Object> context, Object value,
    Class toType) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
    try {
    if (toType == Date.class) { // 當字符串向Date類型轉換時,這時value的來源是從url或者表單提交
    String[] params = (String[]) value;
    return sdf.parseObject(params[0]);// Request.getParameterValues() ,轉換為string數組是因為像復選框之類的組件可以提交的值是一個數組//解析成日期格式(注意:這里的日期一定要是util包下的日期)
    } else if (toType == String.class) {//當Date轉換成字符串時,這時value的來源是action類,因此value不要強轉為數組形式(注意:使用EL表達式向頁面輸出是該if不會被執行,只有使用OGNL表達式向頁面輸出是才會進入此if語句)
    Date date=(Date)value;
    return sdf.format(date);//轉換為字符串
    }
    } catch (java.text.ParseException e) {
    e.printStackTrace();
    }
    return null;
    }
    }

    枚舉類型轉換器

    package com.ljq.type.converter;
    
    import java.util.Map;
    
    import com.ljq.action.HelloWorldAction.Gender;
    import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
    
    /**
    * 枚舉自定義類型轉換器
    * 
    * @author jiqinlin
    *
    */
    public class GenderTypeConverter extends DefaultTypeConverter{
    
    @Override
    public Object convertValue(Map<String, Object> context, Object value,
    Class toType) {
    if(toType==Gender.class){ //當字符串向Gender類型轉換時
    String[] params=(String[])value;
    return Gender.valueOf(params[0]);
    }else if (toType==String.class) { //當Gender轉換成字符串時
    Gender gender=(Gender)value;
    return gender.toString();
    }
    return null;
    }
    }

    配置類型轉換器

    測試路徑
    日期
    http://localhost:8083/struts2/control/employee/list_execute.do?birthday=20110315 23:34:55
    枚舉
    http://localhost:8083/struts2/control/employee/list_execute.do?gender=WOMEN
    
    
    局部類型轉換器: HelloWorldAction-conversion.properties
    birthday=com.ljq.type.converter.DateTypeConverter
    gender=com.ljq.type.converter.GenderTypeConverter
    
    
    全局類型轉換器: xwork-conversion.properties
    java.util.Date=com.ljq.type.converter.DateTypeConverter

    在頁面打印日期和枚舉的值

    birthday=${birthday }
    gender=${gender }


    參考鏈接:

    http://blog.csdn.net/gzx2080205/article/details/6340056

    http://blog.163.com/taodengwen@126/blog/static/87199341201282712417646/

    版權聲明:本文為iteye_8785原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/iteye_8785/article/details/82580666

    智能推薦

    自己定義struts2中action類型轉換器

    DateAction.java中代碼例如以下: struts2.xml: date.jsp: 代碼如上,假設在地址欄輸入: http://localhost:8080/struts2_itheima/dateAction? time=2011-01-04 控制臺和jsp都可以正常輸出: 可是假設地址欄輸入: http://localhost:8080/struts2_itheima/dateAct...

    【Struts2】(2)Struts2校驗框架、Struts2攔截器、Struts2轉換器

    一、Struts2校驗框架 輸入校驗幾乎是任何一個系統都需要開發的功能模塊,我們無法預料用戶如何輸入,但是必須全面考慮用戶輸入的各種情況,尤其需要注意那些非正常輸入。Struts2提供了功能強大的輸入校驗機制,通過Struts2內建的輸入校驗器,在應用程序中無需書寫任何代碼,即可完成大部分的校驗功能,并可以同時完成客戶端和服務器端的校驗。 如果應用的輸入校驗規則特別,Struts2也允許通過重寫v...

    Struts2(12)_Struts2 攔截器

    本系列博客匯總在這里:Struts2 匯總 攔截器 一、struts 攔截器介紹 二、自定義攔截器 三、攔截器和攔截器棧的配置 四、排除 Action 的攔截 源碼工程文件為:struts2_14 一、struts 攔截器介紹 Struts2 的核心就是攔截器,param,modelDriven,validation,servletAPI 等等這些都是攔截器完成的功能。 服務器啟動時實例化 Str...

    Struts2框架之自定義參數類型轉換

    在前端提交的表單中有時會遇到需要手動轉換的參數類型,比如日期格式,struts2默認的轉換器只能將yyyy-MM-dd格式的字符串轉成日期Date型,但是假設現在的需求是yyyy/MM/dd,這時我們就需要自定義轉換器。 1、日期轉換Demo 首先我們通過一個用戶注冊的Demo演示日期的轉換。 ①、項目目錄結構 ②、User.java類 ③、RegisterAction.java類 ④、strut...

    Struts2 自定義攔截器

    1. 什么是攔截器 攔截器是Struts2最強大的特性之一,是Struts2的核心之一,Struts2中的很多功能都是由攔截器完成的,是AOP編程思想的一個應用形式。 自定義一個攔截器需要三步: 1 .自定義一個實現Interceptor接口(或者繼承自AbstractInterceptor)的類。 2 .在struts.xml中注冊上一步中定義的攔截器。 3 .在需要使用的Action中引用上述...

    猜你喜歡

    struts2中自定義攔截器

    struts2里在struts-default.xml文件中有個叫defaultStack的攔截器棧這是默認的攔截器棧,我們之前的參數封裝params和servlet-config攔截器都包含在這里面。當這里面的攔截器滿足不了我們的需求時,我們可以自定義攔截器或攔截器棧,并將其設置為默認攔截器棧。 這里我們自定義一個登陸驗證攔截器,除了登陸動作以外,其他動作全部攔截,那么此時我們需要一個叫Meth...

    struts2自定義攔截器

    第一步:寫action 第二步:寫攔截器 第三步:配置web.xml 第四步:配置struts2.xml 第五步:登錄頁面(login.jsp) 第六步:主頁面(main.jsp) 登錄界面: 直接進入主頁面 登錄后才能顯示商品信息...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡