2010-06-29 22 views
3

我的Java Web應用程序包含一個啓動servlet。當Web應用程序服務器(Tomcat)啓動時,將調用其init()方法。在這種方法中,我需要我的Web應用程序的URL。由於沒有HttpServletRequest,如何獲取此信息?如何從內部識別Java Web應用程序的URL?

+3

你不能。你需要什麼?請詳細說明功能要求,而不是詢問如何實現您認爲它是正確的解決方案的解決方案,但這可能不是正確的解決方案。也許這個要求反過來可以合理地回答。 – BalusC 2010-06-29 11:51:43

+0

我想發送一封包含網絡應用程序URL的電子郵件。 至少,上下文路徑會很好。 – Witek 2010-06-29 13:59:17

回答

1

這裏是如何對我的作品,也許對於大多數配置:

public static String getWebappUrl(ServletConfig servletConfig, boolean ssl) { 
    String protocol = ssl ? "https" : "http"; 
    String host = getHostName(); 
    String context = servletConfig.getServletContext().getServletContextName(); 
    return protocol + "://" + host + "/" + context; 
} 

public static String getHostName() { 
    String[] hostnames = getHostNames(); 
    if (hostnames.length == 0) return "localhost"; 
    if (hostnames.length == 1) return hostnames[0]; 
    for (int i = 0; i < hostnames.length; i++) { 
     if (!"localhost".equals(hostnames[i])) return hostnames[i]; 
    } 
    return hostnames[0]; 
} 

public static String[] getHostNames() { 
    String localhostName; 
    try { 
     localhostName = InetAddress.getLocalHost().getHostName(); 
    } catch (UnknownHostException ex) { 
     return new String[] {"localhost"}; 
    } 
    InetAddress ia[]; 
    try { 
     ia = InetAddress.getAllByName(localhostName); 
    } catch (UnknownHostException ex) { 
     return new String[] {localhostName}; 
    } 
    String[] sa = new String[ia.length]; 
    for (int i = 0; i < ia.length; i++) { 
     sa[i] = ia[i].getHostName(); 
    } 
    return sa; 
} 
5

你不能。因爲「從內部」沒有「Java Web應用程序的URL」。一個servlet不綁定到一個URL,這是從外部完成的。 (也許你有一個連接到Tomcat的Apache服務器--Tomcat無法知道它) 問一個HttpServletRequest的URL是很有意義的,因爲我們正在講述一個事件的信息(URL是實際上用於生成此請求),請求配置 URL是沒有意義的。

1

解決方法是在第一個請求到達時執行初始化。您可以實現一次這樣做的過濾器,例如通過將boolean標誌存儲在靜態變量中並正確地同步對標誌的訪問。但它意味着一點開銷,因爲每個後續請求都會通過過濾器,然後繞過初始化。只是一個想法。

1

在servlet API中沒有提供這些信息的東西,再加上任何給定的資源都可能綁定到多個URL。

你能做什麼,是當你收到一個實際的請求時檢查servlet上下文並查看使用了哪個URL。

相關問題