URLが http:// localhost:8080/project-name/resource.xhtml であると仮定すると、
JSF管理Beanで次の http:// localhost:8080/project-name を取得したい。
JSF 2とJava EE 6をこの回答に使用していると仮定します。
実際のメカニズムの実装は、元のURLが必要になる範囲によって異なります。
HttpServletRequestオブジェクトで生成された、基礎となるサーブレットコンテナ(ポートレットコンテナではなく、1つと想定)へのアクセスを取得する必要があります。 FacesContext
オブジェクトを使用して、次の方法でHttpServletRequestオブジェクトにアクセスします。
_HttpServletRequest origRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
_
HttpServletRequest
クラスは、元のリクエストの近似表現を取得するためのいくつかのユーティリティメソッドを提供します。
getRequestURL()
、これはクエリ文字列を除く元のリクエストを提供しますgetScheme
、getServerName
、getServerPort
、getContextPath
、getServletPath
、getPathInfo
およびgetQueryString
のすべて出力を順番に組み合わせて元のリクエストを取得できます。 URLのより小さなフラグメントが必要な場合は、後者の呼び出しを省略しなければならない場合があります。次のようにして取得できます。
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を取得することは、コードにおいのアラームです。
この形式のようなもので 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をベースとして使用することは、一般的な場合にアプリケーションのリソースを参照する正しい方法ではないことに注意してください。 ViewHandler
とExternalContext
は、アプリケーションリソースを参照するためのリソースURLを作成して、JSFライフサイクルを呼び出すためのリソースまたはアクションURLを取得するために使用する必要があります。
残念ながら、JSFアプリでやりたいことをすべて行うための一般的なコンテナに依存しない方法があるとは思わないので、実装に依存していることがあります他のAPIにキャストする以外の選択肢はほとんどありません。
最善の方法は、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']}" />