Pregunta

Este es el escenario.

Mi aplicación web Java tiene ruta siguiente

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

Supongamos que hay un archivo JSP

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

y necesito recuperar

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

dentro de este archivo JSP.

Por supuesto, no es más bien una forma perezosa y tonto de sólo conseguir la URL y luego volviendo a trazar el camino de regreso.

Pero hay una manera programática de hacer esto? En concreto, creo que puedo conseguir el dominio + port, pero ¿cómo puedo realmente recuperar el nombre de la aplicación "MyWebApp"?

¿Fue útil?

Solución

El nombre de la aplicación web (en realidad la ruta de contexto) está disponible llamando HttpServletrequest#getContextPath() (y por lo tanto no getServletPath() como uno sugirió antes). Puede recuperar esta en JSP por ${pageContext.request.contextPath}.

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

Si usted tiene la intención de utilizar esto para todas las rutas relativas en su página JSP (lo que haría esta pregunta más sentido), entonces usted puede hacer uso de la etiqueta <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>

Todos los enlaces en la página A continuación, automagicamente ser relativa a la <base> de modo que usted no necesita CopyPaste la ruta de contexto en todas partes. Tenga en cuenta que cuando los enlaces relativos comienzan con un /, entonces no van a ser relativa a la <base> más, pero a la raíz del dominio en su lugar.

Otros consejos

Tome un vistazo a la documentación de HttpServletRequest .
Con el fin de construir el URL en su ejemplo, usted tendrá que utilizar:

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

Este es un método que devolverá su ejemplo:

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

El nombre de la aplicación provienen de getContextPath.

Me parece que este gráfico de Agile Software Artesanía HttpServletRequest trayectoria de decodificación ordena a todos los diferentes métodos que están disponibles:

 introducir descripción de la imagen aquí

Me firmemente en que sugeriría leer a través de la docs , por métodos similares. Si usted está interesado en la ruta de contexto, echar un vistazo aquí, ServletContext.getContextPath () .

El siguiente código podría ser útil para aplicaciones web utilizando JavaScript.

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

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

Si está siendo pasado una URL como una cadena y desea extraer la raíz de contexto de esa aplicación, se puede utilizar esta expresión regular para extraerlo. Se trabajará para las direcciones URL completas o URL relativos que comienzan con la raíz de contexto.

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top