JSP 1.2 Custom Tags

Post on 18-Nov-2014

278 views 0 download

Transcript of JSP 1.2 Custom Tags

1

JSP 1.2JSP 1.2Custom TagsCustom Tags

2

Disclaimer & Acknowledgments● Even though Sang Shin is a full-time employees of Sun

Microsystems, the contents here are created as his own personal endeavor and thus does not reflect any official stance of Sun Microsystems.

● Sun Microsystems is not responsible for any inaccuracies in the contents.

● Acknowledgements– The slides, speaker notes, and example code of this

presentation are created from ● “Core Servlets and JavaServer Pages” book written by

Marty Hall● “Custom Tags” section of Java WSDP 1.2 tutorial written by

Stephanie Bodoff of Sun Microsystems– Many slides are borrowed from “Sevlet/JSP” codecamp

material authored by Doris Chen of Sun Microsystems

3

Revision History● 10/13/2003: version 1: created by Sang Shin● Things to do– speaker notes need to be added and polished– some concepts need to be explained better – advanced usage scenarios (tag variables, listener,

etc in JSP 1.2) still need to be discussed– “how does it work” part needs to be polished up a bit

4

Agenda I ● Evolution of Web-tier technology● What is and why custom tags?● Components that make up custom tag

architecture● How to build, configure, and deploy

custom tag library?● How does it work?

5

Agenda II● Usage scenarios of custom tags (in the

increasing order of complexity)– Defining a tag without attributes or tag bodies– Assigning attributes to tags– Including tag body– Optionally including tag body– Manipulating tag body– Including or manipulating tag body multiple

times– Using nested tags

6

Evolution ofEvolution ofWeb tier technologyWeb tier technology

7

Web Application Designs

8

Where does custom tags fit in?

9

Standard Action Tags (or Tags) ● <jsp:useBean>– Instantiate JavaBean object

● <jsp:getProperty>– Allow accessing bean properties

● <jsp:setProperty>– Allow setting bean properties

10

Standard Action Tags (or Tags)● <jsp:forward>– Forwards request to another HTML page, JSP, or

servlet● <jsp:include>– Includes output of another JSP file

● <jsp:plugin>– Downloads Java plugin to browser to execute applet

or bean

11

What is a What is a Custom Tag?Custom Tag?

12

What is a Custom Tag?● User defined JSP language elements (as

opposed to standard tags)● Encapsulates recurring tasks● Distributed in a “custom made” tag library

13

Custom Tags Can● Be customized via attributes passed from the

calling JSP page● Pass variables back to the calling page● Access all the objects available to JSP pages● Communicate with each other– You can create and initialize a JavaBeans

component, create a public EL variable that refers to that bean in one tag, and then use the bean in another tag

● Be nested within one another and communicate via private variables

14

Custom Tag Examples● Getting/setting Implicit objects● Processing forms● Accessing database● Flow control● Iterations ● Many more

15

Ready-to-usable Custom Tag Library● Java Standard Tag Library (JSTL)– Tags for setting/getting attributes, iteration, etc– Tags for database access– Tags for internationalized formatting– Tags for XML

● Jakarta-Taglibs

16

Why Custom Tags?Why Custom Tags?

17

Why Custom Tags?● Separate presentation from business (and

other functionality) logic– page authors author presentation– Business logic developers create custom tags

● Encapsulate business logic– Reusable & Maintainable

● Help page authors – Page authors use simpler syntax

● Provide– Portable semantics

18

Custom Tags against JavaBeans● Pros– Custom tags can manipulate JSP contents

while beans cannot– Complex operations can be reduced to a

significantly simpler form with custom tags than beans

● Cons– Custom tags require quite a bit of more work to

set up than do beans

source: more Servlets and JSP[2]

19

Quick Introduction onQuick Introduction onComponents that make up Components that make up Custom tag architecture Custom tag architecture

(in JSP 1.2)(in JSP 1.2)

20

