1

次のマッピングがある場合、URLと一致するようにカスタム正規表現パターンを作成する必要がありますか(例):

<url-mapping id="approvedQuestions">
    <pattern>/questions/approved/#{viewOption}/</pattern>
    <view-id>/approved.xhtml</view-id>
</url-mapping>

ユーザーがURLを「/」で終わらせない場合、viewoption-portionも一致する必要がありますか?また、viewOption部分をまったく追加しない場合、ある種のデフォルト値を指定することは可能ですか?

また、viewOptionが列挙型の場合、パラメーターを小文字にすることはできますか?今、私はそれを機能させるために大文字を書かなければなりません。

4

1 に答える 1

3

カスタム正規表現を使用してこのタイプを実行できますが、url-rewriteルールを使用して、末尾にスラッシュがない場合は追加することをお勧めします。1つのURL(末尾に「/」がある場合とない場合)を選択する必要があります。そうしないと、実際には2つの異なるアドレスで同じリソースを提供し、検索エンジンや他のクローラーによって罰せられます。

これを行うには、次のような書き換えルールを使用します。

<rewrite match="/questions/approved/[^/]+" trailingSlash="append" />

これにより、サーバーはURLの末尾に「/」がないことを検出し、末尾に「/」を付けてリクエストを適切な場所にリダイレクトします。

列挙型の問題に対処するために、これはもう少し複雑です。通常、値を列挙に直接バインドすることはお勧めしません。この場合、実際には列挙型にバインドしていませんが(推測しています)、リテラル文字列のURL値をリクエストスコープのELコンテキストに実際にバインドしています。この値は、アプリケーションの別の場所で抽出され、そこでENUMへの変換が行われます。

PrettyFaces 4がリリースされるまでは、代わりに値をStringの場所にバインドし、アクションメソッドを使用して、次のように正しい値を自分でロードすることをお勧めします。

<url-mapping id="approvedQuestions">
    <pattern>/questions/approved/#{params.viewOption}/</pattern>
    <view-id>/approved.xhtml</view-id>
    <action>#{params.loadViewOption}</action>
</url-mapping>

同じくOCPsoftのより高度なURL書き換えツールを試したい場合は、JavaベースのURL書き換えツールである「Rewrite」(http://ocpsoft.com/rewrite/)を使用できますが、そうではありません。 JSFと同じくらい統合されています。

PrettyFaces 4はコアとしての書き換えに基づいており、その時点で、現在使用しているすべての機能が、このようなことを実行できるようになります。これは、私が間違っていない場合に必要なことです。

.addRule(Join.path("/questions/approved/{viewOption}").to("/approved.xhtml")
.where("viewOption")
.matches("[^/]+/?")
.transformedBy(TrailingSlash.append())
.transformedBy(To.upperCase())

ライブラリでまだ定義されていないため、独自のトランスフォーマーを作成する必要がありますが、それが一般的な考え方です。これは、PrettyFacesで現在可能なものよりもはるかに強力ですが、同じJSFナビゲーション統合を提供せず、構成が少し難しいです。

これがお役に立てば幸いです、〜リンカーン

于 2011-11-25T19:26:51.057 に答える