2015-12-16 51 views
2

我希望能夠靜態(或全局地)訪問我自己的應用程序的URL,也就是我想知道根上下文路徑的URL,因此對於如果是比如在:如何知道Servlet應用程序中的Web應用程序URL

http://example.com/contextroot/

我希望能夠得到我的應用程序的任何部分信息。所以我想在應用程序初始化後我必須獲得這些信息,我的直覺告訴我它在偵聽器或Servlet攔截器中的某個位置,但我不確定我可以在哪裏存儲這些信息,例如Singleton。

+0

你的意思是像使用'@RequestMapping(值= 「/上下文根」,方法= RequestMethod.GET)':請求可以使用獲得的屬性? –

+0

@HassanAlBourji我從來沒有提到過Spring MVC,我使用普通Servlets – MichelReap

+0

也是我想要的是完整的URL,如協議://域/上下文 – MichelReap

回答

1

我幾年前做過類似的事情。 但是有一點邏輯涉及。

request.getRequestURL() 

你其實可以得到您的應用程序的完整路徑,但如果你這樣做在servlet中,你的結果會是這樣的。

http://<server:port>/<contextname>/<servletName> 

我所做的只是解析字符串,並用空字符串替換servletName。

爲了使這個全局可用,我使用了servlets上下文屬性。

getServletContext().setAttribute(key, value) 

在Servlet中,您可以通過上下文對象全局訪問它們。

在JSP中,我曾使用JSTL和訪問這樣

${applicationScope.key} 

我覺得可能是更好的選擇,要做到這一點,但是這已經爲我

+1

請注意,這取決於給定的請求,由客戶端,所以你基本上不能依靠這些信息.. – lunatikz

0

Web應用程序沒有定義工作主機和端口本身,它定義上下文根和上下文根中可用的所有資源。該主機和端口的服務器配置的一部分,而不是可以通過任何Servlet API的其他不是通過請求對象使用這種方法的入站請求的一部分:

HttpServletRequest.getRequestURL() 
ServletRequest.getLocalName() 
ServletRequest.getLocalPort() 

如果你不希望建立一個變量作爲請求的一部分,另一個選項是ServletContextListener - 您可以在contextInitialized方法中設置ServletContext屬性,但您需要從其他方式讀取主機名和端口。

ServelRequest.getServletContext().geAttribute() 
相關問題