2008-11-17 55 views
11

En expresiones EL, utilizadas en una página jsp, las cadenas se toman literalmente. Por ejemplo, en el siguiente fragmento de códigoUso de expresiones regulares en JSP EL

<c:when test="${myvar == 'prefix.*'}"> 

prueba no evalúa a verdadero si el valor de mivar es 'prefixxxxx.' ¿Alguien sabe si hay una manera de interpretar la cadena como una expresión regular en su lugar? ¿El EL tiene algo similar al operador de tilde ~ de awk?

Respuesta

19

Si bien este caso especial se puede manejar con la función JSTL fn:startsWith, las expresiones regulares en general parecen como pruebas muy probables . Es desafortunado que JSTL no incluya una función para estos.

Por el lado positivo, es bastante fácil escribir una función EL que hace lo que quiere. Necesita la implementación de la función y un TLD para que su aplicación web sepa dónde encontrarla. Colóquelos en un JAR y suéltelos en su directorio WEB-INF/lib.

He aquí un bosquejo:

com/x/taglib/core/Regexp.java:

import java.util.regex.Pattern; 

public class Regexp { 

    public static boolean matches(String pattern, CharSequence str) { 
    return Pattern.compile(pattern).matcher(str).matches(); 
    } 

} 

META-INF/xc.tld:

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> 
    <tlib-version>1.0</tlib-version> 
    <short-name>x-c</short-name> 
    <uri>http://dev.x.com/taglib/core/1.0</uri> 
    <function> 
    <description>Test whether a string matches a regular expression.</description> 
    <display-name>Matches</display-name> 
    <name>matches</name> 
    <function-class>com.x.taglib.core.Regexp</function-class> 
    <function-signature>boolean matches(java.lang.String, java.lang.CharSequence)</function-signature> 
    </function> 
</taglib> 

En este momento, yo no 't probar esta función particular, pero espero que sea suficiente para apuntar en la dirección correcta.

5

sólo tiene que añadir lo siguiente a WEB-INF/tags.tld

<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"> 

    <display-name>Acme tags</display-name> 
    <short-name>custom</short-name> 
    <uri>http://www.acme.com.au</uri> 
     <function> 
     <name>matches</name> 
     <function-class>java.util.regex.Pattern</function-class> 
     <function-signature>boolean matches(java.lang.String, java.lang.CharSequence) </function-signature> 
    </function> 
</taglib> 

Luego, en su JSP

<%@taglib uri="http://www.acme.com.au" prefix="custom"%> 
custom:matches('aaa.+', someVar) } 

Esto funciona exactamente igual que Pattern.match

+0

¡La mejor solución IMO! –

+0

¡Solución inteligente! Pero sería posible devolver el resultado del partido. Intenté algo con la clase java.util.regex.Matcher, pero no sé cómo hacerlo funcionar con esa sintaxis tld ... – user2718671

0

para el uso del patrón. coincide dentro de una página jsp en mi caso fue suficiente para llamar al java.util.regex.Pattern.matches (regexString, stringToCompare) porque no puede importar paquete en jsp

+0

Se debe notar que esto no fue posible hasta que se lanzó EL 2.2 y la pregunta era preguntado más de un año antes de eso. – BalusC

+0

@BalusC tienes toda la razón, solo lo compartí porque todos están buscando ahora :) – Giuseppe

Cuestiones relacionadas