• <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自定義類型轉換器

    為什么需要類型轉換器

    當在表單中輸入填入日期時, 格式有很多,比如可以輸入1990年1月1日, 也可以填1990-01-01等多種方法, 這時候使用自定義類型的轉換器可以將格式進行轉化, 變為Action類可讀的格式

    類型轉換器的種類

    1. 基于OGNL的類型轉換器

    要創建基于ognl的類型轉換器, 必須實現DefaultTypeConverter 并重寫convertValue方法
    在入口的jsp頁面表單中, 放入兩個文本框, 分別輸入一個數字,和一個日期, 由于用戶很可能不輸入正確的數字, 或者多種格式的日期,所以我們需要自定義類型轉換 ,還需要對錯誤的進行處理

      <body>
            <s:form action="action">
                <s:textfield name="num" label="數字"></s:textfield>
                <s:textfield name="birthday" label="生日"></s:textfield>
                <s:submit value="提交"></s:submit>
            </s:form>
      </body>

    action類僅僅如此,不需要別的操作

    public class Struts2Action extends ActionSupport{
        Date birthday;
        int num;
    
        @Override
        public String execute() throws Exception {
            return Action.SUCCESS;
        }
        public Date getBirthday() {
            return birthday;
        }
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
    }
    

    再來寫我們的轉換器, 繼承DefaultTypeConverter
    其中convertValue方法的三個參數分別表示為:
    context 上下文對象
    value 需要進行類型轉換的參數, 是一個數組
    toType 需要轉成什么類.
    方法中分為兩種清空,使用toType來區分是從字符串轉成日期,還是從日期轉成字符串,其中dfs數組用多個SimpleDateFormat來格式化用戶的輸入,如果都沒有到達用戶的輸入要求則會拋出TypeConversionException();

    public class MyDateConverter extends DefaultTypeConverter{
        //日期格式
        final DateFormat[] dfs = {new SimpleDateFormat("yyyy年MM月dd日"),
                                new SimpleDateFormat("yyyy-MM-dd"),
                                new SimpleDateFormat("yyyy/MM/dd"),
                                new SimpleDateFormat("yyyy.MM.dd")};
        @Override
        public Object convertValue(Map<String, Object> context, Object value,
                Class toType) {
            System.out.println("進入");
            if (toType == Date.class){
                String dateStr = ((String[])value)[0];
                System.out.println("form:"+dateStr);
                for (int i=0; i<dfs.length; i++){
                    try {
                        return dfs[i].parse(dateStr);
                    } catch (ParseException e) {
                        continue;
                    }
                }
    
            }else if (toType == String.class){
                Date date = (Date)value;
                return dfs[0].format(date);
            }
            throw new TypeConversionException();
        }
    }

    完成了轉換器, 接著要將轉換器和action類建立聯系,不然他兩不就不認識了, 聯系起來有兩種方式,一種是全局范圍轉換器, 另一個是應用于特定類的轉換器
    應用于特定類的轉換器配置如下:

    在action類同包下創建文件:ClassName-conversion.properties (其中ClassName指的是action類名) 編輯內容: 屬性名=類型轉換器的限定名

    全局范圍轉換器:

    在src目錄下創建xwork-converter.properties文件, 編輯內容:需要轉換的類的限定名=類型轉換器限定名 (這里的需要轉換的類是java.util.Date)

    配置struts.xml文件如下, 其中當輸入錯誤的信息就會action類就會返回input,將錯誤信息回顯到index.jsp中

    <struts>
        <package name="demo" extends="struts-default" namespace="/">
            <action name="action" class="defaultStruts2.Struts2Action">
                <result name="success">success.jsp</result>
                <result name="input">index.jsp</result>
            </action>
        </package>
    </struts>

    為了讓當輸入錯誤信息返回到index.jsp后,在頁面上顯示中問, 還需要修改錯誤的信息,步驟如下:
    在Action同包下創建ClassName.properties文件(其中ClassName表示Action類,我這里是Struts2Action) 編輯文件如下 , \u是由于properties文件無法顯示中文的原因

    invalid.fieldvalue.birthday=\u65E5\u671F\u9519\u8BEF
    invalid.fieldvalue.num=\u6570\u5B57\u9519\u8BEF

    最后的success.jsp顯示正確的信息:

      <body>
        <s:property value="num"/>
        <s:property value="birthday"/>
        <s:debug></s:debug>
      </body>

    錯誤結果:
    這里寫圖片描述
    正確結果:
    這里寫圖片描述

    2.基于struts2的類型轉換器

    使用struts2的類型轉換器需要繼承StrutsTypeConverter類, 并實現兩個抽象方法convertFromString和convertToString, 其中第一個方法作用為將String => 對象, 第二個作用是對象 =》 String.
    基于struts2的類型轉換器代碼如下, 感覺也就是把方法寫分開了, 其他都一樣

    
    public class DateConverter extends StrutsTypeConverter{
    
        //日期格式
        final DateFormat[] dfs = {new SimpleDateFormat("yyyy年MM月dd日"),
                                new SimpleDateFormat("yyyy-MM-dd"),
                                new SimpleDateFormat("yyyy/MM/dd"),
                                new SimpleDateFormat("yyyy.MM.dd")};
    
        @Override
        public Object convertFromString(Map context, String[] values, Class toClass) {
    
            String dateStr = values[0];
            for(int i =0 ;i<dfs.length; i++){
                System.out.println(dateStr);
                try {
                    return dfs[i].parse(dateStr);  //轉成date類型
                } catch (Exception e) {
                    continue;
                }
            }
            throw new TypeConversionException();
        }
    
        @Override
        public String convertToString(Map context, Object o) {
    
            Date date = (Date)o;
            String str = new SimpleDateFormat("yyyy-MM-dd").format(date);
            return str;
        }
    }
    
    版權聲明:本文為qq_36238595原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_36238595/article/details/78661603

    智能推薦

    自定義類型轉換器

    自定義類型轉換器 字符串變成對象 自定義步驟 1 修改input.jsp頁面,實現Employee字符串變為POJO 2 Handler 3 自定義的轉化器(@Component) 4 springmvc的配置文件ConversionServiceFactoryBean 5 <mvc:annotation-driven>引用轉換器 6 debug  ...

    自己定義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 轉換器應用

    1. 為什么要使用轉換器? 答:所有頁面與控制器傳遞的數據均為String類型,而我們在對其進行處理時可能會用到各種數據類型,程序無法自動完成數據類型的轉換,需要我們在代碼中手動完成,這個過程稱為類型轉換。 2.在struts2中內置了類型轉換器,如果內置轉換器滿足不了我們的需求的話,那么我們就要自己創建屬于自己的類型轉換器了。 先講一個重要的接口ongl.TypeConverter,該接口里面只...

    Struts2第五篇【類型轉換器、全局、局部類型轉換器】

    前言 上篇博文已經講解了,Struts2為我們實現了數據自動封裝…由上篇的例子我們可以看出,表單提交過去的數據全都是String類型的,但是經過Struts自動封裝,就改成是JavaBean對應成員變量的類型了。 但是呢,日期類型只支持是yyyy-MM-dd這種格式的,因為我們在上個例子中直接使用的是Struts支持的格式,因此沒有報錯…本篇博文就是講解Struts如何...

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

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

    猜你喜歡

    SpriingMVC 04 類型轉換器---自定義類型轉換器

    創建一個添加商品信息的應用程序,通過使用自定義類型的轉換器實現功能 1.目錄結構 2.注解控制器的應用 2.1 web.xml文件 , 導入jar 包(這里不在提醒) 2.2 DispatcherServlet-servlet.xml 文件 建議將 這個自定義轉換器代碼 放到 掃描器的上面, 我這里之前因為這給報了500,說是找不到 這個自定義轉換器 2.3 Controller 文件 2.4 自...

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

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

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

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

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

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

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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