`

JSP自定义标签 实例

    博客分类:
  • J2EE
JSP 
阅读更多

定义:自定义标签是一种非常优秀的组件技术。通过使用自定义标签库,可以在简单的标签中封装复杂的

         功能;

 

理解:其将JSP页面中的(复杂、重复并且格式统一的)内容封装,使用一个标签代替;

         标签对应一个类,在类中有固定的方法,这些方法在编译JSP页面中的自定义标签时,被调用。方法内输出被封装的内容;

 

         标签——>JAVA类——>类方法输出页面内容

 

自定义标签的分类:

     1.简单标签;

     2.带属性的标签;

     3.带标签体的标签;

     4.可以被script使用的标签;

 

实现自定义标签的步骤

    1.开发自定义标签处理类;

     2.建立一个*.tld文件,每个*.tld文件对应一个标签库,每个标签库对应多个标签;

    3.在web.xml文件中增加自定义标签的定义;

    4.在JSP文件中使用自定义标签;

 

一;开发自定义标签类

   

 

 

类名 方法名 作用 备用
TagSupport

doEndTag()

destroy()

该方法在标签结束生成页面内容

销毁标签时调用的方法

简单标签

带属性的标签

BodyTagSupport

doStartTag()

doAfterBody()

doEndTag()

 

开始处理方法时,调用该方法

每次标签体处理完后调用该方法

标签体结束时调用该方法

带标签体的标签
       

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>

分享到:
评论

相关推荐

    jsp 自定义标签实例

    本实例将深入探讨如何实现一个简单的JSP自定义标签。 首先,自定义标签的实现主要依赖于两个核心概念:Tag接口和TagSupport类。`Tag`接口定义了自定义标签必须实现的方法,如`doStartTag()`和`doEndTag()`,它们...

    jsp自定义标签实例

    **JSP自定义标签实例详解** 在Java服务器页面(JSP)开发中,自定义标签是一种强大的工具,它允许开发者创建可重用的组件,提高了代码的可读性和可维护性。本文将深入探讨JSP自定义标签的概念、实现过程以及实际...

    JSP自定义标签实例与详细讲解

    五、自定义标签实例 一个简单的HelloWorld自定义标签可能如下: 1. 创建TLD文件(hello.tld): ```xml xsi:schemaLocation=...

    JSP自定义标签实例

    综上所述,JSP自定义标签提供了一种强大的方式来组织和复用代码,而分页标签则是实际项目中常见的应用场景。结合Java反射机制,我们可以灵活地调用各种服务方法,实现复杂的功能,同时保持页面逻辑的清晰和简洁。...

    jsp自定义标签实例.doc

    ### JSP自定义标签概述及实现 #### 一、引言 JSP (JavaServer Pages) 是一种基于Java技术的标准,用于开发动态Web应用程序。它允许开发者将Java代码嵌入到HTML页面中,从而实现动态内容的生成。为了提高代码的复用...

    一个JSP自定义标签的例子。格式化基础数据

    #### 三、创建JSP自定义标签实例:格式化数据 假设我们需要创建一个用于格式化日期的自定义标签。下面将详细介绍创建步骤: ##### 1. 定义标签库描述文件(TLD) 首先,我们需要定义一个标签库描述文件(TLD),...

    jsp 自定义标签的使用

    本教程将深入探讨JSP自定义标签的使用,同时结合实例介绍分页和下拉框绑定值的封装。 一、JSP自定义标签基础 1. **定义标签库(Tag Library)**:自定义标签首先需要定义一个TLD(Tag Library Descriptor)文件,它...

    jsp自定义标签入门实例

    本实例将带你深入理解JSP自定义标签的创建和使用。 首先,我们要了解自定义标签的结构。自定义标签通常由三部分组成:标签库描述文件(TLD)、标签处理类(Tag Handler)和JSP页面。TLD是XML格式的文件,用于定义...

    JSP自定义标签入门实例

    为了运行和测试这个自定义标签实例,你需要将其部署到支持JSP的Web服务器(如Tomcat),然后通过浏览器访问`index.jsp`页面。如果一切配置正确,你应该能看到自定义标签按预期工作。 通过学习和实践这个JSP自定义...

    jsp自定义标签简单实例

    以下是一个关于"jsp自定义标签简单实例"的详细说明。 1. **自定义标签概述** 自定义标签是JSP 1.2版本引入的新特性,它允许开发者创建符合XML语法规则的自定义标签库,这些标签库可以包含一系列具有特定功能的标签...

    JSP 自定义标签之一 简单实例

    下面我们来实现一个非常简单的自定义标签,期望通过这个简单的实例引领各位进入自定义标签的领域。我们准备定义的这个自定义标签所实现的功能是在JSP页面中显示出版权信息,并且在以后的博文中,我们还会对它进行...

    jsp自定义标签大全.rar

    本资源“jsp自定义标签大全.rar”提供了一套全面的JSP自定义标签的实例和指南,旨在帮助开发者深入理解和应用这一特性。 **JSP自定义标签的基本概念** JSP自定义标签不同于标准动作标签(如&lt;jsp:include&gt;或&lt;jsp:...

    jsp 自定义标签有实例的DLC

    本DLC(Digital Learning Content,数字学习资源)将深入探讨如何创建和使用JSP自定义标签,并通过实例来帮助理解这一过程。 一、JSP自定义标签基础 1.1 JSP标准标签库(JSTL) 在自定义标签之前,我们需要了解...

Global site tag (gtag.js) - Google Analytics