Using JSTL with Struts is as simple as adding the JSTL .jar files (jstl.jar and standard.jar) to your Web application's library directory (/WEB-INF/lib) and then referencing the Tag Library Descriptors (.tlds) from your JSPs. There are two ways that you can reference JSTL .tlds in your JSPs. First, you can use an absolute URI, as shown next:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
Second, you can make an entry in the web.xml file and then the URI assigned in the web.xml file is used by JSPs. This approach is not necessary or recommended; however, if you choose to take this route, you must copy the JSTL .tld files into your Web application's WEB-INF directory so that you can reference them.
The following table lists the absolute URI for each of the libraries, should you choose to reference the .tlds in that way.
Library | Prefix | URL |
---|---|---|
Core | c | http://java.sun.com/jstl/core |
Format | fmt | http://java.sun.com/jstl/fmt |
XML | x | http://java.sun.com/jstl/xml |
As previously mentioned, with the advent of JSTL, the Struts tag library tags should now be used only when there is not a JSTL equivalent tag to replace them. This ensures that JSPs are as portable as possible and shields your application from being too heavily tied to Struts-specific facilities. The following table lists each of the Struts tag library tags that can be replaced by JSTL tags and their corresponding replacements.
Struts Tag Library | Tag | JSTL Replacement |
---|---|---|
Bean | cookie | c:set |
Bean | define | c:set |
Bean | header | c:set |
Bean | include | c:import |
Bean | parameter | c:set |
Bean | write | c:out |
Logic | empty | c:if, c:when |
Logic | equal | c:if, c:when |
Logic | greaterEqual | c:if, c:when |
Logic | greaterThan | c:if, c:when |
Logic | iterate | c:forEach |
Logic | lessEqual | c:if, c:when |
Logic | lessThan | c:if, c:when |
Logic | notEmpty | c:if, c:when |
Logic | notEqual | c:if, c:when |
As you can see, JSTL can be used in lieu of many of the Struts tag library tags. However, you may have noticed that none of the tags from the Struts HTML Tag Library has an equivalent JSTL tag. JSTL does not have a tag library for rendering HTML form elements, thus the absence of Struts tag replacements. For the HTML tags and all the tags in the Bean and Logic tag libraries that do not have JSTL replacements, a project called Struts EL was created. Struts EL was created by David Karr and is distributed with Struts.
The Struts EL project is an extension to Struts that provides a JSTL expression language– enabled version of each Struts tag for which no JSTL replacement exists. Most of the base Struts tag library tags' attributes accept values represented as JSP expressions. This allows the tags to have dynamic attribute values. For example, the Bean Tag Library's message tag accepts expressions for its key attribute, as shown here:
<bean:message key="<%=messageKey%>"/>
This example uses the value of the messageKey JSP scripting variable as the value for the message tag's key attribute. Notice that the JSP scripting variable had to be specified within the JSP expression identifiers <%= and %>.
The following example shows the Struts EL equivalent of the previous example using a JSTL expression to specify a dynamic value for the key attribute:
<bean:message key="${messageKey}"/>
As you can see, the JSTL expression syntax is a little shorter and is cleaner looking.
As mentioned, the basic concepts of using JSTL expressions apply to all the Struts EL tags in the same way. Any tag attribute that accepts a JSP expression with the base tags will accept a JSTL expression with the Struts EL tags.
The following sections provide examples for replacing Struts tag library tags with their JSTL equivalents. Remember that not all the Bean, HTML, and Logic tags can be replaced by JSTL tags.
The following snippet shows the basic usage of the cookie tag from the Bean Tag Library:
<bean:cookie name="cat"/>
The JSTL equivalent is as follows:
<c:set var="category" value="${cookie['cat'].value}"/>
This example accesses the cat cookie with a JSTL expression that makes use of the JSTL implicit cookie object.
The following snippet shows the basic usage of the define tag from the Bean Tag Library:
<bean:define name="nameObj"/>
The JSTL equivalent is as follows:
<c:set var="name" value="${nameObj}"/>
The following snippet shows the basic usage of the header tag from the Bean Tag Library:
<bean:header name="User-Agent"/>
The JSTL equivalent is as follows:
<c:set var="browser" value="${header['User-Agent']}"/>
This example accesses the "User-Agent" header with a JSTL expression that makes use of the JSTL implicit header object.
The following snippet shows the basic usage of the include tag from the Bean Tag Library:
<bean:include href="http://www.yahoo.com/"/>
The JSTL equivalent is as follows:
<c:import var="yahooContents" url=" http://www.yahoo.com/"/>
The following snippet shows the basic usage of the parameter tag from the Bean Tag Library:
<bean:parameter name="clr"/>
The JSTL equivalent is as follows:
<c:set var="color" value="${param['clr']}"/>
This example accesses the clr parameter with a JSTL expression that makes use of the JSTL implicit param object.
The following snippet shows the basic usage of the write tag from the Bean Tag Library:
<bean:write name="bizObj"/>
The JSTL equivalent is as follows:
<c:out value="${bizObj}" />
The following snippet shows the basic usage of the empty tag from the Logic Tag Library:
<logic:empty name="results"> Your search yielded no results. </logic:empty>
The JSTL equivalent is as follows:
<c:if test="${empty results}"> Your search yielded no results. </c:if>
The following snippet shows the basic usage of the equal tag from the Logic Tag Library:
<logic:equal name="count" value="0"> Count is zero. </logic:equal>
The JSTL equivalent is as follows:
<c:if test="${count == 0}"> Count is zero. </c:if>
The following snippet shows the basic usage of the greaterEqual tag from the Logic Tag Library:
<logic:greaterEqual name="count" value="5"> Count is greater than or equal to five. </logic:greaterEqual>
The JSTL equivalent is as follows:
<c:if test="${count >= 5}"> Count is greater than or equal to five. </c:if>
The following snippet shows the basic usage of the greaterThan tag from the Logic Tag Library:
<logic:greaterThan name="count" value="5"> Count is greater than five. </logic:greaterThan>
The JSTL equivalent is as follows:
<c:if test="${count > 5}"> Count is greater than five. </c:if>
The following snippet shows the basic usage of the iterate tag from the Logic Tag Library:
<logic:iterate collection="<%=results%>"> Result: <%=result%><br> </logic:iterate>
The JSTL equivalent is as follows:
<c:forEach var="result" items="${results}"> Result: <c:out value="${result}"/> </c:forEach>
The following snippet shows the basic usage of the lessEqual tag from the Logic Tag Library:
<logic:lessEqual name="count" value="5"> Count is less than or equal to five. </logic:lessEqual>
The JSTL equivalent is as follows:
<c:if test="${count <= 5}"> Count is less than or equal to five. </c:if>
The following snippet shows the basic usage of the lessThan tag from the Logic Tag Library:
<logic:lessThan name="count" value="5"> Count is less than five. </logic:lessThan>
The JSTL equivalent is as follows:
<c:if test="${count < 5}"> Count is less than five. </c:if>
The following snippet shows the basic usage of the notEmpty tag from the Logic Tag Library:
<logic:notEmpty name="results"> Your search returned results! </logic:notEmpty>
The JSTL equivalent is as follows:
<c:if test="${!empty results}"> Your search returned results! </c:if>
The following snippet shows the basic usage of the notEqual tag from the Logic Tag Library:
<logic:notEqual name="count" value="0"> Count is not equal to zero. </logic:notEqual>
The JSTL equivalent is as follows:
<c:if test="${count != 0}"> Count is not equal to zero. </c:if>
To use the Struts EL tag libraries in a Struts application, your application's JSPs must declare their use of the libraries with JSP taglib directives:
<%@ taglib uri="http://struts.apache.org/tags-bean-el" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html-el" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-logic-el" prefix="logic" %>
Notice that the prefix attributes are set to "bean", "html", and "logic", respectively. These attributes can be set to whatever you want; however, "bean", "html", and "logic" are the accepted defaults for the Struts EL tag libraries. Using the same prefix for the Struts EL tag libraries as the base Struts tag libraries allows applications to easily transition to JSP 2.0.
The prefix attribute declares the prefix that each tag must have when it is used in a JSP, as shown here:
<bean:message key="label.search.name">
Because "bean" was defined as the prefix, the message tag was used as shown. However, if you chose to use a prefix of "strutsbean", the tag would be used in the following way:
<strutsbean:message key="label.search.name">
Note | Modern application servers use the uri attribute of the taglib directive to automatically resolve the location of the tag library descriptor file. Older application servers that support only JSP version 1.1 and/or version 1.0 require that tag libraries be registered in the web.xml file so that they can be resolved, as shown here:
<taglib> <taglib-uri>http://struts.apache.org/tags-bean-el</taglib-uri> <taglib-location>/WEB-INF/struts-bean-el.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://struts.apache.org/tags-html-el</taglib-uri> <taglib-location>/WEB-INF/struts-html-el.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://struts.apache.org/tags-logic-el</taglib-uri> <taglib-location>/WEB-INF/struts-logic-el.tld</taglib-location> </taglib> |
As mentioned, each of the tags in the Struts EL tag libraries is simply a tag from the Bean, HTML, Logic, or Tiles tag libraries to which support for JSTL expressions has been added. Thus, they are not individually covered in detail here. Instead, the basic concepts of using JSTL expressions with the tags were discussed because they apply to all the extended tags in the same way. For non–Struts EL–related information on each of the extended tags, see the descriptions of their base tags in their respective chapters.
The remainder of this section lists each Struts EL library-specific tag and the base tag from which it has been extended. Remember that not all of the Bean, HTML, Logic, and Tiles tags have been extended to support JSTL expressions. Only those tags whose functionality cannot be wholly replaced by a JSTL tag have been extended.
The following table lists each of the tags in the Struts EL Bean Tag Library and provides a short description of each tag's purpose.
Tag | Description |
---|---|
include | Expression language–enabled version of the Bean Tag Library's include tag. |
message | Expression language–enabled version of the Bean Tag Library's message tag. |
page | Expression language–enabled version of the Bean Tag Library's page tag. |
resource | Expression language–enabled version of the Bean Tag Library's resource tag. |
size | Expression language–enabled version of the Bean Tag Library's size tag. |
struts | Expression language–enabled version of the Bean Tag Library's struts tag. |
The following table lists each of the tags in the Struts EL HTML Tag Library and provides a short description of each tag's purpose.
Tag | Description |
---|---|
base | Expression language–enabled version of the HTML Tag Library's base tag. |
button | Expression language–enabled version of the HTML Tag Library's button tag. |
cancel | Expression language–enabled version of the HTML Tag Library's cancel tag. |
checkbox | Expression language–enabled version of the HTML Tag Library's checkbox tag. |
errors | Expression language–enabled version of the HTML Tag Library's errors tag. |
file | Expression language–enabled version of the HTML Tag Library's file tag. |
form | Expression language–enabled version of the HTML Tag Library's form tag. |
frame | Expression language–enabled version of the HTML Tag Library's frame tag. |
hidden | Expression language–enabled version of the HTML Tag Library's hidden tag. |
html | Expression language–enabled version of the HTML Tag Library's html tag. |
image | Expression language–enabled version of the HTML Tag Library's image tag. |
img | Expression language–enabled version of the HTML Tag Library's img tag. |
javascript | Expression language–enabled version of the HTML Tag Library's javascript tag. |
link | Expression language–enabled version of the HTML Tag Library's link tag. |
messages | Expression language–enabled version of the HTML Tag Library's messages tag. |
multibox | Expression language–enabled version of the HTML Tag Library's multibox tag. |
option | Expression language–enabled version of the HTML Tag Library's option tag. |
options | Expression language–enabled version of the HTML Tag Library's options tag. |
optionsCollection | Expression language–enabled version of the HTML Tag Library's optionsCollection tag. |
password | Expression language–enabled version of the HTML Tag Library's password tag. |
radio | Expression language–enabled version of the HTML Tag Library's radio tag. |
reset | Expression language–enabled version of the HTML Tag Library's reset tag. |
rewrite | Expression language–enabled version of the HTML Tag Library's rewrite tag. |
select | Expression language–enabled version of the HTML Tag Library's select tag. |
submit | Expression language–enabled version of the HTML Tag Library's submit tag. |
text | Expression language–enabled version of the HTML Tag Library's text tag. |
textarea | Expression language–enabled version of the HTML Tag Library's textarea tag. |
xhtml | Expression language–enabled version of the HTML Tag Library's xhtml tag. |
The following table lists each of the tags in the Struts EL Logic Tag Library and provides a short description of each tag's purpose.
Tag | Description |
---|---|
forward | Expression language–enabled version of the Logic Tag Library's forward tag. |
iterate | Expression language–enabled version of the Logic Tag Library's iterate tag. |
match | Expression language–enabled version of the Logic Tag Library's match tag. |
messagesNotPresent | Expression language–enabled version of the Logic Tag Library's messagesNotPresent tag. |
messagesPresent | Expression language–enabled version of the Logic Tag Library's messagesPresent tag. |
notMatch | Expression language–enabled version of the Logic Tag Library's notMatch tag. |
notPresent | Expression language–enabled version of the Logic Tag Library's notPresent tag. |
present | Expression language–enabled version of the Logic Tag Library's present tag. |
redirect | Expression language–enabled version of the Logic Tag Library's redirect tag. |
The following table lists each of the tags in the Struts EL Tiles Tag Library and provides a short description of each tag's purpose.
Tag | Description |
---|---|
add | Expression language–enabled version of the Tiles Tag Library's add tag. |
definition | Expression language–enabled version of the Tiles Tag Library's definition tag. |
get | Expression language–enabled version of the Tiles Tag Library's get tag. |
getAsString | Expression language–enabled version of the Tiles Tag Library's getAsString tag. |
importAttribute | Expression language–enabled version of the Tiles Tag Library's importAttribute tag. |
initComponentDefinitions | Expression language–enabled version of the Tiles Tag Library's initComponentDefinitions tag. |
insert | Expression language–enabled version of the Tiles Tag Library's insert tag. |
put | Expression language–enabled version of the Tiles Tag Library's put tag. |
putList | Expression language–enabled version of the Tiles Tag Library's putList tag. |
useAttribute | Expression language–enabled version of the Tiles Tag Library's useAttribute tag. |