zoukankan      html  css  js  c++  java
  • JSP自定义标签

    以下内容引用自http://wiki.jikexueyuan.com/project/jsp/custom-tags.html

    自定义标签是一种用户定义的JSP 语言元素。当一个包含自定义标签的JSP页面翻译成一个Servlet时,该标签转换为在一个对象上的操作称为标签处理程序。然后当执行JSP页面的Servlet时,Web容器调用这些操作。

    扩展的JSP标签允许创建新标签,可以直接插入到一个JavaServer Page(JSP)中,就像内置标签。为了编写这些自定义标签,JSP 2.0规范引入了简单的标签处理程序。

    要编写一个自定义标签,可以简单地扩展SimpleTagSupport类,并且重写doTag( )方法,其中可以添加代码来生成标签的内容。

    一、创建“Hello”标签

    假如想定义一个自定义标签名为<ex:Hello>,想要在以下没有标签体的方式中使用,如下所示:

    <ex:Hello />

    要创建一个自定义JSP标签,必须首先创建一个Java类作为标记处理程序。因此,创建HelloTag类如下:

    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()产生的当前JspWriter对象,并使用它发送“Hello Custom Tag!”给当前的JspWriter对象。

    编译上面的类,并将其复制到CLASSPATH环境变量的有效目录中。最后创建以下标签库文件: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.jsoft.HelloTag</tag-class>
        <body-content>empty</body-content>
      </tag>
    </taglib>

    在JSP程序中,使用上面定义的自定义标签Hello,如下所示:

    <%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
    <html>
      <head>
        <title>A sample custom tag</title>
      </head>
      <body>
        <ex:Hello/>
      </body>
    </html>

    尝试调用上述JSP,显示结果如下所示:

    二、访问标签体

    可以标签体中引用在标准标签体中所见的消息。假如想定义一个自定义标签名为<ex:Hello>,想要在以下含有标签体的方式中使用,如下所示:

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

    在上面标签的代码中进行如下修改来处理标签的主体:

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

    在这种情况下,在调用中产生的输出是在写入与标签相关的JspWriter对象之前第一个捕获到的StringWriter。因此需要改变TLD文件,如下所示:

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

    现在调用上述带有标签体的标签,如下所示:

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

    显示结果如下所示:

    三、自定义标签属性

    可以使用自定义标签的各种属性。要得到一个属性值,一个自定义标签类需要实现setter方法,和JavaBean相同的setter方法如下所示:

    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( )。现在用<attribute>元素添加该属性到TLD文件中,如下所示:

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

    现在尝试下面的带有消息属性的 JSP 页面,如下所示:

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

    显示结果如下所示:

    值得注意的是,一个属性可以包含下列属性:

    属性目的
    name 名称元素定义了一个属性的名称。对于一个特定的标签,每个属性名称必须是唯一。
    required 这指定如果这个属性是必需的或可选的,则指定它。对于可选的,默认为false。
    rtexprvalue 如果对于一个标签属性,运行时间表达式的值是有效的,则声明它。
    type 定义了该属性的Java类类型。默认情况下它是假设为字符串
    description 可以提供信息的描述。
    fragment 如果这个属性值应该被视做一个JspFragment,则声明它。

    下面是指定一个属性的相关属性的例子:

    .....
        <attribute>
          <name>attribute_name</name>
          <required>false</required>
          <type>java.util.Date</type>
          <fragment>false</fragment>
        </attribute>
    .....

    如果使用的是两个属性,那么可以修改TLD如下所示:

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

    测试工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test20

  • 相关阅读:
    CSS+JS实现兼容性很好的无限级下拉菜单
    自动切换的JS菜单
    (2)C#连sqlite
    protobuf编译器
    (67) c# 序列化
    (66) c# async await
    (65)C# 任务
    mbatis 入门
    (64)C# 预处理器指令
    (63)C# 不安全代码unsafe
  • 原文地址:https://www.cnblogs.com/EasonJim/p/6969877.html
Copyright © 2011-2022 走看看