2010-04-09 6 views

Répondre

1

Cette fonctionnalité n'existe pas dans JSTL. Le plus proche est le fn:replace(), mais il ne supporte pas les expressions régulières. L'autre functions offre la possibilité de se débarrasser de la partie principale jusqu'au domaine (en utilisant fn:substringAfter() plusieurs fois sur // et /), mais rien ne permet de se débarrasser facilement de la partie arrière. Peut-être avec tout un tas de fn:substringAfter et c:set dans une boucle, mais cela rendrait le code maladroit et pas vraiment réutilisable.

Eh bien, en regex vous pouvez utiliser ^[^/]+/+[^/]+|[^/]+$ pour cela:

url = url.replaceAll("^[^/]+/+[^/]+|[^/]+$", ""); 

Vous pouvez créer une fonction EL personnalisée qui fait exactement ceci:

${f:replaceAll(url, '^[^/]+/+[^/]+|[^/]+$', '')} 

Pour y parvenir, tout d'abord créer une classe comme ce:

package com.example; 

public final class Functions { 
    private Functions() {} 

    public static String replaceAll(String string, String pattern, String replacement) { 
     return string.replaceAll(pattern, replacement); 
    } 
} 

et créer un /WEB-INF/functions.tld comme ceci:

<?xml version="1.0" encoding="UTF-8" ?> 
<taglib 
    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" 
    version="2.1"> 

    <display-name>Custom Functions</display-name>  
    <tlib-version>1.0</tlib-version> 
    <uri>http://example.com/functions</uri> 

    <function> 
     <name>matches</name> 
     <function-class>com.example.Functions</function-class> 
     <function-signature>java.lang.String replaceAll(java.lang.String, java.lang.String, java.lang.String)</function-signature> 
    </function> 
</taglib> 

que vous pouvez importer comme:

<%@taglib uri="http://example.com/functions" prefix="f" %> 
+0

Ce ne sera pas plus agréable à utiliser http://java.sun.com/javase/6/docs/api/java/net/URL .html et getProtocol(), getHost(), etc? – Bozho

+0

@Bozho: c'était aussi le premier où j'ai regardé, mais il n'a pas de méthodes pour retourner exactement la chaîne désirée. Le 'getPath()' se rapproche, mais vous auriez toujours besoin de sous-traiter/remplacer la dernière partie. De plus, construire un 'URL' est un peu plus cher. Alors j'ai pensé, donnons un exemple générique avec 'String # replaceAll()', qui peut avoir plus d'utilisations que cela. – BalusC

Questions connexes