2009-07-02 16 views

Odpowiedz

41

Mogłeś to zrobić przy użyciu tagów JSTL, ale wynik nie jest optymalna:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<html> 
<body> 

<jsp:useBean id="numbers" class="java.util.HashSet" scope="request"> 
    <% 
     numbers.add("one"); 
     numbers.add("two"); 
     numbers.add("three"); 
    %> 
</jsp:useBean> 

<c:forEach items="${numbers}" var="value"> 
    <c:if test="${value == 'two'}"> 
     <c:set var="found" value="true" scope="request" /> 
    </c:if> 
</c:forEach> 
${found} 

</body> 
</html> 

Lepszym sposobem byłoby użyć funkcji niestandardowej:

package my.package; 
public class Util { 

    public static boolean contains(Collection<?> coll, Object o) { 
    if (coll == null) return false; 
    return coll.contains(o); 
    } 

} 

ta jest zdefiniowana w pliku TLD ROOT /WEB-INF/tag/custom.tld:

<?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"> 
    <tlib-version>1.0</tlib-version> 
    <short-name>myfn</short-name> 
    <uri>http://samplefn</uri> 
    <function> 
     <name>contains</name> 
     <function-class>my.package.Util</function-class> 
     <function-signature>boolean contains(java.util.Collection, 
      java.lang.Object)</function-signature> 
    </function> 
</taglib> 

Funkcja ta może być następnie importowane do swoich stron JSP:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<%@ taglib prefix="myfn" uri="http://samplefn"%> 
<html> 
<body> 

<jsp:useBean id="numbers" class="java.util.HashSet" scope="request"> 
    <% 
     numbers.add("one"); 
     numbers.add("two"); 
     numbers.add("three"); 
    %> 
</jsp:useBean> 

${myfn:contains(numbers, 'one')} 
${myfn:contains(numbers, 'zero')} 

</body> 
</html> 

Kolejna wersja EL (ze względu na JEE6) powinien pozwalają na większą formę bezpośrednią:

${numbers.contains('two')} 
+0

+1 za korzystanie z funkcji niestandardowej. To jest właściwa droga, którą można przejść i użyć ponownie :) – AlfaTeK

1

Jeśli używasz Spring Framework, można użyć Wiosna tagLib i Spel:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
--- 
<spring:eval var="containsValue" expression="yourList.contains(yourValue)" /> 

Contains (true or false): ${containsValue} 
Powiązane problemy