Voici le scénario.
Mon application Web Java a le chemin suivant
https://www.mywebsite.com:9443/MyWebApp
Disons qu'il y a un fichier JSP
https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp
et j'ai besoin de récupérer
https://www.mywebsite.com:9443/MyWebApp
dans ce fichier JSP.
Bien sûr, il existe un moyen plutôt paresseux et idiot d’obtenir l’URL, puis de retracer le chemin.
Mais y a-t-il une manière programmatique de faire cela? Plus précisément, je pense pouvoir obtenir le domaine + le port, mais comment puis-je récupérer le nom de l'application "MyWebApp"?
Le nom de l'application Web (en réalité le chemin du contexte) est disponible en appelant HttpServletrequest#getContextPath()
(et donc NOT getServletPath()
comme suggéré auparavant). Vous pouvez récupérer cela dans JSP par ${pageContext.request.contextPath}
.
<p>The context path is: ${pageContext.request.contextPath}.</p>
Si vous avez l’intention de l’utiliser pour tous les chemins relatifs de votre page JSP (ce qui donnerait plus de sens à cette question), vous pouvez utiliser la balise HTML <base>
:
<%@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="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />
<!doctype html>
<html lang="en">
<head>
<title>SO question 2204870</title>
<base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
<script src="js/global.js"></script>
<link rel="stylesheet" href="css/global.css">
</head>
<body>
<ul>
<li><a href="home.jsp">Home</a></li>
<li><a href="faq.jsp">FAQ</a></li>
<li><a href="contact.jsp">Contact</a></li>
</ul>
</body>
</html>
Tous les liens de la page seront alors automatiquement associés au <base>
, de sorte que vous n’auriez pas besoin de copier le chemin du contexte partout. Notez que lorsque les liens relatifs commencent par un /
, ils ne seront plus relatifs au <base>
, mais à la racine du domaine.
Consultez la documentation de HttpServletRequest
.
Pour construire l'URL dans votre exemple, vous devrez utiliser:
getScheme()
getServerName()
getServerPort()
getContextPath()
Voici une méthode qui retournera votre exemple:
public static String getURLWithContextPath(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Le nom de l'application provient de getContextPath
.
Je trouve ce graphique de Agile Software Craftsmanship HttpServletRequest Path Decoding trie toutes les méthodes disponibles
Je vous suggère fortement de lire les docs , pour des méthodes similaires. Si vous êtes intéressé par le chemin de contexte, jetez un œil ici, ServletContext.getContextPath () .
Le code suivant peut être utile pour les applications Web utilisant JavaScript.
var newURL = window.location.protocol + "//" + window.location.Host + "" + window.location.pathname;
newURL = newURL.substring(0,newURL.indexOf(""));
Si une URL est transmise à une chaîne et que vous souhaitez extraire la racine de contexte de cette application, vous pouvez utiliser cette expression rationnelle pour l'extraire. Cela fonctionnera pour les URL complètes ou les URL relatives qui commencent par la racine de contexte.
url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")