Custom tags allow a developer to give non-programmers access to sophisticated class libraries through a simple XML (similar to HTML) tag. In order to develop a custom tag a few guidelines must be followed, which are outlined in the JSP 1.1 specification. Once a custom tag has been created it must be added to the TLD (Tag Library Definition) file. An example of a TLD file with one entry would be:

<?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>transformationbeans</shortname>
	<info>Tag Library For SAS Transformation Beans</info>
<tag>
		<name>Checkbox</name>
		<tagclass>com.sas.servlet.beans.taglets.Checkbox</tagclass>
		<teiclass>com.sas.servlet.beans.taglets.tei.CheckboxInfo</teiclass>
		<info>SAS Checkbox Transformation Bean</info>
		<attribute>
			<name>id</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
</tag>
</taglib>

In addition to the tag class itself, you may also specify a TEI (Tag Extra Info) class. A TEI class allows you to specify variables that you would like to either instantiate and/or set values to with in a JSP page. Now that you have a TLD file specified, the next step is to tell the Servlet Engine where to find the file, and how to reference it. A sample Web Descriptor (web.xml) file would be:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>

    <taglib>
        <taglib-uri>http://localhost/transforms/transform-taglib</taglib-uri>
        <taglib-location>/WEB-INF/transforms.tld</taglib-location>
    </taglib>

</web-app>
The final step in making a custom tag available for use with in a JSP page is to add the JSP directive to the top of the JSP page.  A simple JSP page that utilizes the examples previously specified would look like:
<%@ taglib uri="http://localhost/transforms/transform-taglib" prefix="sas" %>
<HTML>
   <HEAD>
      <TITLE>Sample JSP/Custom Tag Page</TITLE>
   </HEAD>
   <BODY>
      <CENTER>
         <FONT SIZE=”+4”>Sample JSP/Custom Tag Page</FONT>
      </CENTER>
      <P>
      <FORM ACTION=”duh_submit.jsp” METHOD=”POST”>
         <sas:Checkbox id=”cbox” />
      </FORM>
   </BODY>
</HTML>

The Checkbox tag could just have easily been written as:

<sas:Checkbox id=”cbox”>

Other Information Inside the Body of the Checkbox Tag

</sas:Checkbox>

The only reason to have a body inside the tag (the above example) is to specify/use variables that the custom tag produces.