web-dev-qa-db-ja.com

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

静的ファイル(CSS、JS)を処理するには、/AppName/templates/style/main.cssのような絶対パスを記述する必要があります。 style/main.cssのような相対パスを記述できる解決策はありますか?

75
kspacja

actualの懸念がwebappコンテキスト( "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>

every相対リンクで${pageContext.request.contextPath}を繰り返す必要がないように、すべての相対リンクのベースパスを設定する場合は、 <base>タグ。 JSTL functions を使用した例を以下に示します。

<%@ 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>

このようにして、すべての相対リンク(つまり、not/またはスキームで始まる)は、<base>に対して相対的になります。

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

こちらもご覧ください:

162
BalusC

アプリケーションコンテキストの相対パスで <c:url>- tag を使用するだけです。

valueパラメーターが/で始まる場合、タグはそれをアプリケーション相対URLとして扱い、アプリケーション名をURLに追加します。例:

jsp:

<c:url value="/templates/style/main.css" var="mainCssUrl" />`
<link rel="stylesheet" href="${mainCssUrl}" />
...
<c:url value="/home" var="homeUrl" />`
<a href="${homeUrl}">home link</a>

ドメイン相対URLを持つこのhtmlになります:

<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>
20
Ralph

リンク全体を使用する代わりに、以下のように作成できます(解決策はjspファイルです)

JSTLを使用すると、次のようにできます。css、jsなどのリソースをリンクするには:

     <link rel="stylesheet" href="${pageContext.request.contextPath}/style/sample.css" />
     <script src="${pageContext.request.contextPath}/js/sample.js"></script>   

単純にリンクを作成するには:

     <a id=".." class=".." href="${pageContext.request.contextPath}/jsp/sample.jsp">....</a>

タグに慣れる価値がある

   <%@ taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core"%>

以下のように行うjspメソッドもありますが、上記のようなより良い方法です。

   <link rel="stylesheet" href="<%=request.getContextPath()%>/style/sample.css" />
   <script type="text/javascript" src="<%=request.getContextPath()%>/js/sample.js"></script>

単純にリンクを作成するには:

   <a id=".." class=".." href="<%=request.getContextPath()%>/jsp/sample.jsp">....</a>
2
blueberry0xff

Tomcatをあるディレクトリから起動します-これはTomcatの$ cwdです。この$ cwdに関連する任意のパスを指定できます。

あなたが持っていると仮定します

home
- Tomcat
 |_bin
- cssStore
 |_file.css

そして、コマンド「bin/startup.sh」を使用して、Tomcatを〜/ Tomcatから起動するとします。

〜/ TomcatはTomcatのホームディレクトリ($ cwd)になります

サーブレットのクラスファイルから「../cssStore/file.css」にアクセスできます

お役に立てば幸いです-M.S.

2

これはもっと簡単にできます:

<base href="${pageContext.request.contextPath}/"/>

すべてのURLは、不要なdomain:portなしで、アプリケーションコンテキストを使用して形成されます。

2
GKislin