HTML名前空間のid属性を無視する
HTML/XHTML の id 属性は、CSS や JavaScript でも使用しますので、Mayaa のバインディングのため id との使いわけが難しい場合があります。HTML/XHTML の id 属性をバインディングに使わず、Mayaa 名前空間の id 属性だけをバインディングに使うよう設定すれば、そのような煩雑さから解放されます。(その代わり、すべてのテンプレートに Mayaa の名前空間宣言 (xmlns:m="http://mayaa.seasar.org"
) をする必要があります)
HTML/XHTML の id 属性をバインディングに使わないよう設定するには、「エンジン設定方法」と同様に ServiceProvider ファイルを置き、その中で templateBuilder
の設定をします。
templateBuilder の設定
templateBuilder
の設定は標準状態で下記のようになっています。テンプレートの id 属性と Mayaa ファイルの id 属性との一致を処理しているのは EqualsIDInjectionResolver
です。
※レイアウトの都合で改行しています。
<?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>
<templateBuilder
class="org.seasar.mayaa.impl.builder.TemplateBuilderImpl">
<resolver class="org.seasar.mayaa.impl.
builder.injection.MetaValuesSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.ReplaceSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.RenderedSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.InsertSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.InjectAttributeInjectionResolver"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.EqualsIDInjectionResolver">
<parameter name="reportUnresolvedID" value="true"/>
<parameter name="reportDuplicatedID" value="true"/>
<parameter name="addAttribute"
value="{http://www.w3.org/TR/html4}id"/>
<parameter name="addAttribute"
value="{http://www.w3.org/1999/xhtml}id"/>
</resolver>
<resolver class="org.seasar.mayaa.impl.builder.
injection.XPathMatchesInjectionResolver"/>
<parameter name="outputTemplateWhitespace" value="true"/>
<parameter name="outputMayaaWhitespace" value="false"/>
<parameter name="optimize" value="true"/>
</templateBuilder>
</provider>
EqualsIDInjectionResolver
のパラメータは 3 つです。
reportUnresolvedID
- テンプレート側にバインディング対象の id 属性があり、対応する id 属性が Mayaa ファイルにない場合にメッセージをログ出力するかどうかを設定します。ログは commons-logging の WARN レベルで出力します。
true
を設定すると出力し、false
に設定すると出力しません。デフォルトは "true
" です。 reportDuplicatedID
- Mayaa ファイルに同じ値を持つ id 属性が複数定義されている場合にメッセージをログ出力するかどうかを設定します。複数定義されている場合は最初に見つかったものを使うため、それ以外は使われません。ログは commons-logging の WARN レベルで出力します。
true
を設定すると出力し、false
に設定すると出力しません。デフォルトは "true
" です。 addAttribute
- Mayaa ファイルの id 属性と対応させるテンプレート側の属性を追加します。属性は " {名前空間URI}属性名 " の形式で指定します。デフォルトは HTML の id "
{http://www.w3.org/TR/html4}id
" と XHTML の id "{http://www.w3.org/1999/xhtml}id
" です。(Mayaa の内部では、HTML の名前空間 URI を "http://www.w3.org/TR/html4" として扱っています)
■HTML の id と XHTML の id を処理対象から外す
EqualsIDInjectionResolver
に HTML の id 属性と XHTML の id 属性を追加しないように設定すれば、バインディングに使う属性を Mayaa 名前空間の id 属性のみになります。(Mayaa 名前空間の id 属性は必ず対象になります)
既存の設定を上書きするため、デフォルトの設定をそのまま定義しなおして、属性の追加をしないようコメントアウトします。
※レイアウトの都合で改行しています。
<?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>
<templateBuilder
class="org.seasar.mayaa.impl.builder.TemplateBuilderImpl">
<resolver class="org.seasar.mayaa.impl.
builder.injection.MetaValuesSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.ReplaceSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.RenderedSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.InsertSetter"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.InjectAttributeInjectionResolver"/>
<resolver class="org.seasar.mayaa.impl.
builder.injection.EqualsIDInjectionResolver">
<parameter name="reportUnresolvedID" value="true"/>
<parameter name="reportDuplicatedID" value="true"/>
<!-- HTMLのidとXHTMLのidを追加しないようコメントアウト
<parameter name="addAttribute"
value="{http://www.w3.org/TR/html4}id"/>
<parameter name="addAttribute"
value="{http://www.w3.org/1999/xhtml}id"/>
-->
</resolver>
<resolver class="org.seasar.mayaa.impl.builder.
injection.XPathMatchesInjectionResolver"/>
<parameter name="outputTemplateWhitespace" value="true"/>
<parameter name="outputMayaaWhitespace" value="false"/>
<parameter name="optimize" value="true"/>
</templateBuilder>
</provider>
これで Mayaa 名前空間の id 属性 (xmlns:m="http://mayaa.seasar.org"
, m:id
) のみが有効になります。
必要に応じて、Tapestry の jwcid のような独自属性を追加することもできます。(HTML の名前空間を使う場合は HTML/XHTML の使いわけにご注意ください)