JSP and JSTL experiences javacode 9085791

JSP and JSTL experiences

This post describes some of my recent experiences in using JSP and JSTL. For many probably highly trivial.

A dynamic include of a JSP (fragment), using jsp:include, allows passing of parameters, using jsp:param. However, such parameters are always String values. I needed to pass an array (String[]) and could not figure out how to. Using a scriptlet to define an array, add it to the pageContext (see for example) and reference it in the JSP fragment did not work:

<%
  String[] lov = {"a","b", "c"};
  pageContext.setAttribute("lov", lov);
%>

This is only logical once you realize that a jsp:include turns over control to a JSP that to all intents a purposes is a new, stand-alone JSP with its own pageContext. However, JSTL comes to the rescue. It turns out that the forEach tag recognizes a comma separated list of values. Note however that JSTL does not now consider the parameter a String[], it is still a String.

Code to call the JSP fragment:

<jsp:include page="lovPopup.jsp" flush="true">
                    <jsp:param name="lovParam" value="a,b,c"/>
</jsp:include>

Code in called JSP fragment:

<bean:parameter id="lov" name="lovParam"/>
  <c:forEach var="listItem" items="${lov}"/>
     <c: out value="${listItem}" />
  </c>
</c>

It is important that the JSP fragment is also “JSTL enabled” (initially I erroneously thought that somehow this JSP would inherit the taglibraries imported by the JSP that invokes it), by importing the Core JSTL library:

<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>

Now it is not possible to refer to

${lov [1]};

even though forEach knows how to iterate through a comma-separated String, it does not mean that it is equivalent to a String[] (error: Unable to find a value for “1” in object of class “java.lang.String” using operator “[]” (null)).

It should be possible to put an attribute of type String[] in the requestScope, rather than the pageScope, and thus transfer a typed object, rather than just a String, to the included JSP fragent.

<%
  String[] lov = {"a","b", "c"};
  pageContext.setAttribute("lov", lov, PageContext.REQUEST_SCOPE);
%>

and to get access to the lov object in the included JSP fragment:

  <c:set var="list" value="${lov}" scope="request" />
  <c: out value="${list [1]}" />
  <c:forEach var="listItem" items="${list}"/>
  <c: out value="${listItem}" />
  </c:forEach>

One Response

  1. ananth March 9, 2005