一昨日の記事「複合コンポーネントをライブラリ化する」の続きです。色々試してみて、もうこれ以上ここに時間をかけるわけにいかないので、自分達が最終的に選択した方法をメモ書き。
この試み(複合コンポのjar化)自体は海外でもチラホラみるし、書籍にもあるので間違ってはいないかと。
3つ目のQ&Aで「taglib.xmlは要らないよ」とコメントがあって、それに対して最後「トライしてみる。ちなみに、Jarでも??」と言ってるのだけど、その回答が知りたい!!!
自分達が出した結論としては、taglib.xmlで色々頑張る道となったので、不要なら絶対そのほうが楽です。
試した内容
Mavenで作ったWebアプリケーションの中に複合コンポーネントが作成されている状態から
JavaWebPrototypeCommonComponentProject
+-- src
+-- main
+-- java
+-- resources
+-- webapp
+-- component
+-- xxx.xhtml ←作成した複合コンポーネント
+-- test
+-- target
pom.xml
複合コンポーネントを(今後、他のプロジェクトでも再利用できるように)共通ライブラリとするために新しいMavenプロジェクトへ移植
CommonComponentProject
+-- src
+-- main
+-- java
+-- resources
+-- META-INF
+-- resources ←このresourcesは不要ではとも思ったのですが、ないと何か上手く動かなくて…
+-- component
+-- xxx.xhtml
component.taglib.xml ←追加
+-- webapp
+-- test
+-- target
pom.xml
ここからjarを作って、Mavenのローカルリポジトリに入れて、この共通複合コンポを利用したい人はpom.xmlに設定を書いて組み込む形です。
taglib.xmlを用いない場合
まず、上記のJavaWebPrototypeCommonComponentProjectみたいに複合コンポーネントを内包して利用してる場合は間違いなくtaglib.xmlは不要です。
で、CommonComponentProjectみたいにした場合ですが、taglib.xmlなしでjar生成して、それを参照させて
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:my="http://java.sun.com/jsf/composite/component">
〜中略〜
<h:body>
<my:xxx value="hello" />
</h:body>
</html>
と定義すれば普通に動きます。
が、なぜかNetBeansでのコード補完(タグ補完というべきか)が効かないです…(上記例でいうと、「my:」と打ってCtrl+Spaceを押しても何もでない)。な、なぜ…。これが本当に残念。
何か設定が足りないだけな気もするのですが、2人がかりで色々試してダメだったので諦めました。
属性は覚えてるから補完なんて不要で大丈夫だぜ!ってメンバが揃ってれば問題ないかもしれません(^^;
taglib.xmlを用いる場合
やはりコード補完は欲しいので仕方なく以下のようなファイル(component.taglib.xml)を定義しました。
xml version="1.0" encoding="UTF-8"
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xmlnscomposite="http://java.sun.com/jsf/composite"
xsischemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>"http://java.sun.com/jsf/composite</namespace>
<composite-library-name>component</composite-library-name>
<tag>
<tag-name>xxx</tag-name>
<source>./resources/component/xxx.xhtml</source>
<attribute>
<name>disabled</name>
<description>有効かどうか</description>
</attribute>
<attribute>
<name>readonly</name>
<description>読取専用かどうか</description>
</attribute>
〜 必要な属性すべて書く 〜
</tag>
</facelet-taglib>
こういう定義を書くのが初めてなら仕方ない気もするのですが、複合コンポーネントを定義している時点で
<compositeinterface>
<compositeattribute name="disabled" default="false" shortDescription="有効かどうか" />
<compositeattribute name="readonly" shortDescription="読取専用かどうか" default="false" />
</compositeinterface>
と書いているだけに悲しい…悲しすぎです。
結局丸2日くらいかかってしまったので、調査は諦め、とりあえずこの方式で進むことに決定。
中々難しい(^^;
それにしても、やっぱり日本語の情報がもっと欲しい。。。