访问完整的URL,包括带有jstl的主机名

Nim*_*sky 7 java jsp jstl spring-mvc

<c:url var="myUrl" value="/MyPath/${MyID}"/>
Run Code Online (Sandbox Code Playgroud)

我稍后使用它(使用户能够复制链接):

<input size="35" disabled value="${myUrl}" />
Run Code Online (Sandbox Code Playgroud)

它显示

/my-app-name/MyPath/23
Run Code Online (Sandbox Code Playgroud)

但我希望它是

http://myHost/my-app-name/MyPath/23
Run Code Online (Sandbox Code Playgroud)

我可以肯定前置字符串,但想要一种主动获取正确主机名的方法......?

Bal*_*usC 23

您需要根据JSTL函数HttpServletRequest#getRequestURL()的一些帮助自己做好准备:

<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}"/>
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,在tomcat 7.0.52上,简化的baseURL适用于我:`<c:set var ="baseURL"value ="$ {fn:replace(req.requestURL,req.requestURI,req.contextPath)}"/> ` (3认同)
  • @cthiebaud:如果将webapp部署到上下文根并且请求URI为"/",则会失败.如果请求URL包含-by重复的请求URI部分,这也会失败.你最好通过索引对确切的部分进行子串. (2认同)

hel*_*ios 7

HttpServletRequest对象具有所有细节:

  • getProtocol
  • getServerName
  • getContextPath

所以我认为你可以使用:

${request.protocol} :// ${request.serverName} ${request.contextPath} /etc
Run Code Online (Sandbox Code Playgroud)

建立你想要的东西.

  • 和港口:) (4认同)
  • 你只会在一个笨拙的if-else逻辑流程中结束,以便在它已经是给定协议的默认端口时隐藏端口.基于`getRequestURL()`构建起来更容易.另外,`getServerName()`可由客户端通过`Host`请求头操作,我不会依赖于此. (2认同)