Faceletsで作るカスタムタグ

Faceletsで作るカスタムタグ

1) web.xml
下記追加

<context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>
        <![CDATA[/WEB-INF/taglib/hoge-taglib.xml]]>
    </param-value>
</context-param>

2) hoge.xhtml (カスタムタグ本体)

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">

    <h:outputText value="#{value}" />

</ui:composition>

3) hoge-taglib.xml

<?xml version="1.0"?>
<!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://foo.bar/jsf</namespace>
    <tag>
        <tag-name>echo</tag-name>
        <source>../tag/hoge.xhtml</source>
    </tag>
</facelet-taglib>

4) hoge.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" 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/dtd/web-jsptaglibrary_1_2.dtd">
    <tlib-version>1.2</tlib-version>
    <short-name>fb</short-name>
    <uri>http://foo.bar.jp/jsf</uri>
    <tag>
        <description>echoタグ</description>
        <name>echo</name>
        <tag-class/>
        <body-content>JSP</body-content>
        <attribute>
            <description>画面に表示する文字列</description>
            <name>value</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.String</type>
        </attribute>
    </tag>
</taglib>

使い方

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:fb="http://foo.bar.jp/jsf">

    <fb:echo value="hello world!" />

</ui:composition>

ポイントは 2) 内で記述したEL式の変数が、そのままカスタムタグの属性名になり、そこに指定した属性値が 2) のEL式に代入されるというところ。