2010-11-04 70 views
6

我知道請求對象有一個獲取服務器名稱的函數。 (即HttpServletRequest.getServerName())Servlet初始化期間獲取服務器名稱

如果我在servlet的初始化過程中需要相同的功能,該怎麼辦?我該怎麼做呢?

+2

如果我調用java.net.InetAddress.getLocalHost()。getCanonicalHostName()來獲取服務器名稱,是否有任何問題/問題? – 2010-11-04 23:44:14

+0

是的,當你有你的主機的別名。例如,您的應用程序可能在'http:// www.google.com /'下可見,而使用'getCanonicalHostName()'可能會給你'http:// nuq05s02-in-f18.1e100.net /' – 2015-02-27 16:18:35

回答

4

此信息是基於請求而非嚴格基於應用程序。它可以按每個請求更改。在Servlet初始化期間,您手頭上的所有內容都是ServletContext實例,該實例繼而提供像getInitParameter()這樣的方法。您可以利用它來訪問應用程序範圍的設置。

所以最好的辦法是在web.xml

<context-param> 
    <param-name>serverName</param-name> 
    <param-value>foo</param-value> 
<context-param> 

所以手動設置服務器名稱作爲上下文參數,你可以在servlet的init()方法如下得到它:

String serverName = getServletContext().getInitParameter("serverName"); 

另一個(不推薦)替代方法是將其設置爲顯示名稱web.xml

<display-name>foo</display-name> 

,這樣就可以如下得到它:

String serverName = getServletContext().getServletContextName(); 
0

我認爲這是不可能的。主持人可以有多個名字。哪一個應該被退回?主機可能甚至不知道在DNS中配置的所有名稱。

+0

我認爲asker希望從HttpServletRequest.getServerName()獲得與通用HttpServlet相同的值。有返回名稱的標準行爲。 – 2011-09-19 09:35:30

+0

HttpServletRequest確實包含一個服務器名稱,因爲Web瀏覽器發送了一個名稱。在初始化servlet時,沒有要求從中讀取服務器名稱的請求。 – MForster 2011-10-05 08:58:12

3

如果由於某種原因你不想使用BalusC的回答,你不馬上需要的名字,你可以懶洋洋地做到這一點。有一天,我實現了一個類似的情況那樣。

private volatile boolean initialized; 

public void doGet(..) { 
    if (!initialized) { 
     synchronized(this) { 
      if (!initialized) { 
       initialize(request.getServerName()) 
      } 
     } 
    } 
} 

(雙重檢查鎖定爲懶惰初始化可以以多種方式實現See wikipedia

0

InetAddress.getLocalHost()的gethostname()