1. ホーム
  2. jsp

コンテキストのルート名を含まずに相対パスを使用する方法は?

2023-07-20 11:20:04

質問

静的ファイル(CSS, JS)を動作させるには、次のように絶対パスを記述する必要があります。 /AppName/templates/style/main.css . 相対パスで記述する方法はありますか? style/main.css ?

どのように解決するのですか?

もし、あなたの 実際の がウェブアプリのコンテキスト ("AppName" の部分) のダイナミックさに関係するのであれば、単にそれを HttpServletRequest#getContextPath() .

<head>
    <link rel="stylesheet" href="${pageContext.request.contextPath}/templates/style/main.css" />
    <script src="${pageContext.request.contextPath}/templates/js/main.js"></script>
    <script>var base = "${pageContext.request.contextPath}";</script>
</head>
<body>
    <a href="${pageContext.request.contextPath}/pages/foo.jsp">link</a>
</body>

すべての相対リンクのベースとなるパスを設定したい場合、何度も ${pageContext.request.contextPath} それぞれ 相対リンクの場合は <base> タグを使用します。以下は JSTL 関数 .

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<head>
    <c:set var="url">${pageContext.request.requestURL}</c:set>
    <base href="${fn:substring(url, 0, fn:length(url) - fn:length(pageContext.request.requestURI))}${pageContext.request.contextPath}/" />
    <link rel="stylesheet" href="templates/style/main.css" />
    <script src="templates/js/main.js"></script>
    <script>var base = document.getElementsByTagName("base")[0].href;</script>
</head>
<body>
    <a href="pages/foo.jsp">link</a>
</body>

こうすることで、すべての相対リンク(つまり ではなく で始まる / またはスキーム) からの相対パスとなります。 <base> .

ところで、これは特にTomcatとは何の関係もありません。HTTP/HTMLの基本に関係しているだけです。他のすべての Web サーバでも同じ問題が発生するでしょう。

も参照してください。