場合によっては、サーブレット/JSP/その他に基づいて、Webアプリのコンテキストへの完全なURLを構築する必要がありますHttpServletRequest
。http://サーバー名:8080/コンテキスト/Servlet API にはこれを実現するための単一のメソッドはありません。
最も簡単な方法は、すべてのURLコンポーネントを に追加することですStringBuffer
。
ctxUrl = sb.append(req.getScheme()).append("://")
.append(req.getgetServerName()).append(":")
.append(req.getServerPort()) etc
この代替案(10 倍高速)に何か問題があるのだろうか:
ctxUrl = req.getRequestURL();
ctxUrl = ctxUrl.substring(0, ctxUrl.lastIndexOf("/")));
上記の2つの方法はいつも同じ結果を生み出すのでしょうか?
ベストアンサー1
これは「ベース URL」と呼ばれます (HTML タグで使用できるもの<base>
)。次のように取得できます。
StringBuffer url = req.getRequestURL();
String uri = req.getRequestURI();
String ctx = req.getContextPath();
String base = url.substring(0, url.length() - uri.length() + ctx.length()) + "/";
このctxUrl.substring(0, ctxUrl.lastIndexOf("/")));
アプローチは、 のような複数のフォルダーを含む URL では失敗しますhttp://server.name:8080/context/folder1/folder2/folder3
。
参照:
- コンテキスト ルート名を含めずに相対パスを使用するにはどうすればよいでしょうか?(JSP 回答用)
- ベース URL を取得するにはどうすればよいですか?(JSF の回答)