web-dev-qa-db-ja.com

ドメインURLとアプリケーション名を取得する方法は?

これがシナリオです。

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」を取得するにはどうすればよいですか?

94
ericbae

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>からの相対リンクではなく、代わりにドメインルートからの相対リンクになります。

90
BalusC

HttpServletRequest のドキュメントをご覧ください。
サンプルでURLを作成するには、以下を使用する必要があります。

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

例を返すメソッドは次のとおりです。

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
103
Jataro

アプリケーション名はgetContextPathに由来します。

このグラフィックは Agile Software Craftsmanship HttpServletRequest Path Decoding から入手できます。利用可能なさまざまなメソッドがすべて整理されています。

enter image description here

13
AgilePro

同様の方法については、 docs を一読することを強くお勧めします。コンテキストパスに興味がある場合は、 ServletContext.getContextPath() をご覧ください。

7
Adeel Ansari

次のコードは、JavaScriptを使用するWebアプリケーションに役立ちます。

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

newURL = newURL.substring(0,newURL.indexOf(""));
4
user2496033

URLを文字列として渡していて、そのアプリケーションのコンテキストルートを抽出する場合は、この正規表現を使用して抽出できます。完全なURLまたはコンテキストルートで始まる相対URLに対して機能します。

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
0
master_d