web-dev-qa-db-ja.com

リクエストされたサーブレットなしでjsfマネージドBeanでリクエストURLを取得するにはどうすればよいですか?

URLが http:// localhost:8080/project-name/resource.xhtml であると仮定すると、

JSF管理Beanで次の http:// localhost:8080/project-name を取得したい。

43
Lan

JSF 2とJava EE 6をこの回答に使用していると仮定します。

実際のメカニズムの実装は、元のURLが必要になる範囲によって異なります。

HttpServletRequestオブジェクトで生成された、基礎となるサーブレットコンテナ(ポートレットコンテナではなく、1つと想定)へのアクセスを取得する必要があります。 FacesContext オブジェクトを使用して、次の方法でHttpServletRequestオブジェクトにアクセスします。

_HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
_

HttpServletRequest クラスは、元のリクエストの近似表現を取得するためのいくつかのユーティリティメソッドを提供します。

  • getRequestURL() 、これはクエリ文字列を除く元のリクエストを提供します
  • getSchemegetServerNamegetServerPortgetContextPathgetServletPathgetPathInfoおよびgetQueryStringのすべて出力を順番に組み合わせて元のリクエストを取得できます。 URLのより小さなフラグメントが必要な場合は、後者の呼び出しを省略しなければならない場合があります。
73
Vineet Reynolds

次のようにして取得できます。

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String url = req.getRequestURL().toString();
return url.substring(0, url.length() - req.getRequestURI().length()) + req.getContextPath() + "/";
// ...

要件を達成するためのより良い方法がある可能性があることに注意してください。 JSFマネージドBean内で生のServlet APIを取得することは、コードにおいのアラームです。

25
BalusC

この形式のようなもので ExternalContext を使用すると、コンテナ固有の依存関係を回避できます。

public String getApplicationUri() {
  try {
    FacesContext ctxt = FacesContext.getCurrentInstance();
    ExternalContext ext = ctxt.getExternalContext();
    URI uri = new URI(ext.getRequestScheme(),
          null, ext.getRequestServerName(), ext.getRequestServerPort(),
          ext.getRequestContextPath(), null, null);
    return uri.toASCIIString();
  } catch (URISyntaxException e) {
    throw new FacesException(e);
  }
}

ただし、このコードは完全にコンテナに依存しない可能性があることに注意してください。これらのメソッドの一部は、デフォルト実装でUnsupportedOperationExceptionをスローします。このコードは、JSF 2.0メソッドに依存しています。

また、このようなURIをベースとして使用することは、一般的な場合にアプリケーションのリソースを参照する正しい方法ではないことに注意してください。 ViewHandlerExternalContextは、アプリケーションリソースを参照するためのリソースURLを作成して、JSFライフサイクルを呼び出すためのリソースまたはアクションURLを取得するために使用する必要があります。

残念ながら、JSFアプリでやりたいことをすべて行うための一般的なコンテナに依存しない方法があるとは思わないので、実装に依存していることがあります他のAPIにキャストする以外の選択肢はほとんどありません。

4
McDowell

最善の方法は、ExternalContext RequestHeaderMap属性にアクセスすることです。

    ExternalContext ext = FacesContext.getCurrentInstance().getExternalContext();
    Map<String,String> requestHeader = ext.getRequestHeaderMap();
    urlRefered = requestHeader.get("referer");

BeanにurlRefered属性を保存し、次のようにxhtmlページで処理できます。

<h:outputText value="#{notFoundBean.urlRefered}

Web.xmlファイルにエラーページをマッピングすることも忘れないでください。

<error-page>
    <error-code>404</error-code>
    <location>/xhtml/pg/error/404.xhtml</location>
</error-page>

反対側では、この行から直接xhtmlページにアクセスすることもできます。

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />
1
Sky Games Inc