<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    爪哇一角

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

    十二 自定義Renderer

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

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

    所以這里要自定義一個(gè)Renderer來做編碼,解碼工作。要自定義一個(gè)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");

          }

    }

    這個(gè)Renderer和之前Component的編碼解碼過程類似,只是方法上多了一個(gè)UIComponent參數(shù),用來表示對(duì)應(yīng)的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>

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

    public String getComponentType() {

            //return "test.TextWithCmd";

            return "javax.faces.Input";

        }

        public String getRendererType() {

            //return null;

           return "test.TextCmd";

        }

     

    同樣的,你也可以在自定義的Component中設(shè)置使用的Renderer。修改上面自定義Component的構(gòu)造函數(shù)就可以了。

     

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

     

    主站蜘蛛池模板: 国产成人免费片在线观看| 久久99精品国产免费观看| 国产亚洲精品第一综合| 亚洲国产精品18久久久久久| 77777亚洲午夜久久多喷| 亚洲国产日韩在线成人蜜芽| 亚洲国产精品久久网午夜| 亚洲午夜成激人情在线影院| 亚洲国产夜色在线观看| 亚洲六月丁香婷婷综合| 亚洲私人无码综合久久网| 亚洲欧美综合精品成人导航| 久久综合亚洲色hezyo| 精品特级一级毛片免费观看| 日韩免费高清一级毛片| 好猛好深好爽好硬免费视频| 国产综合免费精品久久久| 青青青国产手机频在线免费观看 | 亚洲一区二区三区影院| 国产精品亚洲片在线| 亚洲情a成黄在线观看动漫尤物| 亚洲好看的理论片电影| 亚洲国产精品久久网午夜| 亚洲人成色777777精品| 成人免费夜片在线观看| 免费网站观看WWW在线观看| 亚洲视频免费在线看| 暖暖在线日本免费中文| 在线日韩日本国产亚洲| 久久久久久久亚洲Av无码| 亚洲乱码一区二区三区国产精品| 精品一区二区三区免费毛片| 久久精品成人免费观看97| 1000部禁片黄的免费看| 午夜一区二区免费视频| 亚洲性在线看高清h片| 久久精品国产亚洲AV香蕉| 亚洲AV无码男人的天堂| 91成人免费观看在线观看| 91成年人免费视频| 免费一看一级毛片人|