第二部分 有獨立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>
編譯打包吧,可以使用瞭