Comment utiliser les chemins relatifs sans inclure le nom de racine du contexte?

À travailler mes fichiers statiques (CSS, JS) je dois écrire le chemin absolu comme /AppName/templates/style/main.css . Y a-t-il une solution, que je puisse écrire un chemin relatif comme style/main.css ?

73
demandé sur BalusC 2011-01-22 01:18:32

6 réponses

si votre réel préoccupation est la dynamicité du contexte webapp( la partie "AppName"), puis juste le récupérer dynamiquement par 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>

si vous voulez définir un chemin de base pour tous les liens relatifs de sorte que vous n'ayez pas besoin de répéter ${pageContext.request.contextPath} dans chaque lien relatif, utilisez la balise <base> . Voici un exemple avec l'aide de fonctions 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>

de cette façon, chaque lien relatif (c.-à-d. et non commençant par / ou un schéma) deviendra relatif au <base> .

ce N'est d'ailleurs pas spécifiquement lié à Tomcat. C'est juste lié aux bases HTTP/HTML. Vous auriez le même problème sur tous les autres serveurs web.

voir aussi:

156
répondu BalusC 2017-05-23 12:18:07

il suffit d'utiliser <c:url> tag avec un contexte d'application de chemin d'accès relatif.

lorsque le paramètre value commence par un / , alors la balise le traitera comme une url relative à l'application, et ajoutera le nom de l'application à l'url. Exemple:

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>

deviendra ce html, avec une url relative de domaine:

<link rel="stylesheet" href="/AppName/templates/style/main.css" />
...
<a href="/AppName/home">home link</a>
18
répondu Ralph 2015-11-22 14:32:01

vous démarrez tomcat à partir d'un répertoire - qui est le $cwd pour tomcat. Vous pouvez spécifier n'importe quel chemin relatif à ce $cwd.

supposons que vous ayez

home
- tomcat
 |_bin
- cssStore
 |_file.css

et supposons que vous démarriez tomcat à partir de ~ / tomcat, en utilisant la commande "bin/startup.sh".

~/tomcat devient le répertoire de base ($cwd) pour tomcat

Vous pouvez accéder "../cssStore / file.css" à partir de fichiers de classe dans votre servlet maintenant

Hope that helps, - M. S.

2
répondu Manidip Sengupta 2011-01-21 22:37:44

au lieu d'utiliser le lien entier que nous pouvons faire comme ci-dessous (la solution concerne les fichiers jsp)

avec JSTL on peut faire comme: Pour lier des ressources comme css, js:

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

Pour simplement faire un lien:

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

il vaut la peine de se familiariser avec les étiquettes

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

il y a aussi la méthode jsp pour le faire comme ci-dessous, mais mieux comme ci-dessus:

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

pour simplement faire un lien:

   <a id=".." class=".." href="<%=request.getContextPath()%>/jsp/sample.jsp">....</a>
2
répondu blueberry0xff 2014-08-21 00:55:31

Ce qui pourrait être fait de manière plus simple:

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

toutes les URL seront formées sans domain:port inutile, mais avec le contexte de l'application.

2
répondu GKislin 2016-10-27 00:18:04

c'est un dérivé de la suggestion de @Ralph que j'ai utilisée. Ajoutez le c:url en haut de votre JSP.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value="/" var="root" />

il suffit alors de faire référence à la variable root dans votre page:

<link rel="stylesheet" href="${root}templates/style/main.css">
-1
répondu David Newcomb 2016-03-21 16:59:04