jspbase-url

How to get domain URL and application name?


Here's the scenario.

My Java web application has following path

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

Let's say there is a JSP file

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

and I need to retrieve

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

within this JSP file.

Of course, there is rather a lazy and silly way of just getting the URL and then re-tracing the path back.

But is there a programatic way of doing this? Specifically, I think I can get the domain + port, but how do I actually retrieve the application name "MyWebApp"?


Solution

  • The web application name (actually the context path) is available by calling HttpServletrequest#getContextPath() (and thus NOT getServletPath() as one suggested before). You can retrieve this in JSP by ${pageContext.request.contextPath}.

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

    If you intend to use this for all relative paths in your JSP page (which would make this question more sense), then you can make use of the HTML <base> tag:

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

    All links in the page will then automagically be relative to the <base> so that you don't need to copypaste the context path everywhere. Note that when relative links start with a /, then they will not be relative to the <base> anymore, but to the domain root instead.