Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

JSFのURLをきれいにするPrettyFaces

GW中、久しぶりにCore JavaServer Facesの本を改めて読み返していたのですが、RESTful Navigation and Bookmarkable URLsの章で「pretty URLs」という表現があることに気づきました。

かわいいurlって何?と思ったのですが、Alcで調べると、prettyには「きれいにする」という意味があるようです。eow.alc.co.jp

本の文脈的にもこれっぽい。。。で、本の中には

Currently, JSF does not have a standard mechanism for producing or consuming "pretty URLs", but since JSF 2.0, there is support for GET requests.

と記述があって、Bookmarkableな仕組みの話につないでいました。

で、そういえばPrettyFacesというライブラリがあったなぁと。

PrettyFaces

前にPrettyFacesを知ったときは、PrimeFacesやIceFacesのようなリッチコンポ―ネントの1つなのかなー?ぐらいの感じでスルーしてました(^^;; が、上記の意味を知って、改めてみてみたらJSFにおけるURLを色々と使いやすくするものでした。

f:id:kikutaro777:20150507223224j:plain

サイトTopページに

PrettyFaces is an OpenSource URL-rewriting library with enhanced support for JavaServer Faces – JSF 1.1, 1.2 and 2.0 – enabling creation of bookmark-able, pretty URLs. PrettyFaces solves the “RESTful URL” problem elegantly, including features such as: page-load actions, seamless integration with faces navigation, dynamic view-id assignment, managed parameter parsing, and configuration-free compatibility with other web frameworks.

とあります。JSFで"RESTful URL"…!?

気になったので、ちょっと触ってみました。

mavenのpom.xmlで以下追加しました。

<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-servlet</artifactId>
    <version>3.0.0.Alpha6</version>
</dependency>
<dependency>
    <groupId>org.ocpsoft.rewrite</groupId>
    <artifactId>rewrite-config-prettyfaces</artifactId>
    <version>3.0.0.Alpha6</version>
</dependency>

WEB-INF配下に「pretty-config.xml」というxmlを追加します。

f:id:kikutaro777:20150507223528j:plain

今回はxmlを利用しましたが、アノテーションベースでも書けるようです(試してないです)

URLのマッピング

JSFでベタにWebアプリを作成すると、以下のようなURLになります(facesはservlet-mappingで変更可能+ここの例ではxhtmlを利用を前提としてます)

http://localhost:8080/PrettyFaces/faces/login.xhtml

PrettyFacesでは、これを

http://localhost:8080/PrettyFaces/login

と以下定義によってマッピングできます。

pretty-config.xmlの定義

<url-mapping id="login">
    <pattern value="/login" />
    <view-id value="/faces/login.xhtml" />
</url-mapping>

Path Parameters

PrettyFacesのDocumentationでは「3.2. Add Path-parameters to your mapped URL (REST)」のタイトルにあるようにRESTとして紹介しています。

http://localhost:8080/PrettyFaces/faces/product/order.xhtml

http://localhost:8080/PrettyFaces/product/ここにパラメータ

のようにマッピング。JSFのViewParamで取れるとのことで

<h:body>
    <h:form>
        <f:metadata>
            <f:viewParam name="id" value="#{orderBean.id}" />
        </f:metadata>

        <h:outputText value="#{orderBean.id}" />
    </h:form>
</h:body>

のように記述。

f:id:kikutaro777:20150507230638j:plain

サンプルそのまま書いてしまった(^^;けど動きました。ためしに「book」というパラメータにすると

f:id:kikutaro777:20150507230734j:plain

pretty-config.xmlは以下です。

<url-mapping id="order">
    <pattern value="/product/#{id}" />
    <view-id value="/faces/product/order.xhtml" />
</url-mapping>

なお、直接EL式でバインドも可能なようで、次のような設定でも動きました。

<url-mapping id="user">
   <pattern value="/#{userBean.user}" />
   <view-id value="/faces/user/user.xhtml" />
</url-mapping>

他にも色々と機能あるようなので、もう少しみてみようかなぁ。

JSFではServletやJAX-RSを比べて、URLを意識した設計をすることはあまりないと思いますが、その辺を結び付けたいときには使えるのかも。相性が良いかは置いておいて。

また、今回はお試しレベルにすぎず、実戦投入してるわけではないので、ご注意を(^^;

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