2008-11-17 4 views
11

Dans les expressions EL utilisées dans une page jsp, les chaînes sont prises littéralement. Par exemple, dans le code suivant snippetUtilisation d'expressions rationnelles dans JSP EL

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

test n'évalue pas à true si la valeur de myvar est 'prefixxxxx.' Est-ce que quelqu'un sait s'il existe un moyen d'avoir la chaîne interprétée comme une regex à la place? Est-ce que EL a quelque chose de similaire à l'opérateur tilde ~ d'awk?

Répondre

19

Bien que ce cas particulier peut être manipulé avec la fonction JSTL fn:startsWith, les expressions régulières en général semblent comme des tests très probables . Il est regrettable que JSTL n'inclue pas de fonction pour ceux-ci. Par contre, il est assez facile d'écrire une fonction EL qui fait ce que vous voulez. Vous avez besoin de l'implémentation de la fonction et d'un TLD pour indiquer à votre application Web où la trouver. Mettez-les ensemble dans un fichier JAR et déposez-le dans votre répertoire WEB-INF/lib.

Voici un aperçu:

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> 

Désolé, je n Ne teste pas cette fonction particulière, mais j'espère que c'est suffisant pour vous orienter dans la bonne direction.

5

Il suffit d'ajouter ce qui suit à 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> 

Puis dans votre jsp

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

Cela fonctionne exactement le même que Pattern.match

+0

Meilleure solution IMO! –

+0

Solution intelligente! Mais serait-il possible de retourner le résultat du match. J'ai essayé quelque chose avec la classe java.util.regex.Matcher mais je ne sais pas pour le faire fonctionner avec cette syntaxe tld ... – user2718671

0

pour l'utilisation de motif. correspond à l'intérieur d'une page jsp dans mon cas, il suffisait d'appeler java.util.regex.Pattern.matches (regexString, stringToCompare) parce que vous ne pouvez pas importer package in jsp

+0

Noté devrait être que ce n'était pas possible jusqu'à ce que EL 2.2 a été libéré et la question était demandé plus d'un an avant cela. – BalusC

+0

@BalusC vous avez parfaitement raison, je viens de partager pour tout le monde cherche maintenant :) – Giuseppe

Questions connexes