YouTip LogoYouTip

Jsp Custom Tags

JSP Custom Tags

Custom tags are user-defined JSP language elements. When a JSP page contains a custom tag, it is transformed into a servlet, and the tag is transformed into operations on an object called a tag handler. That is, when the servlet executes, the Web container calls those operations.

JSP tag extensions allow you to create new tags and insert them directly into a JSP page. The JSP 2.0 specification introduced Simple Tag Handlers to write these custom tags.

You can develop the simplest custom tag by inheriting the SimpleTagSupport class and overriding the doTag() method.


Creating a "Hello" Tag

Next, we want to create a custom tag called , with the following format:

To create a custom JSP tag, you must first create a Java class that handles the tag. So, let's create a HelloTag class as shown below:

package com.tutorial;

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. Inside the method, it uses the getJspContext() method to get the current JspContext object and passes "Hello Custom Tag!" to the JspWriter object.

Compile the above class and copy it to the directory specified by the CLASSPATH environment variable. Finally, create the tag library descriptor file as follows: webappsROOTWEB-INFcustom.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.tutorial.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 output of the above program is:

Hello Custom Tag!


Accessing the Tag Body

You can include message content within a tag, similar to standard tag libraries. For example, if we want to include content within our custom Hello tag, the format is as follows:

<ex:Hello>
    This is message body
</ex:Hello>

We can modify the tag handler class file as follows:

package com.tutorial;

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 shown below:

<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.tutorial.HelloTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>
</taglib>

Now we can use the modified tag in a JSP as follows:

<%@ 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 a custom tag. To receive attributes, the custom tag class must implement setter methods, similar to the setter methods in a JavaBean, as shown below:

package com.tutorial;

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 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.tutorial.HelloTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>message</name>
        </attribute>
    </tag>
</taglib>

Now we can use the message attribute in a JSP file as follows:

<%@ 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. The attribute name for each tag must be unique.
required Specifies whether the attribute is required or optional. If set to false, it is optional.
rtexprvalue Declares whether the tag attribute is valid for a runtime expression.
type Defines the Java class type of the attribute. The default is specified as String.
description Description information.
fragment If this attribute is declared, the attribute value will be treated as a JspFragment.

Here is an example specifying related attributes:

.....
    <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>
.....
← Jsp Expression LanguageJsp Javabean β†’