2025-03-25

第二部分 有獨立Renderer的Noncomposite Component


<verse>


  通常一個UI Component包含瞭兩個部分:Behavior和Renderer.兩者最好能夠分別實現,UIComponent類用來實現Behavior,比如處理事件,通過EL綁定屬性等等。專門實現一個Renderer類來負責Encoding和Decoding。Encoding指的是生成可以在客戶端顯示的標記語言,比如html等,Decoding用來將客戶端傳來的請求(通常以某種標記語言風格)轉換成Java變量。


  在進入下一個更加完善一點的UI Component編程之前,先來看一些基本概念。在前面的例子中,HtmlHelloWorld繼承瞭UIComponentBase類,需要實現getFamily方法。該方法返回的字符串用來表示UI Component的種類,比如UIInput屬於javax.faces.Input,而UICommand屬於javax.faces.Command.在faces-config.xml中,我們會將UIComponent和Renderer配對,比如Primefaces中的配置:


<render-kit>


  <renderer>


    <component-family>javax.faces.Output</component-family>


    <renderer-type>javax.faces.Head</renderer-type>


    <renderer-class>org.primefaces.renderkit.HeadRenderer</renderer-class>


  </renderer>


</render-kit>


  有瞭這種配對關系,我們就可以方便的指定哪一種UIComponent使用哪一個Renderer。作為自定義UI Component,我們可以任意用一個字符串來標志它的UIComponent類的family,如果沒有Renderer(也就意味著不需要在faces-config.xml中配置render-kit),可以簡單的返回null,第一部分例子就是這樣做的。


  現在來開發一個helloworld2 tag,和前面的功能一樣,但是多瞭一個Renderer負責渲染。首先是UIComponent HtmlHelloWorld2.java的代碼:


package com.freebird.component;


import javax.faces.component.UIComponentBase;


import javax.faces.context.ResponseWriter;


import java.io.IOException;


import javax.faces.context.FacesContext;


import java.util.Date;


public class HtmlHelloWorld2 extends UIComponentBase {


  @Override


  public String getFamily() {


    return “helloworld2”;


  }


}


  註意getFamily返回”helloworld2″字符串,後面要用到。然後實現Renderer類HtmlHelloWorld2Renderer.java:


package com.freebird.renderer;


import javax.faces.render.Renderer;


import javax.faces.context.ResponseWriter;


import java.io.IOException;


import javax.faces.component.UIComponent;


import javax.faces.context.FacesContext;


import java.util.Date;


/**


 * Describe class HtmlHelloWorld2Renderer here.


 *


 *


 * Created: Tue Dec 28 10:46:08 2010


 *


 * @author <a href=”chenshumailto:chenshu@csdesktop”>chenshu</a>


 * @version 1.0


 */


public class HtmlHelloWorld2Renderer extends Renderer {


  @Override


  public void encodeBegin(FacesContext context, UIComponent component) throws IOException {


  }


  @Override


  public void encodeChildren(FacesContext context, UIComponent component) throws IOException {


  }


  @Override


  public void encodeEnd(FacesContext context, UIComponent component) throws IOException {


    //String clientId = component.getClientId(context);


    //char sep = UINamingContainer.getSeparatorChar(context);


    ResponseWriter writer = context.getResponseWriter();


    writer.startElement(“p”, component);


    writer.writeAttribute(“style”, “color : red”, null );


    writer.writeText(“HelloWorld! today is: ” + new java.util.Date(), null);


    writer.endElement(“p”);


  }


}


  現在添加配置信息到helloworld.taglib.xml文件:


  <tag>


    <tag-name>helloworld2</tag-name>


    <component>


      <component-type>HtmlHelloWorld2</component-type>


      <renderer-type>HtmlHelloWorld2Renderer</renderer-type>


    </component>


  </tag>


  最後添加配置信息到faces-config.xml文件:


  <component>


    <component-type>HtmlHelloWorld2</component-type>


    <component-class>com.freebird.component.HtmlHelloWorld2</component-class>


  </component>


  <render-kit>


    <renderer>


      <component-family>helloworld2</component-family>


      <renderer-type>HtmlHelloWorld2Renderer</renderer-type>


      <renderer-class>com.freebird.renderer.HtmlHelloWorld2Renderer</renderer-class>


    </renderer>


  </render-kit>


  編譯打包吧,可以使用瞭

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *