Contents
URLマッピング
現状、JavaEE(JSF+JavaBean+EJB+JPA)を使って開発していますが、フレームワークを使って開発していますとURLの整合性をしっかりと考える必要が出てきます。
URLとページのマッピングがそのまま対応していればいいのですがパラメーターをいれたり、きれいに整形したい場合は書き換えをする必要があります。
一番多いのはhttp://hogehoge.com/product/view/7
などといった形で7を商品IDとして取得し、この商品データを表示したいといったようなケースでしょう。
自分が関わっているものはさらに特殊でして
上記のurlでhttp://hogehoge.com/uId/1/product/list
とアクセスしたときに
src/main/webapp/product/list.xhtml
に飛ばしたいというような実装でした。
要はuId/1/といったディレクトリは全くありません。しかもuID/1/の1をパラメータとして内部で処理したい場合ですね。
これをJavaEEで実装する方法が何とか見つかりましたのでかかせていただきます。
prettyfaces
上記のようなページの設定の場合、ディフォルトでできる方法が見つからずあきらめていましたが、ボス(社長)がprettyfacesというライブラリを発見してもらいました。
http://www.ocpsoft.org/prettyfaces/
このライブラリを使うことでurlのリライトができます。
導入方法
pom.xmlの設定
mavenのpom.xmlに以下の記述を書きます。
1 2 3 4 5 6 7 8 9 10 |
<dependency> <groupId>org.ocpsoft.rewrite</groupId> <artifactId>rewrite-servlet</artifactId> <version>2.0.12.Final</version> </dependency> <dependency> <groupId>org.ocpsoft.rewrite</groupId> <artifactId>rewrite-config-prettyfaces</artifactId> <version>2.0.12.Final</version> </dependency> |
pretty-config.xmlの設定
次にpretty-config.xmlという設定ファイルをWEB-INF直下に置きます。
内容は下記のように設定します。
1 2 3 4 5 6 7 8 9 10 |
<pretty-config xmlns="http://ocpsoft.org/schema/rewrite-config-prettyfaces" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ocpsoft.org/schema/rewrite-config-prettyfaces http://ocpsoft.org/xml/ns/prettyfaces/rewrite-config-prettyfaces.xsd"> <url-mapping id="page" > <pattern value="/uId/#{companyId}/#{pageType}/#{page}" /> <view-id value="#{rootingBean.getPath}" /> </url-mapping </pretty-config> |
このように書くと<pattern>はマッチするURLのパターンで、
<view-id>は該当のページまたは処理です。
<pattern>には正規表現などもいけるようですが、ワイルドカードはだめでした。
マッチングパターンの具体例などは下記URLが参考になります。
http://www.ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/Configuration.html#config.dynaview
view-idには静的なページを記述することもできますが、今回のように動的な処理を行いたい場合はMangedBeanのメソッドを呼び出します。
ManagedBeanでのパラメーターの取得方法
RootingBeanには下記のような記述を行います。(※実際にはuIdをとる処理がありますが該当ページに飛ばしたいのが趣旨なので省略します。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
@Named @RequestScoped public class RootingBean extends ViewBase implements Serializable { /** * pretty-config.xmlでマッチしたURLをここで解析し、該当ページに飛ばす * @return ページ */ public String getPath() { String pageType; String page; pageType = this.getRequestParameter("pageType") != null ? "/" + this.getRequestParameter("pageType") : ""; page = this.getRequestParameter("page") != null ? "/" + this.getRequestParameter("page") : ""; String url = createUrl(pageType, page); return url; } /** * URLの作成 * @param pageType adminかmasterかのページタイプ * @param page 実際のページ * @return ページ */ public String createUrl(String pageType, String page) { String url; //両方からの場合はindex.xhtml if (pageType.length() == 0 && page.length() == 0) { url = "/index.html"; } else if (page.length() == 0) { //pageがないケース url = pageType; } else { //正常系 url = pageType + page; } return url; } /** * リクエストパラメーターの取得 * @param 取得したいパラメーターのキー * @return パラーメータ */ public String getRequestParameter(String name) { Map<String, String> map = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); return map.get(name); } } |
これで該当ページに飛ばすことができました。
まだまだ不完全なのですが、このリライト機能はいろいろと応用範囲はありそうです。