SE 452 Lecture Notes


Week 7: Custom Tag Libraries



Administrative [1/11]
JSP Tag Extensions [2/11]
Tag Libs vs. Java Beans [3/11]
Creating a custom tag [4/11]
The tag handler [5/11]
Tag Handler Life Cycle [6/11]
Tag Library Descriptor (TLD) [7/11]
JSP that uses our new tag [8/11]
Where to deploy [9/11]
Using the tag contents [10/11]
Exam next week [11/11]

Administrative [1/11]




JSP Tag Extensions [2/11]




Tag Libs vs. Java Beans [3/11]



Creating a custom tag [4/11]



The tag handler [5/11]


package edu.depaul.se452; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.io.*; public class HelloWorldTag extends TagSupport { protected String myString; public void setMyString(String myString) { this.myString = myString; } public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.print("Hello, " + myString + "!"); } catch(IOException ioe) {} return(SKIP_BODY); } } HelloWorldTag.java

Tag Handler Life Cycle [6/11]


You can overwrite as many of the below methods as you need to. So you should know what happens when.

default properties initialized ->
all properties initialized from tag ->
pageContext initialized ->
doStartTag() ->
setBodyContent() ->
doInitBody() ->
doAfterBody() ->
doEndTag()

Tag Library Descriptor (TLD) [7/11]


<?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"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>se452</shortname> <tag> <name>helloTag</name> <tagclass>edu.depaul.se452.HelloWorldTag</tagclass> <bodycontent>EMPTY</bodycontent> <attribute> <name>myString</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> se452-taglib.tld

JSP that uses our new tag [8/11]


<html> <title>MyFirst Tag</title> <body> <%@page import="java.util.*" %> <%@taglib uri="WEB-INF/se452-taglib.tld" prefix="se452" %> Let's try our first tag<br> <se452:helloTag myString="<%= \"World on \" + new Date() %>" /> </body> </html> myFirstTag.jsp

Where to deploy [9/11]



Using the tag contents [10/11]


package edu.depaul.se452; import java.util.Arrays; import java.util.List; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; public class CounterTag extends BodyTagSupport { private List theList = ListClass.getList(); private int size = theList.size(); public int doAfterBody() { BodyContent bodyContent = getBodyContent(); if (size > 0) { try { JspWriter out = bodyContent.getEnclosingWriter(); out.println(bodyContent.getString() + theList.get(--size)); bodyContent.clearBody(); } catch (Exception e) {} return EVAL_BODY_AGAIN; } return SKIP_BODY; } } class ListClass { private static String[] ar = new String[] { "jen", "joe", "sue" }; public static List getList() { return Arrays.asList(ar); } } CounterTag.java <?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"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>se452</shortname> <tag> <name>helloTag</name> <tagclass>edu.depaul.se452.HelloWorldTag</tagclass> <bodycontent>EMPTY</bodycontent> <attribute> <name>myString</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>counter</name> <tagclass>edu.depaul.se452.CounterTag</tagclass> <bodycontent>JSP</bodycontent> </tag> </taglib> se452-taglib.tld <html> <title>My Second Tag</title> <body> <%@page import="java.util.*" %> <%@taglib uri="WEB-INF/se452-taglib.tld" prefix="se452" %> Let's try our second tag<br> <ul> <se452:counter><li></se452:counter> </ul> </body> </html> mySecondTag.jsp

Exam next week [11/11]


Exam next week
Homework due before class