JSPファイルによって生成されたHTMLページ内のすべての相対URLは、現在の要求URL(ブラウザーのアドレスバーに表示されるURL)に相対的であり、サーバー側のJSPファイルの場所に相対的ではありません。つまり、これらのリソースをURLで個別にダウンロードする必要があるのはウェブブラウザであり、何らかの方法でディスクからリソースを含める必要があるウェブサーバーではありません。
相対URLを変更して、JSPファイルの場所ではなくサーブレットのURLに相対するようにする以外に、この問題を修正する別の方法は、ドメインルートに相対するようにすることです(つまり、で開始します/
)。これにより、サーブレットのURLを変更するときに、相対パスをもう一度変更することを心配する必要がなくなります。
<head>
<link rel="stylesheet" href="/context/css/default.css" />
<script src="/context/js/default.js"></script>
</head>
<body>
<img src="/context/img/logo.png" />
<a href="/context/page.jsp">link</a>
<form action="/context/servlet"><input type="submit" /></form>
</body>
ただし、コンテキストパスをハードコーディングしたくない場合があります。非常に合理的です。ELのコンテキストパスは${pageContext.request.contextPath}
。で取得できます。
<head>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/default.css" />
<script src="${pageContext.request.contextPath}/js/default.js"></script>
</head>
<body>
<img src="${pageContext.request.contextPath}/img/logo.png" />
<a href="${pageContext.request.contextPath}/page.jsp">link</a>
<form action="${pageContext.request.contextPath}/servlet"><input type="submit" /></form>
</body>
(これは簡単に短縮でき<c:set var="root" value="${pageContext.request.contextPath}" />
、${root}
他の場所と同じように使用できます)
または、読み取れないXMLや壊れたXML構文の強調表示を恐れない場合は、JSTLを 使用して<c:url>
ください。
<head>
<link rel="stylesheet" href="<c:url value="/css/default.css" />" />
<script src="<c:url value="/js/default.js" />"></script>
</head>
<body>
<img src="<c:url value="/img/logo.png" />" />
<a href="<c:url value="/page.jsp" />">link</a>
<form action="<c:url value="/servlet" />"><input type="submit" /></form>
</body>
いずれにせよ、相対URLがたくさんある場合、これはかなり面倒です。そのためにあなたは<base>
タグを使うことができます。すべての相対URLは即座に相対URLになります。これは、スキーム(で開始することがありhttp://
、https://
など)。プレーンELでベースコンテキストパスを取得するための適切な方法はないため、ここではJSTLの少しの助けが必要です。
<%@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="uri" value="${req.requestURI}" />
<c:set var="url">${req.requestURL}</c:set>
...
<head>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/" />
<link rel="stylesheet" href="css/default.css" />
<script src="js/default.js"></script>
</head>
<body>
<img src="img/logo.png" />
<a href="page.jsp">link</a>
<form action="servlet"><input type="submit" /></form>
</body>
これには(再び)いくつかの注意点があります。アンカー(#identifier
URL)もベースパスを基準になります!代わりに、リクエストURL(URI)を基準にして作成します。だから、次のように変更します
<a href="#identifier">jump</a>
に
<a href="${uri}#identifier">jump</a>
それぞれの方法には、独自の長所と短所があります。どちらを選ぶかはあなた次第です。少なくとも、この問題がどのように発生し、どのように解決するかを理解する必要があります:)
参照: