GW中、久しぶりにCore JavaServer Facesの本を改めて読み返していたのですが、RESTful Navigation and Bookmarkable URLsの章で「pretty URLs」という表現があることに気づきました。
Prentice Hall (2010-05-27)
かわいい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を色々と使いやすくするものでした。
サイト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を追加します。
今回はxmlを利用しましたが、アノテーションベースでも書けるようです(試してないです)
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>
のように記述。
サンプルそのまま書いてしまった(^^;けど動きました。ためしに「book」というパラメータにすると
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を意識した設計をすることはあまりないと思いますが、その辺を結び付けたいときには使えるのかも。相性が良いかは置いておいて。
また、今回はお試しレベルにすぎず、実戦投入してるわけではないので、ご注意を(^^;