1.  什么是用户自定义标签?

Ø   JSP自定义标签是用户定义的JSP语言元素,可以看成是一种通过标签处理器生成基于XML脚本的方法。

Ø   自定义标签在功能上和逻辑上都与JavaBean类似,都是一组可重用的组件代码。

相较于JavaBean,自定义标签可以使Web开发者可以完全从Java编程中脱离开来,专注于页面显示和格式上面去,所以具有广阔的发展前景

2.  自定义标签的优点是什么?

分离了程序逻辑和表示逻辑

将Java代码从HTML中剥离,便于美工维护页面

减少了JSP页面中的脚本,减少了维护成本

提供了可重用的功能组件

3.  自定义标签的组成:

 一个自定义标签一般由JavaBean、标签库描述、标签处理器、web.xml文件配置、标签库声明等元素所构成

4.  自定义标签的作用:

JavaBean -à标签库用来执行所分配微软的基本代码模块

标签库描述-àxml文件记录标签处理器属性信息和位置信息

标签处理器-à标签库核心,对外部资源和访问信息进行处理

web.xml文件配置-à配置文件用来描述自定义标签TLD文件位置

标签库声明-à使用自定义表情,使用标签库指令进行声明

5.  自定义标签的声明:

 <%@ taglib prefix="pre"uri="URLToTagLibrary"%>

无论JSP页面中的自定义标签出现在什么位置,taglib指令都必须出现在页面的前端位置

6.  标签库表述符文件:

Ø   标签库描述符(TLD文件)是一个描述标签库的XML文档。TLD包含有关整个库以及库中包含的每一个标签的信息。它把自定义标签与对应的处理程序关联起来。TLD文件名称必须扩展名为.tld。

Ø   TLD文件存储在Web模块的WEB-INF目录下或者子目录下,并且一个标签库要对应一个标签库描述文件,而在一个描述文件中可以包含多个自定义标签的声明。

TLD文件的根元素是<taglib>,该元素的子元素如下所示:

元素

说明

元素

说明

<tlib-version>

用于设置标签库版本

<small-icon>

用于设置标签库的可选小图标

<jsp-version>

用于设置标签库要求的JSP规范版本

<large-icon>

用于设置标签库的可选大图标

<short-name>

用于设置该标签库的助记名

<description>

用于设置标签库的描述信息

<uri>

唯一标识该标签库的URI

<listener>

用于设置标签库的监听器类

<display-name>

用于设置标签库显示的可选名

<tag>

用于设置标签库的具体标签


7.  <tag>元素的方法:

<tag>元素是真正用来查找标签库中具体标签的

元素

说明

元素

说明

<name>

用于设置标签的唯一名称

<small-icon>

用于设置标签的可选小图标

<tag-class>

用于设置标签处理器的完全限定名

<large-icon>

用于设置标签的可选大图标

<tei-class>

用于设置脚本变量信息的子类名称

<description>

用于设置标签的描述信息

<body-content>

用于设置标签的正文内容类型

<variable>

用于设置标签的脚本变量信息

<display-name>

用于设置标签显示的可选名

<attribute>

用于设置标签的属性信息


8.  标签处理器:

Ø   在标签处理器中定义了标签处理方法doStartTag()和doEndTag(),这两个方法分别在标签开始和结束时执行处理和输出动作。

Ø   这两个方法都要求分别返回一个状态码,通知JSP容器岁自定义标签的处理结果及整个JSP页面的运行状态。

状态码一共有四种,具体作用如下所示:

状态码

作用说明

EVAL_BODY_INCLUDE

当doStartTag()返回时,指明servlet应对标签进行评估

SKIP_BODY

当doStartTag()返回时,指明servlet应忽视标签体

EVAL_PAGE

当doEndTag()返回时,指明页面其余部分应被评估

SKIP_PAGE

当doEndTag()返回时,指明页面其余部分就被跳过

 

9.    简单格式的标签开发:

Ø   简单格式的标签没有属性和体,它需要实现Tag接口中的doStartTag()和doEndTag()方法。

Ø   当Web容器遇到开始标签时会自动调用doStartTag()方法。由于简单格式的标签没有体,所以这个方法会直接返回一个SKIP_BODY。

Ø   在遇到结束标签的时候会调用doEndTag()方法。如果还需要页面中的其他部分进行判断,则doEndTag()方法会返回EVAL_PAGE,否则,会返回SKIP_PAGE。


10.    实现自定义标签:

package com.msit.tag;

 

import java.io.IOException;

 

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

/**
 *  定义第一个输出内容的自定义标签处理类
 * @author admin
 *
 */
@SuppressWarnings("serial")
publicclassMytagPrint extendsTagSupport {
   @Override
   publicint doStartTag() throws JspException {
      //创建页面输出对象
      JspWriterout =  pageContext.getOut();
      try {
         out.print("这是第一个自定义输出");
      }catch(IOException e) {
         e.printStackTrace();
      }
      returnSKIP_BODY;//skip 跳过或忽略
   }

  

@Override
   publicint doEndTag() throws JspException {
      returnEVAL_PAGE;//eval  评估或处理
   }
}

Web文件配置:

<jsp-config>
 <taglib>
  <taglib-uri>/msit/myprint</taglib-uri>
  <taglib-location>/WEB-INF/Myprint.tld</taglib-location>
 </taglib>
</jsp-config>

Tld文件配置

<short-name>pt</short-name>
 <uri>/myprint</uri>
 <tag>
 <name>myprint</name>
 <tag-class>com.msit.tag.MytagPrint</tag-class>
 <body-content>empty</body-content>
 </tag>

在页面输出:

<%@ taglib uri="/msit/myprint"prefix="p" %>
   调用自定义标签:<br>
   <p:myprint />