2011-10-06 116 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