【struts2】struts2实现自定义数据类型转换器
JSP提交的數據全部都是String類型的。struts2也是通過request.getParameter(name)獲取到String類型數據,并通過攔截器將String轉換成各種常用的數據類型,如:Date、Time、Timestamp等,然后通過getter、setter方法設置到Action對應的屬性上。
struts2默認的轉換器并不總是滿足要求。例如:輸入時間,struts2只能轉換形如12:00:00的格式,而輸入12:00就會拋錯,也有一些數據類型struts2轉換不了。因此,需要自定義數據轉換器。
數據類型轉換器都需要實現ognl.TypeConvertor接口。一般的,直接繼承DefaultTypeConvertor類,并實現
convertValue(Map context,Object value,Class toType)方法就可以了。(DefaultTypeConvertor是位于ognl包下的,是ognl開源標準中的一部分。從此可以看出struts2集成了許多其他的技術。)
convertValue(Map context,Object value,Class toType)方法有三個參數,參數value為待轉換的數據,參數toType為要轉成的類型。注意JSP提交數據時,參數value為request.getParameterValues(String name)返回的String[]類型對象,而不是String。
===========================================
下面自定義一個日期、時間轉換器。該轉換器能夠轉換各種常用的時間格式。convertValue()方法既能將Date轉換成String,也能講String轉換成Date。
==========================================
工作原理:
用戶在convert.jap頁面中輸入要轉換的內容后將請求提交,請求被提交到FilterDispatcher過濾器,FilterDispatcher詢問ActionMapper是否需要調用某個Action來處理這個(HttpServlet Request)請求,如果ActionMapper決定需要調用某個Action,FilterDispatcher則把請求的處理交給ActionProxy,ActionProxy通過Configuration Manager(struts.xml)詢問框架的配置文件,加載一系列的攔截器,找到需要調用的Action類和相應的轉換器,由攔截器將HttpServletRequest參數解析出來,傳入Action,然后由action調用轉換器進行數據轉換處理。
==========================================
實現如下:
DateTimeConvertor.java
package com.lmb.struts2.convertor;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Map;import ognl.DefaultTypeConverter;public class DateTimeConvertor extends DefaultTypeConverter {//日期格式轉化器private DateFormat[] dateFormat={new SimpleDateFormat("yyyy-MM-dd"),//格式如2008-08-08new SimpleDateFormat("yyyy/MM/dd"),//格式如2008/08/08new SimpleDateFormat("yy-MM-dd"),//格式如08-08-08};//時間格式轉化器private DateFormat[] timeFormat={new SimpleDateFormat("HH:mm:ssss"),//格式如13:00:1100new SimpleDateFormat("HH:mm"),//格式如13:00};//重寫轉化方法public Object convertValue(Map context,Object value,Class toType){if(toType.equals(java.sql.Date.class)){//如果是java.sql.Date類型String[] parameterValues=(String[])value;//原始字符串數據for (DateFormat format:dateFormat) {//使用三種格式化其轉化日期try {long n=format.parse(parameterValues[0]).getTime();java.sql.Date date=new java.sql.Date(n);return date;} catch (ParseException e) {}}}else if (toType.equals(java.sql.Time.class)) {//如果是java.sql.Time類型String[] parameterValues=(String[])value;//原始字符串數據for (DateFormat format:timeFormat) {//使用2種格式化其轉化時間try {long n=format.parse(parameterValues[0]).getTime();java.sql.Time time=new java.sql.Time(n);return time;} catch (ParseException e) {}}}else if(toType.equals(java.util.Date.class)){//如果是java.util.Date類型String[] parameterValues=(String[])value;//原始字符串數據for (DateFormat format:dateFormat) {//使用三種格式化其轉化日期try {java.util.Date date=format.parse(parameterValues[0]);return date;} catch (ParseException e) {}}}else if (toType.equals(String.class)) {//如果是字符串if(value instanceof java.sql.Date){}else if(value instanceof java.sql.Time){}else if(value instanceof java.util.Date){String str=dateFormat[0].format((java.util.Date)value);//將Date轉換成字符串return str;}}return super.convertValue(context, value, toType);//否則調用父類方法}}action類:
ConvertorAction.java
(通過為該action配置轉換器來完成轉換)
下面為action配置以及為該action配置轉換器的代碼(注意屬性名是converter,不是convertor)
struts.xml
<action name="convertor" class="com.lmb.struts2.action.ConvertorAction" converter="com.lmb.struts2.convertor.DateTimeConvertor"><result name="success">/convertSuccess.jsp</result><result name="input">/convert.jsp</result></action>轉換器其配置有兩種形式:
1、配置在xwork-conversion.properties中(對所有action都生效);
2、配置在struts.xml的action中(只對某一個action生效);
xwork-conversion.properties是又一個struts2的配置文件,只是名字上還保留著webwork的特征。同其它配置文件一樣放置在“/WEB-INF/classes”下。Properties屬性對的key為需要轉化的類型,value為轉換器的類名。該配置對所有的action都生效。另外轉換器還可以配置只對某個action生效,即在struts.xml的action中進行配置。
在xwork-conversion.properties配置轉換器的代碼如下:
xwork-conversion.properties
java.sql.Date = com.lmb.struts2.convertor.DateTimeConvertor java.sql.Time = com.lmb.struts2.convertor.DateTimeConvertor java.util.Date = com.lmb.struts2.convertor.DateTimeConvertor下面是input輸入頁面。頁面中定義了3個日期輸入域,用于輸入不同格式的日期,例如2008/08/08、2008-08-08、12:00等,代碼如下:
convert.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="struts" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>轉換頁面</title></head><body><struts:form action="convertor"><!-- 提交到"convertor.action" --><struts:label label="轉換器"></struts:label><!-- 文字標簽 --><struts:textfield name="sqlDate" label="SQL Date:"></struts:textfield><!-- 日期類型文本域 --><struts:textfield name="sqlTime" label="SQL Time:"></struts:textfield><!-- 時間類型文本域 --><struts:textfield name="utilDate" label="Util Date:"></struts:textfield><!-- 日期、時間類型文本域 --><struts:submit value="提交" method="convert"></struts:submit><!-- 提交給convert()方法 --></struts:form></body></html>下面是success輸出頁面。該頁面將轉換成功的Date類型輸出。在輸出Action的Date類型屬性時,struts2標簽會再次調用轉換器的convertValue()方法將Date類型轉換成String類型,代碼如下:
convertSuccess.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="struts" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>轉換成功頁面</title></head><body>java.sql.Date:<struts:property value="sqlDate"/><br/><!-- 輸出轉化后的日期 -->java.sql.Time:<struts:property value="sqlTimee"/><br/><!-- 輸出轉化后的時間-->java.util.Date:<struts:property value="utilDate"/><br/><!-- 輸出轉化后的日期、時間 --><a href="convertor.action"><<重新轉換</a></body></html>如果輸入非法的日期格式,將會轉化為null,而不會拋出異常。以為異常在自定義轉換器中用try……catch處理掉了,因此不會出現轉化錯誤的頁面。
總結
以上是生活随笔為你收集整理的【struts2】struts2实现自定义数据类型转换器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJO模式
- 下一篇: 【struts2】struts2的一些常