Como chegar URL de domínio e nome do aplicativo?
Pergunta
Aqui está o cenário.
aplicação web Meu Java tem seguinte caminho
https://www.mywebsite.com:9443/MyWebApp
Vamos dizer que há um arquivo JSP
https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp
e eu preciso recuperar
https://www.mywebsite.com:9443/MyWebApp
dentro deste arquivo JSP.
É claro, existe sim uma maneira preguiçosa e bobo de ficar apenas a URL e, em seguida, re-traçando o de volta caminho.
Mas há uma maneira programática de fazer isso? Especificamente, eu acho que eu posso obter o domínio + porto, mas como faço para realmente recuperar o nome do aplicativo "MyWebApp"?
Solução
O nome do aplicativo web (na verdade, o caminho do contexto) está disponível pelo telefone HttpServletrequest#getContextPath()
(e, portanto, não getServletPath()
como sugerido antes). Você pode recuperar isso em JSP por ${pageContext.request.contextPath}
.
<p>The context path is: ${pageContext.request.contextPath}.</p>
Se você pretende usar isso para todos os caminhos relativos em sua página JSP (o que tornaria essa questão mais sentido), então você pode fazer uso da tag <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 os links na página, então automagicamente ser relativo ao <base>
de modo que você não precisa CopyPaste o caminho do contexto em todos os lugares. Note que quando links relativos começar com uma /
, então eles não vão ser relativo ao <base>
mais, mas a raiz de domínio.
Outras dicas
Dê uma olhada na documentação para HttpServletRequest
.
Para construir a URL no seu exemplo você vai precisar usar:
-
getScheme()
-
getServerName()
-
getServerPort()
-
getContextPath()
Aqui está um método que irá retornar o seu exemplo:
public static String getURLWithContextPath(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
O nome do aplicativo vêm de getContextPath
.
I encontrar este gráfico de Agile Software Craftsmanship HttpServletRequest Path Decoding classifica para fora todos os diferentes métodos que estão disponíveis:
Gostaria de sugerir que você leia o docs , por métodos semelhantes. Se você está interessado no caminho do contexto, dê uma olhada aqui, ServletContext.getContextPath () .
O código a seguir pode ser útil para aplicações web usando JavaScript.
var newURL = window.location.protocol + "//" + window.location.host + "" + window.location.pathname;
newURL = newURL.substring(0,newURL.indexOf(""));
Se você está sendo passado um url como uma String e deseja extrair a raiz contexto dessa aplicação, você pode usar esse regex para extraí-lo. Ele vai trabalhar para URLs completas ou urls relativos que começam com a raiz de contexto.
url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")