Three things make up custom tagarchitecture● Tag handler class– Defines tag's behavior

● Tag library descriptor (TLD)– Maps XML elements to tag handler class

● JSP file (user of custom tags)– Uses tags

21

Steps for implementing & using & deploying custom tags ● Implementing custom tags– Write tag handlers– Write Tag library descriptor (TLD) file– Package tag handlers and TLD file into tag

library (either unpacked or packed form)● Using custom tags– Write JSP pages that use tags

● Deploying custom tags as part of web app– Configure and deploy tag library along with JSP

pages

22

Tag handler class● Implements interface– javax.servlet.jsp.tagext.Tag or – javax.servlet.jsp.tagext.Bodytag interface

● Usually extends utility class– javax.servlet.jsp.tagext.TagSupport or– javax.servlet.jsp.tagext.BodyTagSupport class

● Located in the same directory as servlet class files– /WEB-INF/classes/<package-directory-structure>

23

Example: Tag Handler (page 1)ExampleTag.javapackage moreservlets.tags;

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;

/** Very simple JSP tag that just inserts a string * ("Custom tag example...") into the output. * The actual name of the tag is not defined here; * that is given by the Tag Library Descriptor (TLD) * file that is referenced by the taglib directive * in the JSP file. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * &copy; 2002 Marty Hall; may be freely used or adapted. */

24

Example: Tag Handler (page 2)ExampleTag.javapublic class ExampleTag extends TagSupport { public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.print("Custom tag example " + "(moreservlets.tags.ExampleTag)"); } catch(IOException ioe) { System.out.println("Error in ExampleTag: " + ioe); } return(SKIP_BODY); }}

25

Tag Library Descriptor (TLD)● XML file that describes – tag name– bodycontent– attributes – tag handler class

● Container knows which tag is associated with which tag handler class via this file

● Located – Usually under WEB-INF directory

● Custom location can specified in JSP file– Via uri attribute of taglib directive

26

Example: TLD (page 1)msajsp-tags.tld<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<!-- a tag library descriptor -->

<taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>msajsp-tags</shortname> <info> A tag library from More Servlets and JavaServer Pages, http://www.moreservlets.com/. </info>

27

Example: TLD (page 2)msajsp-tags.tld <tag> <name>example</name> <tagclass>moreservlets.tags.ExampleTag</tagclass> <bodycontent>empty</bodycontent> <info>Simplest example: inserts one line of output</info> </tag>

<tag> <name>simplePrime</name> <tagclass>moreservlets.tags.SimplePrimeTag</tagclass> <bodycontent>empty</bodycontent> <info>Outputs a random 50-digit prime.</info> </tag>

...</taglib>

28

What is Tag Library?● Is a collection of related tags– Tag(s) can be packaged in a Tag Library

● Typically packaged as a jar file containing– A tag library descriptor (TLD)

• e.g. META-INF/taglib.tld– *.class files for the tag handler class(es)– Any additional associated resource(s)

29

JSP page● Declare the tag library via taglib directive ● Use tags using custom tag syntax

30

Declaring a tag library● Include taglib directive before tags are used● Syntax– <%@ taglib prefix="myprefix" uri=”myuri” %>– prefix: identifies the tag library– uri: uniquely identifies the tag library descriptor

(TLD) directly or indirectly

31

Custom Tag Syntax in a JSP page<prefix:tag attr1="value" ... attrN="value" /> or <prefix:tag attr1="value" ... attrN="value" > body</prefix:tag>

prefix: distinguishes tag librarytag: identifies a tag (within the tag library)attr1 ... attrN: modify the behavior of the tag

32

Example: JSP page SimpleExample.jsp<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- Illustration of very simple JSP custom tag.

Taken from More Servlets and JavaServer Pagesfrom Prentice Hall and Sun Microsystems Press,http://www.moreservlets.com/.(C) 2002 Marty Hall; may be freely used or adapted.--><HTML><HEAD><%@ taglib uri="/WEB-INF/msajsp-taglib.tld" prefix="msajsp" %><TITLE><msajsp:example /></TITLE><LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"></HEAD><BODY><H1><msajsp:example /></H1><msajsp:example /></BODY></HTML>

