web-dev-qa-db-ja.com

JSF BeanでリクエストURLを取得しますか?

JSFページをサポートするBeanでリクエストURLをどのように取得しますか?私はFacesContextのドキュメントを調べてきましたが、見つけることができる最良の方法はひどく長いようです:

public String getRequestURL()
{
    Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
    if(request instanceof HttpServletRequest)
    {
            return ((HttpServletRequest) request).getRequestURL().toString();
    }else
    {
        return "";
    }
}

編集:機能要件ここでの要件は、サードパーティのjavascriptユーティリティに完全なURLが必要であることです。ユーティリティの使用またはアーキテクチャーはJSFにうまく適合しませんが、この呼び出し以外のすべては適合します。私が見つけたメソッドは機能しますが、FacesContextを深く掘り下げるのは間違っていると感じました。さらに、これは「ビュー」関連の方法で使用されるため、JSF式言語で呼び出すことができる方法があることを望んでいました。

19
Adam

FacesContextによってJSFフードの下から未加工のサーブレットAPIを引き出す必要がある場合は、間違った場所で作業を行っている可能性があります。これは正しいソリューションだと思った機能要件は何ですか? JSFマネージドBeanの代わりに、実際のServletクラスまたはFilterを使用してはいけませんか?あるいは、同じことを達成するためのより良い「jsfish」方法があるので、リクエストURLがまったく必要ないのではないでしょうか。

機能要件に関する詳細を含めるように質問を更新すると、適切なソリューションを提案できる場合があります。


編集に従って更新:したがって、結局のところ、ビュー側でそれが必要ですか?例えば。 #{bean.requestURL}? ELですでに暗黙的に使用可能なHttpServletRequestオブジェクトから取得することもできます。

JSPを使用している場合:

${pageContext.request.requestURL}

または、Faceletsを使用している場合:

#{request.requestURL}

そして今、JavaScriptでそれをどのように必要としますか? JavaScript変数として印刷しますか?そのようです?

var url = '#{request.requestURL}';

その場合は、単に window.location そのため。

var url = window.location;

ビュー固有の詳細でJSF Beanを散らかす必要はありません。

31
BalusC

すべてのHTTPリクエストはFacesコンテキストから取得する必要があるため、この方法を使用する必要があると思います。もちろん、facesコンテキスト取得など、このメソッドの一部を簡略化することもできますが、これらの詳細を抽象化してHttpRequestオブジェクトに直接アクセスできるような種類のフレームワークを使用しない限り、最終的にはその方法です。

よろしく。

3
Jose Diaz