320 likes | 472 Views
Custom Tags. Organization of the platform. Your web pages. Your application. JSTL. JavaServer Pages (JSP). Java Servlet API. Java language. What’s irritating about Custom Tags?. The tag-extension protocol is too complicated. Tag handler. doStartTag(). doEndTag(). .
E N D
Organization of the platform Your web pages Your application JSTL JavaServer Pages (JSP) Java Servlet API Java language
What’s irritating about Custom Tags? • The tag-extension protocol is too complicated Tag handler doStartTag() doEndTag() Too hard for Gosling, even? doInitBody() doAfterBody() doCatch() doFinally() release()
What’s irritating about JSP? • Also, tags don’t support certain kinds of code reuse. <font color=”<%=statusColor%>”> <% for (…) { %> <%= customer %>: <%= hatSize %> <% } %> </font> out.println(…); for(…) { out.println(…); … }
What’s bad about JSP? () • The general consensus says… Scriplets • They complicate abstraction and code reuse. • They make it harder for nonprogrammers to maintain pages
JSP 2.0 • Sun introduced the solution to these problems in JSP 2.0. • It addresses theses issues by introducing • Expression language • Tag files • Simplified Tag API (SimpleTag versus Tag) • Improved XML syntax • JSTL, although it is not part of JSP specificiation.
JSP Expression Language • JSP became beautiful after this • The motivation is to lose scriplets whatsoever . • Also non java programmers should be able to use it easily, because it is just an expression language. • It was inspired by xpath and java script except it is much easier than any of them
EL syntax • Expressions appear between ${ and }. • Note that ${ and } may contain whole expressions, not just variable names • E.g., ${myExpression + 2} • Access JavaBean properties using . (dot) • ${book.title} translates to book.getTitle() • Access to Array and Collection elements using collection[] • Access to a Map value by key using map[“key”]
EL syntax • EL searches each scope area if a scope isn’t specified • Specific scope areas can be used: • ${pageScope.title} • ${requestScope.title} • ${sessionScope.title} • ${applicationScope.title} ${duck.beakColor} can resolve to ((Duck) pageContext.getAttribute(”duck”)).getBeakColor() • Automatic Casting, wow
EL Operators • Arithmetic • +, -, *, / (or div), % (or mod) – note on XPath • Relational • == (or eq), != (or ne), < (or lt) • > (or gt), <= (or le), >= (or ge) • Logical • && (or and), || (or or), ! (or not) • Validation • empty • null values • Collections or Arrays that are empty • Strings that evaluate to “”
EL Operators (Examples) • Arithmetic ${age + 3} • Comparisons ${age > 21} • Equality checks ${age = 55} • Logical operations ${young or beautiful} • Emptiness detection ${empty a} • ‘a’ is empty String (“”), empty List, null, etc. Useful for ${empty param.x}
Implicit objects in EL • Param and paramvalues • Access HTTP request parameters • Example: ${param.password} • Header and headervalues • Request header information • Example: ${header[“User-Agent”]} • Initparam (for the context init parameters of the webapp) • Example: ${pageContext.request.remoteUser} • Cookies • Example: ${cookie.crumb}
EL: Uses • JSTL 1.0 introduced the EL, but it could be used only within tags. • In JSP 2.0, it can be used almost anywhere <font color=”${color}”> Hi, ${user}. You are <user:age style=”${style}”/> years old. </font>
JSTL • JSP Standard Tag Library • Set of tags that should be available in all compliant JSP containers • Promotes rapid application development at the web page layer
Why JSTL? • A big reason is that writing your own custom actions, or tags, can be a pain • There was lots of reinventing the wheel going on, for tasks like displaying a date in a special format • Many open source libraries sprung up, but there was still no standard • This fueled the fire behind JSTL
JSTL: Features • Control flow • Iteration, conditions • URL management • Retrieve data, add session IDs • Text formatting and internationalization • Dates and numbers • Localized messages • XML manipulation • XPath, XSLT • Database access • Queries, updates (you do not need to write java any more )
Managing variables • Outputting values with EL <c:out value=”${user.IQ}” /> • Storing data <c:set var=”user” scope=”session”> // arbitrary text </c:set> Note the use of “var” and “scope”: a JSTL convention
Iteration • A loop with a start, end, and step (typical for statement) <c:forEach var="name" varStatus="name" begin="expression" end="expression" step="expression"> body content </c:forEach> • A loop using an Iterator for a collection <c:forEach var="name" items="expression" varStatus="name" begin="expression" end="expression" step="expression"> body content </c:forEach>
Example <table> <tr><th>Value</th><th>Square</th></tr> <c:forEach var="x" begin="0" end="10" step="2"> <tr> <td>${x}</td> <td>${x * x}</td> </tr> </c:forEach> </table>
Conditional evaluation <c:if test=”${a == b}”> a equals b </c:if> Mutually exclusive conditionals <c:choose> <c:when test=”${a == b}”> a equals b </c:when> <c:when test=”${a == c}”> a equals c </c:when> <c:otherwise> I don’t know what ’a’ equals. </c:otherwise> </c:choose> Conditional logic
Example <c:choose> <c:when test="${pageContext.request.scheme eq 'http'}"> This is an insecure Web session. </c:when> <c:when test="${pageContext.request.scheme eq 'https'}"> This is a secure Web session. </c:when> <c:otherwise> You are using an unrecognized Web protocol. How did this happen?! </c:otherwise> </c:choose>
URL management • Retrieving data <c:import var=”cnn” url=”http://www.cnn.com/cnn.rss”/> • Data exposed as String or Reader • All core URLs supported (HTTP, FTP, HTTPS with JSSE) • Local, cross-context imports supported • Printing URLs <c:url value=”/foo.jsp”> • Redirection <c:redirect url=”/foo.jsp”>
Text formatting • Locale-sensitive formatting and parsing • Numbers • Dates • Internationalization • Message bundles • Message argument substitution • “Hi {0}. I would like to {1} your money today. I will use it to buy myself a big {2}.” <fmt:formatNumber type=“currency” value=“${salary}” /> <fmt:message key=“welcome” />
Example <table> <fmt:timeZone value="US/Eastern"> <c:forEach items="${entryList}" var="blogEntry" varStatus="status"> <c:if test="${status.first}"> <tr> <td align="left" class="blogDate"> <fmt:formatDate value="${blogEntry.created}" dateStyle="full"/> </td> </tr> </c:if> <tr> <td align="left" class="blogTitle">${blogEntry.title}</td> </tr> <tr> <td align="left" class="blogText">${blogEntry.text} <font class="blogPosted"> [Posted <fmt:formatDate value="${blogEntry.created}" pattern="h:mm a zz"/>] </font> </td> </tr> </c:forEach> </fmt:timeZone> </table>
database manipulation • Queries (and ResultSet caching) • Updates / inserts • Transactions (<sql:transaction>) • Parametric (PreparedStatement) argument substitution (<sql:param>) • DataSource-based connection management <sql:query sql=“SELECT * FROM USERS” var=“result” /> <c:forEach items=“${result.rows}”> … </c:forEach>
XML manipulation • Use of XPath to access, display pieces of XML documents <c:import url=”http://www.cnn.com/cnn.rss” var=”cnn”/> <x:parse xml=”${cnn}” var=“dom”> <x:out value=”$dom//item[1]/title”/> • Chaining XSLT transformations <x:transform xslt=”${xsl2}” /> <x:transform xml=”${xml}” xslt=”${xsl}” /> </x:transform>
Why Not XSLT • JSTL integrates XPath with convenient, standard access to Java/JSP code. • E.g., parse an article URL out of a document, then follow the URL and parse its contents. • JSP/JSTL may be more familiar and convenient for simple tasks. • Functional versus imperative programming
Adding New Tag • There are two ways to add news tags • Extend the JSTL and override methods • Define Tag files (This is much easier, so we gone study this )
Tag Files • Solve difficulty of reusing text/HTML within a tag. • And makes it much easier to write simple tags, since you can do so in JSP instead of Java. • Stand-alone file with <%@ tag %> directive instead of traditional <%@ page %> directive.
Tag Files <%@ tag name=”tableTag” %> <%@ attribute name=”items” %> <table width=”…” bgcolor=”…”> <th> <td>Name</td> <td>IQ</td> </th> <c:forEach var=”i” items=”${items}”> <tr> <td>${i.fullName}</td> <td>${i.IQ}</td> </tr> </c:forEach> </table>
Using new Tag.... Your shopping cart: <my:tableTag items=”${cart}” /> Your wish list: <my:tableTag items=”${wishList}” /> Things we want you to buy: <my:tableTag items=”${pressuredSales}” />