2011-10-06 113 views
7
<c:url var="myUrl" value="/MyPath/${MyID}"/> 

然後我使用後(以使用戶能夠複製鏈接)主機名:訪問完整的URL,包括JSTL

<input size="35" disabled value="${myUrl}" /> 

,它顯示

/my-app-name/MyPath/23 

但是我想它

http://myHost/my-app-name/MyPath/23 

我可以預先確定字符串,但想要一種方式積極獲取正確的主機名...?

+2

旁註:請記住,主動獲取主機名會爲您提供用於訪問服務器的主機名。如果它是re​​verseProxy後面的應用程序(例如對應用程序服務器的Apache重新路由請求),則用戶看不到主機名。 – helios

回答

22

你需要自己根據HttpServletRequest#getRequestURL()JSTL functions一點幫助準備吧:

<c:set var="req" value="${pageContext.request}" /> 
<c:set var="baseURL" value="${fn:replace(req.requestURL, fn:substring(req.requestURI, 1, fn:length(req.requestURI)), req.contextPath)}" /> 
... 
<c:url var="myUrl" value="${baseURL}/${MyID}"/> 
+0

很快,thnx會給它一個鏡頭。 – NimChimpsky

+0

在tomcat 7.0.52上,我不得不將子串的起始位置從1改爲0:'fn:substring(req.requestURI,0,fn:length(req.requestURI))等等,' – cthiebaud

+3

甚至更​​好, tomcat 7.0.52,簡化的baseURL適用於我:'' – cthiebaud

7

HttpServletRequest對象擁有的所有細節:

  • getProtocol
  • getServerName
  • getContextPath

所以我覺得你可以使用:

${request.protocol} :// ${request.serverName} ${request.contextPath} /etc 

打造你想要的。

+4

and port too :) – helios

+2

只有當它已經是給定協議的默認端口時,您纔會以笨拙的if-else邏輯流程結束以隱藏端口。基於'getRequestURL()'構建起來更容易。另外,'getServerName()'可以由客戶端通過'Host'請求頭來操作,我不會依賴這個。 – BalusC

+0

好的。我沒想到隱藏港口。我沒有采用getRequestURL方式,因爲OP想更改URL。一個問題。我沒有理解服務器名稱操作。是否,如果客戶發送一個Host:www.other.com將進入我們的內置網址? – helios