SimpleTag——认识自定义标签

自定义标签

自定义标签的开发与应用步骤

  • 编写完成标签功能的 Java 类(标签处理器)
  • 编写标签库描述(tld)文件,在tld文件中对自定义中进行描述
  • 在 JSP 页面中导入和使用自定义标签

①. 创建一个标签处理器类: 实现javax.servlet.jsp.tagext.SimpleTag接口. 

 

package yang.mybatis.tag;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import java.io.IOException;

/**
 * Created by yangshijing on 2017/11/24 0024.
 */
public class HelloSimpleTag implements javax.servlet.jsp.tagext.SimpleTag{
    @Override
    public void doTag() throws JspException, IOException {
        System.out.println("doTag");
    }

    @Override
    public void setParent(JspTag jspTag) {
        System.out.println("setParent");

    }

    @Override
    public JspTag getParent() {
        System.out.println("getParent");
        return null;
    }

    @Override
    public void setJspContext(JspContext jspContext) {
        System.out.println("setJspContext");

    }

    @Override
    public void setJspBody(JspFragment jspFragment) {
        System.out.println("setJspBody");

    }
} 

②. 在 WEB-INF 文件夹下新建一个 .tld(标签库描述文件) 为扩展名的 xml 文件. 

 

<?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">
    <!--描述TLD 文件-->
    <description>MyTag 1.0 core library</description>
    <display-name>MyTag core</display-name>
    <tlib-version>1.0</tlib-version>
    <!--建议在Jsp页面上使用的标签的前缀-->
    <short-name>myshortname</short-name>
    <!-- 作为 tld 文件的 id, 用来唯一标识当前的 TLD 文件, 多个 tld 文件的 URI 不能重复. 通过 JSP 页面的 taglib 标签的 uri 属性来引用. -->
    <uri>http://mycompany.com</uri>

    <!-- Invoke 'Generate' action to add tags or functions -->
    <!--描述自定义的HelloSimpleTag 标签-->
    <tag>
        <!--标签名,在 JSP 页面上使用标签时的名字-->
        <name>hello</name>
        <!--标签所在的全类名-->
        <tag-class>yang.mybatis.tag.HelloSimpleTag</tag-class>
        <!--标签体的类型-->
        <body-content>empty</body-content>
    </tag>
</taglib>

③. 在 tld 文件中描述自定义的标签:

<!-- Invoke 'Generate' action to add tags or functions -->
    <!--描述自定义的HelloSimpleTag 标签-->
    <tag>
        <!--标签名,在 JSP 页面上使用标签时的名字-->
        <name>hello</name>
        <!--标签所在的全类名-->
        <tag-class>yang.mybatis.tag.HelloSimpleTag</tag-class>
        <!--标签体的类型-->
        <body-content>empty</body-content>
    </tag>

④. 在 JSP 页面上使用自定义标签:

  • 使用 taglib 指令导入标签库描述文件: 
<%@taglib uri="http://mycompany.com" prefix="nchu" %>
  • 使用自定义的标签: 
 <nchu:hello/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入标签库描述文件--%>
<%@taglib uri="http://mycompany.com" prefix="nchu" %>
<%@ taglib prefix="nchu" uri="http://mycompany.com" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <nchu:hello/>
</body>
</html>

 

⑤.从结果可以看出,使用自定义标签时,首先调用自定义SimpleTag实现类的SetJspContext()方法,然后调用doTag()方法

@Override
    public void setJspContext(JspContext jspContext) { 
    System.out.println(
"setJspContext");
  }

JspContext 是PageContext的父类,通过该方法传入的参数既是PageContext对象;可以通过PageContext对象获取jsp的隐含对象,进而在doTag()方法中对自定义标签实现功能。

在浏览器上输出Hello World

package yang.mybatis.tag;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import java.io.IOException;

/**
 * Created by yangshijing on 2017/11/24 0024.
 */
public class HelloSimpleTag implements javax.servlet.jsp.tagext.SimpleTag{
    private  PageContext pageContext;
    @Override
    public void doTag() throws JspException, IOException {
        pageContext.getOut().print("Hello world!");
        System.out.println("doTag");
    }

    @Override
    public void setParent(JspTag jspTag) {
        System.out.println("setParent");

    }

    @Override
    public JspTag getParent() {
        System.out.println("getParent");
        return null;
    }

    @Override
    public void setJspContext(JspContext jspContext) {
        pageContext = (PageContext) jspContext;
        boolean b = jspContext instanceof PageContext;
        System.out.println("setJspContext "+b);

    }

    @Override
    public void setJspBody(JspFragment jspFragment) {
        System.out.println("setJspBody");

    }
}

 

posted @ 2017-11-28 13:46  Wayfo  阅读(733)  评论(0编辑  收藏  举报