Example Analysis of Usage of Custom Label in jsp

  • 2021-07-24 11:34:47
  • OfStack

This article illustrates the use of custom tags in jsp. Share it for your reference. The details are as follows:

Here simply write a custom label, the advantage of defining the label is in the jsp page can use their own defined functions, completely separated from the Java code

1. The tld file is as follows:

The first thing to do is to write the *. tld file. When the project starts with the server, it will check whether there is a * tld file in the project.
tld file written by


<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
  version="2.1">
  <!--  Definition version  -->
  <tlib-version>1.0</tlib-version>
  <!--  Define a name  -->
  <short-name>apsliyuan</short-name>
  <!--  Definition uri -->
  <uri>http://my.oschina.net/aps</uri>
  <!--  Define your own class  -->
  <tag>
    <!-- name  Is in jsp The name of the label displayed in the, <aps:hellowTag/> -->
    <name>hellowTag</name>
    <!--  The full path of the label class written by yourself  -->
    <tag-class>cn.itcast.apsliyuan.tag.HellowtTag</tag-class>
    <!-- jsp Is the content to be displayed in the theme in, there are 4 Attributes,   If is empty Words. In jsp Tags in the page can't define their own content, otherwise they will report  Servlet.service() 
      for servlet jsp threw exception org.apache.jasper.JasperException: /index.jsp(12,8) 
      According to TLD, tag aps:hellowTag must be empty, but is not  Anomaly 
     -->
    <body-content>JSP</body-content>
  </tag>
<!-- 
   There is no attribute written here, so I have time to make it up 
 -->
  <tag>
    <name>ApsliyuanTag</name>
    <tag-class>cn.itcast.apsliyuan.tag.ApsliyuanTag</tag-class>
    <body-content>JSP</body-content>
  </tag>
</taglib>

2. The custom tag class java code is as follows:


// Custom label class 
package cn.itcast.apsliyuan.tag;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class HellowtTag extends TagSupport{
  /**
   * 
   */
  private static final long serialVersionUID = 1781703371130382609L;
  @Override
  public int doStartTag() throws JspException {
    // TODO Auto-generated method stub
    JspWriter out = pageContext.getOut();
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
      out.print(format.format(new Date()));
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return EVAL_BODY_INCLUDE;
  }
  @Override
  public int doEndTag() throws JspException {
    // TODO Auto-generated method stub
    JspWriter out = pageContext.getOut();
    try {
      out.print("<br/> <hr/> The tag is finished ");
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return EVAL_PAGE;
  }
}

3. jsp introduces the following self-defined tag code:


//jsp Introduce self-defined tags in 
<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
  <%@taglib uri="http://my.oschina.net/aps" prefix="aps" %>
  <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index.jsp</title>
</head>
<body>
   Now the time is: <aps:hellowTag> </aps:hellowTag><br/>
  <hr/>
   The people I love are:  <aps:ApsliyuanTag/>
</body>
</html>

4. The code for TagSupport is as follows:


// Take a look TagSupport The source code in,   This is the adapter mode 
public class TagSupport implements IterationTag, Serializable {
  public static final Tag findAncestorWithClass(Tag from,
      // TCK signature test fails with generics
      @SuppressWarnings("unchecked")
      Class klass) {
  boolean isInterface = false;
  if (from == null ||
    klass == null ||
    (!Tag.class.isAssignableFrom(klass) &&
     !(isInterface = klass.isInterface()))) {
    return null;
  }
  for (;;) {
    Tag tag = from.getParent();
    if (tag == null) {
    return null;
    }
    if ((isInterface && klass.isInstance(tag)) ||
      klass.isAssignableFrom(tag.getClass()))
    return tag;
    else
    from = tag;
  }
  }
  /**
   * Default constructor, all subclasses are required to define only
   * a public constructor with the same signature, and to call the
   * superclass constructor.
   *
   * This constructor is called by the code generated by the JSP
   * translator.
   */
  public TagSupport() { }
  /**
   * Default processing of the start tag, returning SKIP_BODY.
   *
   * @return SKIP_BODY
   * @throws JspException if an error occurs while processing this tag
   *
   * @see Tag#doStartTag()
   */
  public int doStartTag() throws JspException {
    return SKIP_BODY;
  }
  /**
   * Default processing of the end tag returning EVAL_PAGE.
   *
   * @return EVAL_PAGE
   * @throws JspException if an error occurs while processing this tag
   *
   * @see Tag#doEndTag()
   */
  public int doEndTag() throws JspException {
  return EVAL_PAGE;
  }
  /**
   * Default processing for a body.
   *
   * @return SKIP_BODY
   * @throws JspException if an error occurs while processing this tag
   *
   * @see IterationTag#doAfterBody()
   */
  public int doAfterBody() throws JspException {
  return SKIP_BODY;
  }
  // Actions related to body evaluation
  /**
   * Release state.
   *
   * @see Tag#release()
   */
  public void release() {
  parent = null;
  id = null;
  if( values != null ) {
    values.clear();
  }
  values = null;
  }
  /**
   * Set the nesting tag of this tag.
   *
   * @param t The parent Tag.
   * @see Tag#setParent(Tag)
   */
  public void setParent(Tag t) {
  parent = t;
  }
  /**
   * The Tag instance most closely enclosing this tag instance.
   * @see Tag#getParent()
   *
   * @return the parent tag instance or null
   */
  public Tag getParent() {
  return parent;
  }
  /**
   * Set the id attribute for this tag.
   *
   * @param id The String for the id.
   */
  public void setId(String id) {
  this.id = id;
  }
  /**
   * The value of the id attribute of this tag; or null.
   *
   * @return the value of the id attribute, or null
   */
  public String getId() {
  return id;
  }
  /**
   * Set the page context.
   *
   * @param pageContext The PageContext.
   * @see Tag#setPageContext
   */
  public void setPageContext(PageContext pageContext) {
  this.pageContext = pageContext;
  }
  /**
   * Associate a value with a String key.
   *
   * @param k The key String.
   * @param o The value to associate.
   */
  public void setValue(String k, Object o) {
  if (values == null) {
    values = new Hashtable<String, Object>();
  }
  values.put(k, o);
  }
  /**
   * Get a the value associated with a key.
   *
   * @param k The string key.
   * @return The value associated with the key, or null.
   */
  public Object getValue(String k) {
  if (values == null) {
    return null;
  } else {
    return values.get(k);
  }
  }
  /**
   * Remove a value associated with a key.
   *
   * @param k The string key.
   */
  public void removeValue(String k) {
  if (values != null) {
    values.remove(k);
  }
  }
  /**
   * Enumerate the keys for the values kept by this tag handler.
   *
   * @return An enumeration of all the keys for the values set,
   *   or null or an empty Enumeration if no values have been set.
   */
  public Enumeration<String> getValues() {
  if (values == null) {
    return null;
  }
  return values.keys();
  }
  // private fields
  private  Tag     parent;
  private  Hashtable<String, Object>  values;
  /**
   * The value of the id attribute of this tag; or null.
   */
  protected String   id;
  // protected fields
  /**
   * The PageContext.
   */
  protected PageContext pageContext;
}

Return value of doStartTag

The value returned in doStartTag determines how the data in body part is displayed.

Two return values:

0 SKIP_BODY constant. body is not displayed.
1-EVAN_BODY_INCLUDE; Contains the data of body part, which is displayed normally.
3: There are also two return values in doEndTag

Determines whether the following sections of the page are displayed:

SKIP_PAGE: The following page sections are no longer displayed.

EVAL_PAGE: Displays the following page section.

I hope this article is helpful to everyone's JSP programming.


Related articles: