WEB DEVELOPER SITE
HTMLCSSJAVASCRIPTSQLPHPBOOTSTRAPJQUERYANGULARXML
 

JSP custom tags


Custom tags are user-defined JSP language elements. When a JSP page contains a custom tag, it will be converted to a servlet Operations on objects called tag handlers, that is, those operations that the Web container invokes when the servlet executes.

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

You can extend the SimpleTagSupport class and override the doTag () method to develop the simplest custom tag.


Create "Hello" tags

Next, we want to create a custom tag called <ex:Hello>,Mark The signature format is:

<ex:Hello />

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.welookups;

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

Compile the above classes and copy them to the environment variable 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.welookups.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

Next, we can use Hello tags in JSP files:

<%@ 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!

Access tag body

You can include message content in tags just like the standard tag library. If we want to include content in our custom Hello, the format is as follows:

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

We can modify the tag processing class file, the code is as follows:

package com.welookups;

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

Now we can use the modified tags in 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 the custom standard. To receive attributes, the value custom tag class must implement setter methods. The setter methods in JavaBeans are as follows:

package com.welookups;

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) {
          /* Using messages from attributes */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* Using messages from the content body */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }

}

The name of the attribute is "message", so the setter method is setMessage (). Now let's use in the TLD file <attribute>Element adds this attribute:

<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.welookups.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 data is:

This is custom tag

You can also include the following attributes:

by default
Attribute Description
name Defines the name of the attribute. Each tag's attribute name 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 when the expression is run.
type Defines the Java class type of the attribute. String
description Description information
fragment If the attribute is declared, the attribute value will be treated as a JspFragment .

The following is an example of 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>
.....