2011-06-01 69 views

回答

65

我假設你正在使用JSF 2和Java EE 6的這個答案。

實際的機制將根據到你需要的原始URL的長度變化的實施。

你首先需要獲得(而不是portlet容器假定爲一個)訪問底層的Servlet容器生產HttpServletRequest對象。使用FacesContext對象來訪問以下面的方式HttpServletRequest對象:

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

HttpServletRequest類提供了幾種實用方法,以獲得原始請求的近表示:

  • getRequestURL(),它提供了原始請求無查詢字符串
  • getSchemegetServerName,getServerPort,getContextPath,getServletPathgetPathInfogetQueryString所有的輸出可以按順序組合以獲得原始請求。如果您想要較小的URL片段,則可能不得不省略後者的調用。
+0

由於我在本地主機上沒有辦法,現在有一個真實的域名進行測試。你能告訴我哪一種方法會給我這個域名嗎?我想檢索www.mydomain.com – Ced 2016-05-24 15:34:25

19

如下你可以得到它:

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是一種代碼異味警報。

+0

感謝它的智能答案。 – Lan 2011-06-03 04:16:58

+0

@BalusC,工作正常,但在應用程序名稱前返回兩個斜線。 – 2012-10-23 13:59:06

+0

@Mah:查看更新的答案。 – BalusC 2012-10-23 14:03:25

4

您可以通過這樣的形式使用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。

+0

非常感謝。 – Lan 2011-06-03 04:18:13

1

最好的方法是訪問ExternalContext的RequestHeaderMap屬性。

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

你可以在你的XHTML頁面保存在你的bean和工藝urlRefered屬性如下:

<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']}" />