Expression Languages

Before we dive into JSTL, we will examine one of its most important features: expression languages . Expression languages give JSP developers a mechanism for embedding expressions to be evaluated in place of constants or scriptlets. Consider the following example, in which a JSP must display the amount attribute contained in the JavaBean called PaymentDetail:

<jsp:useBean class="com.officemin.Catalog" scope="app" />
The number of items in the catalog is <%=catalog.getItems().getSize() %>
<!—Other JSP code—>

Here, a page author has to use an expression <%= somevalue %> to access the properties of the JavaBean component. If the properties are nested, the expression becomes even more complex:

<%= catalog.getItems().getItem(0).getName()%>

An expression language allows a page author to access an object using a simplified syntax such as <x:sometag att="${aName}"> for a simple variable or

<x:sometag att="${outer.inner.innermost}"> for nested properties.

JSTL defines the syntax for such expression languages, based on ECMA-Script and XPath. To be more precise, the JSP 2.0 developed under JSR-152 owns the syntax from which the JSTL expressions are derived.

Java Start Sidebar

As result of the confusion and cross-browser compatibility issues of Java-Script, Netscape submitted a proposal to the European Computer Manufacturers Association that was adopted in 1997. The home of the ECMA-Script specification is

XPath is used to access different parts of an XML document. It is a W3C specification since 1999 and can be found at

Java End Sidebar

The expression language defines a set of implicit objects. When an expression references one of these objects by name, the appropriate object is returned instead of the corresponding attribute. For example, ${pageContext} returns the PageContext object. Most of the implicit objects are modeled as a java.util.Map and hold some name value mapping. Table B.1 lists the implicit objects available.

Table B.1: Implicit objects in JSTL

Implicit Object



The PageContext object in JSPs.


Maps page-scoped attribute names to their values.


Maps request-scoped attribute names to their values. The attributes are available only for the duration of the request.


Maps session-scoped attribute names to their values. Attributes are available until the session is invalidated.


Maps app-scoped attribute names to their values. Attributes are available throughout the app for the life of the container. These map to a ServletContext .getAttribute().


Maps parameter names to a single String parameter value using request.getParameter (name).


Maps parameter names to a String[] of all values for that parameter using request.getParameter (name).


Maps header names to a single String header value using request.getHeader (name).


Maps header names to a String[] of all values for the headers.


Maps cookie names to a single cookie object that is returned using the request.getCookies() method.


Maps context initialization parameter names to their values using the getInitParameter(name).

For example, to access the URI from the request, the implicit object request can be used, like ${pageContext.request.requestURI}. This will obtain the URI of the request, and the container will map this to HTTPServletRequest.getRequestURI().

To obtain a catalog object from the session, ${sessionScope:catalog} can be used, and the container will call pageContext.getAttribute("catalog", PageContext.SESSION_SCOPE).