6.5. XML 名前空間の使用
前述の例では 2 種類のコンポーネント宣言メソッドを XML 名前空間を使うものと使わないものに修正しています。 以下に名前空間を使用しない典型的な
components.xml ファイルを示します。
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
xsi:schemaLocation=
"http://jboss.com/products/seam/components
http://jboss.com/products/seam/components-2.2.xsd">
<component class="org.jboss.seam.core.init">
<property name="debug">true</property>
<property name="jndiPattern">@jndiPattern@</property>
</component>
</components>
ご覧の通りこのコードは冗長です。 さらにコンポーネントと属性の名前がデプロイメント時に確認できません。
名前空間を使用すると、
<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
xmlns:core="http://jboss.com/products/seam/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://jboss.com/products/seam/core
http://jboss.com/products/seam/core-2.2.xsd
http://jboss.com/products/seam/components
http://jboss.com/products/seam/components-2.2.xsd">
<core:init debug="true" jndi-pattern="@jndiPattern@"/>
</components>
スキーマ宣言は冗長ではありますが、 XML の内容自体は簡潔かつ理解しやすいものになります。 このスキーマは各コンポーネントと利用可能な属性に関する詳細情報を与えて、 XML エディタによるインテリジェントな自動補完入力を可能にします。 名前空間付きのエレメントの使用により、適切な
components.xml ファイルの生成と保守が容易になります。
これは組み込みの Seam コンポーネントに対しては良く機能しますが、 ユーザーのコンポーネントに対してはオプションが 2 つあります。 最初に Seam は両方の混在したモデルに対応することで、ユーザーのコンポーネントには汎用の
<component> 宣言を使用できるようにし、 また組み込みコンポーネントには名前空間が付いた宣言が使用できるようにしています。 さらに重要な点は、 Seam により独自のコンポーネントに対して簡単に名前空間を宣言できるということです。
いずれの Java パッケージにも
@Namespace アノテーションをパッケージに付加することによって XML 名前空間を関連付けることができます (パッケージレベルのアノテーションはパッケージディレクトリ内の package-info.java という名前のファイルに宣言します)。seampay デモからの例を示します。
@Namespace(value="http://jboss.com/products/seam/examples/ seampay") package org.jboss.seam.example.seampay; import org.jboss.seam.annotations.Namespace;
components.xml で名前空間のスタイルを使用するのはこんなに簡単です。 次のように記述できます。
<components xmlns="http://jboss.com/products/seam/components"
xmlns:pay="http://jboss.com/products/seam/examples/seampay"
... >
<pay:payment-home new-instance="#{newPayment}"
created-message="Created a new payment to #{newPayment.payee}" />
<pay:payment name="newPayment"
payee="Somebody"
account="#{selectedAccount}"
payment-date="#{currentDatetime}"
created-date="#{currentDatetime}" />
...
</components>
または、
<components xmlns="http://jboss.com/products/seam/components"
xmlns:pay="http://jboss.com/products/seam/examples/seampay"
... >
<pay:payment-home>
<pay:new-instance>"#{newPayment}"</pay:new-instance>
<pay:created-message>
Created a new payment to #{newPayment.payee}
</pay:created-message>
</pay:payment-home>
<pay:payment name="newPayment">
<pay:payee>Somebody"</pay:payee>
<pay:account>#{selectedAccount}</pay:account>
<pay:payment-date>#{currentDatetime}</pay:payment-date>
<pay:created-date>#{currentDatetime}</pay:created-date>
</pay:payment>
...
</components>
前述の例では名前空間付きエレメントの 2 種類の使用モデルを説明しています。 最初の宣言では
<pay:payment-home> が paymentHome コンポーネントを参照しています。
package org.jboss.seam.example.seampay;
...
@Name("paymentHome")
public class PaymentController extends EntityHome<Payment> {
...
}
そのエレメント名はコンポーネント名をハイフンで連結した形式です。 そのエレメントの属性はプロパティ名をハイフンで連結した形式です。
2 番目の宣言では、
<pay:payment> エレメントが org.jboss.seam.example.seampay パッケージにある Payment クラスを参照しています。 この場合 Payment は Seam コンポーネントとして宣言されているエンティティです。
package org.jboss.seam.example.seampay;
...
@Entity
public class Payment implements Serializable {
...
}
ユーザー定義のコンポーネントに対して妥当性検証と自動補完入力を機能させるにはスキーマが必要になります。 Seam は複数のコンポーネントからなるセットに対してはまだスキーマを自動的には生成できないため、 手動で作成しなければなりません。 参考として標準的な Seam パッケージ用のスキーマ定義を使用できます。
次は Seam によって使用される名前空間です。
- components —
http://jboss.com/products/seam/components - core —
http://jboss.com/products/seam/core - drools —
http://jboss.com/products/seam/drools - framework —
http://jboss.com/products/seam/framework - jms —
http://jboss.com/products/seam/jms - remoting —
http://jboss.com/products/seam/remoting - theme —
http://jboss.com/products/seam/theme - security —
http://jboss.com/products/seam/security - mail —
http://jboss.com/products/seam/mail - web —
http://jboss.com/products/seam/web - pdf —
http://jboss.com/products/seam/pdf - spring —
http://jboss.com/products/seam/spring