完整的教材: html
公司決策層選擇了JSF作頁面,WEB開發人員不容易呀,一個頁面動不動就幾千行,若是一個新人加入團隊,估計都看暈了。我今天要寫的課程,就是跟簡化頁面代碼有關係了。自定義組件不但能夠複用代碼,還能讓頁面的代碼更簡潔。自定義JSF組件與JSP標籤不是一回事,這裏我作一個HelloWolrd的示例,這個示例是循次漸進的演進,不僅是一個簡單的Hello World,不過看這課程的同窗須要有JSF基礎。 java
用過JSF的同窗都知道,JSF的視圖能夠選擇JSP或Facelets技術,而絕大部份人好像對Facelets情有獨鍾,咱們公司也不例外用了Facelets。因此咱們就從作一個支持Facelets組件開始。 web
這個組件組件很簡單,就是根據name屬性輸出一句話,以下面這行代碼輸出爲:你好,世界! app
<ida:helloWorld name="世界" /> ide
開發環境: ui
- Windows 7
- IntelliJ IDEA 12.1.2
- jboss-6.1.0.Final
- JSF 1.2
下面的步驟是實現這個組件的過程: this
一、 首先固然是定義一個組件UIHelloWorld,記住JSF的組件必須繼承javax.faces.component.UIComponent或者它的子類。這裏UIHelloWorld只是輸出一句話,繼承javax.faces.component.UIOutput最省事了。 spa
public class UIHelloWorld extends UIOutput { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void encodeBegin(FacesContext context) throws IOException { ResponseWriter writer = context.getResponseWriter(); writer.write("<div>"); if (StringUtils.isNotBlank(this.name)) { writer.write(String.format("你好,%s!" + this.name)); } writer.write("</div>"); } }
HelloWorld組件只定義了一個屬性name,而且覆蓋了父類的encodeBegin方法,這個方法很簡單,就是網頁上輸出一段文字。 .net
二、在faces-config.xml裏聲明HelloWorld組件。 調試
<?xml version='1.0' encoding='UTF-8'?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> <component> <component-type>com.regaltec.faces.HelloWorld</component-type> <component-class>com.regaltec.faces.component.UIHelloWorld</component-class> </component> <application> <locale-config> <default-locale>zh_CN</default-locale> <supported-locale>en_US</supported-locale> </locale-config> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application> </faces-config>
component-type是組件的一個類型、名稱之類的,能夠根據我的喜愛命名。
三、要在網頁上使用這個組件,還必需要對這個組件做標籤聲明。標籤的聲明在uicomponent.taglib.xml這個文件中,這個文件通常以taglib.xml結尾,放在WEB-INF目錄或者子目錄下。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd"> <facelet-taglib> <namespace>http://www.regaltec.com/ida40</namespace> <tag> <tag-name>helloWorld</tag-name> <component> <component-type>com.regaltec.faces.HelloWorld</component-type> </component> </tag> </facelet-taglib>
namespace在寫網頁的時候會使用,而component-type這項與faces-config.xml的定義的必需要一致。
四、可是Application Server還不能識別咱們自定義的組件,須要告訴Application Server自定義的標籤在那裏,這個步驟也簡單,只要打開web.xml,加上下面3行代碼。
<context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/uicomponent.taglib.xml</param-value> </context-param>
五、通過上面4個步驟,咱們已完成了HelloWorld組件的所有工做了,如今我寫一個頁面使用這個組件。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:ida="http://www.regaltec.com/ida40" > <f:view> <head> <title>Hello World</title> </head> <body> <ida:helloWorld name="World" /> </body> </f:view> </html>
你們能夠留意到,只要引入咱們在uicomponent.taglib.xml的命名空間,就能夠用ida:helloWorld來引用組件了。
下一節,我將使用Render類改造這個例子。Renderer類是JSF組件開發中一個較重要的類,該類主要功能是在Java和HTML之間的轉換,在響應階段將Java組件的屬性轉換爲HTML代碼,在接受請求階段將HTML Request中傳來的資料轉換爲Java組件的屬性。
以上代碼在jboss-6.1.0.Final調試經過,感謝百度雲網盤提供源代碼下載。