1.JSF轉(zhuǎn)換器的應(yīng)用
Web應(yīng)用程式與瀏覽器之間傳送的資料基本上都是字串文字,而Java應(yīng)用程式本身基本上則是物件,所以物件資料必須經(jīng)由轉(zhuǎn)換傳送給瀏覽器.
JSF定義了一系列標(biāo)準(zhǔn)的轉(zhuǎn)換器(Converter),對(duì)于基本資料型態(tài)
(primitive type)或是其Wrapper類別,
JSF會(huì)使用
javax.faces.Boolean、
javax.faces.Byte、
javax.faces.Character、
javax.faces.Double、
javax.faces.Float、
javax.faces.Integer、
javax.faces.Long、
javax.faces.Short等自動(dòng)進(jìn)行轉(zhuǎn)換,對(duì)于BigDecimal、BigInteger,則會(huì)使用javax.faces.BigDecimal、javax.faces.BigInteger自動(dòng)進(jìn)行轉(zhuǎn)換。
DateTime、Number,我們可以使用<f:convertDateTime>、<f:convertNumber>標(biāo)簽進(jìn)行轉(zhuǎn)換。
當(dāng)我們需要在頁面上綁定或者顯示Bean里的信息的時(shí)候,如果Bean里的字段不是String類型的,則需要將其先轉(zhuǎn)換成String類型。
例:
先定義一個(gè)Bean,里面包含了一個(gè)Date類型的變量。
package test;
import java.util.Date;
//JSF的轉(zhuǎn)換器示例
public class JsfCoverter {
private Date date = new Date();
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
再建立一個(gè)Jsp,用來顯示JsfCoverter里面的變量date。
<%@ taglib
uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib
uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@page
contentType="text/html;charset=utf-8"%>
<f:view>
<html>
<head>
<title>轉(zhuǎn)換器示范</title>
</head>
<body>
<b>
<h:outputText value="#{jsfcover.date}">
<f:convertDateTime pattern="dd/MM/yyyy"
/>
</h:outputText> </b>
<h:form>
<h:inputText
id="dateField" value="#{jsfcover.date}">
<f:convertDateTime
pattern="dd/MM/yyyy" />
</h:inputText>
<h:message for="dateField"
style="color:red" />
<br>
<h:commandButton value="送出"
action="show" />
</h:form>
</body>
</html>
</f:view>
在<f:convertDateTime>中指定了pattern的樣式為dd/MM/yyyy,你在<h:inputText>中輸入的是String類型的信息,但是和這個(gè)字段綁定的是一個(gè)Date變量(jsfcover.date),
因此你必須將輸入的String類型轉(zhuǎn)換成Date類型才行。而<f:convertDateTime>就是幫我們做這件事的。
如果轉(zhuǎn)換出錯(cuò)的話,<h:message>則會(huì)顯示錯(cuò)誤信息。
當(dāng)然,我們還需要配置定義的Bean,以及設(shè)子頁面的跳轉(zhuǎn),才能正常運(yùn)行。
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>show</from-outcome>
<to-view-id>/pages/jsfCoverter.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<!--
jsf轉(zhuǎn)換器 -->
<managed-bean>
<managed-bean-name>jsfcover</managed-bean-name>
<managed-bean-class>test.JsfCoverter</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
啟動(dòng)Tomcat,就可以運(yùn)行了http://localhost:8080/jsfTest/pages/jsfCoverter.faces
具體程序參看示例程序.
2.自定義JSF轉(zhuǎn)換器
除了使用標(biāo)準(zhǔn)的轉(zhuǎn)換器之外,您還可以自行定制您的轉(zhuǎn)換器,您可以實(shí)作javax.faces.convert.Converter接口,這個(gè)接口有兩個(gè)要實(shí)作的方法:
public
Object getAsObject(FacesContext context,
UIComponent component,
String
str);
public String
getAsString(FacesContext context,
UIComponent component,
Object
obj);
簡(jiǎn)單的說,第一個(gè)方法會(huì)接收從客戶端經(jīng)由HTTP傳來的字符串?dāng)?shù)據(jù),您在第一個(gè)方法中將之轉(zhuǎn)換為您的自訂對(duì)象,這個(gè)自訂對(duì)象將會(huì)自動(dòng)設(shè)定給您指定的Bean對(duì)象;
第二個(gè)方法就是將從您的Bean對(duì)象得到的對(duì)象轉(zhuǎn)換為字符串,如此才能藉由HTTP傳回給客戶端。
上面的<f:convertDateTime>轉(zhuǎn)換器可以將用戶輸入的String類型的信息轉(zhuǎn)換成Bean的date變量,顯示時(shí)再由Date型轉(zhuǎn)成String顯示在頁面上。
但是很多項(xiàng)目需要將用戶輸入的或者檢索的不規(guī)則的Date格式統(tǒng)一化,這就需要用戶自己定義一個(gè)共通的轉(zhuǎn)換器了。
首先建立一個(gè)轉(zhuǎn)換器,它要實(shí)現(xiàn)javax.faces.convert.Converter接口:
package
test;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
javax.faces.application.FacesMessage;
import
javax.faces.component.UIComponent;
import
javax.faces.context.FacesContext;
import
javax.faces.convert.Converter;
import
javax.faces.convert.ConverterException;
public class JsfMyCoverter implements Converter {
public Object getAsObject(FacesContext
context, UIComponent component,
String obj) {
// TODO Auto-generated method stub
try {
Date date = new Date();
String objFor =
obj.substring(0,4) + "-"
+ obj.substring(4,6) + "-"
+
obj.substring(6,8);
SimpleDateFormat sdf = new
SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(objFor);
return date;
} catch (Exception e) {
FacesMessage
facesMessage = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"日期格式錯(cuò)誤", "日期格式錯(cuò)誤");
throw new
ConverterException(facesMessage);
}
}
public String getAsString(FacesContext
context, UIComponent component,
Object obj) {
// TODO Auto-generated method stub
String res = null;
if (obj instanceof Date) {
String pattern =
"yyyy-MM-dd";
SimpleDateFormat sdf = new
SimpleDateFormat(pattern);
res = sdf.format(obj);
return res;
}
return res;
}
}
同時(shí)定義表示頁面jsfMyCoverter.jsp.
別忘記在faces-config.xml中完成注冊(cè):
<!--
自定義轉(zhuǎn)換器 -->
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>myConverter</from-outcome>
<to-view-id>/pages/jsfMyCoverter.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<!--
自定義轉(zhuǎn)換器 -->
<converter>
<converter-id>dateFormatCoverter</converter-id>
<converter-class>
test.jsfMyCoverter
</converter-class>
</converter>
更新Tomcat,http://localhost:8080/jsfTest/pages/jsfMyCoverter.faces就可以看到自定義的轉(zhuǎn)換器了。
具體程序參看示例程序。