読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

続・複合コンポーネントをライブラリ化する

JSF 複合コンポーネント Jar

一昨日の記事「複合コンポーネントをライブラリ化する」の続きです。色々試してみて、もうこれ以上ここに時間をかけるわけにいかないので、自分達が最終的に選択した方法をメモ書き。

この試み(複合コンポの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"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:composite="http://java.sun.com/jsf/composite"
       xsi:schemaLocation="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> <!-- 本来は/componentを付けるべきようですが動かなかった… -->
    <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>

こういう定義を書くのが初めてなら仕方ない気もするのですが、複合コンポーネントを定義している時点で

<composite:interface>
    <composite:attribute name="disabled" default="false" shortDescription="有効かどうか" />
    <composite:attribute name="readonly" shortDescription="読取専用かどうか" default="false" />
</composite:interface>

と書いているだけに悲しい…悲しすぎです。

結局丸2日くらいかかってしまったので、調査は諦め、とりあえずこの方式で進むことに決定。
中々難しい(^^;
それにしても、やっぱり日本語の情報がもっと欲しい。。。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村