爪哇一角

          共同探討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的構造函數就可以了。

           

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

           

          主站蜘蛛池模板: 嵊州市| 尉氏县| 南安市| 玛沁县| 札达县| 郑州市| 迁安市| 郯城县| 兰坪| 丽水市| 义马市| 夏邑县| 芒康县| 邢台市| 晋城| 三河市| 象山县| 阿拉善盟| 建宁县| 北流市| 临泉县| 淮滨县| 阿拉善左旗| 沽源县| 合山市| 驻马店市| 武宁县| 吉木萨尔县| 贺兰县| 弥勒县| 大连市| 噶尔县| 彰武县| 治县。| 安国市| 蒙阴县| 台江县| 香港| 岑巩县| 五台县| 阿拉善右旗|