Yuta's Weblog

All | Personal | Sun
日付別メイン | 次の日(Mar月 31日, 2006年) »

20060330 2006年 3月 30日 木曜日

Shale Remoting と JSF カスタムコンポーネント
Shale リモーティング - 最近のお気に入りです。
そもそもの始まりは、今 GlassFish上で AJAX 化した JSF カスタムコンポーネントを集めた ライブラリ jar を作っているんだけど、その中にあるクラスから同じライブラリ中 のリソース(JavaScript とかイメージとかいろいろ)を返す、consistent な方法は 何かっていう話をしてたわけです。 つまり、通常の web アプリ中に展開される場合は当然その中にあるリソースは WEB-INF の下を除いて URL でアクセス可能なのですが、スタンドアローンな jarファイル では URL でアクセスなんてできない。だから、カスタムコンポーネントの Renderer で HTML とかを出力する時にどのような URL を書き出したらいいかわからない ということになります。
これを解決する方法はいくつかあって、今までは PhaseListener を使ってねといろいろな場で言ってきました。↓こんな感じに↓

    public void afterPhase(PhaseEvent event) {
        String rootId = event.getFacesContext.getViewRoot().getViewId();
        if (rootId.endsWith("特定のJavaScriptファイルとかを指すID")) {
            handleResourceRequest(event, "/META-INF/コンポーネント名/ファイル名",
                "text/javascript");
        }
        ........
    }
    public void handleResourceRequest(PhaseEvent event, String resource, String contentType) {
        1). getClass().getResourceAsStream(resource);で実際のリソース取ってきて、
        2). event.getFacesContext().getExternalContext().getResponse();で
       HttpServletResponse 取って、
        3). リソース読み込んで response に setContentType()して、
            OutputStream に書き出す
     }
ただ、別のリソース を追加したりしたときの管理がけっこう面倒だったり、複数の人が別々のコンポーネント を作ってる時、当然 PhaseListener はそのコンポーネントの数だけ存在する場合が多く、 faces-config.xml に登録されたリスナはすべて起動されて結局同じ JavaScript を 複数回ロードしてしまうような結果をレンダーしてしまうとかいうけっこう厄介な問題が あります。
そうしたら、 Craig McClanahan 氏 が、「そりゃあんさん、Shale Remotingでんがな」とおっしゃって、試してみたところ、 簡単で美しい。好きになってしまいました。

うーん。。。導入部が長くなってしまいました。実際どうやるかは次のブログで。。。 Posted by yuta ( 3月 30日 2006年, 03:41:53 午後 PST ) Permalink 投稿されたコメント [0]


Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.