2010-02-05 103 views
84

以下是該場景。如何獲取域名的URL和應用程序名稱?

我的Java Web應用程序有以下路徑

https://www.mywebsite.com:9443/MyWebApp 

比方說,有一個JSP文件

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp 

,我需要這個JSP文件中檢索

https://www.mywebsite.com:9443/MyWebApp 

當然,有一種懶惰和愚蠢的方式來獲取URL,然後重新追溯路徑。

但是有沒有這樣做的程序化方式?具體來說,我認爲我可以獲得域+端口,但我如何實際檢索應用程序名稱「MyWebApp」?

回答

85

Web應用程序名稱(實際上是上下文路徑)可通過調用HttpServletrequest#getContextPath()(因此如前面建議的那樣不是getServletPath())來使用。您可以通過${pageContext.request.contextPath}在JSP中檢索這個。

<p>The context path is: ${pageContext.request.contextPath}.</p> 

如果你打算用這個在JSP頁面中的所有相對路徑(這將使這個問題更有意義),那麼你可以使用HTML的<base>標籤:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<c:set var="req" value="${pageContext.request}" /> 
<c:set var="url">${req.requestURL}</c:set> 
<c:set var="uri" value="${req.requestURI}" /> 

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2204870</title> 
     <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/"> 
     <script src="js/global.js"></script> 
     <link rel="stylesheet" href="css/global.css"> 
    </head> 
    <body> 
     <ul> 
      <li><a href="home.jsp">Home</a></li> 
      <li><a href="faq.jsp">FAQ</a></li> 
      <li><a href="contact.jsp">Contact</a></li> 
     </ul> 
    </body> 
</html> 

所有那麼頁面中的鏈接將自動相對於<base>,因此您無需在任何地方複製上下文路徑。請注意,如果相關鏈接以/開頭,則它們不再是相對於<base>而是相對於域根。

+0

Doc狀態:「由'ServletContext.getContextPath()'返回的上下文路徑應被視爲應用程序的主要或首選上下文路徑」。這就是我在意識到這個事情之後將這一個包含在我的原始答案中的原因。我沒有刪除我的第一次嘗試,因爲我希望OP考慮閱讀文檔並瞭解更多關於相關方法的信息。我希望你明白我的觀點。 – 2010-02-05 14:02:47

+0

@Vinegar:對於JSP文件,getServletPath()返回'/ filename.jsp'。 OP沒有要求那麼做,這當然不是要走的路。 – BalusC 2010-02-05 14:25:52

+0

我當然會在我的帖子中進行更正,但這次我期待着對我的評論的迴應,這是完全不同的:)。 – 2010-02-08 09:44:33

93

查看HttpServletRequest的文檔。
爲了建立你的榜樣的網址,您將需要使用:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

這裏是一個將返回一個方法你例如:

public static String getURLWithContextPath(HttpServletRequest request) { 
    return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); 
} 
+1

如何在服務器名爲localhost的情況下獲取ip? – 2012-11-11 14:15:12

+0

只是簡單的說明,getScheme()並不總是適用於https,一些服務器有奇怪的行爲,並且可能總是返回http而不是https。我以爲我應該讓你知道。嘗試request.getRequestURL()。toString()和按摩,如果你需要 – 2013-03-08 19:05:21

+0

@MahmoudSaleh'request.getLocalAddr()' – bluish 2013-03-21 07:51:44

1

以下代碼可能對使用JavaScript的Web應用程序非常有用。

var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname; 

newURL = newURL.substring(0,newURL.indexOf("")); 
0

如果你正在傳遞一個URL作爲一個字符串,並要提取該應用程序的上下文根,你可以使用這個正則表達式來解壓。它將適用於以上下文根開頭的完整網址或相關網址。

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3") 
相關問題