2015-01-12 79 views
5

表示されるコンテンツの一部がURLに依存する「一般的な」ビューを実装しようとしています。例えば。JSFでルーティングを実装する簡単な方法はありますか?

:代わりに、私のようなものを持っている私は、一般的なビューを使用してデータベースから /somepath/somepage.xhtmlのコンテンツを取得するために試してみたい404エラー、 /genericview.xhtml、にまっすぐ行くの非既存のファイルへ

/somepath/somepage.xhtmlた場合のポイント、

<h:outputText value="#{genericViewBean.content_lg}" 
       escape="false" /> 
バッキングBeanによって見つかった場合、

、最初に要求のviewIdに応じて希望出力tgenericcontentテーブルからデータベースエントリの内容、:

webpath        | content 
/somepath/somepage.xhtml    | <p>This is a test</p> 
/someotherpath/someotherpage.xhtml | <p>A different test</p> 

場合ビューのコンテンツがそのテーブルに見つからない場合、標準の404エラーが返されます。

最も近いのは、/genericview.xhtmlのファイルパスのみを複製するために浪費しています(たとえば、/somepath/somepage.xhtml)。しかし、それは私に1つのビューのファイルの正確なコピーを取得します。それはかなり面倒です、そして、私は私のデータベースにエントリを追加するだけで新しいURLを作成することができません。

クローニングを行わずに同じ結果を得る方法を教えてください。/genericview.xhtml

(P.S:?私はprettyfacesについて読んだことがあるが、簡単な解決策はありません)

+1

だからフロントコントローラー? 'FacesServlet'がすでにやっていることと違いはありませんか? Prettyfaceや独自のフロントコントローラー(既存のページやサーブレットのいずれかに対応している必要があります)を書くことは、唯一の選択肢です。自分のフロントコントローラー内で、さまざまなメカニズムを使って要求を適切なビューにディスパッチできるようになりました。 – kolossus

+0

オプションを指定すると、prettyfacesをデプロイしてfaces-configを/ genericview.xhtml?path = *またはそのようなもの... – NotGaeL

答えて

9

そのために、通常servlet filterが使用されています。 PrettyFaces,UrlRewriteFilterおよびFacesViewsもそうです。

リクエストURIはHttpServletRequest#getRequestURI()で取得できます。存在しないリソースでnullを返すServletContext#getResource()によってWebリソースの存在を確認できます。リソースが存在する場合は、要求をFilterChain#doFilter()まで続行し、要求を汎用ビューにRequestDispatcher#forward()で転送します。

すべてのすべてで、これは、フィルタは次のようになり可能性がどのようである:/genericview.xhtml

@WebFilter("/*") 
public class GenericViewFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String relativeRequestURI = request.getRequestURI().substring(request.getContextPath().length()); 

     boolean resourceExists = request.getServletContext().getResource(relativeRequestURI) != null; 
     boolean facesResourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)); 

     if (resourceExists || facesResourceRequest) { 
      chain.doFilter(request, response); 
     } 
     else { 
      request.getRequestDispatcher("/genericview.xhtml").forward(request, response); 
     } 
    } 

    // ... 
} 

、元のリクエストURIはRequestDispatcher#FORWARD_REQUEST_URIでキー要求属性として提供されています。 DBから適切なコンテンツを取得するために、ビューに関連付けられたバッキングBeanの@PostConstructに使用することができます。

String originalRequestURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 
// ... 
+0

私はすでにスーパー簡単なRewrite(http://www.ocpsoft.org/rewrite/)設定プロバイダクラスを実装していましたが(prettyfacesの人は間違いなくprettyfacesの大きな後継者:私のPOMに1つだけ余分な依存関係があり、私のプロジェクトで構成プロバイダークラスを実装するだけで、追加の変更は必要ありません。どうもありがとうございました! – NotGaeL

+0

あなたは大歓迎です:) – BalusC

関連する問題