Jsp2.0自定义标签(第一天)——一个简单的例子

今天是学习自定义标签的第一天

Jsp2.0以来,自定义标签的实现比传统标签的实现容易了很多,一般只要extends类SimpleSupport重写doTag()方法即可。

image

 

先看最简单的例子,输出一个Hello World

效果图:

image

 

jsp页面的代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="myout" uri="/lirui" %>
<html>
<head>
</head>
<body>
    <h1>我的测试页面</h1>
    <myout:demo value="Hello World"/>
</body>
</html>

页面上的Hello World就是<myout:demo value="Hello World"/> 这一行代码输出的,

但是<myout:demo value="Hello World"/> 为什么会输出Hello World呢?是哪里定义了该标签有输出value值的功能呢?

 

解答:

要实现<myout:demo value="Hello World"/> 有输出功能,主要有四部分:

第一部分:定义标签的地方。既然是自定义标签,自然有定义该标签的文件(*.tld),这里定义为demo.tld,一般放在WEB-INF下

<?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>1.0</tlib-version>
    <short-name>myout</short-name>
    <!-- 输出值 -->
    <tag>
        <!-- 定义标签的名称 -->
        <name>demo</name>
        <!-- 定义该标签的具体业务逻辑,比如上面的输入:Hello World -->
        <tag-class>com.tag.support.TagDemo</tag-class>
        <!-- 标签体是否为空,这里设置为空 -->
        <body-content>empty</body-content>
        <!-- 标签的属性 -->
        <attribute>
            <!-- 属性名 -->
            <name>value</name>
            <!-- 是否必须,true表示必须要写value属性值 -->
            <required>true</required>
            <!-- 是否支持表达式,一般是EL表达式 -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
<taglib>

 

第二部分:实现具体业务功能的类,也就是上面demo.tld中的<tag-class>com.tag.support.TagDemo</tag-class>

在Jsp2.0以后,自定义标签的实现类一般继承SimpleTagSupport这个类并重写doTag方法

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

public class TagDemo extends SimpleTagSupport {
    //注意:这个属性要与tld文件中定义的属性一致,并提供get和set方法
    private String value;
    
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
    //具体业务实现类
    @Override
    public void doTag() throws JspException, IOException {
        //this.getJspContext()获得JspContext对象也就是前台页面的PageContext
        //可以看出页面输出Hello World注意是这里的write方法实现的
        this.getJspContext().getOut().write(value);
    }
}

 

第三部分:在页面引入该标签。

<%@taglib prefix="myout" uri="/demo" %>

但是这地方有些问题,uri=“/demo”究竟是怎么引用到上面所定义的标签呢?

别急还有第四部分

 

第四部分:在web.xml中定义uri指向

     <jsp-config>
            <taglib>
                <taglib-uri>/demo</taglib-uri>
                <taglib-location>/WEB-INF/demo.tld</taglib-location>
            </taglib>
</jsp-config>

现在明白对前面的引入究竟是怎么一回事了吧!!!

 

其实还有另外一种方式在指向/demo,就是在前面的demo.tld文件中加上<uri>/demo</uri>,具体看下面

<?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>1.0</tlib-version>
    <short-name>myout</short-name>
    
<!-- 这就是比上面的demo.tld文件多添加了一行 ,web.xml里就不需要再配置了--><uri>/demo</uri>
    <!-- 输出值 -->
    <tag>
        <!-- 定义标签的名称 -->
        <name>demo</name>
        <!-- 定义该标签的具体业务逻辑,比如上面的输入:Hello World -->
        <tag-class>com.tag.support.TagDemo</tag-class>
        <!-- 标签体是否为空,这里设置为空 -->
        <body-content>empty</body-content>
        <!-- 标签的属性 -->
        <attribute>
            <!-- 属性名 -->
            <name>value</name>
            <!-- 是否必须,true表示必须要写value属性值 -->
            <required>true</required>
            <!-- 是否支持表达式,一般是EL表达式 -->
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

这样的话,你在web.xml就不需要配置了。

 

今天是学习Jsp自定义标签第一天,例子也比较简单,后续会慢慢深入。。。

由于是分享自己的学习心得,可能有地方还有问题,请看到问题的网友及时指正。

posted @ 2015-11-30 14:30  夏日的雪花  阅读(267)  评论(0编辑  收藏  举报