1. 程式人生 > >struts2-型別轉換器

struts2-型別轉換器

struts2在接受資料後,會將接收到的資料轉換成對應的資料型別。這裡是struts2中型別轉換器的作用,而其中預設的型別轉換器有如下(struts-default.xml檔案中):
這裡寫圖片描述
頁面資料提交,轉換器收到資料後執行convertValue()方法,將相應的string字串按照內部對應屬性型別進行轉換,在資料傳回頁面時,有經過轉換器將所以轉換成string字串。

在struts2中要實現資料回顯(格式錯誤時跳轉回提交頁面,顯示資料並提示錯誤)要藉助struts-tags的標籤,並在struts.xml對應頁面action下,加入name=”input”的頁面(struts2預設要求)。

 <result name="input">/test.jsp</result>

test.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <s:form action="test/some" method="post"> <s:textfield name="date" label="date"></s:textfield> <s:textfield
name="age" label="age">
</s:textfield> <s:submit value="submit"></s:submit> </s:form> </body> </html>

如上,在資料格式錯誤時會有相應提示與資料回顯:
這裡寫圖片描述


自定義的型別轉換器(時間型別轉換器)
1、參照原始碼
這裡寫圖片描述
2、myDateConvert.java

public class myDateConvert extends DefaultTypeConverter {


    //value接受的是String[],class是要被轉換的型別,因為頁面到服務端和服務端到頁面都要經過轉換器,所以內部是雙向邏輯。
    @Override
    public Object convertValue(Object value, Class toType) {
        SimpleDateFormat sdf = null; //new一個時間格式空物件
        try{
        if(toType == Date.class){//頁面到服務端
            String dateStr = ((String[])value)[0];//獲取要被轉換為date引數的第一個string字串
            sdf = getSimpleDateFormat(dateStr);//通過方法獲取到對應的格式
            ActionContext.getContext().getSession().put("sdf", sdf);//將格式存入session中,以便在回顯和頁面獲取資料時的格式轉換
            return sdf.parse(dateStr);//返回按格式轉換的date值
        }
        else if(toType == String.class){//服務端到頁面
            Date date = (Date)value;//回顯時資料單值,強轉date
            sdf = (SimpleDateFormat)ActionContext.getContext().get("sdf");//session獲取格式
            return sdf.format(date);//返回按格式轉換後的string字串
        }
        }catch(ParseException e){
            e.printStackTrace();//這個解析異常只會在後臺丟擲,不會在回顯頁面提示,所以在獲取格式的方法中就丟擲型別轉換異常
        }

        return super.convertValue(value, toType);
    }

    private SimpleDateFormat getSimpleDateFormat(String dateStr) {
        //根據這裡的格式進行判斷,若沒有相應格式即丟擲異常      
        SimpleDateFormat sdf = null;
        if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", dateStr)){//用模組匹配來判斷格式
            sdf = new SimpleDateFormat("yyyy-MM-dd");
        }else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)){
            sdf = new SimpleDateFormat("yyyy/MM/dd");
        }else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)){
            sdf = new SimpleDateFormat("yyyyMMdd");
        }else {
            throw new TypeConversionException();//若格式都不符合則丟擲異常
        }
        return sdf;
    }

}

3、這是自定義的轉換器,要進行配置,為action指定轉換器。
通過區域性型別轉換註冊:

  • 在指定action所在包下,新建properties檔案,action名-conversion.properties
  • 內容:屬性=轉換器的全限定性類名
    這裡寫圖片描述
    執行:這裡寫圖片描述

4、這裡資料回顯後的錯誤提示都是英文,於是可以自定義:

  • 在對於action包下,新建action名.properties
  • 內容:invalid.fieldvalue.變數名=錯誤提示資訊

這裡寫圖片描述
5、測試執行:
這裡寫圖片描述