属性自動セット

JSP カスタムタグに HTML テンプレートの属性をセットする

JSP カスタムタグのなかには HTML のタグを出力するものがあり、そのために HTML のタグと同じ属性を持つものがあります。そのような JSP カスタムタグの場合、HTML テンプレートと Mayaa ファイルの JSP カスタムタグとに同じ属性を書くことになり、数が多い場合には大変です。

Mayaa には、HTML テンプレートにある属性を自動的に JSP カスタムタグの属性としてセットする機能があります。完全自動では意図しない動作を引き起こすため、この機能はデフォルト設定で無効になっています。適切に設定することで、この機能を有効にできます。

この機能を有効にすると、TLD から取得できる情報を元に JSP カスタムタグの属性を調べ、Mayaa ファイル上で指定されていない属性には HTML テンプレート上の同名属性から値を取得してセットします。Mayaa ファイル上でセットしている属性には何もしません。

■実行イメージ

実行時イメージは次のようになります。実行結果の強調部分は、Mayaa ファイルには書いていない属性です。(例として Struts の JSP カスタムタグを使用しています)

<html>
<body>
    <form id="greetingForm">
        <input id="greetingInput" name="greeting" value="Hello."
            size="20" maxlength="20">
    </form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<m:mayaa xmlns:m="http://mayaa.seasar.org"
            xmlns:html="http://struts.apache.org/tags-html">
    <html:form m:id="greetingForm" action="/hello" />

    <!-- html:text には size, maxlength, styleId などの属性があります -->
    <html:text m:id="greetingInput" property="greeting" />
</m:mayaa>
実行結果
<html>
<body>
    <form action="/mayaa/hello.do">
        <input id="greetingInput" name="greeting" value=""
             size="20" maxlength="20" >
    </form>
</body>
</html>

html:text タグには size 属性, maxlength 属性, styleId 属性を指定していませんが、出力はそれらを指定したかのようなものになっています。このような動作をさせるには、たとえば次のように設定します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE provider
    PUBLIC "-//The Seasar Foundation//DTD Mayaa Provider 1.0//EN"
    "http://mayaa.seasar.org/dtd/mayaa-provider_1_0.dtd">
<provider>

    <templateAttributeReader templateAttributeReader >
        <!-- 無視する属性の設定 (複数記述可能) -->
        <ignoreAttribute 
                 qName ="{http://struts.apache.org/tags-html}*"
                 attribute ="id" />
        <ignoreAttribute
                qName="{http://struts.apache.org/tags-html}text"
                attribute="name" />
        <ignoreAttribute
                qName="{http://struts.apache.org/tags-html}text"
                attribute="value" />

        <!-- 別名で置き換える属性の設定 (複数記述可能) -->
        <aliasAttribute 
                 qName ="{http://struts.apache.org/tags-html}*"
                 attribute ="styleId"
                 templateAttribute ="id" />

        <!-- 機能を有効にする設定 (デフォルトは false) -->
        <parameter name ="enabled" value ="true" />
    </templateAttributeReader >
</provider>

■設定タグ・属性の説明

この機能の設定は templateAttributeReader タグでおこないます。templateAttributeReader タグのボディには ignoreAttribute タグ、aliasAttribute タグ、parameter タグを書くことができ、それぞれ複数、この順番で記述します。(parameter タグで設定する内容は enabled のひとつだけです)

・属性自動セット機能を有効にする

<parameter   name ="enabled"  value ="true" />

機能を有効にするには、templateAttributeReader タグの子として parameter タグを書き、name 属性に "enabled"value 属性に "true" を書きます。デフォルトは "false" になっています。 機能を有効にすると、すべての JSP カスタムタグの属性に対し、対応づけられた HTML テンプレート上のタグにある同名の属性が自動的にセットされるようになります。

自動セットしない属性を指定する

<ignoreAttribute 
         qName ="{http://struts.apache.org/tags-html}text"
         attribute ="value" />

すべての属性を自動的にセットすると、JSP カスタムタグによっては正常に動作しない場合があります。たとえば例に挙げた Struts の html:text は、property 属性と value 属性を同時にセットすると property 属性の指定は無効になるため、property 属性を使いたい場合には HTML テンプレート側に value 属性を付けられないということになります。

この対策として、JSP カスタムタグの属性ごとに、HTML テンプレート上の属性を使わないよう設定できます。設定をするには、templateAttributeReader タグの子として ignoreAttribute タグを書き、qName 属性に設定する対象の JSP カスタムタグ名を、attribute 属性に自動セットの対象外とする JSP カスタムタグの属性名を書きます。

qName 属性の値にはブレース ("{", "}") で囲んだ uri (Mayaa ファイルの xmlns で指定するもの) と、それに続けて JSP カスタムタグ名を指定します。これは完全一致か前方一致を指定でき、前方一致の場合には末尾に "*" を指定します。末尾以外の "*" は特別な意味を持ちません。

attribute 属性の値には qName で指定した JSP カスタムタグの属性名を指定します。これは完全一致か前方一致を指定でき、前方一致の場合には末尾にワイルドカード ("") を指定します。末尾以外の "" は特別な意味を持ちません。

自動セットするときに属性名を変える

<aliasAttribute 
         qName ="{http://struts.apache.org/tags-html}text"
         attribute ="styleId"
         templateAttribute ="id" />

JSP カスタムタグによっては、出力する HTML の属性名と JSP カスタムタグでの属性名が異なる場合があります (例: Struts では styleId 属性の値が id 属性の値として出力される)。

このような属性名が異なる場合の設定をするには、templateAttributeReader タグの子として aliasAttribute タグを書き、qName 属性に設定する対象の JSP カスタムタグ名を、attribute 属性に JSP カスタムタグの属性名を、templateAttribute 属性に HTML テンプレート上の属性名を書きます。 qName 属性、および attribute 属性は ignoreAttribute タグの同名属性と同じです。

templateAttribute 属性の値には attribute 属性で指定した JSP カスタムタグの属性に対応する HTML テンプレート上の属性の名前を指定します。上記の例では、text カスタムタグの styleId 属性に、HTML テンプレート上の id 属性の値がセットされることになります。templateAttribute 属性にはワイルドカードを使うことはできません。