Frage

Hier ist das Szenario.

Meine Java-Web-Anwendung hat folgenden Pfad

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

Nehmen wir an, es gibt eine JSP-Datei

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

und ich brauche abrufen

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

innerhalb dieser JSP-Datei.

Natürlich gibt es eher eine faule und dumme Art und Weise nur die URL bekommt und dann wieder Tracing den Pfad zurück.

Aber gibt es eine programmatische Art und Weise, dies zu tun? Genauer gesagt, ich glaube, ich die Domain + Port zu bekommen, aber wie kann ich abrufen tatsächlich den Namen der Anwendung „MyWebApp“?

War es hilfreich?

Lösung

Der Webapplikations-Name (eigentlich der Kontextpfad) ist durch den Aufruf von HttpServletrequest#getContextPath() (und getServletPath() somit nicht als ein zuvor vorgeschlagen). Sie können dies durch ${pageContext.request.contextPath} in JSP abzurufen.

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

Wenn Sie beabsichtigen, dies in Ihrer JSP-Seite für alle relativen Pfade zu verwenden (was diese Frage mehr Sinn machen würde), dann können Sie die Verwendung des HTML <base> Tag machen:

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

Alle Links auf der Seite werden dann auf die <base> automagically relativ sein, so dass Sie den Kontextpfad nicht überall Copypaste müssen. Beachten Sie, dass, wenn die relativen Links mit einem / beginnen, dann werden sie nicht mehr auf den <base> relativ sein, sondern auf den Domänenstamm statt.

Andere Tipps

Werfen Sie einen Blick in die Dokumentation für HttpServletRequest .
Um die URL in Ihrem Beispiel bauen Sie verwenden müssen:

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

Hier ist eine Methode, die Ihr Beispiel zurück:

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

Der Name der Anwendung stammen aus getContextPath.

Ich finde diese Grafik von Agile Software Craftsmanship HttpServletRequest Pfad Dekodierung aussondert alle die verschiedenen Methoden, die verfügbar sind:

 image description hier

Ich würde vorschlagen, dass Sie stark durch die ServletContext.getContextPath () .

Der folgende Code kann für Web-Anwendung mit JavaScript nützlich sein.

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

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

Wenn Sie eine URL als String übergeben werden und wollen den Kontext Wurzel dieser Anwendung zu extrahieren, können Sie diese Regex verwenden sie zu extrahieren. Es wird für die vollständige URLs oder relative URLs arbeiten, die mit dem Kontext Wurzel beginnen.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top