📜  JSP-自定义标签

📅  最后修改于: 2020-11-13 05:29:18             🧑  作者: Mango


在本章中,我们将讨论JSP中的自定义标签。定制标记是用户定义的JSP语言元素。将包含定制标记的JSP页面转换为servlet时,该标记将转换为对称为标记处理程序的对象的操作。然后,当执行JSP页面的servlet时,Web容器将调用这些操作。

JSP标记扩展允许您创建可以直接插入JavaServer Page中的新标记。 JSP 2.0规范引入了用于编写这些定制标记的简单标记处理程序。

要编写自定义标签,只需扩展SimpleTagSupport类并覆盖doTag()方法,即可在其中放置代码以生成标签内容。

创建“你好”标签

考虑您要定义一个名为的自定义标签,并且您想以以下方式使用它而不使用主体-


要创建自定义JSP标记,必须首先创建一个充当标记处理程序的Java类。现在让我们如下创建HelloTag类:

package com.tutorialspoint;

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!");
   }
}

上面的代码具有简单的编码,其中doTag()方法使用getJspContext()方法获取当前JspContext对象,并使用它发送“ Hello Custom Tag!”。到当前的JspWriter对象

让我们编译上面的类并将其复制到环境变量CLASSPATH中可用的目录中。最后,创建以下标记库文件: webapps \ ROOT \ WEB-INF \ custom.tld


   1.0
   2.0
   Example TLD
   
   
      Hello
      com.tutorialspoint.HelloTag
      empty
   

现在让我们在JSP程序中使用上面定义的自定义标记Hello ,如下所示:

A sample custom tag
   
   
   
      
   

调用上述JSP,这将产生以下结果-

Hello Custom Tag!

访问标签主体

您可以像在标准标签中看到的那样在标签正文中包含一条消息。考虑您要定义一个名为的自定义标签,并且要以以下方式将其与主体一起使用-


   This is message body

让我们在上面的标记代码中进行以下更改,以处理标记的主体-

package com.tutorialspoint;

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());
   }
}

在这里,调用产生的输出首先被捕获到StringWriter中,然后再写入与该标签关联的JspWriter中。我们需要如下更改TLD文件-


   1.0
   2.0
   Example TLD with Body
   
   
      Hello
      com.tutorialspoint.HelloTag
      scriptless
   

现在让我们用适当的身体来称呼上面的标签,如下所示:

A sample custom tag
   
   
   
      
         This is message body
      
   

您将收到以下结果-

This is message body

自定义标签属性

您可以将各种属性与自定义标签一起使用。要接受属性值,定制标签类需要实现setter方法,与JavaBean setter方法相同,如下所示-

package com.tutorialspoint;

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 the body */
         getJspBody().invoke(sw);
         getJspContext().getOut().println(sw.toString());
      }
   }
}

该属性的名称为“ message” ,因此setter方法为setMessage() 。现在让我们使用元素将此属性添加到TLD文件中,如下所示-


   1.0
   2.0
   Example TLD with Body
   
   
      Hello
      com.tutorialspoint.HelloTag
      scriptless
      
      
         message
      
   
   

让我们遵循JSP的message属性,如下所示:

A sample custom tag
   
   
   
      
   

这将产生以下结果-

This is custom tag

考虑为属性包括以下属性-

S.No. Property & Purpose
1

name

The name element defines the name of an attribute. Each attribute name must be unique for a particular tag.

2

required

This specifies if this attribute is required or is an optional one. It would be false for optional.

3

rtexprvalue

Declares if a runtime expression value for a tag attribute is valid

4

type

Defines the Java class-type of this attribute. By default it is assumed as String

5

description

Informational description can be provided.

6

fragment

Declares if this attribute value should be treated as a JspFragment.

以下是指定与属性相关的属性的示例-

.....
   
      attribute_name
      false
      java.util.Date
      false
   
.....

如果您使用两个属性,则可以按以下方式修改TLD-

.....
   
      attribute_name1
      false
      java.util.Boolean
      false
   
   
   
      attribute_name2
      true
      java.util.Date
   
.....