Practical Methods to Check if a List Contains a String in JSTL

Dec 04, 2025 · Programming · 11 views · 7.8

Keywords: JSTL | list contains check | custom functions

Abstract: This article explores effective methods for determining whether a string list contains a specific value in JSTL. Since JSTL lacks a built-in contains function, it details two main solutions: using the forEach tag to manually iterate and compare elements, and extending JSTL functionality through custom TLD functions. With code examples and comparative analysis, it helps developers choose appropriate methods based on specific needs, offering performance optimization tips and best practices.

Introduction

In JSP development, it is common to need to check if a list contains a specific string value within page logic, such as dynamically hiding or showing elements based on conditions. However, JSTL (JSP Standard Tag Library) does not provide a direct contains function for list membership checks, posing challenges for developers. This article delves into solutions for this issue, focusing on two primary approaches: using the c:forEach tag for manual iteration and extending JSTL functionality through custom functions.

Implementing List Contains Check with forEach Tag

Due to the absence of a built-in list contains function in JSTL, the most straightforward method is to use the c:forEach tag to iterate through the list and compare each element using the c:if tag. Here is a complete example:

<c:set var="contains" value="false" />
<c:forEach var="item" items="${myList}">
  <c:if test="${item eq myValue}">
    <c:set var="contains" value="true" />
  </c:if>
</c:forEach>

In this code snippet, a variable contains is first initialized to false. Then, the c:forEach tag iterates over each element in myList, assigning it to the variable item. Inside the loop, the c:if tag uses the eq operator (equivalent to ==) to compare item and myValue. If a match is found, contains is set to true. After the iteration, the value of ${contains} indicates whether the list contains the target string.

This method is simple and requires no additional configuration, making it suitable for small lists or temporary checks. However, for large lists, manual iteration may incur performance overhead, as each check requires a full traversal of the list.

Extending JSTL with Custom TLD Functions

To improve code reusability and performance, custom TLD (Tag Library Descriptor) functions can be created to encapsulate Java's List.contains() method. This involves two steps: defining a TLD file and implementing a Java class.

First, create a TLD file (e.g., custom-functions.tld) and place it in the WEB-INF directory:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<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>
    <function>
        <name>contains</name>
        <function-class>com.utils.CustomFunctions</function-class>
        <function-signature>boolean contains(java.util.List, java.lang.Object)</function-signature>
    </function>
</taglib>

Then, implement the corresponding Java class:

package com.utils;

import java.util.List;

public class CustomFunctions {
    public static boolean contains(List list, Object o) {
        if (list == null || o == null) {
            return false;
        }
        return list.contains(o);
    }
}

In the JSP page, import the custom tag library and use the function:

<%@ taglib uri="/WEB-INF/custom-functions.tld" prefix="fn" %>
<c:if test="${fn:contains(mylist, myValue)}">
    style='display:none;'
</c:if>

This method leverages the efficient contains method from Java's collections framework (with average time complexity of O(1) for HashSet or O(n) for ArrayList), offering better performance than manual iteration. Additionally, it enhances code readability and maintainability, allowing reuse across multiple JSP pages.

Alternative Approach: Using Map for Fast Lookup

Beyond the above methods, consider using a Map instead of a List for data storage to enable faster contains checks. For example, store strings as values in a HashMap:

Map<Long, String> map = new HashMap<>();
map.put(1L, "one");
map.put(2L, "two");

In JSTL, check for value existence directly by key:

<c:if test="${not empty map[1]}">
    <!-- perform action -->
</c:if>

This approach is suitable for key-value pair data, providing O(1) lookup performance, but may not fit all scenarios, especially when data is inherently list-based.

Performance Comparison and Best Practices

When choosing a method, consider the following factors:

Recommendation: Use the forEach method for small or temporary needs; implement custom functions for performance-critical or frequently used scenarios. If data structure allows, consider using Map to optimize lookups.

Conclusion

Checking if a list contains a string in JSTL is a common requirement but lacks built-in support. This article presented two core methods: manual iteration via c:forEach and using custom TLD functions. Manual iteration suits simple cases, while custom functions offer better performance and reusability. Additionally, using Map as an alternative data structure can further optimize performance. Developers should select appropriate methods based on specific application contexts to balance code simplicity, performance, and maintainability. By understanding these techniques, one can handle list contains checks more efficiently in JSP, enhancing the dynamism and user experience of web applications.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.