我知道請求對象有一個獲取服務器名稱的函數。 (即HttpServletRequest.getServerName())Servlet初始化期間獲取服務器名稱
如果我在servlet的初始化過程中需要相同的功能,該怎麼辦?我該怎麼做呢?
我知道請求對象有一個獲取服務器名稱的函數。 (即HttpServletRequest.getServerName())Servlet初始化期間獲取服務器名稱
如果我在servlet的初始化過程中需要相同的功能,該怎麼辦?我該怎麼做呢?
此信息是基於請求而非嚴格基於應用程序。它可以按每個請求更改。在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();
我認爲這是不可能的。主持人可以有多個名字。哪一個應該被退回?主機可能甚至不知道在DNS中配置的所有名稱。
我認爲asker希望從HttpServletRequest.getServerName()獲得與通用HttpServlet相同的值。有返回名稱的標準行爲。 – 2011-09-19 09:35:30
HttpServletRequest確實包含一個服務器名稱,因爲Web瀏覽器發送了一個名稱。在初始化servlet時,沒有要求從中讀取服務器名稱的請求。 – MForster 2011-10-05 08:58:12
如果由於某種原因你不想使用BalusC的回答,你不馬上需要的名字,你可以懶洋洋地做到這一點。有一天,我實現了一個類似的情況那樣。
private volatile boolean initialized;
public void doGet(..) {
if (!initialized) {
synchronized(this) {
if (!initialized) {
initialize(request.getServerName())
}
}
}
}
(雙重檢查鎖定爲懶惰初始化可以以多種方式實現See wikipedia)
InetAddress.getLocalHost()的gethostname()
如果我調用java.net.InetAddress.getLocalHost()。getCanonicalHostName()來獲取服務器名稱,是否有任何問題/問題? – 2010-11-04 23:44:14
是的,當你有你的主機的別名。例如,您的應用程序可能在'http:// www.google.com /'下可見,而使用'getCanonicalHostName()'可能會給你'http:// nuq05s02-in-f18.1e100.net /' – 2015-02-27 16:18:35