DATE : 2006/05/26 (Fri)
(前回の記事)
コンポーネント ID の表現方法
コンポーネント ID を特定する方法として、相対表現と絶対表現があります。
- コンポーネント ID の相対表現
特定のコンポーネントを中心とした表現方法です。
例えば、次の例で、「form1」の f:form から「table」の h:dataTable を指定するとします。
... <f:view> <f:form id="form1"> <h:dataTable id="table" ...> ... </h:dataTable> </f:form> </f:view> ...
相対表現では、「form1:table」と表現します。
- コンポーネント ID の絶対表現
コンポーネントツリーのルートにあるコンポーネントを中心とした表現方法です。JSF では、f:view 要素がコンポーネントツリーのルートにあたります。
絶対表現を行うには、「:」を表現の先頭に付けます。
つまり、上の例の絶対表現は「:form1:table」となります。
ここで、前回の最後に示した例に戻ります。
... <f:view> <f:form target="_blank"> <h:dataTable id="items" ...> ... </h:dataTable> </f:form> <f:form> <t:dataScroller for="items" ...> ... </t:dataScroller> </f:form> </f:view> ...
t:dataScroller 要素の for 属性「items」は相対表現です。そのため、上の例では2つ目の f:form 要素内でコンポーネント ID が items の要素を探していることになります。
そこで、絶対表現に書き換えます。ファイルパスであれば、親ディレクトリを示す表記方法がありますが、コンポーネント ID にはそのような方法はないようです(調査不足かもしれません)。
まず、コンポーネント ID を表記しやすいように、1つめの f:form 要素に id 属性を付けます。
... <f:view> <f:form id="table_form" target="_blank"> <h:dataTable id="items" ...> ... </h:dataTable> </f:form> <f:form> <t:dataScroller for="items" ...> ... </t:dataScroller> </f:form> </f:view> ...
「table_form」という ID を付けました。
そして、 h:dataTable のコンポーネント ID を絶対表現で表します。絶対表現は、「:table_form:items」となります。
この絶対表現を t:dataScroller の for 属性にすれば、 t:dataScroller が h:dataTable を参照できるようになります。
... <f:view> <f:form id="table_form" target="_blank"> <h:dataTable id="items" ...> ... </h:dataTable> </f:form> <f:form> <t:dataScroller for=":table_form:items" ...> ... </t:dataScroller> </f:form> </f:view> ...(了)
DATE : 2006/05/24 (Wed)
コンポーネント ID
DataScroller では、ページ単位で表示を行う一覧(DataTableなどのjavax.faces.component.UIData)を指定するために、そのコンポーネントの ID を t:dataScroller の for 属性に設定します。
例えば、「items」というコンポーネント ID の DataTable を DataScroller に指定するときは、次のようなコードになります。
(「...」の部分は省略部分です) ... <f:view> <f:form> <h:dataTable id="items" ...> ... </h:dataTable> <t:dataScroller for="items" ...> ... </t:dataScroller> </f:form> </f:view> ...
上の例では、1つの f:form 要素の中に h:dataTable 要素と t:dataScroller 要素があります。
しかし、 h:dataTable と t:dataScroller とで別々の f:form 要素が必要な場合はどうなるでしょうか。例えば、 h:dataTable では表内のボタンを押すと別ウィンドウで詳細な情報を表示し、 t:dataScroller のボタンを押すと同じウィンドウでページの切り替えを行うという場合です。素直に上記の例を書き換えると、次のようになります。
... <f:view> <f:form target="_blank"> <h:dataTable id="items" ...> ... </h:dataTable> </f:form> <f:form> <t:dataScroller for="items" ...> ... </t:dataScroller> </f:form> </f:view> ...
ところが、この例はうまく動作しません。 t:dataScroller 要素の for 属性である items が見つからないというエラーが出ます。
この理由は、コンポーネント ID は同じ階層で一意であれば良いという条件に基づきます。初めの例の場合、h:dataTable と t:dataScroller は同じ f:form 要素の直下にあるので同じ階層にあります。しかし、次の例では h:dataTable と t:dataScroller は別々の f:form 要素の直下にあるため、違う階層にあります。
同じ階層であればコンポーネント ID が一意ということは、逆に言えば階層が違えばコンポーネント ID は重複しても良いということになります。
これが、先程のエラーの原因です。for 属性で item という ID 持つ h:dataTable を指定したものの、t:dataScroller よりも上の階層や別の階層では ID が重複している可能性があるため、他の階層にある h:dataTable を特定できない仕様になっているのです。
そこで、ID の指定の仕方を少し変える必要がでてきます。
(つづきます)
DATE : 2006/05/22 (Mon)
Entity クラスの条件
Java Persistence API では、永続化の対象とするクラスのことを Entity クラスと呼びます。
Entity クラスを定義するためには、以下の条件を満たさなければなりません。
- Entity アノテーションを付加するか、XML ファイルで Entity として設定する。
- 引数なしのコンストラクタを用意する(アクセス修飾子は public か protected)。
- トップレベルのクラスであること(クラスやインタフェースの中で宣言されたクラスではないこと)。
- final クラスではないこと。
- RMI などで オブジェクトを直列化しなければならないときは、java.io.Serializable を実装すること。
- 他のクラスからインスタンス変数にアクセスさせる際は、アクセッサメソッド(getter/setter)を通して行う(インスタンス変数のアクセス修飾子は、public 以外にする)。
- プライマリーキーを表すプロパティを用意し、Id アノテーションを付加すること。
DATE : 2006/05/21 (Sun)
最近、諸事情で JSF に手を出し始めました。
(;^ω^)Java SE, ME, EE と忙しいですが、気にしないでください
JSF とは、とても簡単に言えば GUI を作る感覚でウェブアプリケーションを作ることができる仕様です。
私はその実装として Apache MyFaces を使用しています。MyFaces には、 tomahawk という MyFaces 独自の JSF コンポーネントが用意されています。これがなかなか便利なのでMyFaces を使っている、という次第です。
しかし、問題はその tomahawk、バージョン1.1.2で起きました。
tomahawk には DataScroller という JSF コンポーネントがあります。これを使うと、大量のデータからなる表を複数ページに分割でき、さらにナビゲート用のリンクまで用意してくれます。
とりあえず、日本語、英語、公式、非公式さまざまな資料を見ながら、 DataScroller を使ってみました。
(;゚Д゚)動きません。(;´Д`)動くことは動くのですが、次のページへ行こうとしたり、3ページ目へ行こうとしても移動してくれません。
とりあえず、資料を見直したり、 DataScroller に渡すデータを見直したり修正したりといった作業を繰り返しました。
しかし、状況は一向に変わらず(´Д⊂ヽ
バグ追跡システムも当たってみましたが、怪しそうなものはいくつかあったものの、決定打にはならず……。
もう自前で複数ページに分割するようにしようかとも考え始めたのですが、とりあえず最後(に近い)手段を思いつきました。
まずは、tomahawk を現在開発中の最も新しいバージョンにするということです。1.1.2で動かないのですから、それよりも新しいバージョンであれば修正されている可能性があります。Apache MyFaces はオープンソースで公開されているので、幸いにも開発中のバージョンでも手に入れることができます。
もう一つは、1.1.2を1.1.1にダウングレードすることです。最新版だからといって、安定しているとは限りません。DataScroller は1.1.0よりも昔からあるので、初めからうまく動かないものがずっと提供され続けていることもないだろうと考えました。
さて、実際に上の方法を試してみたところ……
ダウングレードしたら動きました orz
1.1.2がバグっていたのか、それとも資料にある書き方が古かったのかは分かりませんが、昨日1日悩み続けていた問題があっという間に解決してしまいました(;・∀・)
(;´∀`)ちなみにこの DataScroller 、結構バクバグのようです。バグ追跡システムにも結構居座っていますし、JavaScript を生成せずに使用する設定にするとやっぱり動きませんでした。
(;´Д`)こういう時、本当に「時間よ戻れ」と叫びたくなりますね
(;^ω^)時が戻ったのは tomahawk だけ……
DATE : 2006/05/20 (Sat)
巷でいろいろと話題になっている「MUSASHI -GUN道-」の第1話が GyaO で放送されていたので、見てみました。
(;・∀・)……
オープニングから、昔のアニメの臭いがぷんぷんします。映像がとにかく安っぽいです。キャラクターの動きがものすごく単調で、スタッフのフォントやレイアウトもものすごく適当です。
なんとなく不安を抱えたまま本編へ突入。初めの方はいたって普通でしたが、一瞬、口の動きが始まる前にセリフが流れていたような気もします。アイキャッチも適当です。
後編になると、戦闘シーンへ突入。いちいち説明台詞が多いです(;´Д`) まあ、それはともかくとしても、セリフの切れがものすごく悪く、流れについていけないところがところどころにありました。
例えば、ダンジョウというキャラクターがヤシャという敵と戦うシーンでのことです。ダンジョウはヤシャを剣で斬りつけますが、ヤシャには効きません。しかし、そのことを予測していたダンジョウは別の手段を……というよくある場面ですが、そこでのセリフ。
「(驚いて)な、なにー!!!! (続けて)そうだろうと思ってたよ、これではどうかな」
(;´Д`)一呼吸も置いていません。あまりに急に調子が変わるので、ついていけませんでした。
ちなみに、ヤシガニの再来とも言われています。むしろ、ヤシガニは1話分のみが問題だったものが、「MUSASHI -GUN道-」では全編(註:BS-i では、第7話まで放送済みです)ヤシガニ状態なので、ヤシガニを越えたとも言われています。
なお、全26話だそうです(;゚Д゚)
(;^ω^)第1話でこれですから、先がとても楽しみですね