開發自定義JSF組件(1) HelloWorld

完整的教材: html

  1. 開發自定義JSF組件(1) HelloWorld
  2. 開發自定義JSF組件(2) 使用Render渲染器
  3. 開發自定義JSF組件(3) 使用綁定變量
  4. 開發自定義JSF組件(4) 保存狀態與恢復狀態
  5. 開發自定義JSF組件(5) 在JSP中用JSF組件

公司決策層選擇了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調試經過,感謝百度雲網盤提供源代碼下載

相關文章
相關標籤/搜索