爪哇一角

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

          十二 自定義Renderer

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

          上面的例子,表現層的編碼,解碼工作都是Component自己完成的,但是這樣的話,自定義Component的重用行就很差了。

          所以這里要自定義一個Renderer來做編碼,解碼工作。要自定義一個Renderer,需要繼承javax.faces.render.Renderer

          package test;

          import java.io.IOException;

          import java.util.Map;

          import javax.faces.component.EditableValueHolder;

          import javax.faces.component.UIComponent;

          import javax.faces.component.UIInput;

          import javax.faces.context.FacesContext;

          import javax.faces.context.ResponseWriter;

          import javax.faces.render.Renderer;

          public class TextCmdRenderer extends Renderer {

          private static final String TEXT = ".text";

              private static final String CMD = ".cmd";

              //編碼

              public void encodeBegin(FacesContext context,

                      UIComponent component) throws IOException {

                   ResponseWriter writer = context.getResponseWriter();

                   String clientId = component.getClientId(context);

                 

                   encodeTextField(component, writer, clientId);

                   encodeCommand(component, writer, clientId);

                }

              //解碼

                public void decode(FacesContext context,

                                          UIComponent component) {

                   Map reqParaMap = context.getExternalContext().

                                              getRequestParameterMap();

                   String clientId = component.getClientId(context);

                 

                   String submittedValue =

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

                   ((EditableValueHolder) component).setSubmittedValue(

                                                        submittedValue);

                   ((EditableValueHolder) component).setValid(true);

                }

                private void encodeTextField(UIComponent component,

                                ResponseWriter writer, String clientId)

                                                 throws IOException {

                   writer.startElement("input", component);

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

                 

                   Object value = ((UIInput) component).getValue();

                   if(value != null) {

                       writer.writeAttribute("value",

                                    value.toString(), null);

                   }

                   String size =

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

                   if(size != null) {

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

                   }

                   writer.endElement("input");

                }

                private void encodeCommand(UIComponent component,

                                   ResponseWriter writer,

                                   String clientId) throws IOException {

                   writer.startElement("input", component);

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

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

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

                   writer.endElement("input");

                }

          }

          這個Renderer和之前Component的編碼解碼過程類似,只是方法上多了一個UIComponent參數,用來表示對應的Component

          faces-config.xml中配置定義的Renderer

          <!-- 自定義Renderer -->

                 <render-kit>

                   <renderer>

                       <component-family>

                           javax.faces.Input

                       </component-family>

                       <renderer-type>

                           test.TextCmd

                       </renderer-type>

                       <renderer-class>

                           test.TextCmdRenderer

                       </renderer-class>

                   </renderer>

               </render-kit>

          定義好了之后,只需要把上面自定義的那個Tag文件稍微修改一下就可以了:

          public String getComponentType() {

                  //return "test.TextWithCmd";

                  return "javax.faces.Input";

              }

              public String getRendererType() {

                  //return null;

                 return "test.TextCmd";

              }

           

          同樣的,你也可以在自定義的Component中設置使用的Renderer。修改上面自定義Component的構造函數就可以了。

           

          大家自己去試一下吧。具體程序參看示例程序。

           

          主站蜘蛛池模板: 凌云县| 固原市| 齐齐哈尔市| 外汇| 红桥区| 宝丰县| 随州市| 唐山市| 芜湖市| 茶陵县| 德钦县| 台江县| 景东| 龙江县| 浦城县| 光泽县| 太康县| 会昌县| 香港| 宣化县| 若羌县| 菏泽市| 寻乌县| 普洱| 津市市| 洞口县| 西丰县| 筠连县| 新密市| 财经| 辉县市| 苏尼特右旗| 邵东县| 昭苏县| 大悟县| 中卫市| 正定县| 屏南县| 安义县| 商城县| 万宁市|