これがシナリオです。
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を取得してパスを再度トレースするだけの、怠laでばかげた方法があります。
しかし、これを行うプログラム的な方法はありますか?具体的には、ドメイン+ポートを取得できると思いますが、実際にアプリケーション名「MyWebApp」を取得するにはどうすればよいですか?
Webアプリケーション名(実際にはコンテキストパス)は、 HttpServletrequest#getContextPath()
を呼び出すことで使用できます(したがって、以前に提案されたgetServletPath()
ではありません)。 ${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>
からの相対リンクではなく、代わりにドメインルートからの相対リンクになります。
HttpServletRequest
のドキュメントをご覧ください。
サンプルでURLを作成するには、以下を使用する必要があります。
getScheme()
getServerName()
getServerPort()
getContextPath()
例を返すメソッドは次のとおりです。
public static String getURLWithContextPath(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
アプリケーション名はgetContextPath
に由来します。
このグラフィックは Agile Software Craftsmanship HttpServletRequest Path Decoding から入手できます。利用可能なさまざまなメソッドがすべて整理されています。
同様の方法については、 docs を一読することを強くお勧めします。コンテキストパスに興味がある場合は、 ServletContext.getContextPath() をご覧ください。
次のコードは、JavaScriptを使用するWebアプリケーションに役立ちます。
var newURL = window.location.protocol + "//" + window.location.Host + "" + window.location.pathname;
newURL = newURL.substring(0,newURL.indexOf(""));
URLを文字列として渡していて、そのアプリケーションのコンテキストルートを抽出する場合は、この正規表現を使用して抽出できます。完全なURLまたはコンテキストルートで始まる相対URLに対して機能します。
url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")