JSP Custom Tags
Custom tags are user-defined elements in the JSP language. When a JSP page includes a custom tag, it is converted into a servlet, with the tag being transformed into operations on an object called a tag handler. These operations are then called by the web container when the servlet executes.
JSP tag extensions allow you to create new tags that can be directly inserted into a JSP page. The JSP 2.0 specification introduced Simple Tag Handlers for writing these custom tags.
You can extend the SimpleTagSupport class and override the doTag() method to develop a simple custom tag.
Creating a "Hello" Tag
Next, we want to create a custom tag called <ex:Hello>
, with the format:
<ex:Hello />
To create a custom JSP tag, you must first create a Java class to handle the tag. So, let's create a HelloTag class as follows:
package com.tutorialpro;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Custom Tag!");
}
}
The following code overrides the doTag() method, which uses the getJspContext() method to obtain the current JspContext object and passes "Hello Custom Tag!" to the JspWriter object.
Compile the above class and copy it to the CLASSPATH directory. Finally, create the following tag library: <Tomcat installation directory>webapps\ROOT\WEB-INF\custom.tld
.
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialpro.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
Next, we can use the Hello tag in a JSP file:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello/>
</body>
</html>
The above program outputs:
Hello Custom Tag!
Accessing Tag Body
You can include message content within the tag, similar to standard tag libraries. If we want to include content in our custom Hello tag, it would look like this:
<ex:Hello>
This is message body
</ex:Hello>
We can modify the tag handler class file as follows:
package com.tutorialpro;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException
{
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
Next, we need to modify the TLD file as follows:
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<taglib>
<tag>
<tag-class>com.tutorialpro.HelloTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
Now we can use the modified tag in JSP as shown below:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello>
This is message body
</ex:Hello>
</body>
</html>
The output of the above program is as follows:
This is message body
Custom Tag Attributes
You can set various attributes in your custom tag. To receive attributes, the custom tag class must implement setter methods, as shown in JavaBean:
package com.tutorialpro;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
private String message;
public void setMessage(String msg) {
this.message = msg;
}
StringWriter sw = new StringWriter();
public void doTag()
throws JspException, IOException
{
if (message != null) {
/* Use message from attribute */
JspWriter out = getJspContext().getOut();
out.println( message );
}
else {
/* Use message from body content */
getJspBody().invoke(sw);
getJspContext().getOut().println(sw.toString());
}
}
}
The attribute name is "message", so the setter method is setMessage(). Now let's add this attribute using the <attribute>
element in the TLD file:
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD with Body</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialpro.HelloTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>message</name>
</attribute>
</tag>
</taglib>
Now we can use the message attribute in the JSP file as shown below:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello message="This is custom tag" />
</body>
</html>
The output of the above example is:
This is custom tag
You can also include the following attributes:
Attribute | Description |
---|---|
name | Defines the name of the attribute. Each tag's attribute name must be unique. |
required | Specifies whether the attribute is mandatory or optional. If set to false, it is optional. |
rtexprvalue | Declares whether the tag attribute value is valid at runtime. |
type | Defines the Java class type of the attribute. Defaults to String. |
description | Descriptive information. |
If this attribute is declared, the attribute value will be treated as a JspFragment.
Below is an example of specifying the related attribute:
.....
<attribute>
<name>attribute_name</name>
<required>false</required>
<type>java.util.Date</type>
<fragment>false</fragment>
</attribute>
.....
If you use two attributes, modify the TLD file as follows:
.....
<attribute>
<name>attribute_name1</name>
<required>false</required>
<type>java.util.Boolean</type>
<fragment>false</fragment>
</attribute>
<attribute>
<name>attribute_name2</name>
<required>true</required>
<type>java.util.Date</type>
</attribute>
.....