Question

Voici le scénario.

Mon application Java Web a suivant chemin

https://www.mywebsite.com:9443/MyWebApp

Disons qu'il est un fichier JSP

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp

et je dois récupérer

https://www.mywebsite.com:9443/MyWebApp 

dans ce fichier JSP.

Bien sûr, il y a plutôt une façon paresseuse et stupide de simplement obtenir l'URL et puis re-tracer le chemin du retour.

Mais est-il un moyen programatic de le faire? Plus précisément, je pense que je peux obtenir le domaine + port, mais comment puis-je récupérer en fait le nom de l'application « MyWebApp »?

Était-ce utile?

La solution

Le nom de l'application Web (en fait le chemin de contexte) est disponible en appelant HttpServletrequest#getContextPath() (et donc pas getServletPath() comme on suggéré avant). Vous pouvez récupérer ceci dans JSP par ${pageContext.request.contextPath}.

<p>The context path is: ${pageContext.request.contextPath}.</p>

Si vous avez l'intention d'utiliser pour tous les chemins relatifs dans votre page JSP (ce qui rendrait cette question plus de sens), vous pouvez utiliser la balise <base> HTML:

<%@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 dans la page seront alors automagiquement par rapport à la <base> afin que vous ne avez pas besoin de copypaste le chemin de contexte partout. Notez que lorsque les liens relatifs commencent par un /, ils ne seront pas par rapport à la <base> plus, mais à la racine de domaine à la place.

Autres conseils

Jetez un oeil à la documentation pour le titre HttpServletRequest .
Afin de construire l'URL dans votre exemple, vous devez utiliser:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

Voici une méthode qui renverra votre exemple:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

Le nom de l'application proviennent de getContextPath.

Je trouve ce graphique de Agile Software HttpServletRequest Chemin Décodage Artisanat trie toutes les différentes méthodes disponibles:

 ici

Je vous suggère fortement de lire le ServletContext.getContextPath () .

Le code suivant peut être utile pour une application Web en utilisant JavaScript.

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));

Si vous êtes passé une URL comme une chaîne et que vous voulez extraire la racine du contexte de cette application, vous pouvez utiliser cette regex pour l'extraire. Il fonctionnera pour urls plein ou urls relatifs qui commencent par la racine du contexte.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top