`
kidiaoer
  • 浏览: 821939 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

jsp自定义标签实例

    博客分类:
  • jsp
阅读更多
jsp自定义标签实例

JSP自定义标签。在自定义标签的起始和结束标签之间的部分为标签体(Body)。
   标签处理程序类:定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。
   标签库描述符(TLD)文件:描述标签库的XML文档,向JSP引擎提供有关自定义标签的标签处理程序的信息。tag标签相关属性:实现简单标签处理程序 标签处理程序是一个在运行时调用的Java类,它包含在 JSP文件中使用的自定义标签的实现代码.标签处理程序必须实现或扩展javax.servlet.jsp.tagext包中的类和接口.javax.servlet.jsp.tagext含有允许标签处理程序类与JSP容器通信的接口和类。

最近在项目中要用到这种技术,所以自己就写一个经典的HelloWorld实例:
其实对自定义标签已经早有接触了(Struts中使用了很多自定义标签,如html、bean等)
使用这种技术的优点:取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计人员

实现步骤:
首先启动eclipse,新建一个web项目(废话...)

1、修改web.xml文件,增加自定义标签支持

   1. <?xml version="1.0" encoding="UTF-8"?>   
   2. <web-app version="2.5"   
   3.      xmlns="http://java.sun.com/xml/ns/javaee"   
   4.      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
   5.      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
   6.      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">     
   7.    <jsp-config>   
   8.      <taglib>   
   9.          <taglib-uri>/helloworldTag</taglib-uri>   
  10.          <taglib-location>/WEB-INF/tlds/helloworld.tld</taglib-location>   
  11.      </taglib>   
  12.    </jsp-config>   
  13. </web-app>  

<?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>
     <taglib-uri>/helloworldTag</taglib-uri>
     <taglib-location>/WEB-INF/tlds/helloworld.tld</taglib-location>
 </taglib>
  </jsp-config> 
</web-app>



2、创建标签库TLD文件 tlds\helloworld.tld

   1. <?xml version="1.0" encoding="UTF-8"?>   
   2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
   3. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">      
   4. <taglib>   
   5.     <tlib-version>1.0</tlib-version><!-- 标签库的版本 -->   
   6.     <jsp-version>1.2</jsp-version><!-- 这个标签库要求的JSP规范版本 -->   
   7.     <short-name>mytag</short-name><!-- JSP页面编写工具可以用来创建助记名的可选名字 -->   
   8.     <tag>   
   9.        <name>helloworld</name><!-- 唯一标签名 -->   
  10.        <tag-class>com.fastfish.HelloWorldTag</tag-class><!-- 标签HelloWorldTag类的完全限定名 -->   
  11.        <body-content>empty</body-content><!-- 正文内容类型 -->   
  12.     </tag>   
  13. </taglib>  

<?xml version="1.0" encoding="UTF-8"?>
<!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><!-- 这个标签库要求的JSP规范版本 -->
   <short-name>mytag</short-name><!-- JSP页面编写工具可以用来创建助记名的可选名字 -->
   <tag>
      <name>helloworld</name><!-- 唯一标签名 -->
      <tag-class>com.fastfish.HelloWorldTag</tag-class><!-- 标签HelloWorldTag类的完全限定名 -->
      <body-content>empty</body-content><!-- 正文内容类型 -->
   </tag>
</taglib>




这里注意:web.xml和xxx.tld这两个XML文件的头信息的版本匹配很重要,否则会导致页面报错找不到标签


3、创建标签处理程序类 HelloWorldTag(重写doStartTag和doEndTag方法)
Java代码 复制代码
   1. package com.fastfish;   
   2.   
   3. import java.io.IOException;   
   4. import javax.servlet.jsp.JspException;   
   5. import javax.servlet.jsp.JspTagException;   
   6. import javax.servlet.jsp.tagext.TagSupport;   
   7. /**
   8. * TagSupport与BodyTagSupport的区别:
   9. * 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport
  10. * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport
  11. */  
  12. public class HelloWorldTag extends TagSupport {   
  13.     private static final long serialVersionUID = 3174234039143531070L;   
  14.     @Override  
  15.     public int doStartTag() throws JspException {//这个方法不用所以直接返回值   
  16.         return EVAL_BODY_INCLUDE;   
  17.      }   
  18.     @Override  
  19.     public int doEndTag() throws JspException {//重点在这个方法上   
  20.         try {   
  21.              pageContext.getOut().write("Hello World!");//标签的返回值     
  22.          } catch (IOException ex) {   
  23.             throw new JspTagException("错误");   
  24.          }   
  25.         return EVAL_PAGE;   
  26.      }   
  27. }  

package com.fastfish;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
/**
 * TagSupport与BodyTagSupport的区别:
 * 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport
 * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport 
 */
public class HelloWorldTag extends TagSupport {
 private static final long serialVersionUID = 3174234039143531070L;
 @Override
 public int doStartTag() throws JspException {//这个方法不用所以直接返回值
  return EVAL_BODY_INCLUDE;
 }
 @Override
 public int doEndTag() throws JspException {//重点在这个方法上
  try {
   pageContext.getOut().write("Hello World!");//标签的返回值  
  } catch (IOException ex) {
   throw new JspTagException("错误");
  }
  return EVAL_PAGE;
 }
}




补充:
doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字
doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步

EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
EVAL_PAGE:继续处理页面,doEndTag()函数可用
SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的。

预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页
如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页


4、最终测试页面 hello.jsp
   1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>   
   2. <%@ taglib uri="/helloworldTag" prefix="mytag"%><!-- 在页面中加以声明 -->   
   3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">   
   4. <html>   
   5.    <head>   
   6.      <title>MyJSP</title>       
   7.    </head>     
   8.    <body>   
   9.      <h1>自定义标签:</h1><br>   
  10.      <mytag:helloworld></mytag:helloworld>   
  11.    </body>   
  12. </html>  

分享到:
评论

相关推荐

    jsp 自定义标签实例

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

    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