RichFacesのDropDownMenuは、RichFacesのコンポーネントの中でもどうしても使いたい機能のひとつだけど、なかなかどうして一筋縄ではいかなかった。公式サイトのサンプルにあるように、普通に静的メニューを作るならば問題無い。業務システムなので当然データベースから動的に生成したいのだけど、サンプルのようには動かなかった。value=”Edit”/></f:facet></rich:dropDownMenu></rich:toolBar>a4j:repeatがui:repeatでもdataTableでも動かない。menus.get(q).getUrl();}}RichFacesのバグ?とにかくui:repeatは捨てて、c:forEachでやる。List<>やArrayList<>ではなく、配列をわたさなきゃならないらしい。分かればどうってことないけど、リソースも無いし結構はまりました。月曜日IE6はRichFacesのSkinスタイルを思いっきり無視するので要注意。commandButtonとcheckBoxは「ただのinput」とみなされ、色もマージンも妙なコトになる。gray;}こうなっている。1.input指定でinput要素全てに対してスタイルを設定。2.input[type=""]で、特定の要素(ここではbotton、submit)のスタイルをオーバーライド。IE6は2のinput[type=""]を無視するわけだ。様々なCSSハックを行っても何故か状況は変わらず...(通常のHTMLではうまくいった)。gray;}</style>のようにべた書きして、各要素でstyleClassを使って強制指定することで、ようやく解決した。う~ん...Vistaがずっこけたので、企業ではいまだにXPがほとんど。アップデートを意図的に抑制している企業も多くて、IE6はまだ無視出来ない。PHPやHTML開発でもそうだがIE6には、もうウンザリ。いつまでWEB開発者は、こんな無駄な時間を浪費せざるおえないのだろうか...。月曜日seamでファイルのアップロードにはs:fileUploadを使う。これを使うと、EntityBeanに簡単にinsert出来る。~}わずか数分でコーディング完了。次にEntityBeanにbyte[]で登録したファイルのダウンロード。}}これでブラウザにダウンロードダイアログが表示される。日本語ファイル名の場合は、ダウンロード時にファイル名の文字コードを変換すればよい。月曜日SeamのRichFacesで最も便利な機能ModalPanel。これを使いたくてSeamを使ってると言っても良いかも。便利に使うには少々コツが必要。意外にリソースが少なかったりするからメモっておく。普通に上位10件程度の履歴などを見せる場合には、特にコツもなく以下のようなコードで出来る。/></rich:column></rich:dataTable></rich:modalPanel>特に難しくもなく、RichFacesのマニュアル通りに書けば普通に動く。rich:modalPanelのコードは、どこに書いてもOKなので、ページの頭にでも書いておけばOK。ModalPanelの中でフォームを使って検索などをしたい場合には書き方が変わる。メインでリンクをクリック->モーダルオープン->商品や顧客などを検索->検索結果をメインにセット等という業務システムではあるととても助かる機能を実装したい場合、上記の方法だと何故かフォームの変数がSessionBeanに渡らない。以下のように書くパネルを開く(上記といっしょ。/>として別のfaceletファイルを読み込む。ui:includeは必ずa4j:formの外側で行う。ItemsearchPanelの中でもa4j:formを使うから。ItemsearchPanelActionクラスを作成(無論インターフェースも)。/></rich:column></rich:dataTable></a4j:form></rich:modalPanel></ui:component></ui:composition>ここまで来ればすぐ実装出来るはずだけど、a4j:formをつい忘れてしまうので要注意かな。昨今はブラウザ側がポップアップブロックを標準装備しててJavaScriptのwindow.open()も使えないから、これは必須の機能だね。気に入っちゃってガンガン多投してるけど、凄く表現力上がるし客受けも良い。いうのをパッと出来ちゃう所がseamの便利なところだなぁ。月曜日Seam(JSF)でCSVを出力する場合、facesContextを利用してファイルデータを書き出す。{}このへんの処理も業務システムでは多投する。スマートに出来るような仕組みがフレームワーク側にあると便利なのだが...。デフォルト設定のままでは、deploy時にOutOfMemoryだしまくり。Linux環境ではrun.conf、Winではrun.batのJAVA_OPTS変更しないと開発では利用出来ない。メモリ搭載量の少ないマシンに多めのメモリを振りすぎても、やはりOutOfMemory...。自分の環境では、いちどにたくさんのデータを取得するようなページでは752以上ないとダメだった。パス式でHQLを書くなどのチューニングまでは(まだ)いっていないが、OS領域もあわせると最低1GB以上は必要かも。RedHatの公式サポートなどを受けると、この辺のラインはキチンとだしてくれるのだろうか?とりあえずデュアルコアのプロセッサとタップリなメモリ、それとなるだけメモリを消費しないようなソースで、この仕事をしのいでいこう。ハードは安くなったからね。月曜日seamで、条件によって処理後のリダイレクト先を切替える場合はpages.xmlを利用すると良い。上記をpages.xmlに書き込んだ場合、view-idのページがレンダリングされる直前にactionメソッドが呼び出される。“/RecognitionList.xhtml”;}とでも書いておけばOK。この辺の処理は、本番業務システムではよく必要とする。自前で書くとけっこう面倒。#{a4jSkin.headerGradientColor};}</style>のようにa4jSkinで、Skinのスタイルにアクセス出来る。自前のテーブルやパーツをスタイリングする場合に、普通にcolor:#BCBCBCなどと書いてしまうと、Skinを変更したとき色が合わずに悲しい結果になってしまう。利用できるスタイルはRichFacesのAPIガイド->Skinを参照。上記スタイルはfacelets中に書くべし。別スタイルシートファイルに書いてもダメだった(まぁ当たり前だが...)。テンプレにスタイルが入るのは気持ち悪いけど、JSFはもともとそれほど綺麗なHTMLを生成してくれる訳ではないので割り切っていく。月曜日inputTextaraなどで入力させた文字列を表示させるには、s:formattedTextとpreを組み合わせると便利。/></pre>preを入れないと、普通に出力されてしまう。単純だが以外にハマッた。改行をbrに置き換えるメソッドなどをゴリゴリ書いてて、「まてよ?」と。月曜日あるコンボボックスの選択結果によって、次のコンボボックスを動的に変化させたいような場合がある。seamの場合はa4j:supportタグを利用すると良さそう。/></h:selectOneMenu>とっても簡単。SessionBean側で@Beginをしておかないと、JSFのライフサイクルエラーが出てうまくいかなかった。フォーム系は全て@Beginと@Endでライフサイクルを意識した方が良さそう。