获取由Servlet转发的JSP中的请求URL

时间:2010-06-07 13:25:56

标签: jsp url servlets

如何在JSP中获取由Servlet转发的请求URL?

如果我在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的Servlet中获取它,但我想在JSP中获取它。

8 个答案:

答案 0 :(得分:65)

如果使用RequestDispatcher.forward()将请求从控制器路由到视图,则请求URI将作为名为javax.servlet.forward.request_uri的请求属性公开。所以,你可以使用

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

${requestScope['javax.servlet.forward.request_uri']}

答案 1 :(得分:8)

请改为尝试:

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锚点。例如,如果您有网址“toc.html #top”那么您只能获得“toc.html”

注意:req.getAttribute(“javax.servlet.forward.request_uri”)仅适用于JSP。如果你在JSP之前在控制器中运行它,那么结果为空

您可以使用两种变体的代码:

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;
}

答案 2 :(得分:7)

要从JSP文件中获取当前路径,您只需执行以下操作之一:

<%= request.getContextPath() %>
<%= request.getRequestURI() %>
<%= request.getRequestURL() %>

答案 3 :(得分:5)

试试这个,

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

我想将它放在我的基本模板中,并在需要的时候在整个应用程序中使用。

答案 4 :(得分:3)

这些属性都不可靠,因为根据servlet规范(2.4,2.5和3.0),如果第二次包含/转发(或者有人调用getNamedDispatcher),则会覆盖这些属性。我认为获取原始请求URI /查询字符串的唯一可靠方法是在web.xml中的过滤器链的开头粘贴一个过滤器,该过滤器根据request.getRequestURI()/ getQueryString()设置您自己的自定义请求属性任何前锋/包括发生。

http://www.caucho.com/resin-3.0/webapp/faq.xtp包含有关其工作原理的精彩摘要(减去技术说明,第二个转发/包含会影响您使用这些属性的能力)。

答案 5 :(得分:2)

你也可以使用

${pageContext.request.requestURI}

答案 6 :(得分:2)

为避免在jsp中使用scriptlet,请遵循&#34;除以零&#34;的建议,并使用 ${pageContext.request.requestURI} 这是一个更好的方法。

答案 7 :(得分:0)

与@axtavt相同,但是您也可以使用RequestDispatcher常量。

request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);