2011-03-27 15 views
25

Estoy trabajando en una aplicación de reserva de cruceros utilizando struts/tiles que usa múltiples servlets/jsp hacia adelante para alcanzar la jsp derecha para visualizar. Pero, una vez que llegue a la jsp final que se utiliza para representar la página, la llamada ${pageContext.request.requestURL} en esa jsp devuelve la ruta de esta jsp.Cómo obtener la URL de solicitud original de un servlet/jsp después de múltiples servlets hacia adelante

Por ejemplo

  1. solicitud original: /reserva/getCruiseDetails
  2. se reenvía a: /booking/validateCruiseDeteails.jsp
  3. se reenvía a: /booking/validateUser.jsp
  4. finalmente se reenvía a: /booking/showCruiseDetails.jsp

Así, en /booking/showCruiseDetails.jsp cuando llamo me ${pageContext.request.requestURL} consigo /booking/showCruiseDetails.jsp

¿Cómo se obtiene la del (cliente hecho) solicitud de URL original de una JSP que se ha alcanzado a través múltiples hacia delante. Encontré las siguientes publicaciones en stackoverflow que apuntan a la solución here y here, pero no abordan cómo encontrar la url de solicitud original después de que se produjeron varios forwards.

+0

Forwards múltiples dentro de JSPs es un diseño extremadamente malo. – BalusC

+0

estuvo de acuerdo ... pero estoy tratando con el código heredado ;-( –

Respuesta

10

Usted puede utilizar un filtro para poner dirección de origen para solicitar atributo y luego leerlo de JSP

filtro asignada a/reserva/* ejecutar:

request.setAttribute("origin", request.getRequestURL()); 

JSP:

${pageContext.request.attribute["origin"]} 

Esto funciona porque el filtro ha configurado el despachador de PETICIONES por defecto. Esto significa que el filtro se ejecuta solamente peticiones de clientes directos no para el avance/incluyendo

+0

Voy a probar esto, y si funciona i ' Lo aceptaré como la respuesta. Mientras tanto, le he dado una votación positiva :-) –

+0

Estaré muy feliz si esta solución te ayuda – smas

+0

Por cierto, ¿podrías explicarme qué quieres decir cuando dices? "Esto funciona porque el filtro ha configurado el despachador de PETICIONES por defecto"? thnx (y no he llegado a validar su sugerencia por el momento) –

1

Considere utilizar filtros de servlet para validar la información. Esto significa que puede evitar su reenvío de validación y quedarse en un solo archivo JSP.

+0

Eso es un gran consejo, pero estoy tratando con una aplicación heredada y estoy obligado por su arquitectura. –

48

He encontrado una mejor respuesta en este post [How do you detect the URL in a Java Servlet when forwarding to JSP?]

En el objetivo JSP uso:

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

Para encontrar cuál fue la URL original.

No requiere que usted tome ningún paso adicional en el servlet reenvío

+1

Esta es en realidad una mejor respuesta que la aceptada. La especificación de servlet garantiza que esta propiedad sobrevive a múltiples reenvíos: "Tenga en cuenta que estos atributos siempre deben reflejar la información en la solicitud original, incluso en la situación en que se llaman múltiples reenvíos e inclusiones subsiguientes". (especificación del servlet, 9.4.2: parámetros de solicitud reenviados) – LordOfThePigs

3
${requestScope["javax.servlet.forward.request_uri"]} 

o

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

Puede mostrar sin necesidad de utilizar una referencia de frijol con lo siguiente:

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" /> 

Sin embargo, necesita asignar la página 404 en su archivo web.xml.

<error-page> 
    <error-code>404</error-code> 
    <location>/xhtml/pg/error/404.xhtml</location> 
</error-page> 
Cuestiones relacionadas