4.3. The JSP Expression LanguageJSP 2.0 introduced the JSP Expression Language (the EL ), which is designed to make it easier for page authors to access and write logical tests. Expressions written in the EL can be embedded into static text or passed into JSP tag parameters. In both cases, the JSP engine evaluates the expression and embeds the result in the page.
EL expressions begin with a $ and are enclosed by curly bracket characters. Here's a simple example, evaluating the expression 3 > 4 (to false, of course) and also doing the sum: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> Is three greater than four? That's ${3 > 4}. The sum is ${3+4}, though. </body> </html> Expressions can also retrieve values from the page, request, session, and application scopes, in that order. Let's say that you have the following Java bean: public class Product { private String name = null; private double price = 0.0d; public String getName( ) { return name; } public void setName(String name) { this.name = name; } public double getPrice( ) { return price; } public void setPrice(double price) { this.price = price; } }
We can load the object into the request scope with a servlet like this (note that the servlet isn't responsible for generating any HTML content, just for creating and packaging the Product object): import javax.servlet.http.*; import javax.servlet.ServletException; import java.io.IOException; public class ProductServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Product product = new Product( ); product.setName("Hyperwidget"); product.setPrice(599.99d); request.setAttribute("product", product); request.getRequestDispatcher("/product.jsp") .forward(request, response); } } Now that the object is in the request scope, we can access it via the EL within the product.jsp page: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Product Description</title></head> <body> <h1>${product.name}</h1> Price: $${product.price} </body> </html> The only trick here is that we included two $ characters before {price}: one to display to the user and one to indicate the start of the expression. All of the built-in objects described in Table 4-2 are available within the EL. For instance, to display the application context page, you can use the expression ${pageContext.request.contextPath}, which pulls the HttpServletRequest object from the PageContext object and evaluates the contextPath bean property. The EL also allows retrieval of values from maps using the following syntax: mapname['key'] Using the built-in param convenience object (which contains the form parameters for the current request), the standard "Hello, Joe" application looks like this: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Generic Seasonal Greetings!</title></head> <body>Hello, ${param['name']}!</body> </html> Accessing this JSP via the URI /context/hello.jsp?name=Joe provides an appropriate greeting to Joe. 4.3.1. Using the EL with TagsJSP EL expressions can also be used with JSP tag attributes. Simply replace the tag literal with the EL expression. For example, we can use the <c:if> tag (which we'll look at a little more in the next section) along with an EL expression to display special shipping information if the cost of an item on our product page is more than, say, $400: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Product Description</title></head> <body> <h1>${product.name}</h1> Price: $${product.price} <c:if test="${product.price > 400}"> <br/><font color="red">Eligible for Saver Shipping!</font> </c:if> </body> </html> Of course, we really shouldn't have the logic for Saver Shipping eligibility embedded in the JSP itself. For more information on techniques for abstracting business logic away from content, see the chapter on Struts (Chapter 19), the chapter on JavaServer Faces (Chapter 5), or the book J2EE Design Patterns by William Crawford and Jonathan Kaplan(O'Reilly). |