web-dev-qa-db-ja.com

jspリクエストオブジェクトからベースURLを取得する方法は?

JspリクエストオブジェクトからベースURLを取得する方法は? http:// localhost:8080/SOMETHING/index.jsp 、しかしindex.jspまでの部分が欲しいのですが、jspではどのように可能ですか?

29
Maverick

だから、ベースURLが必要ですか?次のようにして、サーブレットで取得できます。

String url = request.getRequestURL().toString();
String baseURL = url.substring(0, url.length() - request.getRequestURI().length()) + request.getContextPath() + "/";
// ...

または、JSTLをほとんど使用せずに、<base>としてJSPで:

<%@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}" />
...
<head>
    <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/" />
</head>

80などのデフォルトのポート番号である場合、これにはポート番号が含まれないことに注意してください。Java.net.URLはこれを考慮しません。

こちらもご覧ください:

50
BalusC

Bozhoの答えのJSPバリアント:

<%@taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="baseURL" value="${req.scheme}://${req.serverName}:${req.serverPort}${req.contextPath}" />
18
hfmanson
new URL(request.getScheme(), 
        request.getServerName(), 
        request.getServerPort(), 
        request.getContextPath());
12
Bozho

しかし、@ BalusCの受け入れられた答えには1つの大きな欠陥があります。部分文字列は1ではなく0から始まる必要があります

<base href="${fn:replace(req.requestURL, fn:substring(uri, 1, fn:length(uri)), req.contextPath)}" />

そのはず

<base href="${fn:replace(req.requestURL, fn:substring(uri, 0, fn:length(uri)), req.contextPath)}" />

1を使用すると、二重のスラッシュが得られます:http://localhost:8080//appcontext/ 0を取得すると、http://localhost:21080/appcontext/

私のアプリケーションでは、request.getSession(false)は、ダブルスラッシュで終了するときに常にnullを返しました!!!

0
Sujit Joshi