Download - JSPs Lecture 8
![Page 1: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/1.jpg)
JSPsJSPsLecture 8Lecture 8
cs193i – Internet cs193i – Internet TechnologiesTechnologies
Summer 2004Summer 2004
Stanford UniversityStanford University
![Page 2: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/2.jpg)
Administrative StuffAdministrative Stuff
HW#3 due todayHW#3 due today HW#4 due August 11HW#4 due August 11 All local SCPD students must come All local SCPD students must come
to campus for final examto campus for final exam
![Page 3: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/3.jpg)
Why JSPs?Why JSPs?
Goal: Create dynamic web content (HTML, XML, ...) for a Web Application
Goal: Make it easier/cleaner to mix static HTML parts with dynamic Java servlet code
JSP specification ver. 2.0Java Servlet specification ver. 2.4
![Page 4: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/4.jpg)
JSP/ASP/PHP vs JSP/ASP/PHP vs CGI/ServletsCGI/Servlets
CGI & Servlets -- Mostly Code with some HTML via print & out.println
JSP/ASP/PHP -- Mostly HTML, with code snippets thrown in No explicit recompile Great for small problems Easier to program Not for large computations
![Page 5: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/5.jpg)
What is JSP?What is JSP?
Mostly HTML page, with extension .jsp Include JSP tags to enable dynamic
content creation Translation: JSP → Servlet class Compiled at Request time
(first request, a little slow) Execution: Request → JSP Servlet's
service method
![Page 6: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/6.jpg)
What is a JSP?What is a JSP?
<html> <body> <jsp:useBean.../> <jsp:getProperty.../> <jsp:getProperty.../> </body></html>
![Page 7: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/7.jpg)
AdvantagesAdvantages
Code -- Computation HTML -- Presentation Separation of Roles
Developers Content Authors/Graphic
Designers/Web Masters Supposed to be cheaper... but not
really...
![Page 8: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/8.jpg)
Model-View-ControllerModel-View-Controller
A Design Pattern Controller -- receives user interface
input, updates data model Model -- represents state of the world
(e.g. shopping cart) View -- looks at model and generates
an appropriate user interface to present the data and allow for further input
![Page 9: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/9.jpg)
Model-View-ControllerModel-View-Controller
Bean
JSP
ServletController
View
Model
![Page 10: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/10.jpg)
public class OrderServlet … { public void dogGet(…){ if(isOrderValid(req)){ saveOrder(req); … out.println(“<html><body>”); … } private void isOrderValid(…){ … } private void saveOrder(…){ … }}
Public class OrderServlet … { public void doGet(…){ … if(bean.isOrderValid(…)){ bean.saveOrder(req); … forward(“conf.jsp”); }}
<html> <body> <c:forEach items=“${order}”> … </c:forEach> </body></html>
isOrderValid()saveOrder()
------------------private state
Pure Servlet
Servlet
JSP
Java Bean
![Page 11: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/11.jpg)
JSP Big PictureJSP Big Picture
Server w/JSP Container
GET /hello.jsp
<html>Hello!</html>
Hello.jsp
HelloServlet.java
HelloServlet.class
![Page 12: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/12.jpg)
A JSP FileA JSP File
![Page 13: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/13.jpg)
<%@ Directive %><%@ Directive %><%@ page contentType="text/html" %><%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %><html> <head> <title>JSP is Easy</title> </head> <body bgcolor="white"> <h1>JSP is as easy as ...</h1> <%-- Calculate the sum of 1 + 2 + 3 dynamically --%> 1 + 2 + 3 = <c:out value="${1 + 2 + 3}" /> </body></html>
![Page 14: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/14.jpg)
<%-- JSPComment --><%-- JSPComment --><%@ page contentType="text/html" %><%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %><html> <head> <title>JSP is Easy</title> </head> <body bgcolor="white"> <h1>JSP is as easy as ...</h1> <%-- Calculate the sum of 1 + 2 + 3 dynamically --%> 1 + 2 + 3 = <c:out value="${1 + 2 + 3}" /> </body></html>
![Page 15: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/15.jpg)
Template TextTemplate Text<%@ page contentType="text/html" %><%@ taglib prefix="c" uri=http://java.sun.com/jstl/core %><html> <head> <title>JSP is Easy</title> </head> <body bgcolor="white"> <h1>JSP is as easy as ...</h1> <%-- Calculate the sum of 1 + 2 + 3 dynamically --%> 1 + 2 + 3 = <c:out value="${1 + 2 + 3}" /> </body></html>
![Page 16: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/16.jpg)
<%= expr ><%= expr >
Java expression whose output is spliced into HTML
<%= userInfo.getUserName() %><%= 1 + 1 %><%= new java.util.Date() %>
Translated to out.println(userInfo.getUserName()) ...
WARNING: Old School JSP! The new way is introduced after break.... you mayuse either, but Old School JSP is used sparingly nowadays
![Page 17: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/17.jpg)
<% code %><% code %>
Scriptlet: Add a whole block of code to JSP... passed through to JSP's service method
![Page 18: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/18.jpg)
<%@ page language="java" contentType="text/html" %><%@ page import="java.util.*" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><% // Create an ArrayList with test data ArrayList list = new ArrayList( ); Map author1 = new HashMap( ); author1.put("name", "John Irving"); author1.put("id", new Integer(1)); list.add(author1); Map author2 = new HashMap( ); author2.put("name", "William Gibson"); author2.put("id", new Integer(2)); list.add(author2); Map author3 = new HashMap( ); author3.put("name", "Douglas Adams"); author3.put("id", new Integer(3)); list.add(author3); pageContext.setAttribute("authors", list);%><html> <head> <title>Search result: Authors</title> </head> <body bgcolor="white"> Here are all authors matching your search critera: <table> <th>Name</th> <th>Id</th> <c:forEach items=“${authors}” var=“current”>
![Page 19: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/19.jpg)
<%@ page language="java" contentType="text/html" %><html> <head> <title>Browser Check</title> </head> <body bgcolor="white">
<% String userAgent = request.getHeader("User-Agent"); if (userAgent.indexOf("MSIE") != -1) { %> You're using Internet Explorer. <% } else if (userAgent.indexOf("Mozilla") != -1) { %> You're probably using Netscape. <% } else { %> You're using a browser I don't know about. <% } %> </body></html>
![Page 20: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/20.jpg)
<%! decl ><%! decl >
Turned into an instance variable for the servlet
What did I tell you about instance variables & multithreaded servlets?
Serious Race Conditions Here!
![Page 21: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/21.jpg)
<%@ page language="java" contentType="text/html" %><%! int globalCounter = 0;%><html> <head> <title>A page with a counter</title> </head> <body bgcolor="white"> This page has been visited: <%= ++globalCounter %> times. <p> <% int localCounter = 0; %> This counter never increases its value: <%= ++localCounter %> </body></html>
Declarations have serious multithreading issues!
![Page 22: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/22.jpg)
<%@ page language="java" contentType="text/html" %><%! int globalCounter = 0;%><html> <head> <title>A page with a counter</title> </head> <body bgcolor="white"> This page has been visited: <%= ++globalCounter %> times. <p> <% int localCounter = 0; %> This counter never increases its value: <%= ++localCounter %> </body></html>
Not saved between requests...!
![Page 23: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/23.jpg)
<%@ page language="java" contentType="text/html" %><%@ page import="java.util.Date" %><%! int globalCounter = 0; java.util.Date startDate; public void jspInit( ) { startDate = new java.util.Date( ); }
public void jspDestroy( ) { ServletContext context = getServletConfig().getServletContext( ); context.log("test.jsp was visited " + globalCounter + " times between " + startDate + " and " + (new Date( ))); }%><html> <head> <title>A page with a counter</title> </head> <body bgcolor="white"> This page has been visited: <%= ++globalCounter %> times since <%= startDate %>. </body></html>
No real need anymore, since we don't use instance variables!
![Page 24: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/24.jpg)
<jsp:include …><jsp:include …>
<jsp:include page="trailer.html“ flush="true" />
![Page 25: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/25.jpg)
Five Minute Five Minute BreakBreak
![Page 26: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/26.jpg)
Big Picture – Web AppsBig Picture – Web AppsDatabase
Legacy Applications
Java Applications
Web Service
Other…?
End User #1
End User #2
Web Server(Servlets/JSP)
![Page 27: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/27.jpg)
Invoking Dynamic CodeInvoking Dynamic Code(from JSPs)(from JSPs)
Call Java Code Directly(Expressions, Declarations, Scriptlets)
Call Java Code Indirectly(Separate Utility Classes, JSP calls methods)
Use Beans(jsp:useBean, jsp:getProperty, jsp:setProperty)
Use MVC architecture (servlet, JSP, JavaBean) Use JSP expression Language
(shorthand to access bean properties, etc) Use custom tags
(Develop tag handler classes; use xml-like custom tags)
![Page 28: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/28.jpg)
Invoking Dynamic CodeInvoking Dynamic Code(from JSPs)(from JSPs)
Call Java Code Directly(Expressions, Declarations, Scriptlets)
Call Java Code Indirectly(Separate Utility Classes, JSP calls methods)
Use Beans(jsp:useBean, jsp:getProperty, jsp:setProperty)
Use MVC architecture (servlet, JSP, JavaBean) Use JSP expression Language
(shorthand to access bean properties, etc) Use custom tags
(Develop tag handler classes; use xml-like custom tags)
Simple Application orSmall Development Team
Complex Application orBig Development Team
![Page 29: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/29.jpg)
Servlets and JSPsServlets and JSPs
Core Servlets and JavaServer Pages, 2nd Edition, Volumes 1 & 2. Marty Hall & Larry Brown
![Page 30: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/30.jpg)
Java BeansJava Beans
Purpose: Store Data Simple Object,
requires no argument constructor Properties accessible via get & set
methods
![Page 31: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/31.jpg)
Java BeansJava Beans
For a "foo" property, a java bean will respond to Type getFoo() void setFoo(Type foo)
For a boolean "bar" property, a java bean will respond to boolean isBar() void setBar(boolean bar)
![Page 32: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/32.jpg)
Java BeanJava Bean
int getCount()void setCount(int c)
String getS()void setS(String s)
int[] getFoo()void setFoo(int[] f)
int count;String s;int[] foo;
![Page 33: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/33.jpg)
![Page 34: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/34.jpg)
// MagicBean.java/* A simple bean that contains a single* "magic" string.*/public class MagicBean { private String magic; public MagicBean(String string) {
magic = string; } public MagicBean() {
magic = "Woo Hoo"; // default magic string } public String getMagic() {
return(magic); } public void setMagic(String magic) {
this.magic = magic; }}
![Page 35: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/35.jpg)
Java BeansJava Beans <jsp:useBean id="myBean"
class="com.foo.MyBean“ scope="request"/> <jsp:getProperty name="myBean“
property="lastChanged" /> <jsp:setProperty name="myBean“
property="lastChanged" value="<%= new Date()%>"/>
Example <jsp:usebean id="bean" class="MagicBean" /> <jsp:getProperty name="bean"
property="magic" />
![Page 36: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/36.jpg)
<!-- bean.jsp --><hr><h3>Bean JSP</h3>
<p>Have all sorts of elaborate, tasteful HTML ("presentation") surrounding the data we pull off the bean.
<p>Behold -- I bring forth the magic property from the Magic Bean...
<!-- bring in the bean under the name "bean" --><jsp:usebean id="bean" class="MagicBean" />
<table border=1><tr><td bgcolor=green><font size=+2>Woo</font> Hoo</td><td bgcolor=pink><font size=+3><td bgcolor=pink><font size=+3> <!-- the following effectively does bean.getMagic() --> <jsp:getProperty name="bean" property="magic" /></font></td><td bgcolor=yellow>Woo <font size=+2>Hoo</font></td></tr></table>
<!-- pull in content from another page at request time with a relative URL ref to another page --> <jsp:include page="trailer.html" flush="true" />
![Page 37: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/37.jpg)
public class HelloBean extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException { response.setContentType("text/html");
PrintWriter out = response.getWriter();out.println("<html>");out.println("<head>");out.println("<html>");out.println("<head>");String title = "Hello Bean";out.println("<title>" + title + "</title>");out.println("</head>");out.println("<body bgcolor=white>");out.println("<h1>" + title + "</h1>");out.println("<p>Let's see what Mr. JSP has to
contribute...");request.setAttribute("foo", "Binky");MagicBean bean = new MagicBean("Peanut butter sandwiches!");request.setAttribute("bean", bean);RequestDispatcher rd = getServletContext().getRequestDispatcher("/bean.jsp");rd.include(request, response);rd.include(request, response);out.println("<hr>");out.println("</body>");out.println("</html>");
} // Override doPost() -- just have it call doGet() public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response); }}
![Page 38: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/38.jpg)
JSP TagsJSP Tags
Found in JSP Pages Look like HTML Tags
<blah attr=val>Foo</blah> Single Tag Format
<blah attr=val/>
![Page 39: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/39.jpg)
<%-- JSPComment --%><%-- JSPComment --%><%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html> <head> <title>JSP is Easy</title> </head> <body bgcolor="white"> <h1>JSP is as easy as ...</h1> <%-- Calculate the sum of 1 + 2 + 3 dynamically --%> 1 + 2 + 3 = <c:out value="${1 + 2 + 3}" /> </body></html>
![Page 40: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/40.jpg)
<%@ Directive %><%@ Directive %><%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html> <head> <title>JSP is Easy</title> </head> <body bgcolor="white"> <h1>JSP is as easy as ...</h1> <%-- Calculate the sum of 1 + 2 + 3 dynamically --%> 1 + 2 + 3 = <c:out value="${1 + 2 + 3}" /> </body></html>
![Page 41: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/41.jpg)
Page DirectivePage Directive
<%@ page import="package.class" %>
<%@ page import="java.util.*" %> <%@ page contentType="text/html"
%> <%
response.setContentType("text/html"); %>
![Page 42: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/42.jpg)
Include DirectiveInclude Directive
<%@ include file="Relative URL"> Included at Translation time May contain JSP code such as
response header settings, field definitions, etc... that affect the main page
![Page 43: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/43.jpg)
<jsp:include …><jsp:include …>
Include Files at Request Time <jsp:include
page="news/Item1.html"/> page attribute must point to a page
that is HTML or a page that produces HTML (via JSP, CGI, etc)...
![Page 44: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/44.jpg)
Scripting Element TagsScripting Element Tags
<%= expr %> <%! decl %> <% code %>
![Page 45: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/45.jpg)
Action ElementsAction Elements
Standard Actions JSTL (tag library) Actions Custom Actions
![Page 46: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/46.jpg)
Standard ActionsStandard Actions
<jsp:useBean>Makes a JavaBeans component available in a page
<jsp:getProperty>Gets a property value from a JavaBeans component and adds it to the response
<jsp:setProperty>Set a JavaBeans property value
<jsp:include>Includes the response from a servlet or JSP page during the request processing phase
![Page 47: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/47.jpg)
Standard ActionsStandard Actions
<jsp:forward>Forwards the processing of a request to servlet or JSP page
<jsp:param>Adds a parameter value to a request handed off to another servlet or JSP page using <jsp:include> or <jsp: forward>
<jsp:plugin>Generates HTML that contains the appropriate client browser-dependent elements (OBJECT or EMBED) needed to execute an applet with the Java Plug-in software
![Page 48: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/48.jpg)
Custom Actions (Tag Custom Actions (Tag Libraries)Libraries)
Can Define Your own! Description
Define Install Declare Use
Details in JavaServer Pages 2nd ed found on Safari Techbooks
![Page 49: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/49.jpg)
JSTL TagsJSTL Tags
<%@ taglib prefix="c"
uri="http://java.sun.com/jstl/core" %>
...
<c:out value="${1 + 2 + 3}" />
![Page 50: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/50.jpg)
JSP Standard Tag LibraryJSP Standard Tag Library
<%@ page contentType="text/html" %><%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %><html> <head> <title>JSP is Easy</title> </head> <body bgcolor="white"> <h1>JSP is as easy as ...</h1>
1 + 2 + 3 = <c:out value="${1 + 2 + 3}" /> </body></html>
Built on custom tag infrastructure
![Page 51: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/51.jpg)
JSTL Control TagsJSTL Control Tags
<%@ page contentType="text/html" %><%@ taglib prefix="c “uri="http://java.sun.com/jstl/core" %>
<c:if test="${2>0}">It's true that (2>0)!
</c:if>
<c:forEach items="${paramValues.food}" var="current"><c:out value="${current}" />
</c:forEach>
![Page 52: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/52.jpg)
Expression Language Expression Language MotivationMotivation
Limitations of MVC <%= ... %>, <% ... %>, <%! ... %> jsp:useBean, jsp:getProperty verbose clumsy scripting & expression elements
to do more complicated Java things With Expression Language
${expression} Short and readable and fluid, like
JavaScript
![Page 53: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/53.jpg)
Advantages of Expression Advantages of Expression Language (EL)Language (EL)
Simple & Concise Flexible (use in conjunction with tag
libraries & custom tags) Robust against Error
![Page 54: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/54.jpg)
Basic ArithmeticBasic Arithmetic
${1.2 + 2.3} => 3.5 <%= 1.2 + 2.3 %>
${3/0} => Infinity \${1} => ${1} ${10 mod 4} => 2
![Page 55: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/55.jpg)
Basic ComparisonsBasic Comparisons
${4.0 >= 3} => true ${4.0 ge 3} => true Not in Java ${100.0 == 100} => true ${(10*10) ne 100} => false Not in Java ${'hip' > 'hit'} => false Not in Java ${'a' < 'b'} => true Not in Java
![Page 56: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/56.jpg)
Implicit ObjectsImplicit Objects
${param.foo} => booyah ${param["foo"]} => booyah \${param["foo"]} => ${param["foo"]} ${header["host"]} => localhost:8080 ${header["accept"]} => */* ${header["user-agent"]} => Mozilla/5.0
(Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/124 (KHTML, like Gecko) Safari/125
![Page 57: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/57.jpg)
FunctionsFunctions Implemented by Tag Libraries (Tag
Libaries, implemented as Static Methods) ${param["foo"]}
=> JSP 2.0 ${my:reverse(param["foo"])}
=> 0.2 PSJ ${my:reverse(my:reverse(param["foo"]))}
=> JSP 2.0 ${my:countVowels(param["foo"])}
=> 0
![Page 58: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/58.jpg)
ConditionalsConditionals
<TD ALIGN="RIGHT“ BGCOLOR=“${(oranges.total < 0) ? "RED" : "WHITE"}">
![Page 59: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/59.jpg)
package coreservlets;
public class Salesbean {private double q1, q2, q3, q4;
public SalesBean(double q1Sales, double q2Sales, double q3Sales, double q4Sales) {...
}
public double getQ1() {return(q1);}
public double getQ2() {return(q2);}...
}}
![Page 60: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/60.jpg)
package coreservlets;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;
public class Conditionals extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
SalesBean apples = new SalesBean(150.25, -75.25, 22.25, -33.57);SalesBean oranges = new SalesBean(-220.25, -49.57, 138.25, 12.25);
request.setAttribute("apples", apples);request.setattribute("oranges", oranges);RequestDispatcher dispatcher =
request.getRequestDispatcher("/el/conditionals.jsp");dispatcher.forward(request, response);
}}
![Page 61: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/61.jpg)
package coreservlets;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;
public class Conditionals extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
SalesBean apples = new SalesBean(150.25, -75.25, 22.25, -33.57);SalesBean oranges = new SalesBean(-220.25, -49.57, 138.25, 12.25);
request.setAttribute("apples", apples);request.setattribute("oranges", oranges);RequestDispatcher dispatcher =
request.getRequestDispatcher("/el/conditionals.jsp");dispatcher.forward(request, response);
}}
![Page 62: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/62.jpg)
...
<TD ALIGN="RIGHT" BGCOLOR=“${(oranges.total < 0) ? "RED" : "WHITE"}">
<TD ALIGN="RIGHT" BGCOLOR=“${(apples.q1 < 0) ? "RED" : "WHITE"}">
...
![Page 63: JSPs Lecture 8](https://reader035.vdocuments.us/reader035/viewer/2022081513/56815097550346895dbe94be/html5/thumbnails/63.jpg)
EL ExamplesEL Examples
<input name="firstName“ value="${customer.firstName}">
<c:out value="${order.amount + 5}"/>
${order.amount + 5} {order['amount'] + 5}