爪哇一角

          共同探討STRUTS#HIBERNATE#SPRING#EJB等技術(shù)
          posts - 3, comments - 6, trackbacks - 0, articles - 99
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          四 JSF轉(zhuǎn)換器

          Posted on 2009-01-20 14:47 非洲小白臉 閱讀(391) 評(píng)論(0)  編輯  收藏 所屬分類: JSF

          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)我們需要在頁(yè)面上綁定或者顯示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,用來(lái)顯示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è)子頁(yè)面的跳轉(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)單的說(shuō),第一個(gè)方法會(huì)接收從客戶端經(jīng)由HTTP傳來(lái)的字符串?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)換成Beandate變量,顯示時(shí)再由Date型轉(zhuǎn)成String顯示在頁(yè)面上。

          但是很多項(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,

          頁(yè)面輸入信息的轉(zhuǎn)換

           
                               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);

          頁(yè)面顯示信息的轉(zhuǎn)換

           
                        }

                 }

                 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í)定義表示頁(yè)面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>

          更新Tomcathttp://localhost:8080/jsfTest/pages/jsfMyCoverter.faces就可以看到自定義的轉(zhuǎn)換器了。

          具體程序參看示例程序。

           

          主站蜘蛛池模板: 吴桥县| 康保县| 禄丰县| 秦安县| 阿城市| 乌拉特中旗| 溧阳市| 玉林市| 朝阳区| 江西省| 吉隆县| 连山| 南宫市| 枣庄市| 连平县| 团风县| 河源市| 舞钢市| 大田县| 二连浩特市| 鄂州市| 南城县| 海伦市| 大兴区| 赤水市| 望奎县| 三原县| 三门县| 达尔| 五指山市| 遂昌县| 丰原市| 平南县| 图木舒克市| 中宁县| 太湖县| 万年县| 巴塘县| 米林县| 仲巴县| 祥云县|