如何获取域名URL和应用程序名称?

eri*_*bae 96 jsp base-url

这是场景.

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

https://www.mywebsite.com:9443/MyWebApp
Run Code Online (Sandbox Code Playgroud)

假设有一个JSP文件

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp
Run Code Online (Sandbox Code Playgroud)

我需要检索

https://www.mywebsite.com:9443/MyWebApp 
Run Code Online (Sandbox Code Playgroud)

在这个JSP文件中.

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

但是有没有一种编程方式呢?具体来说,我想我可以获得域+端口,但是如何实际检索应用程序名称"MyWebApp"?

Jat*_*aro 103

看看文档HttpServletRequest.
要在您的示例中构建URL,您需要使用:

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

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

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*usC 91

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

<p>The context path is: ${pageContext.request.contextPath}.</p>
Run Code Online (Sandbox Code Playgroud)

如果您打算将这个用于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>
Run Code Online (Sandbox Code Playgroud)

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

  • 在XHTML DOCTYPE中,您需要在contextPath中附加一个'/'字符.<base href ="$ {pageContext.request.contextPath} /"> (2认同)

Agi*_*Pro 17

应用程序名称来自getContextPath.

我从Agile Software Craftsmanship中找到这个图形HttpServletRequest Path Decoding可以 找出所有可用的不同方法:

在此输入图像描述

  • 该图对于回答许多问题很有用。我曾尝试在许多问题的答案中使用它,但它们都被删除了:有一条规则禁止重复使用相同的答案。这是一种耻辱。理论上来说,如果您使用相同的答案,那么问题一定是相同的,因此您应该将问题标记为重复。但这不是现实。有许多不同的问题可以用同一个图形来回答。实施如此武断的规则是心胸狭隘的。如果您发现此图最适合回答某个问题,请使用它。 (2认同)

Ade*_*ari 7

对于类似的方法,我强烈建议你阅读文档.如果您对上下文路径感兴趣,请查看ServletContext.getContextPath().