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"?

Foi útil?

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:

 enter descrição da imagem aqui

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")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top