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

如何获得由Servlet转发的JSP请求URL?

如果我在JSP中运行以下代码,

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

那么我得到JSP的服务器端path。 但是我想要在浏览器的地址栏中看到URL。 我可以在转发到JSP的Servlet中获得它,但是我想在JSP中获得它。

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

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

要么

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

试试这个:

 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; 

注意:您无法从您的url获取HREF定位符。 例如,如果你有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; } 

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

http://www.caucho.com/resin-3.0/webapp/faq.xtp包含了一个很好的总结这是如何工作的(减去技术说明,第二个转发/包含了你使用这些属性的能力)。;

要从JSP文件中获取当前path,只需执行下列操作之一:

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

尝试这个,

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

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

为了避免在jsp中使用脚本,请遵循“divideByZero”的build议,并使用${pageContext.request.requestURI}这是一个更好的方法。

也可以使用

 ${pageContext.request.requestURI}