SlideShare una empresa de Scribd logo
1 de 29
Descargar para leer sin conexión
© 2010 Marty Hall
Simplifying Access to
Java Code: The JSP 2
Expression LanguageExpression Language
Originals of Slides and Source Code for Examples:
http://courses.coreservlets.com/Course-Materials/csajsp2.html
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.2
© 2010 Marty Hall
For live Java EE training, please see training courses
at http://courses.coreservlets.com/.at http://courses.coreservlets.com/.
Servlets, JSP, Struts, JSF 1.x, JSF 2.0, Ajax (with jQuery, Dojo,
Prototype, Ext-JS, Google Closure, etc.), GWT 2.0 (with GXT),
Java 5, Java 6, SOAP-based and RESTful Web Services, Spring,g
Hibernate/JPA, and customized combinations of topics.
Taught by the author of Core Servlets and JSP, More
Servlets and JSP and this tutorial Available at public
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.
Servlets and JSP, and this tutorial. Available at public
venues, or customized versions can be held on-site at your
organization. Contact hall@coreservlets.com for details.
Agenda
• Motivating use of the expression language
• Understanding the basic syntax
• Understanding the relationship of the
i l t th MVCexpression language to the MVC
architecture
• Referencing scoped variables• Referencing scoped variables
• Accessing bean properties, array elements,
List elements and Map entriesList elements, and Map entries
• Using expression language operators
• Evaluating expressions conditionallyEvaluating expressions conditionally
4
© 2010 Marty Hall
EL Motivation:
Simplifying MVC Output
PagesPages
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.5
Servlets and JSP: Possibilities
for Handling a Single Requestfor Handling a Single Request
• Servlet only. Works well when:
O i bi E i– Output is a binary type. E.g.: an image
– There is no output. E.g.: you are doing forwarding or redirection as
in Search Engine example.
– Format/layout of page is highly variable. E.g.: portal.
• JSP only. Works well when:
– Output is mostly character data. E.g.: HTMLp y g
– Format/layout mostly fixed.
• Combination (MVC architecture). Needed when:
A i l t ill lt i lti l b t ti ll diff t– A single request will result in multiple substantially different-
looking results.
– You have a large development team with different team members
doing the Web development and the business logicdoing the Web development and the business logic.
– You perform complicated data processing, but have a relatively
fixed layout.
6
Implementing MVC with
RequestDispatcherRequestDispatcher
1. Define beans to represent result data
– Ordinary Java classes with at least one getBlah method
2. Use a servlet to handle requests
S l d h k f i i– Servlet reads request parameters, checks for missing
and malformed data, calls business logic, etc.
3. Obtain bean instances3. Obtain bean instances
– The servlet invokes business logic (application-specific
code) or data-access code to obtain the results.
4. Store the bean in the request, session, or
servlet context
Th l t ll tAtt ib t th t i– The servlet calls setAttribute on the request, session, or
servlet context objects to store a reference to the beans
that represent the results of the request.7
Implementing MVC with
RequestDispatcher (Continued)RequestDispatcher (Continued)
5. Forward the request to a JSP page.
– The servlet determines which JSP page is appropriate to
the situation and uses the forward method of
RequestDispatcher to transfer control to that page.RequestDispatcher to transfer control to that page.
6. Extract the data from the beans.
– The JSP page accesses beans with jsp:useBean and ap g j p
scope matching the location of step 4. The page then
uses jsp:getProperty to output the bean properties.
The JSP page does not create or modify the bean; it– The JSP page does not create or modify the bean; it
merely extracts and displays data that the servlet
created.
8
Drawback of MVC
• Main drawback is the final step: presenting
h l i h JSPthe results in the JSP page.
– jsp:useBean and jsp:getProperty
• Clumsy and verbose• Clumsy and verbose
• Cannot access bean subproperties
– JSP scripting elements
• Result in hard-to-maintain code
• Defeat the whole purpose behind MVC.
• GoalGoal
– More concise, succinct, and readable syntax
• Accessible to Web developers
– Ability to access subproperties
– Ability to access collections
9
Main Point of EL for New MVC
AppsApps
• Bean
– public String getFirstName(…) { … }
• Servlet
C C C U il fi dC ( )– Customer someCust = CustomerUtils.findCust(…);
– Request.setAttribute("customer", someCust);
– (Use RequestDispatcher forward to go to JSP page)(Use RequestDispatcher.forward to go to JSP page)
• JSP
– <h1>First name is ${customer.firstName}</h1>{ }
• If this is all you ever know about the Expression
Language, you are still in pretty good shape10
Main Point of EL for MVC Apps that
are Upgrading from JSP 1 2are Upgrading from JSP 1.2
• When in JSP 2.x-compliant server with
b l i hcurrent web.xml version, change:
<jsp:useBean id="someName"
type="somePackage someClass"type somePackage.someClass
scope="request, session, or application"/>
<jsp:getProperty name="someName"
/property="someProperty"/>
• To:• To:
${someName.someProperty}
• Bean, servlet, business logic
– Remain exactly the same as before11
Advantages of the Expression
LanguageLanguage
• Concise access to stored objects.
T “ d i bl ” ( bj d i h A ib i h– To output a “scoped variable” (object stored with setAttribute in the
PageContext, HttpServletRequest, HttpSession, or ServletContext)
named saleItem, you use ${saleItem}.
Sh th d t ti f b ti• Shorthand notation for bean properties.
– To output the companyName property (i.e., result of the
getCompanyName method) of a scoped variable named company,
$you use ${company.companyName}. To access the firstName
property of the president property of a scoped variable named
company, you use ${company.president.firstName}.
Si l t ll ti l t• Simple access to collection elements.
– To access an element of an array, List, or Map, you use
${variable[indexOrKey]}. Provided that the index or key is in a
form that is legal for Java variable names, the dot notation for beans
is interchangeable with the bracket notation for collections.
12
Advantages of the Expression
Language (Continued)Language (Continued)
• Succinct access to request parameters, cookies,
and other request dataand other request data.
– To access the standard types of request data, you can use one of
several predefined implicit objects.
• A small but useful set of simple operators.A small but useful set of simple operators.
– To manipulate objects within EL expressions, you can use any of
several arithmetic, relational, logical, or empty-testing operators.
• Conditional output.p
– To choose among output options, you do not have to resort to Java
scripting elements. Instead, you can use ${test ? option1 : option2}.
• Automatic type conversion.yp
– The expression language removes the need for most typecasts and
for much of the code that parses strings as numbers.
• Empty values instead of error messages.
– In most cases, missing values or NullPointerExceptions result in
empty strings, not thrown exceptions.
13
© 2010 Marty Hall
Setup
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.14
Activating the Expression
LanguageLanguage
• Available only in servers that support JSP
2 0 or 2 1 (servlets 2 4 or 2 5)2.0 or 2.1 (servlets 2.4 or 2.5)
– E.g., Tomcat 5 or 6, not Tomcat 4
– For a full list of compliant servers, seep ,
http://theserverside.com/reviews/matrix.tss
• You must use the JSP 2.x web.xml file
Download from coreservlets com use one from Tomcat 5– Download from coreservlets.com, use one from Tomcat 5
or 6, or Eclipse/MyEclipse will build one for you
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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 web-app_2_4.xsd"
i "2 4"version="2.4">
…
</web-app>
15
Invoking the Expression
LanguageLanguage
• Basic form: ${expression}
– These EL elements can appear in ordinary text or in JSP
tag attributes, provided that those attributes permit regular
JSP expressions. For example:JSP expressions. For example:
• <UL>
• <LI>Name: ${expression1}
• <LI>Address: ${expression2}• <LI>Address: ${expression2}
• </UL>
• <jsp:include page="${expression3}" />
• The EL in tag attributes
– You can use multiple expressions (possibly intermixed
with static text) and the results are coerced to strings andwith static text) and the results are coerced to strings and
concatenated. For example:
• <jsp:include page="${expr1}blah${expr2}" />16
Rare (but Confusing)
EL ProblemEL Problem
• Scenario
– You use ${something} in a JSP page
– You literally get "${something}" in the output
You realize you forgot to update the web xml file to refer– You realize you forgot to update the web.xml file to refer
to servlets 2.4 (or 2.5), so you do so
– You redeploy your Web app and restart the serverp y y pp
– You still literally get "${something}" in the output
• Why?
– The JSP page was already translated into a servlet
• A servlet that ignored the expression language
• Solution• Solution
– Resave the JSP page to update its modification date
17
Preventing Expression
Language EvaluationLanguage Evaluation
• What if JSP page contains ${ ?
P h b id t h if k t t lib th t l– Perhaps by accident, perhaps if you make a custom tag library that also uses
${...} notation and evaluates it directly (as with first release of JSTL).
• Deactivating the EL in an entire Web application.
U b l fil h f l 2 3 (JSP 1 2) li– Use a web.xml file that refers to servlets 2.3 (JSP 1.2) or earlier.
• Deactivating the expression language in multiple JSP pages.
– Use the jsp-property-group web.xml element
• Deactivating the expression language in individual JSP pages.
– Use <%@ page isELIgnored="true" %>
• Deactivating individual EL statements.Deactivating individual EL statements.
– In JSP 1.2 pages that need to be ported unmodified across multiple JSP
versions (with no web.xml changes), you can replace $ with &#36;, the
HTML character entity for $.y $
– In JSP 2.0 pages that contain both EL statements and literal ${ strings, you
can use ${ when you want ${ in the output
18
Preventing Use of Standard
Scripting ElementsScripting Elements
• To enforce EL-only with no scripting, use
i i i lid i b lscripting-invalid in web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
i h L tixsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
version="2.4">
<jsp-property-group><jsp property group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>/j p p p y g p
</web-app>
19
Downsides to Preventing Use of
Scripting ElementsScripting Elements
• Harder debugging
– <% System.out.println("...."); %>
• No redirects
% dR di (" l f ") %– <% response.sendRedirect("welcome.faces"); %>
• Some techniques hard to do with MVC
<%– <%
if (outputShouldBeExcel()) {
response.setContentType("application/vnd.ms-excel");
}}
%>
• Just because scripting is usually bad doesJust because scripting is usually bad does
not mean it is always bad
20
© 2010 Marty Hall
EL Uses: Scoped vars,p ,
Bean properties,
collectionscollections
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.21
Accessing Scoped Variables
• ${varName}
S h h P C h H S l R h– Searches the PageContext, the HttpServletRequest, the
HttpSession, and the ServletContext, in that order, and
output the object with that attribute name. PageContext
d t l ith MVCdoes not apply with MVC.
– Application: if you just have an error message, you can
store the String directly instead of putting it in a bean and
i h bstoring the bean
• Equivalent forms
– ${name}${name}
– <%= pageContext.findAttribute("name") %>
– <jsp:useBean id="name"
type="somePackage SomeClass"type= somePackage.SomeClass
scope="...">
<%= name %>22
Example: Accessing Scoped
VariablesVariables
public class ScopedVars extends HttpServlet {
public void doGet(HttpServletRequest request,p ( p q q ,
HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("attribute1", "First Value");
HttpSession session request getSession();HttpSession session = request.getSession();
session.setAttribute("attribute2", "Second Value");
ServletContext application = getServletContext();
application.setAttribute("attribute3",
new java.util.Date());
request.setAttribute("repeated", "Request");
session.setAttribute("repeated", "Session");
application setAttribute("repeated" "ServletContext");application.setAttribute( repeated , ServletContext );
RequestDispatcher dispatcher =
request.getRequestDispatcher
("/WEB-INF/results/scoped-vars.jsp");
di t h f d( t )dispatcher.forward(request, response);
}
}
23
Example: Accessing Scoped
Variables (Continued)Variables (Continued)
<!DOCTYPE …>
…
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Accessing Scoped Variables
</TABLE>
<P>
<UL>
<LI><B>attribute1:</B> ${attribute1}
<LI><B>attribute2:</B> ${attribute2}/ ${ }
<LI><B>attribute3:</B> ${attribute3}
<LI><B>Source of "repeated" attribute:</B>
${repeated}${repeated}
</UL>
</BODY></HTML>
24
Example: Accessing Scoped
Variables (Result)Variables (Result)
The url-pattern of the coreservlets.ScopedVars servlet is scoped-vars.
Setting a url-pattern in web.xml will be discussed in the next lecture.
25
Accessing Bean Properties
• ${varName.propertyName}
– Means to find scoped variable of given name and output
the specified bean property
• Equivalent forms• Equivalent forms
– ${customer.firstName}
– <%@ page import="coreservlets.NameBean" %>
<%
NameBean person =NameBean person =
(NameBean)pageContext.findAttribute("customer");
%>
<% tFi tN () %><%= person.getFirstName() %>
26
Accessing Bean Properties
(Continued)(Continued)
• Equivalent forms
– ${customer.firstName}
– <jsp:useBean id="customer"– <jsp:useBean id= customer
type="coreservlets.NameBean"
scope="request, session, or application" />
<j tP t " t "<jsp:getProperty name="customer"
property="firstName" />
• This is better than script on previous slide.This is better than script on previous slide.
– But, requires you to know the scope
– And fails for subproperties.
• No non-Java equivalent to
${customer.address.zipCode}
27
Example: Accessing Bean
PropertiesProperties
public class BeanProperties extends HttpServlet {
public void doGet(HttpServletRequest requestpublic void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
Name name = new Name("Marty" "Hall");Name name = new Name( Marty , Hall );
Company company =
new Company("coreservlets.com",
"Java EE Training and Consulting");Java EE Training and Consulting );
Employee employee =
new Employee(name, company);
request.setAttribute("employee", employee);equest.set tt bute( e p oyee , e p oyee);
RequestDispatcher dispatcher =
request.getRequestDispatcher
("/WEB-INF/results/bean-properties.jsp");( / / / p p j p );
dispatcher.forward(request, response);
}
}28
Example: Accessing Bean
Properties (Continued)Properties (Continued)
public class Employee {
private Name name;
private Company company;
public Employee(Name name, Company company) {
setName(name);
setCompany(company);
}
public Name getName() { return(name); }
public void setName(Name name) {
this.name = name;
}
public CompanyBean getCompany() { return(company); }
public void setCompany(Company company) {p p y( p y p y) {
this.company = company;
}
}
29
Example: Accessing Bean
Properties (Continued)Properties (Continued)
public class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
setFirstName(firstName);
setLastName(lastName);
}
public String getFirstName() {
return (firstName);
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return (lastName);
}}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}30
Example: Accessing Bean
Properties (Continued)Properties (Continued)
public class Company {
private String companyName;
private String business;
public Company(String companyName, String business) {
setCompanyName(companyName);
setBusiness(business);
}
public String getCompanyName() { return(companyName); }
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getBusiness() { return(business); }
public void setBusiness(String business) {p ( g ) {
this.business = business;
}
}
31
Example: Accessing Bean
Properties (Continued)Properties (Continued)
<!DOCTYPE …>
…
<UL>
<LI><B>First Name:</B>
$${employee.name.firstName}
<LI><B>Last Name:</B>
${employee.name.lastName}
<LI><B>Company Name:</B>
${employee.company.companyName}
<LI><B>Company Business:</B>p y /
${employee.company.business}
</UL>
</BODY></HTML></BODY></HTML>
32
Example: Accessing Bean
Properties (Result)Properties (Result)
The url-pattern of the coreservlets.BeanProperties servlet is bean-properties.
Setting a url-pattern in web.xml will be discussed in the next lecture.
33
Equivalence of Dot and Array
NotationsNotations
• Equivalent forms
– ${name.property}
– ${name["property"]}
Reasons for using array notation• Reasons for using array notation
– To access arrays, lists, and other collections
• See upcoming slidesSee upcoming slides
– To calculate the property name at request time.
• {name1[name2]} (no quotes around name2)
T th t ill l J i bl– To use names that are illegal as Java variable names
• {foo["bar-baz"]}
• {foo["bar.baz"]}
34
Accessing Collections
• ${attributeName[entryName]}
• Works for
– Array. Equivalent to
th A [i d ]• theArray[index]
– List. Equivalent to
• theList.get(index)g ( )
– Map. Equivalent to
• theMap.get(keyName)
Equivalent forms (for HashMap)• Equivalent forms (for HashMap)
– ${stateCapitals["maryland"]}
– ${stateCapitals maryland}${stateCapitals.maryland}
– But the following is illegal since 2 is not a legal var name
• ${listVar.2}35
Example: Accessing Collections
public class Collections extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String[] firstNames = { "Bill", "Scott", "Larry" };
List<String> lastNames = new ArrayList<String>();
lastNames.add("Ellison");
lastNames.add("Gates");
lastNames.add("McNealy");
Map<String,String> companyNames =
new HashMap<String,String>();
companyNames.put("Ellison", "Sun");
companyNames.put("Gates", "Oracle");
companyNames.put("McNealy", "Microsoft");p y p y
request.setAttribute("first", firstNames);
request.setAttribute("last", lastNames);
request.setAttribute("company", companyNames);
RequestDispatcher dispatcher =q p p
request.getRequestDispatcher
("/WEB-INF/results/collections.jsp");
dispatcher.forward(request, response);
}36
Example: Accessing Collections
(Continued)(Continued)
<!DOCTYPE …>
…
<BODY>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE"><TR><TH CLASS="TITLE">
Accessing Collections
</TABLE>
<P><P>
<UL>
<LI>${first[0]} ${last[0]} (${company["Ellison"]})
$ 1 $ 1 ($ )<LI>${first[1]} ${last[1]} (${company["Gates"]})
<LI>${first[2]} ${last[2]} (${company["McNealy"]})
</UL>
</BODY></HTML>
37
Example: Accessing
Collections (Result)Collections (Result)
The url-pattern of the coreservlets.Collections servlet is collections.
Setting a url-pattern in web.xml will be discussed in the next lecture.
38
© 2010 Marty Hall
Implicit Objects andImplicit Objects and
Operatorsp
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.39
Referencing Implicit Objects
(Predefined Variable Names)(Predefined Variable Names)
• pageContext. The PageContext object.
E g ${pageContext session id}– E.g. ${pageContext.session.id}
• param and paramValues. Request params.
– E.g. ${param.custID}
• header and headerValues Request headers• header and headerValues. Request headers.
– E.g. ${header.Accept} or ${header["Accept"]}
– ${header["Accept-Encoding"]}
• cookie Cookie object (not cookie value)• cookie. Cookie object (not cookie value).
– E.g. ${cookie.userCookie.value} or
${cookie["userCookie"].value}
• initParam Context initialization param• initParam. Context initialization param.
• pageScope, requestScope, sessionScope,
applicationScope.
Instead of searching scopes– Instead of searching scopes.
• Problem
– Using implicit objects usually works poorly with MVC model40
Example: Implicit Objects
<!DOCTYPE …>
…
<P>
<UL>
/<LI><B>test Request Parameter:</B>
${param.test}
<LI><B>User-Agent Header:</B>
${h d ["U A t"]}${header["User-Agent"]}
<LI><B>JSESSIONID Cookie Value:</B>
${cookie.JSESSIONID.value}
<LI><B>Server:</B>
${pageContext.servletContext.serverInfo}
</UL>
</BODY></HTML>
41
Example: Implicit Objects
(Result)(Result)
42
Expression Language Operators
• Arithmetic
– + - * / div % mod
• Relational
! l l– == eq != ne < lt > gt <= le >= ge
• Logical
&& and || or ! Not– && and || or ! Not
• Empty
– EmptyEmpty
– True for null, empty string, empty array, empty list,
empty map. False otherwise.
• CAUTION
– Use extremely sparingly to preserve MVC model
43
Example: Operators
…
<TABLE BORDER=1 ALIGN="CENTER"><TABLE BORDER 1 ALIGN CENTER >
<TR><TH CLASS="COLORED" COLSPAN=2>Arithmetic Operators
<TH CLASS="COLORED" COLSPAN=2>Relational Operators
<TR><TH>Expression<TH>Result<TH>Expression<TH>Result
<TR ALIGN="CENTER">
<TD>${3+2-1}<TD>${3+2-1}
<TD>${1&lt;2}<TD>${1<2}
<TR ALIGN="CENTER"><TR ALIGN= CENTER >
<TD>${"1"+2}<TD>${"1"+2}
<TD>${"a"&lt;"b"}<TD>${"a"<"b"}
<TR ALIGN="CENTER">
<TD>${1 + 2*3 + 3/4}<TD>${1 + 2*3 + 3/4}
<TD>${2/3 &gt;= 3/2}<TD>${2/3 >= 3/2}
<TR ALIGN="CENTER">
<TD>${3%2}<TD>${3%2}<TD>${3%2}<TD>${3%2}
<TD>${3/4 == 0.75}<TD>${3/4 == 0.75}
…
44
Example: Operators (Result)
45
Evaluating Expressions
ConditionallyConditionally
• ${ test ? expression1 : expression2 }
– Evaluates test and outputs either expression1 or
expression2
• Problems• Problems
– Relatively weak
• c:if and c:choose from JSTL are much better
– Tempts you to put business/processing logic in JSP page.
– Should only be used for presentation logic.
E th id lt ti• Even then, consider alternatives
46
Example: Conditional
ExpressionsExpressions
public class Conditionals extends HttpServlet {
public void doGet(HttpServletRequest requestpublic void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
SalesBean apples =SalesBean apples =
new SalesBean(150.25, -75.25, 22.25, -33.57);
SalesBean oranges =
S l B ( 220 25 49 57 138 25 12 25)new SalesBean(-220.25, -49.57, 138.25, 12.25);
request.setAttribute("apples", apples);
request.setAttribute("oranges", oranges);
RequestDispatcher dispatcher =
request.getRequestDispatcher
("/WEB-INF/results/conditionals.jsp");
dispatcher.forward(request, response);
}
}47
Example: Conditional
Expressions (Continued)Expressions (Continued)
public class SalesBean {
private double q1, q2, q3, q4;p ate doub e q , q , q3, q ;
public SalesBean(double q1Sales,
double q2Sales,
3double q3Sales,
double q4Sales) {
q1 = q1Sales; q2 = q2Sales;
q3 = q3Sales; q4 = q4Sales;q3 = q3Sales; q4 = q4Sales;
}
public double getQ1() { return(q1); }
public double getQ2() { return(q2); }
public double getQ3() { return(q3); }
public double getQ4() { return(q4); }
public double getTotal() {public double getTotal() {
return(q1 + q2 + q3 + q4); }
}
48
Example: Conditional
Expressions (Continued)Expressions (Continued)
…
<TABLE BORDER=1 ALIGN="CENTER">
<TR><TH>
<TH CLASS="COLORED">Apples
<TH CLASS="COLORED">Oranges
<TR><TH CLASS="COLORED">First Quarter<TR><TH CLASS="COLORED">First Quarter
<TD ALIGN="RIGHT">${apples.q1}
<TD ALIGN="RIGHT">${oranges.q1}
<TR><TH CLASS="COLORED">Second Quarter
<TD ALIGN="RIGHT">${apples.q2}
<TD ALIGN="RIGHT">${oranges.q2}
…
<TR><TH CLASS="COLORED">Total<TR><TH CLASS= COLORED >Total
<TD ALIGN="RIGHT"
BGCOLOR="${(apples.total < 0) ? "RED" : "WHITE" }">
${apples.total}
<TD ALIGN="RIGHT"
BGCOLOR="${(oranges.total < 0) ? "RED" : "WHITE" }">
${oranges.total}
</TABLE>…49
Example: Conditional
Expressions (Result)Expressions (Result)
50
The url-pattern of the coreservlets.Conditionals servlet is conditionals.
Setting a url-pattern in web.xml will be discussed in the next lecture.
© 2010 Marty Hall
Redoing MVC ExamplesRedoing MVC Examples
in JSP 2
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.51
Request-Based Sharing: JSP 1.2
…
<BODY><BODY>
<jsp:useBean id="randomNum"
type="coreservlets.NumberBean"
scope="request" />scope= request />
<H2>Random Number:
<jsp:getProperty name="randomNum"
property="number" />property number />
</H2>
</BODY></HTML>
52
Request-Based Sharing: JSP 2.x
…
<BODY><BODY>
<H2>Random Number:
${randomNum.number}
</H2></H2>
</BODY></HTML>
53
Session-Based Sharing: JSP 1.2
…
<BODY><BODY>
<H1>Thanks for Registering</H1>
<jsp:useBean id="nameBean"
type="coreservlets NameBean"type= coreservlets.NameBean
scope="session" />
<H2>First Name:
<jsp:getProperty name="nameBean"<jsp:getProperty name nameBean
property="firstName" /></H2>
<H2>Last Name:
<jsp:getProperty name="nameBean"jsp:get ope ty a e a e ea
property="lastName" /></H2>
</BODY></HTML>
54
Session-Based Sharing: JSP 2.x
…
<BODY><BODY>
<H1>Thanks for Registering</H1>
<H2>First Name:
${nameBean firstName}</H2>${nameBean.firstName}</H2>
<H2>Last Name:
${nameBean.lastName}</H2>
</BODY></HTML></BODY></HTML>
55
ServletContext-Based Sharing:
JSP 1 2JSP 1.2
…
<BODY><BODY>
<H1>A Prime Number</H1>
<jsp:useBean id="primeBean"
type="coreservlets PrimeBean"type= coreservlets.PrimeBean
scope="application" />
<jsp:getProperty name="primeBean"
property="prime" />property prime />
</BODY></HTML>
56
ServletContext-Based Sharing:
JSP 2 xJSP 2.x
…
<BODY><BODY>
<H1>A Prime Number</H1>
${primeBean.prime}
</BODY></HTML></BODY></HTML>
57
Summary
• The JSP 2 EL provides concise,The JSP 2 EL provides concise,
easy-to-read access to
– Scoped variables
– Bean properties
– Collection elements
Standard HTTP elements such as request parameters– Standard HTTP elements such as request parameters,
request headers, and cookies
• The JSP 2 EL works best with MVC
– Use only to output values created by separate Java code
• Resist use of EL for business logic
– Use EL operators and conditionals sparingly, if at all
58
© 2010 Marty Hall
Questions?
Customized Java EE Training: http://courses.coreservlets.com/
Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6.
Developed and taught by well-known author and developer. At public venues or onsite at your location.59

Más contenido relacionado

La actualidad más candente

J2EE - Practical Overview
J2EE - Practical OverviewJ2EE - Practical Overview
J2EE - Practical Overview
Svetlin Nakov
 
Introduction to JSP
Introduction to JSPIntroduction to JSP
Introduction to JSP
Fulvio Corno
 

La actualidad más candente (20)

J2EE - Practical Overview
J2EE - Practical OverviewJ2EE - Practical Overview
J2EE - Practical Overview
 
JSP
JSPJSP
JSP
 
Introduction to JSP
Introduction to JSPIntroduction to JSP
Introduction to JSP
 
Java Server Faces (JSF) - Basics
Java Server Faces (JSF) - BasicsJava Server Faces (JSF) - Basics
Java Server Faces (JSF) - Basics
 
Jsp sasidhar
Jsp sasidharJsp sasidhar
Jsp sasidhar
 
10 jsp-scripting-elements
10 jsp-scripting-elements10 jsp-scripting-elements
10 jsp-scripting-elements
 
Introduction to the Servlet / JSP course
Introduction to the Servlet / JSP course Introduction to the Servlet / JSP course
Introduction to the Servlet / JSP course
 
Web Applications and Deployment
Web Applications and DeploymentWeb Applications and Deployment
Web Applications and Deployment
 
JSP Directives
JSP DirectivesJSP Directives
JSP Directives
 
Java Web Programming [3/9] : Servlet Advanced
Java Web Programming [3/9] : Servlet AdvancedJava Web Programming [3/9] : Servlet Advanced
Java Web Programming [3/9] : Servlet Advanced
 
Unified Expression Language
Unified Expression LanguageUnified Expression Language
Unified Expression Language
 
JSP - Java Server Page
JSP - Java Server PageJSP - Java Server Page
JSP - Java Server Page
 
Boston 2011 OTN Developer Days - Java EE 6
Boston 2011 OTN Developer Days - Java EE 6Boston 2011 OTN Developer Days - Java EE 6
Boston 2011 OTN Developer Days - Java EE 6
 
Java server pages
Java server pagesJava server pages
Java server pages
 
working with PHP & DB's
working with PHP & DB'sworking with PHP & DB's
working with PHP & DB's
 
Component Framework Primer for JSF Users
Component Framework Primer for JSF UsersComponent Framework Primer for JSF Users
Component Framework Primer for JSF Users
 
Java Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom TagsJava Web Programming [5/9] : EL, JSTL and Custom Tags
Java Web Programming [5/9] : EL, JSTL and Custom Tags
 
Jsf2 composite-components
Jsf2 composite-componentsJsf2 composite-components
Jsf2 composite-components
 
Jsp Slides
Jsp SlidesJsp Slides
Jsp Slides
 
Jsp element
Jsp elementJsp element
Jsp element
 

Destacado (18)

Linea Viso-Corpo "Naturale" by Delta BkB
Linea Viso-Corpo "Naturale" by Delta BkBLinea Viso-Corpo "Naturale" by Delta BkB
Linea Viso-Corpo "Naturale" by Delta BkB
 
02 servlet-basics
02 servlet-basics02 servlet-basics
02 servlet-basics
 
11 page-directive
11 page-directive11 page-directive
11 page-directive
 
Digital Engagement for CSPs
Digital Engagement for CSPsDigital Engagement for CSPs
Digital Engagement for CSPs
 
08 session-tracking
08 session-tracking08 session-tracking
08 session-tracking
 
13 java beans
13 java beans13 java beans
13 java beans
 
01 overview-and-setup
01 overview-and-setup01 overview-and-setup
01 overview-and-setup
 
01 web-apps
01 web-apps01 web-apps
01 web-apps
 
The Change! Tool
The Change! ToolThe Change! Tool
The Change! Tool
 
05 status-codes
05 status-codes05 status-codes
05 status-codes
 
07 cookies
07 cookies07 cookies
07 cookies
 
03 form-data
03 form-data03 form-data
03 form-data
 
ICT observatories for better governance
ICT observatories for better governanceICT observatories for better governance
ICT observatories for better governance
 
10 jdbc
10 jdbc10 jdbc
10 jdbc
 
04 request-headers
04 request-headers04 request-headers
04 request-headers
 
06 response-headers
06 response-headers06 response-headers
06 response-headers
 
10 jdbc
10 jdbc10 jdbc
10 jdbc
 
08 session-tracking
08 session-tracking08 session-tracking
08 session-tracking
 

Similar a 15 expression-language

Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268
Ramamohan Chokkam
 
Struts 2-overview2
Struts 2-overview2Struts 2-overview2
Struts 2-overview2
divzi1913
 
Jeetrainers.com coursejspservlets00
Jeetrainers.com coursejspservlets00Jeetrainers.com coursejspservlets00
Jeetrainers.com coursejspservlets00
Rajesh Moorjani
 
Struts 2-overview2
Struts 2-overview2Struts 2-overview2
Struts 2-overview2
Long Nguyen
 

Similar a 15 expression-language (20)

20jsp
20jsp20jsp
20jsp
 
Ajax basics
Ajax basicsAjax basics
Ajax basics
 
Jsf2 overview
Jsf2 overviewJsf2 overview
Jsf2 overview
 
Jsf2 overview
Jsf2 overviewJsf2 overview
Jsf2 overview
 
Spatial approximate string search Doc
Spatial approximate string search DocSpatial approximate string search Doc
Spatial approximate string search Doc
 
Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268
 
JSP.pptx
JSP.pptxJSP.pptx
JSP.pptx
 
Struts 2-overview2
Struts 2-overview2Struts 2-overview2
Struts 2-overview2
 
Jsp
JspJsp
Jsp
 
Mvc15 (1)
Mvc15 (1)Mvc15 (1)
Mvc15 (1)
 
JAVA SERVER PAGES
JAVA SERVER PAGESJAVA SERVER PAGES
JAVA SERVER PAGES
 
JavaScript-Core
JavaScript-CoreJavaScript-Core
JavaScript-Core
 
JavaScript-Core
JavaScript-CoreJavaScript-Core
JavaScript-Core
 
Jsp Comparison
 Jsp Comparison Jsp Comparison
Jsp Comparison
 
Jeetrainers.com coursejspservlets00
Jeetrainers.com coursejspservlets00Jeetrainers.com coursejspservlets00
Jeetrainers.com coursejspservlets00
 
Coursejspservlets00
Coursejspservlets00Coursejspservlets00
Coursejspservlets00
 
J2 Ee Overview
J2 Ee OverviewJ2 Ee Overview
J2 Ee Overview
 
Struts 2-overview2
Struts 2-overview2Struts 2-overview2
Struts 2-overview2
 
JavaScript, often abbreviated as JS, is a programming language and core techn...
JavaScript, often abbreviated as JS, is a programming language and core techn...JavaScript, often abbreviated as JS, is a programming language and core techn...
JavaScript, often abbreviated as JS, is a programming language and core techn...
 
C:\fakepath\jsp01
C:\fakepath\jsp01C:\fakepath\jsp01
C:\fakepath\jsp01
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 

15 expression-language

  • 1. © 2010 Marty Hall Simplifying Access to Java Code: The JSP 2 Expression LanguageExpression Language Originals of Slides and Source Code for Examples: http://courses.coreservlets.com/Course-Materials/csajsp2.html Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.2 © 2010 Marty Hall For live Java EE training, please see training courses at http://courses.coreservlets.com/.at http://courses.coreservlets.com/. Servlets, JSP, Struts, JSF 1.x, JSF 2.0, Ajax (with jQuery, Dojo, Prototype, Ext-JS, Google Closure, etc.), GWT 2.0 (with GXT), Java 5, Java 6, SOAP-based and RESTful Web Services, Spring,g Hibernate/JPA, and customized combinations of topics. Taught by the author of Core Servlets and JSP, More Servlets and JSP and this tutorial Available at public Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location. Servlets and JSP, and this tutorial. Available at public venues, or customized versions can be held on-site at your organization. Contact hall@coreservlets.com for details.
  • 2. Agenda • Motivating use of the expression language • Understanding the basic syntax • Understanding the relationship of the i l t th MVCexpression language to the MVC architecture • Referencing scoped variables• Referencing scoped variables • Accessing bean properties, array elements, List elements and Map entriesList elements, and Map entries • Using expression language operators • Evaluating expressions conditionallyEvaluating expressions conditionally 4 © 2010 Marty Hall EL Motivation: Simplifying MVC Output PagesPages Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.5
  • 3. Servlets and JSP: Possibilities for Handling a Single Requestfor Handling a Single Request • Servlet only. Works well when: O i bi E i– Output is a binary type. E.g.: an image – There is no output. E.g.: you are doing forwarding or redirection as in Search Engine example. – Format/layout of page is highly variable. E.g.: portal. • JSP only. Works well when: – Output is mostly character data. E.g.: HTMLp y g – Format/layout mostly fixed. • Combination (MVC architecture). Needed when: A i l t ill lt i lti l b t ti ll diff t– A single request will result in multiple substantially different- looking results. – You have a large development team with different team members doing the Web development and the business logicdoing the Web development and the business logic. – You perform complicated data processing, but have a relatively fixed layout. 6 Implementing MVC with RequestDispatcherRequestDispatcher 1. Define beans to represent result data – Ordinary Java classes with at least one getBlah method 2. Use a servlet to handle requests S l d h k f i i– Servlet reads request parameters, checks for missing and malformed data, calls business logic, etc. 3. Obtain bean instances3. Obtain bean instances – The servlet invokes business logic (application-specific code) or data-access code to obtain the results. 4. Store the bean in the request, session, or servlet context Th l t ll tAtt ib t th t i– The servlet calls setAttribute on the request, session, or servlet context objects to store a reference to the beans that represent the results of the request.7
  • 4. Implementing MVC with RequestDispatcher (Continued)RequestDispatcher (Continued) 5. Forward the request to a JSP page. – The servlet determines which JSP page is appropriate to the situation and uses the forward method of RequestDispatcher to transfer control to that page.RequestDispatcher to transfer control to that page. 6. Extract the data from the beans. – The JSP page accesses beans with jsp:useBean and ap g j p scope matching the location of step 4. The page then uses jsp:getProperty to output the bean properties. The JSP page does not create or modify the bean; it– The JSP page does not create or modify the bean; it merely extracts and displays data that the servlet created. 8 Drawback of MVC • Main drawback is the final step: presenting h l i h JSPthe results in the JSP page. – jsp:useBean and jsp:getProperty • Clumsy and verbose• Clumsy and verbose • Cannot access bean subproperties – JSP scripting elements • Result in hard-to-maintain code • Defeat the whole purpose behind MVC. • GoalGoal – More concise, succinct, and readable syntax • Accessible to Web developers – Ability to access subproperties – Ability to access collections 9
  • 5. Main Point of EL for New MVC AppsApps • Bean – public String getFirstName(…) { … } • Servlet C C C U il fi dC ( )– Customer someCust = CustomerUtils.findCust(…); – Request.setAttribute("customer", someCust); – (Use RequestDispatcher forward to go to JSP page)(Use RequestDispatcher.forward to go to JSP page) • JSP – <h1>First name is ${customer.firstName}</h1>{ } • If this is all you ever know about the Expression Language, you are still in pretty good shape10 Main Point of EL for MVC Apps that are Upgrading from JSP 1 2are Upgrading from JSP 1.2 • When in JSP 2.x-compliant server with b l i hcurrent web.xml version, change: <jsp:useBean id="someName" type="somePackage someClass"type somePackage.someClass scope="request, session, or application"/> <jsp:getProperty name="someName" /property="someProperty"/> • To:• To: ${someName.someProperty} • Bean, servlet, business logic – Remain exactly the same as before11
  • 6. Advantages of the Expression LanguageLanguage • Concise access to stored objects. T “ d i bl ” ( bj d i h A ib i h– To output a “scoped variable” (object stored with setAttribute in the PageContext, HttpServletRequest, HttpSession, or ServletContext) named saleItem, you use ${saleItem}. Sh th d t ti f b ti• Shorthand notation for bean properties. – To output the companyName property (i.e., result of the getCompanyName method) of a scoped variable named company, $you use ${company.companyName}. To access the firstName property of the president property of a scoped variable named company, you use ${company.president.firstName}. Si l t ll ti l t• Simple access to collection elements. – To access an element of an array, List, or Map, you use ${variable[indexOrKey]}. Provided that the index or key is in a form that is legal for Java variable names, the dot notation for beans is interchangeable with the bracket notation for collections. 12 Advantages of the Expression Language (Continued)Language (Continued) • Succinct access to request parameters, cookies, and other request dataand other request data. – To access the standard types of request data, you can use one of several predefined implicit objects. • A small but useful set of simple operators.A small but useful set of simple operators. – To manipulate objects within EL expressions, you can use any of several arithmetic, relational, logical, or empty-testing operators. • Conditional output.p – To choose among output options, you do not have to resort to Java scripting elements. Instead, you can use ${test ? option1 : option2}. • Automatic type conversion.yp – The expression language removes the need for most typecasts and for much of the code that parses strings as numbers. • Empty values instead of error messages. – In most cases, missing values or NullPointerExceptions result in empty strings, not thrown exceptions. 13
  • 7. © 2010 Marty Hall Setup Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.14 Activating the Expression LanguageLanguage • Available only in servers that support JSP 2 0 or 2 1 (servlets 2 4 or 2 5)2.0 or 2.1 (servlets 2.4 or 2.5) – E.g., Tomcat 5 or 6, not Tomcat 4 – For a full list of compliant servers, seep , http://theserverside.com/reviews/matrix.tss • You must use the JSP 2.x web.xml file Download from coreservlets com use one from Tomcat 5– Download from coreservlets.com, use one from Tomcat 5 or 6, or Eclipse/MyEclipse will build one for you <?xml version="1.0" encoding="ISO-8859-1"?> <web-app 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 web-app_2_4.xsd" i "2 4"version="2.4"> … </web-app> 15
  • 8. Invoking the Expression LanguageLanguage • Basic form: ${expression} – These EL elements can appear in ordinary text or in JSP tag attributes, provided that those attributes permit regular JSP expressions. For example:JSP expressions. For example: • <UL> • <LI>Name: ${expression1} • <LI>Address: ${expression2}• <LI>Address: ${expression2} • </UL> • <jsp:include page="${expression3}" /> • The EL in tag attributes – You can use multiple expressions (possibly intermixed with static text) and the results are coerced to strings andwith static text) and the results are coerced to strings and concatenated. For example: • <jsp:include page="${expr1}blah${expr2}" />16 Rare (but Confusing) EL ProblemEL Problem • Scenario – You use ${something} in a JSP page – You literally get "${something}" in the output You realize you forgot to update the web xml file to refer– You realize you forgot to update the web.xml file to refer to servlets 2.4 (or 2.5), so you do so – You redeploy your Web app and restart the serverp y y pp – You still literally get "${something}" in the output • Why? – The JSP page was already translated into a servlet • A servlet that ignored the expression language • Solution• Solution – Resave the JSP page to update its modification date 17
  • 9. Preventing Expression Language EvaluationLanguage Evaluation • What if JSP page contains ${ ? P h b id t h if k t t lib th t l– Perhaps by accident, perhaps if you make a custom tag library that also uses ${...} notation and evaluates it directly (as with first release of JSTL). • Deactivating the EL in an entire Web application. U b l fil h f l 2 3 (JSP 1 2) li– Use a web.xml file that refers to servlets 2.3 (JSP 1.2) or earlier. • Deactivating the expression language in multiple JSP pages. – Use the jsp-property-group web.xml element • Deactivating the expression language in individual JSP pages. – Use <%@ page isELIgnored="true" %> • Deactivating individual EL statements.Deactivating individual EL statements. – In JSP 1.2 pages that need to be ported unmodified across multiple JSP versions (with no web.xml changes), you can replace $ with &#36;, the HTML character entity for $.y $ – In JSP 2.0 pages that contain both EL statements and literal ${ strings, you can use ${ when you want ${ in the output 18 Preventing Use of Standard Scripting ElementsScripting Elements • To enforce EL-only with no scripting, use i i i lid i b lscripting-invalid in web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" i h L tixsi:schemaLocation= "http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd" version="2.4"> <jsp-property-group><jsp property group> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> </jsp-property-group>/j p p p y g p </web-app> 19
  • 10. Downsides to Preventing Use of Scripting ElementsScripting Elements • Harder debugging – <% System.out.println("...."); %> • No redirects % dR di (" l f ") %– <% response.sendRedirect("welcome.faces"); %> • Some techniques hard to do with MVC <%– <% if (outputShouldBeExcel()) { response.setContentType("application/vnd.ms-excel"); }} %> • Just because scripting is usually bad doesJust because scripting is usually bad does not mean it is always bad 20 © 2010 Marty Hall EL Uses: Scoped vars,p , Bean properties, collectionscollections Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.21
  • 11. Accessing Scoped Variables • ${varName} S h h P C h H S l R h– Searches the PageContext, the HttpServletRequest, the HttpSession, and the ServletContext, in that order, and output the object with that attribute name. PageContext d t l ith MVCdoes not apply with MVC. – Application: if you just have an error message, you can store the String directly instead of putting it in a bean and i h bstoring the bean • Equivalent forms – ${name}${name} – <%= pageContext.findAttribute("name") %> – <jsp:useBean id="name" type="somePackage SomeClass"type= somePackage.SomeClass scope="..."> <%= name %>22 Example: Accessing Scoped VariablesVariables public class ScopedVars extends HttpServlet { public void doGet(HttpServletRequest request,p ( p q q , HttpServletResponse response) throws ServletException, IOException { request.setAttribute("attribute1", "First Value"); HttpSession session request getSession();HttpSession session = request.getSession(); session.setAttribute("attribute2", "Second Value"); ServletContext application = getServletContext(); application.setAttribute("attribute3", new java.util.Date()); request.setAttribute("repeated", "Request"); session.setAttribute("repeated", "Session"); application setAttribute("repeated" "ServletContext");application.setAttribute( repeated , ServletContext ); RequestDispatcher dispatcher = request.getRequestDispatcher ("/WEB-INF/results/scoped-vars.jsp"); di t h f d( t )dispatcher.forward(request, response); } } 23
  • 12. Example: Accessing Scoped Variables (Continued)Variables (Continued) <!DOCTYPE …> … <TABLE BORDER=5 ALIGN="CENTER"> <TR><TH CLASS="TITLE"> Accessing Scoped Variables </TABLE> <P> <UL> <LI><B>attribute1:</B> ${attribute1} <LI><B>attribute2:</B> ${attribute2}/ ${ } <LI><B>attribute3:</B> ${attribute3} <LI><B>Source of "repeated" attribute:</B> ${repeated}${repeated} </UL> </BODY></HTML> 24 Example: Accessing Scoped Variables (Result)Variables (Result) The url-pattern of the coreservlets.ScopedVars servlet is scoped-vars. Setting a url-pattern in web.xml will be discussed in the next lecture. 25
  • 13. Accessing Bean Properties • ${varName.propertyName} – Means to find scoped variable of given name and output the specified bean property • Equivalent forms• Equivalent forms – ${customer.firstName} – <%@ page import="coreservlets.NameBean" %> <% NameBean person =NameBean person = (NameBean)pageContext.findAttribute("customer"); %> <% tFi tN () %><%= person.getFirstName() %> 26 Accessing Bean Properties (Continued)(Continued) • Equivalent forms – ${customer.firstName} – <jsp:useBean id="customer"– <jsp:useBean id= customer type="coreservlets.NameBean" scope="request, session, or application" /> <j tP t " t "<jsp:getProperty name="customer" property="firstName" /> • This is better than script on previous slide.This is better than script on previous slide. – But, requires you to know the scope – And fails for subproperties. • No non-Java equivalent to ${customer.address.zipCode} 27
  • 14. Example: Accessing Bean PropertiesProperties public class BeanProperties extends HttpServlet { public void doGet(HttpServletRequest requestpublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Name name = new Name("Marty" "Hall");Name name = new Name( Marty , Hall ); Company company = new Company("coreservlets.com", "Java EE Training and Consulting");Java EE Training and Consulting ); Employee employee = new Employee(name, company); request.setAttribute("employee", employee);equest.set tt bute( e p oyee , e p oyee); RequestDispatcher dispatcher = request.getRequestDispatcher ("/WEB-INF/results/bean-properties.jsp");( / / / p p j p ); dispatcher.forward(request, response); } }28 Example: Accessing Bean Properties (Continued)Properties (Continued) public class Employee { private Name name; private Company company; public Employee(Name name, Company company) { setName(name); setCompany(company); } public Name getName() { return(name); } public void setName(Name name) { this.name = name; } public CompanyBean getCompany() { return(company); } public void setCompany(Company company) {p p y( p y p y) { this.company = company; } } 29
  • 15. Example: Accessing Bean Properties (Continued)Properties (Continued) public class Name { private String firstName; private String lastName; public Name(String firstName, String lastName) { setFirstName(firstName); setLastName(lastName); } public String getFirstName() { return (firstName); } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return (lastName); }} public void setLastName(String lastName) { this.lastName = lastName; } }30 Example: Accessing Bean Properties (Continued)Properties (Continued) public class Company { private String companyName; private String business; public Company(String companyName, String business) { setCompanyName(companyName); setBusiness(business); } public String getCompanyName() { return(companyName); } public void setCompanyName(String companyName) { this.companyName = companyName; } public String getBusiness() { return(business); } public void setBusiness(String business) {p ( g ) { this.business = business; } } 31
  • 16. Example: Accessing Bean Properties (Continued)Properties (Continued) <!DOCTYPE …> … <UL> <LI><B>First Name:</B> $${employee.name.firstName} <LI><B>Last Name:</B> ${employee.name.lastName} <LI><B>Company Name:</B> ${employee.company.companyName} <LI><B>Company Business:</B>p y / ${employee.company.business} </UL> </BODY></HTML></BODY></HTML> 32 Example: Accessing Bean Properties (Result)Properties (Result) The url-pattern of the coreservlets.BeanProperties servlet is bean-properties. Setting a url-pattern in web.xml will be discussed in the next lecture. 33
  • 17. Equivalence of Dot and Array NotationsNotations • Equivalent forms – ${name.property} – ${name["property"]} Reasons for using array notation• Reasons for using array notation – To access arrays, lists, and other collections • See upcoming slidesSee upcoming slides – To calculate the property name at request time. • {name1[name2]} (no quotes around name2) T th t ill l J i bl– To use names that are illegal as Java variable names • {foo["bar-baz"]} • {foo["bar.baz"]} 34 Accessing Collections • ${attributeName[entryName]} • Works for – Array. Equivalent to th A [i d ]• theArray[index] – List. Equivalent to • theList.get(index)g ( ) – Map. Equivalent to • theMap.get(keyName) Equivalent forms (for HashMap)• Equivalent forms (for HashMap) – ${stateCapitals["maryland"]} – ${stateCapitals maryland}${stateCapitals.maryland} – But the following is illegal since 2 is not a legal var name • ${listVar.2}35
  • 18. Example: Accessing Collections public class Collections extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] firstNames = { "Bill", "Scott", "Larry" }; List<String> lastNames = new ArrayList<String>(); lastNames.add("Ellison"); lastNames.add("Gates"); lastNames.add("McNealy"); Map<String,String> companyNames = new HashMap<String,String>(); companyNames.put("Ellison", "Sun"); companyNames.put("Gates", "Oracle"); companyNames.put("McNealy", "Microsoft");p y p y request.setAttribute("first", firstNames); request.setAttribute("last", lastNames); request.setAttribute("company", companyNames); RequestDispatcher dispatcher =q p p request.getRequestDispatcher ("/WEB-INF/results/collections.jsp"); dispatcher.forward(request, response); }36 Example: Accessing Collections (Continued)(Continued) <!DOCTYPE …> … <BODY> <TABLE BORDER=5 ALIGN="CENTER"> <TR><TH CLASS="TITLE"><TR><TH CLASS="TITLE"> Accessing Collections </TABLE> <P><P> <UL> <LI>${first[0]} ${last[0]} (${company["Ellison"]}) $ 1 $ 1 ($ )<LI>${first[1]} ${last[1]} (${company["Gates"]}) <LI>${first[2]} ${last[2]} (${company["McNealy"]}) </UL> </BODY></HTML> 37
  • 19. Example: Accessing Collections (Result)Collections (Result) The url-pattern of the coreservlets.Collections servlet is collections. Setting a url-pattern in web.xml will be discussed in the next lecture. 38 © 2010 Marty Hall Implicit Objects andImplicit Objects and Operatorsp Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.39
  • 20. Referencing Implicit Objects (Predefined Variable Names)(Predefined Variable Names) • pageContext. The PageContext object. E g ${pageContext session id}– E.g. ${pageContext.session.id} • param and paramValues. Request params. – E.g. ${param.custID} • header and headerValues Request headers• header and headerValues. Request headers. – E.g. ${header.Accept} or ${header["Accept"]} – ${header["Accept-Encoding"]} • cookie Cookie object (not cookie value)• cookie. Cookie object (not cookie value). – E.g. ${cookie.userCookie.value} or ${cookie["userCookie"].value} • initParam Context initialization param• initParam. Context initialization param. • pageScope, requestScope, sessionScope, applicationScope. Instead of searching scopes– Instead of searching scopes. • Problem – Using implicit objects usually works poorly with MVC model40 Example: Implicit Objects <!DOCTYPE …> … <P> <UL> /<LI><B>test Request Parameter:</B> ${param.test} <LI><B>User-Agent Header:</B> ${h d ["U A t"]}${header["User-Agent"]} <LI><B>JSESSIONID Cookie Value:</B> ${cookie.JSESSIONID.value} <LI><B>Server:</B> ${pageContext.servletContext.serverInfo} </UL> </BODY></HTML> 41
  • 21. Example: Implicit Objects (Result)(Result) 42 Expression Language Operators • Arithmetic – + - * / div % mod • Relational ! l l– == eq != ne < lt > gt <= le >= ge • Logical && and || or ! Not– && and || or ! Not • Empty – EmptyEmpty – True for null, empty string, empty array, empty list, empty map. False otherwise. • CAUTION – Use extremely sparingly to preserve MVC model 43
  • 22. Example: Operators … <TABLE BORDER=1 ALIGN="CENTER"><TABLE BORDER 1 ALIGN CENTER > <TR><TH CLASS="COLORED" COLSPAN=2>Arithmetic Operators <TH CLASS="COLORED" COLSPAN=2>Relational Operators <TR><TH>Expression<TH>Result<TH>Expression<TH>Result <TR ALIGN="CENTER"> <TD>${3+2-1}<TD>${3+2-1} <TD>${1&lt;2}<TD>${1<2} <TR ALIGN="CENTER"><TR ALIGN= CENTER > <TD>${"1"+2}<TD>${"1"+2} <TD>${"a"&lt;"b"}<TD>${"a"<"b"} <TR ALIGN="CENTER"> <TD>${1 + 2*3 + 3/4}<TD>${1 + 2*3 + 3/4} <TD>${2/3 &gt;= 3/2}<TD>${2/3 >= 3/2} <TR ALIGN="CENTER"> <TD>${3%2}<TD>${3%2}<TD>${3%2}<TD>${3%2} <TD>${3/4 == 0.75}<TD>${3/4 == 0.75} … 44 Example: Operators (Result) 45
  • 23. Evaluating Expressions ConditionallyConditionally • ${ test ? expression1 : expression2 } – Evaluates test and outputs either expression1 or expression2 • Problems• Problems – Relatively weak • c:if and c:choose from JSTL are much better – Tempts you to put business/processing logic in JSP page. – Should only be used for presentation logic. E th id lt ti• Even then, consider alternatives 46 Example: Conditional ExpressionsExpressions public class Conditionals extends HttpServlet { public void doGet(HttpServletRequest requestpublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { SalesBean apples =SalesBean apples = new SalesBean(150.25, -75.25, 22.25, -33.57); SalesBean oranges = S l B ( 220 25 49 57 138 25 12 25)new SalesBean(-220.25, -49.57, 138.25, 12.25); request.setAttribute("apples", apples); request.setAttribute("oranges", oranges); RequestDispatcher dispatcher = request.getRequestDispatcher ("/WEB-INF/results/conditionals.jsp"); dispatcher.forward(request, response); } }47
  • 24. Example: Conditional Expressions (Continued)Expressions (Continued) public class SalesBean { private double q1, q2, q3, q4;p ate doub e q , q , q3, q ; public SalesBean(double q1Sales, double q2Sales, 3double q3Sales, double q4Sales) { q1 = q1Sales; q2 = q2Sales; q3 = q3Sales; q4 = q4Sales;q3 = q3Sales; q4 = q4Sales; } public double getQ1() { return(q1); } public double getQ2() { return(q2); } public double getQ3() { return(q3); } public double getQ4() { return(q4); } public double getTotal() {public double getTotal() { return(q1 + q2 + q3 + q4); } } 48 Example: Conditional Expressions (Continued)Expressions (Continued) … <TABLE BORDER=1 ALIGN="CENTER"> <TR><TH> <TH CLASS="COLORED">Apples <TH CLASS="COLORED">Oranges <TR><TH CLASS="COLORED">First Quarter<TR><TH CLASS="COLORED">First Quarter <TD ALIGN="RIGHT">${apples.q1} <TD ALIGN="RIGHT">${oranges.q1} <TR><TH CLASS="COLORED">Second Quarter <TD ALIGN="RIGHT">${apples.q2} <TD ALIGN="RIGHT">${oranges.q2} … <TR><TH CLASS="COLORED">Total<TR><TH CLASS= COLORED >Total <TD ALIGN="RIGHT" BGCOLOR="${(apples.total < 0) ? "RED" : "WHITE" }"> ${apples.total} <TD ALIGN="RIGHT" BGCOLOR="${(oranges.total < 0) ? "RED" : "WHITE" }"> ${oranges.total} </TABLE>…49
  • 25. Example: Conditional Expressions (Result)Expressions (Result) 50 The url-pattern of the coreservlets.Conditionals servlet is conditionals. Setting a url-pattern in web.xml will be discussed in the next lecture. © 2010 Marty Hall Redoing MVC ExamplesRedoing MVC Examples in JSP 2 Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.51
  • 26. Request-Based Sharing: JSP 1.2 … <BODY><BODY> <jsp:useBean id="randomNum" type="coreservlets.NumberBean" scope="request" />scope= request /> <H2>Random Number: <jsp:getProperty name="randomNum" property="number" />property number /> </H2> </BODY></HTML> 52 Request-Based Sharing: JSP 2.x … <BODY><BODY> <H2>Random Number: ${randomNum.number} </H2></H2> </BODY></HTML> 53
  • 27. Session-Based Sharing: JSP 1.2 … <BODY><BODY> <H1>Thanks for Registering</H1> <jsp:useBean id="nameBean" type="coreservlets NameBean"type= coreservlets.NameBean scope="session" /> <H2>First Name: <jsp:getProperty name="nameBean"<jsp:getProperty name nameBean property="firstName" /></H2> <H2>Last Name: <jsp:getProperty name="nameBean"jsp:get ope ty a e a e ea property="lastName" /></H2> </BODY></HTML> 54 Session-Based Sharing: JSP 2.x … <BODY><BODY> <H1>Thanks for Registering</H1> <H2>First Name: ${nameBean firstName}</H2>${nameBean.firstName}</H2> <H2>Last Name: ${nameBean.lastName}</H2> </BODY></HTML></BODY></HTML> 55
  • 28. ServletContext-Based Sharing: JSP 1 2JSP 1.2 … <BODY><BODY> <H1>A Prime Number</H1> <jsp:useBean id="primeBean" type="coreservlets PrimeBean"type= coreservlets.PrimeBean scope="application" /> <jsp:getProperty name="primeBean" property="prime" />property prime /> </BODY></HTML> 56 ServletContext-Based Sharing: JSP 2 xJSP 2.x … <BODY><BODY> <H1>A Prime Number</H1> ${primeBean.prime} </BODY></HTML></BODY></HTML> 57
  • 29. Summary • The JSP 2 EL provides concise,The JSP 2 EL provides concise, easy-to-read access to – Scoped variables – Bean properties – Collection elements Standard HTTP elements such as request parameters– Standard HTTP elements such as request parameters, request headers, and cookies • The JSP 2 EL works best with MVC – Use only to output values created by separate Java code • Resist use of EL for business logic – Use EL operators and conditionals sparingly, if at all 58 © 2010 Marty Hall Questions? Customized Java EE Training: http://courses.coreservlets.com/ Servlets, JSP, JSF 2.0, Struts, Ajax, GWT 2.0, Spring, Hibernate, SOAP & RESTful Web Services, Java 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.59