这是情景。
我的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”?
答案 0 :(得分:101)
查看HttpServletRequest
的文档
要在您的示例中构建URL,您需要使用:
getScheme()
getServerName()
getServerPort()
getContextPath()
这是一个返回示例的方法:
public static String getURLWithContextPath(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
答案 1 :(得分:89)
通过调用HttpServletrequest#getContextPath()
(因此之前建议不是getServletPath()
),可以使用Web应用程序名称(实际上是上下文路径)。您可以通过${pageContext.request.contextPath}
在JSP中检索它。
<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>
,这样您就不需要在任何地方复制上下文路径。请注意,当相对链接以/
开头时,它们将不再与<base>
相关,而是与域根相对。
答案 2 :(得分:13)
应用程序名称来自getContextPath
。
我发现Agile Software Craftsmanship HttpServletRequest Path Decoding中的这张图片可以找出所有可用的不同方法:
答案 3 :(得分:7)
我强烈建议您阅读docs,了解类似的方法。如果您对上下文路径感兴趣,请查看ServletContext.getContextPath()。
答案 4 :(得分:4)
以下代码可能对使用JavaScript的Web应用程序有用。
var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname;
newURL = newURL.substring(0,newURL.indexOf(""));
答案 5 :(得分:0)
如果您将URL作为String传递并想要提取该应用程序的上下文根,则可以使用此正则表达式来提取它。它适用于以上下文根开头的完整URL或相对URL。
url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")