回答
我假設你正在使用JSF 2和Java EE 6的這個答案。
實際的機制將根據到你需要的原始URL的長度變化的實施。
你首先需要獲得(而不是portlet容器假定爲一個)訪問底層的Servlet容器生產HttpServletRequest對象。使用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。
非常感謝。 – Lan 2011-06-03 04:18:13
最好的方法是訪問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']}" />
- 1. 在JSF bean中獲取請求URL?
- 2. JSF請求範圍Bean將根據請求創建新的bean
- 3. 請求如何被dispacther servlet處理?
- 4. 如何獲得請求的URL與Request.Path.Substring
- 5. 請求作用域bean JSF
- 6. 在servlet中獲取請求URL
- 7. JSF Servlet模式/奇怪的請求
- 8. 如何在Java servlet中捕獲不存在的請求URL?
- 9. 如何綁定請求url模板請求和Bean?
- 10. 如何獲得請求的URL和請求體在使用時wp_router_generate_routes
- 11. 如何獲得請求的URL在一個jQuery $不用彷徨/ Ajax請求
- 12. 如何管理POST請求
- 13. 如何訪問Liferay portlet請求中的JSF bean中的servlet會話屬性?
- 14. 如何獲取請求URL?
- 15. JSF請求範圍的託管bean http-session導致實例化
- 16. 如何在請求JSF頁面時調用bean中的方法?
- 17. 獲取被請求/被請求的頁面的名稱
- 18. 請求的資源在JSF
- 19. 如何獲得http請求
- 20. 如何從JSF 1.2中的URL獲取請求參數?
- 21. 轉發請求時的Servlet/JSP URL
- 22. 多個請求處理servlet
- 23. GET請求被禁止的,而POST請求經過精細
- 24. 如何處理boost :: program_options中的未經請求的參數
- 25. Jsf Haning請求
- 26. 如何獲取xmlhttp請求的URL(AJAX)
- 27. Servlet請求
- 28. tomcat請求servlet
- 29. 請求和servlet
- 30. 如何獲得回調servlet中的「請求令牌」?
由於我在本地主機上沒有辦法,現在有一個真實的域名進行測試。你能告訴我哪一種方法會給我這個域名嗎?我想檢索www.mydomain.com – Ced 2016-05-24 15:34:25