定义:自定义标签是一种非常优秀的组件技术。通过使用自定义标签库,可以在简单的标签中封装复杂的
功能;
理解:其将JSP页面中的(复杂、重复并且格式统一的)内容封装,使用一个标签代替;
标签对应一个类,在类中有固定的方法,这些方法在编译JSP页面中的自定义标签时,被调用。方法内输出被封装的内容;
标签——>JAVA类——>类方法输出页面内容
自定义标签的分类:
1.简单标签;
2.带属性的标签;
3.带标签体的标签;
4.可以被script使用的标签;
实现自定义标签的步骤
1.开发自定义标签处理类;
2.建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库对应多个标签;
3.在web.xml文件中增加自定义标签的定义;
4.在JSP文件中使用自定义标签;
一;开发自定义标签类
doEndTag() destroy() 该方法在标签结束生成页面内容 销毁标签时调用的方法 简单标签 带属性的标签 doStartTag() doAfterBody() doEndTag() 开始处理方法时,调用该方法 每次标签体处理完后调用该方法 标签体结束时调用该方法
类名
方法名
作用
备用
TagSupport
BodyTagSupport
带标签体的标签
2.2 标签流向控制
返回值 意义 SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。 SKIP_PAGE 忽略标签后面的JSP内容。 EVAL_PAGE 处理标签后,继续处理JSP后面的内容。 EVAL_BODY_BUFFERED 表示需要处理标签体。 EVAL_BODY_INCLUDE 表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法 EVAL_BODY_AGAIN 对标签体循环处理。
二;建立TLD文件
TLD是Tag Library Definition的缩写,即标签库定义,文件的后缀是.tld,每个TLD文件对应一个标签库,一个标签库对应多个标签;
<taglib>
定义标签库版本
<tlib-version>1.0</tlib-version>
定义JSP版本
<jsp-version>1.2</jsp-version>
配置第一个标签
<short-name>mytag</short-name>
<tag>
配置标签名
<name>helloworld</name>
确定标签的处理类
<tag-class>mytag.HelloWorldTag</tag-class>
确定标签体,标签体为空
<body-content>empty</body-content>
</tag>
</taglib>
三;在web.xml文件中增加标签库定义
<jsp-config>
定义标签库
<taglib>
确定标签库的URL
<taglib-uri>/helloworld</taglib-uri>
确定标签库定义文件的位置
<taglib-location>/WEB-INF/helloworld.tld</taglib-location>
</taglib>
</jsp-config>
四:使用标签库
1.导入标签库:使用taglib编译指令导入标签
<%@ taglib uri="/helloworld" prefix="mytag"%>
2.使用标签:在JSP页面中使用自定义标签
<mytag:helloworld></mytag:helloworld>
---------------------------------------------------------------------------------------
案例
案例目标
配置三种标签
1.简单
2.带属性
3.带标签体
一;标签类的实现
1.简单标签
package mytag;
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
/**
* 简单标签实体类
*/
public class HelloWorldTag extends TagSupport {
/**
* 标签开始 执行语句
*/
@Override
public int doStartTag() throws JspException {
return EVAL_BODY_INCLUDE;
}
/**
* 标签结束 执行语句
*/
@Override
public int doEndTag() throws JspException {
try{
pageContext.getOut().write("Hello world");
}catch(Exception ex){
throw new JspTagException("错误");
}
return EVAL_PAGE;
}
}
2.带属性标签类
package mytag;
import java.io.Writer;
import java.util.Arrays;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import entity.Peron;
/**
* 带属性的标签
*/
public class QueryTag extends TagSupport {
// 标签的属性
private int rows;
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
/**
* 标签处理
*/
@Override
public int doEndTag() throws JspException {
try {
// 生成假数据对象
Peron p1 = new Peron("no1", 10), p2 = new Peron("no2", 13), p3 = new Peron(
"no3", 15);
// 生成假集合
List<Peron> PL = Arrays.asList(p1, p2, p3);
// 获取页面输出流
Writer out = pageContext.getOut();
// 输出
out.write("<table>");
Peron p = null;
for (int i = 0;i < rows;i++) {
p = PL.get(i);
out.write("<tr>");
out.write("<td>");
out.write(p.getName());
out.write("</td>");
out.write("<td>");
out.write(p.getAge());
out.write("</td>");
out.write("</tr>");
}
out.write("</table>");
} catch (Exception ex) {
System.out.println("标签处理产生异常");
}
return EVAL_PAGE;
}
}
3.带标签体的标签
1.外部标签类
package mytag;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* 带标签体的标签
* 完成迭代功能
*/
public class MyiteratorTag extends BodyTagSupport{
//标签需要迭代的集合对象名
//从页面内传递一个值,该值代表页面page内的一个集合的名称
private String bean;
//集合对象的元素下标值
private String item;
//集合当前索引
private int i = 0;
//集合大小
private int size ;
//?
private List<String> itemList;
public String getBean() {
return bean;
}
public void setBean(String bean) {
this.bean = bean;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
/**
* 开始处理标签时,调用该方法
*/
@Override
public int doStartTag() throws JspException {
try{
pageContext.getOut().write("进入MyiteratorTag-doStartTag方法");
}catch(Exception ex){}
//从page范围中获取List对象
itemList = (List<String>)pageContext.getAttribute(bean);
//获取集合长度
size = itemList.size();
//将集合当前索引的值放在page范围的item变量中
pageContext.setAttribute(item, itemList.get(i));
//返回值为EVAL_BODY_BUFFERED;表明需要计算标签体
return EVAL_BODY_BUFFERED;
}
/**
* 每次标签体处理完后调用该方法
*
*/
@Override
public int doAfterBody() throws JspException {
try{
pageContext.getOut().write("进入MyiteratorTag-doAfterbody方法");
}catch(Exception ex){}
//移动List对象的索引位置
i++;
//如果索引已经超过集合的长度
if(i>=size){
//索引归零
i=0;
//不在计算标签体
return SKIP_BODY;
}
//将集合的当前元素值放入page范围的item属性中
pageContext.setAttribute(item, itemList.get(i));
//循环计算标签体
return EVAL_BODY_AGAIN;
}
/**
* 标签体结束时调用该方法
*/
@Override
public int doEndTag() throws JspException {
try{
pageContext.getOut().write("进入MyiteratorTag-doEndTag方法");
//输出标签体内容
bodyContent.writeOut(pageContext.getOut());
}catch(Exception ex){
throw new JspException("错误");
}
return super.doEndTag();
}
}
2.内部标签类
package mytag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
/**
* 嵌套的内部标签
*/
public class WritorTag extends TagSupport {
//item属性 该标签从page中查找item的属性,并输出属性值
private String item;
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
/**
* 开始处理标签时的调用方法
*/
@Override
public int doStartTag() throws JspException {
try{
pageContext.getOut().write((String)pageContext.getAttribute("item"));
}catch(Exception ex){
throw new JspException("错误");
}
return super.doStartTag();
}
}
二。标签体的TLD文件配置
1.简单标签
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 定义标签库版本 -->
<tlib-version>1.0</tlib-version>
<!-- 定义JSP版本 -->
<jsp-version>1.2</jsp-version>
<!-- 定义标签库名称 -->
<short-name>mytag</short-name>
<!-- 定义第一个标签 -->
<tag>
<!-- 配置标签名 -->
<name>helloworld</name>
<!-- 确定实现标签的标签类 -->
<tag-class>mytag.HelloWorldTag</tag-class>
<!-- 确定标签的标签体,标签体为空 -->
<body-content>empty</body-content>
</tag>
</taglib>
2.带属性的标签
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<!-- 定义标签库版本 -->
<tlib-version>1.0</tlib-version>
<!-- 定义JSP版本 -->
<jsp-version>1.2</jsp-version>
<short-name>querytag</short-name>
<!-- 配置标签 -->
<tag>
<!-- 配置标签名称 -->
<name>query</name>
<!-- 配置标签实现类 -->
<tag-class>mytag.QueryTag</tag-class>
<!-- 指定标签体为空 -->
<body-content>empty</body-content>
<!-- 配置属性 -->
<attribute>
<name>rows</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
3.带标签体的标签
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>iterator</short-name>
<!-- 配置迭代器标签 -->
<!-- 外部标签 -->
<tag>
<!-- 配置标签名 -->
<name>iterator</name>
<!-- 配置标签的实现类 -->
<tag-class>mytag.MyiteratorTag</tag-class>
<!-- 配置标签体 -->
<body-content>JSP</body-content>
<!-- 配置标签属性 -->
<attribute>
<name>bean</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>item</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- 配置输出标签 -->
<!-- 内部标签 -->
<tag>
<!-- 配置标签名 -->
<name>write</name>
<!-- 配置标签的实现类 -->
<tag-class>mytag.WritorTag</tag-class>
<!-- 配置标签内容 -->
<body-content>empty</body-content>
<!-- 配置标签属性 -->
<attribute>
<name>item</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
三。WEB.XML文件配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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-app_2_5.xsd">
<jsp-config>
<taglib>
<!-- 配置标签的引用地址 JSP页面中引用时使用-->
<taglib-uri>/helloworld</taglib-uri>
<!-- 配置标签的TLD文件地址 -->
<taglib-location>/WEB-INF/helloworld.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/query</taglib-uri>
<taglib-location>/WEB-INF/query.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/iterator</taglib-uri>
<taglib-location>/WEB-INF/iterator.tld</taglib-location>
</taglib>
</jsp-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
四:JSP调用
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK" import="java.util.*"%>
<%@ taglib uri="/helloworld" prefix="mytag"%>
<%@ taglib uri="/query" prefix="query"%>
<%@ taglib uri="/iterator" prefix="iter"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<mytag:helloworld></mytag:helloworld>
<query:query rows="3" />
<%
//创建输出对象
List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
//将a放入 page 范围内
pageContext.setAttribute("a", a);
%>
<table>
<iter:iterator bean="a" item="item">
<tr>
<td>
<iter:write item="item"/>
</td>
</tr>
</iter:iterator>
</table>
</body>
</html>
发表评论
-
Js 页面跳转(转)
2010-04-19 14:43 2427常用 function toUrl(ul){ if(&qu ... -
请求头信息
2010-03-30 02:15 1594<%@ page language="java ... -
安装Struts
2010-03-29 13:42 957下载jar包 解压jar包;解压后有如下文件结构 ... -
简化的JSP自定义标签
2010-03-29 10:09 1049JSP2.0的自定义标签更加简单,无需重写繁琐的doS ... -
EL表达式-自定义函数
2010-03-28 21:39 10324表达式语言除了可以使用基本的运算符外,还可以使用自定义函数。通 ...
相关推荐
本实例将深入探讨如何实现一个简单的JSP自定义标签。 首先,自定义标签的实现主要依赖于两个核心概念:Tag接口和TagSupport类。`Tag`接口定义了自定义标签必须实现的方法,如`doStartTag()`和`doEndTag()`,它们...
**JSP自定义标签实例详解** 在Java服务器页面(JSP)开发中,自定义标签是一种强大的工具,它允许开发者创建可重用的组件,提高了代码的可读性和可维护性。本文将深入探讨JSP自定义标签的概念、实现过程以及实际...
五、自定义标签实例 一个简单的HelloWorld自定义标签可能如下: 1. 创建TLD文件(hello.tld): ```xml xsi:schemaLocation=...
综上所述,JSP自定义标签提供了一种强大的方式来组织和复用代码,而分页标签则是实际项目中常见的应用场景。结合Java反射机制,我们可以灵活地调用各种服务方法,实现复杂的功能,同时保持页面逻辑的清晰和简洁。...
### JSP自定义标签概述及实现 #### 一、引言 JSP (JavaServer Pages) 是一种基于Java技术的标准,用于开发动态Web应用程序。它允许开发者将Java代码嵌入到HTML页面中,从而实现动态内容的生成。为了提高代码的复用...
#### 三、创建JSP自定义标签实例:格式化数据 假设我们需要创建一个用于格式化日期的自定义标签。下面将详细介绍创建步骤: ##### 1. 定义标签库描述文件(TLD) 首先,我们需要定义一个标签库描述文件(TLD),...
本教程将深入探讨JSP自定义标签的使用,同时结合实例介绍分页和下拉框绑定值的封装。 一、JSP自定义标签基础 1. **定义标签库(Tag Library)**:自定义标签首先需要定义一个TLD(Tag Library Descriptor)文件,它...
本实例将带你深入理解JSP自定义标签的创建和使用。 首先,我们要了解自定义标签的结构。自定义标签通常由三部分组成:标签库描述文件(TLD)、标签处理类(Tag Handler)和JSP页面。TLD是XML格式的文件,用于定义...
为了运行和测试这个自定义标签实例,你需要将其部署到支持JSP的Web服务器(如Tomcat),然后通过浏览器访问`index.jsp`页面。如果一切配置正确,你应该能看到自定义标签按预期工作。 通过学习和实践这个JSP自定义...
以下是一个关于"jsp自定义标签简单实例"的详细说明。 1. **自定义标签概述** 自定义标签是JSP 1.2版本引入的新特性,它允许开发者创建符合XML语法规则的自定义标签库,这些标签库可以包含一系列具有特定功能的标签...
下面我们来实现一个非常简单的自定义标签,期望通过这个简单的实例引领各位进入自定义标签的领域。我们准备定义的这个自定义标签所实现的功能是在JSP页面中显示出版权信息,并且在以后的博文中,我们还会对它进行...
本资源“jsp自定义标签大全.rar”提供了一套全面的JSP自定义标签的实例和指南,旨在帮助开发者深入理解和应用这一特性。 **JSP自定义标签的基本概念** JSP自定义标签不同于标准动作标签(如<jsp:include>或<jsp:...
本DLC(Digital Learning Content,数字学习资源)将深入探讨如何创建和使用JSP自定义标签,并通过实例来帮助理解这一过程。 一、JSP自定义标签基础 1.1 JSP标准标签库(JSTL) 在自定义标签之前,我们需要了解...