JSP自定义标签

自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。

JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。

不含标签体的自定义标签

首先你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。
这里要注意的是这里的Selvlet类不能是裸体类,也就是必须要在包里面,不然后面配置文件不生效

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter;
public class MyServlet extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        JspWriter out = this.getJspContext().getOut();//获得当前页面的输出流
        out.println("Hello World!");//输出Hello World!
    }

}

接下来在WEB-INF目录下写一个标签库,以tld后缀名结尾,这里写mytag.tld

<?xml version="1.0" encoding="UTF-8"?>
    <taglib  xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0" >
        <tlib-version>2.0</tlib-version>
        <!--指定前缀名,可以在jsp声明中更改-->
        <short-name>ex</short-name>
        <tag>
            <!--指定标签名称-->
            <name>Hello</name>
            <!--指定那个Servlet执行这个标签解释-->
            <tag-class>com.mytag.MyServlet</tag-class>
            <!--设置标签体为空-->
            <body-content>empty</body-content>
        </tag>
    </taglib>

接下来就是测试用的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--这里prefix是标签前缀名 uri是标签库地址--%>
<%@ taglib prefix="ex" uri="/WEB-INF/myTag.tld"%>
<html>
<head>
    <title>测试</title>
</head>
<body>
<%--使用自定义标签--%>
<ex:Hello/>
</body>
</html>

这样页面就会输出Hello World!了

访问自定义标签体

访问标签体,这样的话就需要修改以上三个文件了
Selvlet中要有对标签体获取的代码

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.StringWriter;

public class MyServlet extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        StringWriter sw = new StringWriter();//字符串输出流,包装一个字符串
        getJspBody().invoke(sw);//把标签体内容放入sw流里面
        getJspContext().getOut().println(sw);//输出到页面上
    }
}

接着mytag.tld中要设置标签体不为空

<?xml version="1.0" encoding="UTF-8"?>
    <taglib  xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0" >
        <tlib-version>2.0</tlib-version>
        <!--指定前缀名,可以在jsp声明中更改-->
        <short-name>ex</short-name>
        <tag>
            <!--指定标签名称-->
            <name>Hello</name>
            <!--指定那个Servlet执行这个标签解释-->
            <tag-class>com.mytag.MyServlet</tag-class>
            <!--设置标签体为空-->
            <body-content>scriptless</body-content>
        </tag>
    </taglib>

最后是测试用的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--这里prefix是标签前缀名 uri是标签库地址--%>
<%@ taglib prefix="ex" uri="/WEB-INF/myTag.tld"%>
<html>
<head>
    <title>hahah</title>
</head>
<body>
<%--使用自定义标签--%>
<ex:Hello>hahahhahahahhah</ex:Hello>
</body>
</html>

页面上就会输出hahahhahahahhah

另外还有自定义标签属性,不经常使用,这里就不在详细说了

你可能感兴趣的:(jsp,servlet)