33

Example: Accessing SimpleExample.jsp

34

How to build, configure How to build, configure and deploy tag library and deploy tag library

35

Source Directory Structure● Use the following source directory structure (as in

J2EE 1.4 Tutorial's web/iterator directory)– <j2ee14tutorial-install>/j2eetutorial14/examples/web

● iterator– build.xml (ant build file)– src (dir where *.java files with proper package

structure reside)– web (dir)

● WEB-INF (dir)● *.tld● tags (dir - needed for JSP 2.0 tag files)

● *.jsp

36

Build Directory Structure(under build or dist directory)● Use the following build directory structure (as in

J2EE 1.4 Tutorial's web/iterator directory)– <j2eetutorial14-install>/j2eetutorial14/examples/web

● iterator– build (unpacked *.war file)– dist (packed *.war file)

37

Usage Scenarios Usage Scenarios of Custom Tagsof Custom Tags

(in JSP 1.2) (in JSP 1.2)

38

Usage Scenarios of Custom Tags

● Defining a basic tag – A tag without attributes or tag bodies

● Assigning attributes to tags● Including tag body● Optionally including tag body● Manipulating tag body● Including or manipulating tag body multiple

times● Using nested tags

39

Usage Scenarios of Custom Tags

● Bundling listeners with tag libraries● Checking syntax with TagLibraryValidator● Handling Exceptions with TryCatchFinally

interface● Looping without generating BodyContent

40

Defining a basic tagDefining a basic tag(We already saw(We already saw

an example.)an example.)

41

Defining a basic tag● A tag without attributes or body● Extend TagSupport class● All you have to do is to override doStartTag

() method– doStartTag() method defines code that gets called

at request time at the place where the element's start tag is found

– doStartTag() returns SKIP_BODY since the tag does not have a body ● It instructs the container to ignore any body content

between start and end tags

42

Assigning attributes Assigning attributes to tagsto tags

43

Why assigning attributes to tags?● Provides a way to pass attribute/value pairs

from JSP pages to custom tag handlers● Custom tag handlers can use them in

whatever business logic they have

44

Tag handler class● Use of an attribute X in a JSP page results in

a call to a method setX() in the tag handler class – Tag handler must implement setX() method

public void setX(String value1){ doSomethingWith(value1);}

45

Example: Tag Handler (page 1)SimplePrimeTag.java

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;import java.math.*;import moreservlets.*;

/** Generates a prime of approximately 50 digits. * (50 is actually the length of the random number * generated -- the first prime above that number will * be returned.) * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * &copy; 2002 Marty Hall; may be freely used or adapted. */

46

Example: Tag Handler (page 2)SimplePrimeTag.java public class SimplePrimeTag extends TagSupport { protected int len = 50; public int doStartTag() { try { JspWriter out = pageContext.getOut(); BigInteger prime = Primes.nextPrime(Primes.random(len)); out.print(prime); } catch(IOException ioe) { System.out.println("Error generating prime: " + ioe); } return(SKIP_BODY); }}

47

Example: Tag Handler (page 3)PrimeTag.java package moreservlets.tags;

/** Generates an N-digit random prime (default N = 50). * Extends SimplePrimeTag, adding a length attribute * to set the size of the prime. The doStartTag * method of the parent class uses the len field * to determine the length of the prime. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * &copy; 2002 Marty Hall; may be freely used or adapted. */

48

Example: Tag Handler (page 4)PrimeTag.java

public class PrimeTag extends SimplePrimeTag { public void setLength(String length) { try { len = Integer.parseInt(length); } catch(NumberFormatException nfe) { len = 50; } }

/** Servers are permitted to reuse tag instances * once a request is finished. So, this resets * the len field. */ public void release() { len = 50; }}

49

TLD● Attributes must be declared inside tag

element by means of attribute sub-elements● Attribute element has 5 sub-elements of its

own– name (required)– required (required)– rtexprvalue (optional)– type (optional)– example (optional)

50

TLD: Attribute's rtexprvalue/type subelements● rtexprvalue (optional)– true if attribute value can be <%= expression %>

● attribute value can be determined at request time– false if attribute value is a fixed string (default)

● type (optional)– specifies the class to which the value of the

rtexprvalue should be typecast– only legal when rtexprvalue is set to true

51

Example: TLD (page 1)<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<!-- a tag library descriptor -->

<taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>msajsp-tags</shortname> <info> A tag library from More Servlets and JavaServer Pages, http://www.moreservlets.com/. </info>

52

Example: TLD (page 2) ...

<tag> <name>prime</name> <tagclass>moreservlets.tags.PrimeTag</tagclass> <bodycontent>empty</bodycontent> <info>Outputs a random N-digit prime.</info> <attribute> <name>length</name> <required>false</required> </attribute> </tag>

...</taglib>

53

Example: JSP Page (PrimeExample.jsp)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- Illustration of PrimeTag tag.

Taken from More Servlets and JavaServer Pages from Prentice Hall and Sun Microsystems Press, http://www.moreservlets.com/.(C) 2002 Marty Hall; may be freely used or adapted.

--><HTML><HEAD><TITLE>Some N-Digit Primes</TITLE><LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"></HEAD><BODY><H1>Some N-Digit Primes</H1><%@ taglib uri="/WEB-INF/msajsp-taglib.tld" prefix="msajsp" %><UL> <LI>20-digit: <msajsp:prime length="20" /> <LI>40-digit: <msajsp:prime length="40" /> <LI>60-digit: <msajsp:prime length="60" /> <LI>Default (50-digit): <msajsp:prime /></UL></BODY></HTML>

54

Example: Accessing PrimeExample.jsp

55

Including Tag BodyIncluding Tag Body

56

Including Tag body● <prefix:tagname>body</prefix:tagname>● Body content contains typical JSP constructs● JSP constructs inside of body content get

translated at page translation time● In this usage pattern, we are just including

body content without any modification

57

Tag handler class● doStartTag() method should return

EVAL_BODY_INCLUDE ● doEndTag() gets called after body is

evaluated– return EVAL_PAGE for continued processing – return SKIP_PAGE for aborting processing rest of

the page

58

Example: Tag Handler (page 1)HeadingTag.java package moreservlets.tags;

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;

/** Generates an HTML heading with the specified background * color, foreground color, alignment, font, and font size. * You can also turn on a border around it, which normally * just barely encloses the heading, but which can also * stretch wider. All attributes except the background * color are optional. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * &copy; 2002 Marty Hall; may be freely used or adapted. */

59

Example: Tag Handler (page 2)HeadingTag.java public class HeadingTag extends TagSupport { private String bgColor; // The one required attribute private String color = null; private String align="CENTER"; private String fontSize="36"; private String fontList="Arial, Helvetica, sans-serif"; private String border="0"; private String width=null; public void setBgColor(String bgColor) { this.bgColor = bgColor; }

public void setColor(String color) { this.color = color; }

...

60

Example: Tag Handler (page 3)HeadingTag.java public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.print("<TABLE BORDER=" + border + " BGCOLOR=\"" + bgColor + "\"" + " ALIGN=\"" + align + "\""); if (width != null) { out.print(" WIDTH=\"" + width + "\""); } out.print("><TR><TH>"); out.print("<SPAN STYLE=\"" + "font-size: " + fontSize + "px; " + "font-family: " + fontList + "; "); if (color != null) { out.println("color: " + color + ";"); } out.print("\"> "); // End of <SPAN ...> } catch(IOException ioe) { System.out.println("Error in HeadingTag: " + ioe); } return(EVAL_BODY_INCLUDE); // Include tag body }

61

Example: Tag Handler (page 4)HeadingTag.java public int doEndTag() { try { JspWriter out = pageContext.getOut(); out.print("</SPAN></TABLE>"); } catch(IOException ioe) { System.out.println("Error in HeadingTag: " + ioe); } return(EVAL_PAGE); // Continue with rest of JSP page }}

62

TLD● The bodycontent element should contain the

value JSP– <bodycontent>JSP</bodycontent>

63

Example: TLD <?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE ...>

<taglib> ... <tag> <name>heading</name> <tagclass>moreservlets.tags.HeadingTag</tagclass> <bodycontent>JSP</bodycontent> <info>Outputs a 1-cell table used as a heading.</info> <attribute> <name>bgColor</name> <required>true</required> <!-- bgColor is required --> </attribute> <attribute> <name>color</name> <required>false</required> </attribute> ...

64

Example: JSP Page (HeadingExample.jsp)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- Illustration of HeadingTag tag.

Taken from More Servlets and JavaServer Pagesfrom Prentice Hall and Sun Microsystems Press,http://www.moreservlets.com/.(C) 2002 Marty Hall; may be freely used or adapted.--><HTML><HEAD><TITLE>Some Tag-Generated Headings</TITLE></HEAD><BODY><%@ taglib uri="/WEB-INF/msajsp-taglib.tld" prefix="msajsp" %><msajsp:heading bgColor="#C0C0C0">Default Heading</msajsp:heading><P><msajsp:heading bgColor="BLACK" color="WHITE">White on Black Heading</msajsp:heading>

65

Example: JSP Page (HeadingExample.jsp)

<P><msajsp:heading bgColor="#EF8429" fontSize="60" border="5">Large Bordered Heading</msajsp:heading><P><msajsp:heading bgColor="CYAN" width="100%">Heading with Full-Width Background</msajsp:heading><P><msajsp:heading bgColor="CYAN" fontSize="60" fontList="Brush Script MT, Times, serif">Heading with Non-Standard Font</msajsp:heading></BODY></HTML>

66

67

OptionallyOptionallyIncluding Tag BodyIncluding Tag Body

68

Optionally Including Tag body● Decision of usage of body content is decided

at request time● Body content is not modified

69

Tag handler class● doStartTag() method returns either

EVAL_BODY_INCLUDE or SKIP_BODY– depending on the value of some request time

expression, for example● Call getRequest() from pageContext field of

TagSupport– Typecast the return of getRequest() to

HttpServletRequest since getRequest() returns ServletRequest type

70

Example: Tag Handler (page 1)DebugTag.java package moreservlets.tags;

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;import javax.servlet.*;

/** A tag that includes the body content only if * the "debug" request parameter is set. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * &copy; 2002 Marty Hall; may be freely used or adapted. */

71

Example: Tag Handler (page 2)DebugTag.java public class DebugTag extends TagSupport { public int doStartTag() { ServletRequest request = pageContext.getRequest(); String debugFlag = request.getParameter("debug"); if ((debugFlag != null) && (!debugFlag.equalsIgnoreCase("false"))) { return(EVAL_BODY_INCLUDE); } else { return(SKIP_BODY); } }}

72

Example: TLD <?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE ...>

<taglib> ... <tag> <name>debug</name> <tagclass>moreservlets.tags.DebugTag</tagclass> <bodycontent>JSP</bodycontent> <info>Includes body only if debug param is set.</info> </tag>

...

73

Example: JSP Page (DebugExample.jsp)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- Illustration of DebugTag tag.

Taken from More Servlets and JavaServer Pagesfrom Prentice Hall and Sun Microsystems Press,http://www.moreservlets.com/.(C) 2002 Marty Hall; may be freely used or adapted.--><HTML><HEAD><TITLE>Using the Debug Tag</TITLE><LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"></HEAD><BODY><H1>Using the Debug Tag</H1><%@ taglib uri="/WEB-INF/msajsp-taglib.tld" prefix="msajsp" %>Top of regular page. Blah, blah, blah. Yadda, yadda, yadda.<P>

74

Example: JSP Page (DebugExample.jsp)<msajsp:debug><B>Debug:</B><UL> <LI>Current time: <%= new java.util.Date() %> <LI>Requesting hostname: <%= request.getRemoteHost() %> <LI>Session ID: <%= session.getId() %></UL></msajsp:debug><P>Bottom of regular page. Blah, blah, blah. Yadda, yadda, yadda.</BODY></HTML>

75

DebugTag without “debug” inputparameter

76

Accessing DebugExample.jsp with “debug=true” input param

77

Manipulating Tag BodyManipulating Tag Body

78

Tag handler class● Tag handler class should extend

BodyTagSupport class ● BodyTagSupport class has 2 convenience

methods– doAfterBody(): override this method in order to

manipulate the tag body● return SKIP_BODY if no further body processing is needed● return EVAL_BODY_TAG (JSP 1.1) or

EVAL_BODY_AGAIN (JSP 1.2) if the body content needs to be evaluated and handled again

– getBodyContent(): returns BodyContent object

79

BodyContent class● An encapsulation of the evaluation of the

body ● A subclass of JspWriter● BodyContent class has 3 methods– getEnclosingWriter(): returns JspWriter– getReader(): returns a Reader that can read tag

body– getString(): returns a String containing entire tag

body

80

Example: Tag Handler (page 1)FilterTag.java package moreservlets.tags;

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;import moreservlets.*;

/** A tag that replaces <, >, ", and & with their HTML * character entities (&lt;, &gt;, &quot;, and &amp;). * After filtering, arbitrary strings can be placed * in either the page body or in HTML attributes. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * &copy; 2002 Marty Hall; may be freely used or adapted. */

81

Example: Tag Handler (page 2)FilterTag.java public class FilterTag extends BodyTagSupport { public int doAfterBody() { BodyContent body = getBodyContent(); String filteredBody = ServletUtilities.filter(body.getString()); try { JspWriter out = body.getEnclosingWriter(); out.print(filteredBody); } catch(IOException ioe) { System.out.println("Error in FilterTag: " + ioe); } // SKIP_BODY means we're done. If we wanted to evaluate // and handle the body again, we'd return EVAL_BODY_TAG // (JSP 1.1/1.2) or EVAL_BODY_AGAIN (JSP 1.2 only) return(SKIP_BODY); }}

82

Example: TLD <?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE ...>

<taglib> ... <tag> <name>filter</name> <tagclass>moreservlets.tags.FilterTag</tagclass> <bodycontent>JSP</bodycontent> <info>Replaces HTML-specific characters in body.</info> </tag>

...

83

Example: JSP Page (FilterExample.jsp)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- Illustration of FilterTag tag.

Taken from More Servlets and JavaServer Pagesfrom Prentice Hall and Sun Microsystems Press,http://www.moreservlets.com/.(C) 2002 Marty Hall; may be freely used or adapted.--><HTML><HEAD><TITLE>HTML Logical Character Styles</TITLE><LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"></HEAD><BODY><H1>HTML Logical Character Styles</H1>Physical character styles (B, I, etc.) are rendered consistentlyin different browsers. Logical character styles, however,may be rendered differently by different browsers.Here's how your browser (<%= request.getHeader("User-Agent") %>) renders the HTML 4.0 logical character styles:<P>

84

Example: JSP Page (FilterExample.jsp)<%@ taglib uri="/WEB-INF/msajsp-taglib.tld" prefix="msajsp" %><TABLE BORDER=1 ALIGN="CENTER"><TR CLASS="COLORED"><TH>Example<TH>Result<TR><TD><PRE><msajsp:filter><EM>Some emphasized text.</EM><BR><STRONG>Some strongly emphasized text.</STRONG><BR><CODE>Some code.</CODE><BR><SAMP>Some sample text.</SAMP><BR><KBD>Some keyboard text.</KBD><BR><DFN>A term being defined.</DFN><BR><VAR>A variable.</VAR><BR><CITE>A citation or reference.</CITE></msajsp:filter></PRE><TD><EM>Some emphasized text.</EM><BR><STRONG>Some strongly emphasized text.</STRONG><BR><CODE>Some code.</CODE><BR><SAMP>Some sample text.</SAMP><BR><KBD>Some keyboard text.</KBD><BR><DFN>A term being defined.</DFN><BR><VAR>A variable.</VAR><BR><CITE>A citation or reference.</CITE></TABLE></BODY></HTML>

85

To be added

86

Including or Manipulating Including or Manipulating Tag Body Multiple TimesTag Body Multiple Times

87

Tag handler class● Tag handler class should extend

BodyTagSupport class ● doAfterBody() now returns

EVAL_BODY_TAG (EVAL_BODY_AGAIN in JSP 1.2)

88

Example: Tag Handler (page 1)RepeatTag.java package moreservlets.tags;

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import java.io.*;

/** A tag that repeats the body the specified * number of times. * <P> * Taken from More Servlets and JavaServer Pages * from Prentice Hall and Sun Microsystems Press, * http://www.moreservlets.com/. * &copy; 2002 Marty Hall; may be freely used or adapted. */

89

Example: Tag Handler (page 2)RepeatTag.java public class RepeatTag extends BodyTagSupport { private int reps;

public void setReps(String repeats) { try { reps = Integer.parseInt(repeats); } catch(NumberFormatException nfe) { reps = 1; } }

90

Example: Tag Handler (page 3)RepeatTag.java public int doAfterBody() { if (reps-- >= 1) { BodyContent body = getBodyContent(); try { JspWriter out = body.getEnclosingWriter(); out.println(body.getString()); body.clearBody(); // Clear for next evaluation } catch(IOException ioe) { System.out.println("Error in RepeatTag: " + ioe); } // Replace EVAL_BODY_TAG with EVAL_BODY_AGAIN in JSP 1.2. return(EVAL_BODY_TAG); } else { return(SKIP_BODY); } }

91

Example: TLD <?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE ...>

<taglib> ... <tag> <name>repeat</name> <tagclass>moreservlets.tags.RepeatTag</tagclass> <bodycontent>JSP</bodycontent> <info>Repeats body the specified number of times.</info> <attribute> <name>reps</name> <required>true</required> <!-- rtexprvalue indicates whether attribute can be a JSP expression. --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> ...

92

Example: JSP Page (RepeatExample.jsp)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- Illustration of RepeatTag tag.

Taken from More Servlets and JavaServer Pagesfrom Prentice Hall and Sun Microsystems Press,http://www.moreservlets.com/.(C) 2002 Marty Hall; may be freely used or adapted. --><HTML><HEAD><TITLE>Some 40-Digit Primes</TITLE><LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"></HEAD><BODY><H1>Some 40-Digit Primes</H1>Each entry in the following list is the first prime number higher than a randomly selected 40-digit number.

93

Example: JSP Page (RepeatExample.jsp)<%@ taglib uri="/WEB-INF/msajsp-taglib.tld" prefix="msajsp" %><OL><!-- Repeats N times. A null reps value means repeat once. --><msajsp:repeat reps='<%= request.getParameter("repeats") %>'> <LI><msajsp:prime length="40" /></msajsp:repeat></OL></BODY></HTML>

94

To be added

95

More detailed informationMore detailed informationon How to declare tagon How to declare tag

library using taglib directivelibrary using taglib directive

96

Declaring a tag library: uri attribute(3 different ways - 2 on this slide)● Direct reference to TLD file– <%@ taglib prefix="tlt" uri="/WEB-INF/iterator.tld"%>

● Indirect reference to TLD file using a logical name– <%@ taglib prefix="tlt" uri="/tlt"%> – Mapping of the logical name to path to the TLD file

has to be defined in web.xml <jsp-config> <taglib> <taglib-uri>/tlt</taglib-uri> <taglib-location>/WEB-INF/iterator.tld</taglib-location> </taglib></jsp-config>

97

Declaring a tag library: uri attribute(3 different ways - 1 on this slide)● Absolute URI - examples of JSTL tag libraries

<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core"%><%@ taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml"%><%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%><%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

98

More detailed information onMore detailed information onHow to Configure tag library How to Configure tag library

with Web applicationwith Web application

99

Configuring tag library with individual Web app

● In unpacked form– tag handler classes are packaged under

the /WEB-INF/classes/ directory– *.tld file under the /WEB-INF/ directory

● In packaged form (*.jar file)– *.jar file is in the /WEB-INF/lib/ directory

100

How does it Work?How does it Work?

101

How does it work?● JSP translator locates the TLD file via uri

attribute of taglib directive– The TLD file describes the binding between an

action (tag handler) and a Tag● Using a tag in a JSP page generates the

appropriate servlet code– The servlet code contains tag handler

102

Sequence of Calls from Container

103

TagSupport Implements Tag Interface

104

doStartTag() and doEndTag()● doStartTag()– Processes starting element (semantics)– Returns EVAL_BODY_INCLUDE to process body– Returns SKIP_BODY to skip body

● doEndTag()– Completes element processing (flush)– Returns EVAL_PAGE to continue processing– Returns SKIP_PAGE to terminate processing

● Both can throw JspException

105

Calling Sequence from the ContainerObtainhandlerObtainhandler

Set propertiesSet properties Set attributevalues

Set attributevalues

Release( )Release( )

doStartTag( )

Process bodyProcess body

doEndTag( )

Release( )Release( )

ContinueContinueStop

Skip_page Eval_page

Skip_body

Eval_body_include

setPageContext( )setParent( )

106

How Is a Tag Invoked?● JSP technology creates (or reuses) a Tag class instance

associated with the element in the page source– Class is named in the TLD

● Container calls setPageContext() and setParent()– parent (possibly null, unless nested)– PageContext provides access to: request, response,

out, session, page and attributes● Container calls setX() methods for attributes specified● Container calls doStartTag() and doEndTag()● Container invokes release() to free Tag instance for

reuse

107

How Is a Tag Invoked?

<prefix:actionName attr1=“value1” attr2=“value2”>

The body

</prefix:actionName>

• setAttr1(“values1”)

• setAttr2(“value2”)

• doStartTag( )

• setBodyContent( )

• doInitBody( )

• doAfterBody( )

• doEndTag( )

setPageContext()setParent()

108

JSP Page Response Output

● The output of the page is written into a JSPWriter provided by the page implementation

● This is flushed to the output stream of the ServletResponse.

● Output is buffered in the JSPWriter by default.● Tags output to nested JSPWriter streams.

109

BodyTag, BodyTagSupport • For manipulating or evaluating body multiple times,

use BodyTagSupport which is BodyTag type• Example of iteration:

– such as order rows, search results and etc

110

How Does BodyTag Work?

111

BodyContent

112

Manipulating BodyContent (1)● JSP technology creates a nested stream

(BodyContent) to contain the body text● The BodyContent is passed to the

BodyTag via setBodyContent()● doStartBody() is invoked● doInitBody() is invoked● The body text is evaluated into the

BodyContent

113

Manipulating BodyContent (2)● doAfterBody() is invoked:– It must process the content of the nested stream and

write to nesting stream (out)– It can cause the page to be re-evaluated (to support

iterative tags) by returning EVAL_BODY_TAG● Invoke doEndTag().

114

BodyTag Method Semantics● doStartTag():– Same as Tag semantic, except:

• Returns EVAL_BODY_TAG to process body

● doBodyInit():– Prepare to process body

● doAfterBody() :– Handle processed body in BodyContent– Return EVAL_BODY_TAG to reprocess

● DoEndTag() :– Same as Tag Semantics

115

Passion!Passion!