2011-12-05 15 views
5

Estoy tratando de tener un JSP condicional que opere en la URL actual. Básicamente quiero hacer algo si la URL termina en /my-suffix, NO incluye la cadena de consulta, etc. Por lo tanto, debo probar contra una subcadena de la url que está justo en el medio.¿Se puede usar JSTL c: si probar en comparación con un patrón de URL?

<c:if test="url not including query string+ ends with '/my-suffix'"> 
    do something... 
</c:if> 

¿Hay una manera de hacer esto?

Respuesta

12

Pagar el JSTL functions taglib. Una de las funciones disponibles es fn:endsWith(). Esto le permite, por ejemplo, hacer:

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
... 
<c:if test="${not fn:endsWith(pageContext.request.requestURI, '/my-suffix')}"> 
    <p>URL does not end with /my-suffix.</p> 
</c:if> 

(${pageContext.request.requestURI} los rendimientos HttpServletRequest#getRequestURI() que no incluye la cadena de consulta)

O, si ya se encuentra en un Servlet 3.0 contenedor compatible que llega así junto con EL 2.2, como Tomcat 7, Glassfish 3, etc, entonces también puede simplemente llamar a los métodos con argumentos directamente, como String#endsWith():

<c:if test="${not pageContext.request.requestURI.endsWith('/my-suffix')}"> 
    <p>URL does not end with /my-suffix.</p> 
</c:if> 
+0

¿Qué hay de eliminar la cadena de consulta, etc.? Does request.requestURI no incluye esa parte? –

+0

@Tony: no, no dice mi respuesta (haga clic en el enlace de javadoc para ver evidencia autorizada * "... hasta la cadena de consulta ..." *). ¿Es eso un problema? ¿O no lo has probado en absoluto? – BalusC

+0

Heh gracias BalusC, estoy distraído con otras cosas. Cada vez que empiezo a trabajar en esto de nuevo, estoy seguro de que su respuesta será aceptada (¡como si necesitara el representante!) = P –

0

abetos Debería hacer una división en la url, y frisbee los params de la consulta, luego verificar usando ends, con etc ... parece desordenado.

Usted podría simplemente verificar si la cadena está en el camino en absoluto?

para hacer eso >>

Obtener el camino y establecer VARs para la dirección URL y la cadena que desea evaluar:

<c:set var="url" value="${ pageContext.request.requestURI }" /> 
<c:set var="stringToHunt" value="Your-String-Here" /> 

Ahora compruebe si su cadena está en la ruta utilizando indexOf (retornos - 1 si la cadena no se encuentra):

<c:if test="${ fn:indexOf(url , stringToHunt) ne -1 }"> 
    This page does not contain your string! 
</c:if> 

** soy nuevo en JSTL/eL y sólo estoy usando esta lógica para una tarea bastante mundana - la adición de una clase activa con un botón de navegación si se trata de la corriente página. ¡No recomendaría este método para nada comercialmente sensible! Buena suerte.

4

Para añadir aún más a la respuesta de BalusC utilizando la siguiente también funcionaría si usted está buscando para que coincida con una cadena en cualquier lugar en la url:

<c:if test="${fn:contains(pageContext.request.requestURI, 'my-string')}"> 
    <p>URL Contains my string</p> 
</c:if> 

Nota al margen: Ninguna de nuestras respuestas cubrir lo que el título sugiere, aunque (coincidencia de patrones) pero eso no es lo que el OP estaba buscando hacer en su publicación. Eso es en realidad un poco más complicado, pero aún posible (jstl no tiene aparentemente un juego de conversión de expresiones regulares). Si alguien necesita hacer eso, crea una publicación por separado y vincúlame a ella e intentaré ayudarte.

Cuestiones relacionadas