爪哇一角

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

          十 自定義UIComponent

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

          這里介紹的是讓Component自身負責編碼,解碼的例子。

          我們設(shè)置一個簡單的組件,一個文本框加一個按鈕。

          這里我們可以繼承已經(jīng)實現(xiàn)的UIComponent組件UIInput。

          package test;

          import java.io.IOException;

          import java.util.Map;

          import javax.faces.component.UIInput;

          import javax.faces.context.FacesContext;

          import javax.faces.context.ResponseWriter;

          繼承已經(jīng)實現(xiàn)UIComponentUIInput。

           
          public class UITextWithCmd extends UIInput {

          private static final String TEXT = ".text";

              private static final String CMD = ".cmd";

              //不使用Renderer進行解碼

          可以設(shè)定此組件的解碼,編碼不使用Renderer。

           
              public UITextWithCmd() {

                  setRendererType(null); 

              }

              //--------編碼,生成HTML標簽--------------

              public void encodeBegin(FacesContext context)

          實現(xiàn)前臺表現(xiàn)層的編碼??梢跃帉懗?/span>HTML或者其他表現(xiàn)層語言。

           
                                                throws IOException {

                  ResponseWriter writer = context.getResponseWriter();

                  String clientId = getClientId(context);

                

                  encodeTextField(writer, clientId);

                  encodeCommand(writer, clientId);

              }

              private void encodeTextField(ResponseWriter writer,

                                  String clientId) throws IOException {

                  writer.startElement("input", this);

                  writer.writeAttribute("name", clientId + TEXT, null);

                

                  //getValue()繼承于UIInput

                  Object value = getValue();

                  if(value != null) {

                      writer.writeAttribute("value",

                                            value.toString(), null);

                  }

                  String size = (String) getAttributes().get("size");

                  if(size != null) {

                      writer.writeAttribute("size", size, null); 

                  }

                  writer.endElement("input");

              }

              private void encodeCommand(ResponseWriter writer,

                                  String clientId) throws IOException {

                  writer.startElement("input", this);

                  writer.writeAttribute("type", "submit", null);

                  writer.writeAttribute("name", clientId + CMD, null);

                  writer.writeAttribute("value", "submit", null);

                  writer.endElement("input");

              }

          實現(xiàn)標簽輸入值的解碼。取得標簽的輸入值綁定到響應(yīng)的Bean。

           
              // ..........解碼,取得標簽的輸入值...................................

              public void decode(FacesContext context) {

                  Map reqParaMap = context.getExternalContext().

                                          getRequestParameterMap();

                  String clientId = getClientId(context);

                  String submittedValue =

                             (String) reqParaMap.get(clientId + TEXT);

                  setSubmittedValue(submittedValue);

                  setValid(true);

              }

          }

          在配置文件faces-config.xml中聲明自定義組件。

          <!-- 自定義組件 -->

           <component>

               <component-type>test.TextWithCmd</component-type>

               <component-class>test.UITextWithCmd</component-class>

           </component>

          這樣,自定義的UIComponent組件就完成了。

           

          主站蜘蛛池模板: 石阡县| 洞口县| 通化市| 桃园县| 句容市| 阿坝| 靖西县| 阳江市| 淮滨县| 专栏| 行唐县| 南平市| 桂阳县| 峨眉山市| 临城县| 江城| 革吉县| 临泽县| 渭源县| 长顺县| 吴忠市| 乐山市| 广元市| 临江市| 罗城| 天津市| 长寿区| 南城县| 民丰县| 周宁县| 甘孜县| 龙岩市| 永清县| 石门县| 建昌县| 响水县| 海南省| 磐石市| 鹤壁市| 龙陵县| 隆尧县|