jsp - que - tag lib java
¿Cómo obtener la URL del dominio y el nombre de la aplicación? (6)
Aquí está el escenario.
Mi aplicación web Java tiene la siguiente ruta
https://www.mywebsite.com:9443/MyWebApp
Digamos 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, hay una forma bastante vaga y tonta de simplemente obtener la URL y luego volver a rastrear la ruta de regreso.
¿Pero hay una forma programática de hacer esto? Específicamente, creo que puedo obtener el dominio + puerto, pero ¿cómo puedo recuperar el nombre de la aplicación "MyWebApp"?
Eche un vistazo a la documentación de HttpServletRequest
.
Para construir la URL en su ejemplo, deberá usar:
-
getScheme()
-
getServerName()
-
getServerPort()
-
getContextPath()
Aquí hay 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 proviene de getContextPath
.
Encuentro este gráfico de Agile Software Craftsmanship HttpServletRequest Path Decoding clasifica todos los diferentes métodos disponibles:
El nombre de la aplicación web (en realidad, la ruta de contexto) está disponible llamando a HttpServletrequest#getContextPath()
(y por lo tanto NO a getServletPath()
como se sugirió anteriormente). Puede recuperar esto en JSP por ${pageContext.request.contextPath}
.
<p>The context path is: ${pageContext.request.contextPath}.</p>
Si tiene la intención de utilizar esto para todas las rutas relativas en su página JSP (lo que haría que esta pregunta tenga más sentido), puede utilizar la etiqueta 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>
Todos los enlaces en la página serán automágicamente relativos a la <base>
para que no sea necesario copiar la ruta del contexto en todas partes. Tenga en cuenta que cuando los enlaces relativos comienzan con un /
, ya no serán relativos a <base>
, sino a la raíz del dominio.
El siguiente código puede ser útil para la aplicación web que usa JavaScript.
var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname;
newURL = newURL.substring(0,newURL.indexOf(""));
Le sugiero encarecidamente que lea los docs para obtener métodos similares. Si está interesado en la ruta del contexto, eche un vistazo aquí, ServletContext.getContextPath() .
Si le pasan una url como cadena y desea extraer la raíz de contexto de esa aplicación, puede usar esta expresión regular para extraerla. Funcionará para las URL completas o las URL relativas que comiencen con la raíz de contexto.
url.replaceAll("^(.*//////)?.*?///(.+?)///.*|///(.+)$", "$2$3")