100

这是场景。

我的 Java Web 应用程序具有以下路径

https://www.mywebsite.com:9443/MyWebApp

假设有一个 JSP 文件

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp

我需要找回

https://www.mywebsite.com:9443/MyWebApp 

在这个 JSP 文件中。

当然,有一种相当懒惰和愚蠢的方式来获取 URL,然后重新跟踪路径。

但是有没有一种程序化的方式来做到这一点?具体来说,我认为我可以获得域+端口,但我如何实际检索应用程序名称“MyWebApp”?

4

6 回答 6

110

查看HttpServletRequest.
为了在您的示例中构建 URL,您需要使用:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

这是一个将返回您的示例的方法:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
于 2010-02-05T04:15:05.550 回答
94

Web 应用程序名称(实际上是上下文路径)可通过调用获得HttpServletrequest#getContextPath()(因此getServletPath()不像之前建议的那样)。您可以在 JSP 中通过${pageContext.request.contextPath}.

<p>The context path is: ${pageContext.request.contextPath}.</p>

如果您打算将它用于 JSP 页面中的所有相对路径(这会使这个问题更有意义),那么您可以使用 HTML<base>标记:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2204870</title>
        <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
        <script src="js/global.js"></script>
        <link rel="stylesheet" href="css/global.css">
    </head>
    <body>
        <ul>
            <li><a href="home.jsp">Home</a></li>
            <li><a href="faq.jsp">FAQ</a></li>
            <li><a href="contact.jsp">Contact</a></li>
        </ul>
    </body>
</html>

然后页面中的所有链接将自动相对于 ,<base>因此您无需在任何地方复制粘贴上下文路径。请注意,当相对链接以 a 开头时/,它们将不再与 the 相关<base>,而是与域根相关。

于 2010-02-05T11:36:28.090 回答
31

应用程序名称来自getContextPath.

我从Agile Software Craftsmanship HttpServletRequest Path Decoding中发现这张图 整理了所有可用的不同方法:

在此处输入图像描述

于 2018-05-12T22:13:13.763 回答
7

我强烈建议您通读文档,了解类似的方法。如果您对上下文路径感兴趣,请看这里,ServletContext.getContextPath()

于 2010-02-05T03:43:20.770 回答
4

以下代码可能对使用 JavaScript 的 Web 应用程序有用。

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));
于 2013-07-01T03:57:55.287 回答
-1

如果您将 url 作为字符串传递并想要提取该应用程序的上下文根,则可以使用此正则表达式来提取它。它适用于以上下文根开头的完整 url 或相对 url。

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
于 2014-05-07T20:10:44.873 回答