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


98

これがシナリオです。

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

回答:


91

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>ため、どこにでもコンテキストパスをコピーアンドペーストする必要はありません。相対リンクがで始まる場合、リンク/<base>もう相対的ではなく、ドメインルートに相対的であることに注意してください。


Docは、「によって返さServletContext.getContextPath() れるコンテキストパスは、アプリケーションの主要または優先コンテキストパスと見なす必要がある」と述べています。それが私が事を実現した後、私が元の答えにこれを含めた理由でした。OPにドキュメントを読んでもらい、関連するメソッドについてもう少し知ってもらいたいので、最初の試みは削除しませんでした。私の要点を理解していただければ幸いです。
Adeel Ansari、2010

@酢:JSPファイルの場合、をgetServletPath()返します/filename.jsp。OPはそれをまったく要求していませんでした。これは確かに進むべき道ではありません。
BalusC 2010

私は確かに私の投稿を修正しますが、今回はまったく異なる私のコメントへの応答を期待していました:)。
Adeel Ansari、2010

2
XHTML DOCTYPEでは、 '/'文字をcontextPathに追加する必要があります。<基地HREF = "$ {pageContext.request.contextPath} /">
バジルムーサ

なぜ<base>タグを閉じなかったのですか?すべてのタグを閉じる必要はありませんか?
Fabiano Francesconi

106

のドキュメントをご覧くださいHttpServletRequest
この例のURLを作成するには、次のコードを使用する必要があります。

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

ここにあなたの例を返すメソッドがあります:

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

1
サーバー名がlocalhostの場合にIPを取得する方法
Mahmoud Saleh

簡単に言うと、getScheme()は常にhttpsで機能するとは限りません。一部のサーバーは奇妙な動作をし、httpsではなく常にhttpを返す場合があります。私はあなたに知らせるべきだと思いました。request.getRequestURL()。toString()を試し、必要に応じてマッサージします
K ''

1
@MahmoudSalehrequest.getLocalAddr()
青みがかった

各メソッドの出力例も表示するとよいでしょう。それぞれの出力を確認するためだけにWebサーバーを起動して実行するのは面倒です。
Jus12

1
getContextPath()メソッドでは何も返しません!そしてgetServerPort()、4桁の数値ではなく、2桁の数値のみを返します!それについていくつかの助けを利用できますか?
サム

22

アプリケーション名はから来ていgetContextPathます。

Agile Software Craftsmanship HttpServletRequest Path Decodingからのこのグラフィック は、利用可能なさまざまなメソッドをすべて整理しているのがわかります。

ここに画像の説明を入力してください


1
このグラフィックは、多くの質問に答えるのに役立ちます。私は多くの質問への回答でそれを使用しようとしましたが、それらはすべて削除されました:同じ回答を再利用することに対するルールがあります。それは残念です。理論では、同じ回答を使用する場合、質問は同じである必要があるため、質問を重複としてマークする必要があります。しかし、それは現実ではありません。同じグラフィックで回答できるさまざまな質問があります。このような任意のルールを実装することは、心のこもったことではありません。このグラフィックで最もよく答えられる質問を見つけた場合は、それを使用してください。
AgilePro


4

次のコードは、JavaScriptを使用するWebアプリケーションに役立つ場合があります。

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

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

0

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

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.