web-dev-qa-db-fra.com

Comment utiliser des chemins relatifs sans inclure le nom de la racine de contexte?

Pour travailler mon fichier statique (CSS, JS), je dois écrire un chemin absolu comme /AppName/templates/style/main.css. Existe-t-il une solution pour écrire un chemin relatif tel que style/main.css?

75
kspacja

Si votre préoccupation réelle concerne le dynamisme du contexte de l'application Web (la partie "NomApp"), récupérez-le simplement de manière dynamique 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 souhaitez définir un chemin de base pour tous les liens relatifs afin que vous n'ayez pas besoin de répéter ${pageContext.request.contextPath} dans chaque lien relatif , utilisez le <base> tag. 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 manière, chaque lien relatif (c'est-à-dire et non commençant par / ou un schéma) deviendra relatif au <base>.

Soit dit en passant, cela n’a aucun rapport avec Tomcat. C'est juste lié aux bases de HTTP/HTML. Vous auriez le même problème dans tous les autres serveurs Web.

Voir également:

162
BalusC

Il suffit d'utiliser <c:url> _ tag avec un chemin relatif au contexte de l'application.

Lorsque le paramètre value commence par un /, alors la balise la 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 de domaine relative:

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

Au lieu d’utiliser un lien complet, nous pouvons faire comme ci-dessous (la solution concerne les fichiers jsp)

Avec JSTL, nous pouvons faire en sorte que: Pour lier une ressource telle que 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 balises

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

Il y a aussi une 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
blueberry0xff

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

supposez que vous avez

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 personnel ($ cwd) pour Tomcat

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

J'espère que ça aide, - M.S.

2
Manidip Sengupta

Cela pourrait être fait plus simplement:

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

Toutes les URL seront formées sans inutiles domain:port mais avec le contexte d'application.

2
GKislin