Получить URL-адрес запроса в JSP, который пересылается сервлетом - PullRequest
41 голосов
/ 07 июня 2010

Как я могу получить URL запроса в JSP, который пересылается сервлетом?

Если я запускаю следующий код в JSP,

System.out.println("servlet path= " + request.getServletPath());
System.out.println("request URL= " + request.getRequestURL());
System.out.println("request URI= " + request.getRequestURI());

тогда я получаю путь к JSP на стороне сервера. Но я хочу получить URL, как вы можете видеть в адресной строке браузера. Я могу получить его в сервлете, который пересылает в JSP, но я хочу получить его в JSP.

Ответы [ 7 ]

65 голосов
/ 07 июня 2010

Если вы используете RequestDispatcher.forward() для направления запроса от контроллера к представлению, тогда URI запроса будет представлен как атрибут запроса с именем javax.servlet.forward.request_uri. Итак, вы можете использовать

request.getAttribute("javax.servlet.forward.request_uri")

или

${requestScope['javax.servlet.forward.request_uri']}
8 голосов
/ 13 октября 2012

Попробуйте вместо этого:

String scheme = req.getScheme();             
String serverName = req.getServerName(); 
int serverPort = req.getServerPort();    
String uri = (String) req.getAttribute("javax.servlet.forward.request_uri");
String prmstr = (String) req.getAttribute("javax.servlet.forward.query_string");
String url = scheme + "://" +serverName + ":" + serverPort + uri + "?" + prmstr;

Примечание: Вы не можете получить HREF-якорь с вашего URL. Например, если у вас есть url "toc.html # top" , вы можете получить только "toc.html"

Примечание : req.getAttribute ("javax.servlet.forward.request_uri") работает только в JSP. если вы запускаете это в контроллере до JSP, то результатом будет null

Вы можете использовать код для обоих вариантов:

public static String getCurrentUrl(HttpServletRequest req) {
    String url = getCurrentUrlWithoutParams(req);
    String prmstr = getCurrentUrlParams(req);
    url += "?" + prmstr;
    return url;
}

public static String getCurrentUrlParams(HttpServletRequest request) {
    return StringUtil.safeString(request.getQueryString());
}

public static String getCurrentUrlWithoutParams(HttpServletRequest request) {
    String uri = (String) request.getAttribute("javax.servlet.forward.request_uri");
    if (uri == null) {
        return request.getRequestURL().toString();
    }
    String scheme = request.getScheme();
    String serverName = request.getServerName();
    int serverPort = request.getServerPort();
    String url = scheme + "://" + serverName + ":" + serverPort + uri;
    return url;
}
7 голосов
/ 15 июня 2013

Чтобы получить текущий путь из файла JSP, вы можете просто выполнить одно из следующих действий:

<%= request.getContextPath() %>
<%= request.getRequestURI() %>
<%= request.getRequestURL() %>
5 голосов
/ 31 октября 2014

Попробуйте это,

<c:set var="pageUrl" scope="request">
    <c:out value="${pageContext.request.scheme}://${pageContext.request.serverName}"/>
    <c:if test="${pageContext.request.serverPort != '80'}">
        <c:out value=":${pageContext.request.serverPort}"/>
    </c:if>
    <c:out value="${requestScope['javax.servlet.forward.request_uri']}"/>
</c:set>

Я хотел бы поместить его в свой базовый шаблон и использовать во всем приложении всякий раз, когда мне нужно.

3 голосов
/ 20 ноября 2010

Ни один из этих атрибутов не является надежным, поскольку в соответствии со спецификацией сервлета (2.4, 2.5 и 3.0) эти атрибуты переопределяются, если вы включаете / пересылаете во второй раз (или если кто-то вызывает getNamedDispatcher). Я думаю, что единственный надежный способ получить исходный URI / строку запроса - это вставить фильтр в начале цепочки фильтров в файле web.xml, который устанавливает собственные атрибуты запроса на основе request.getRequestURI () / getQueryString () перед любые форварды / инкрустации имеют место.

http://www.caucho.com/resin-3.0/webapp/faq.xtp содержит отличную сводную информацию о том, как это работает (за исключением технического примечания, что второй форвард / испортит вашу способность использовать эти атрибуты).

2 голосов
/ 28 февраля 2014

Чтобы не использовать скриплеты в jsp, следуйте совету "divByZero" и используйте ${pageContext.request.requestURI} Это лучший путь.

2 голосов
/ 28 января 2014

Также вы можете использовать

${pageContext.request.requestURI}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...