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