obtener context jsp url servlets

context - obtener path jsp



Obtener URL de solicitud en JSP que se reenvía por Servlet (7)

¿Cómo puedo obtener una URL de solicitud en JSP que Servlet envía?

Si ejecuto el siguiente código en JSP,

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

luego obtengo el camino del servidor hacia el JSP. Pero quiero obtener la URL como puede ver en la barra de direcciones del navegador. Puedo obtenerlo en el Servlet que lo reenvía al JSP, pero quiero obtenerlo dentro del JSP.


Ninguno de estos atributos es confiable porque según la especificación del servlet (2.4, 2.5 y 3.0), estos atributos se anulan si incluye / reenvía por segunda vez (o si alguien llama a getNamedDispatcher). Creo que la única forma confiable de obtener el URI de solicitud original / cadena de consulta es pegar un filtro al principio de su cadena de filtro en web.xml que establece sus propios atributos de solicitud personalizados basados ​​en request.getRequestURI () / getQueryString () antes cualquier avance / incluye toma lugar.

http://www.caucho.com/resin-3.0/webapp/faq.xtp contiene un excelente resumen de cómo funciona esto (menos la nota técnica de que un segundo forward / include daña tu habilidad para usar estos atributos).


Para evitar el uso de scriplets en jsp, siga los consejos de "divideByZero" y use ${pageContext.request.requestURI} Esta es una mejor forma de hacerlo.


Para obtener la ruta actual desde el archivo JSP, puede hacer una de las siguientes acciones:

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


Prueba esto,

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

Me gustaría ponerlo en mi plantilla base y usarlo en toda la aplicación siempre que lo necesite.


Si utiliza RequestDispatcher.forward() para enrutar la solicitud del controlador a la vista, el URI de solicitud se expone como un atributo de solicitud denominado javax.servlet.forward.request_uri . Entonces, puedes usar

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

o

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


También podrías usar

${pageContext.request.requestURI}


Pruebe esto en su lugar:

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;

Nota: No puede obtener el ancla HREF de su url. Ejemplo, si tiene url "toc.html # top" , puede obtener solo "toc.html"

Nota : req.getAttribute ("javax.servlet.forward.request_uri") funciona solo en JSP. si ejecuta esto en el controlador antes de JSP, el resultado es nulo

Puede usar el código para ambas variantes:

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