`

jsp自定义标签之浅谈jsp自定义标签实现过程

    博客分类:
  • jsp
 
阅读更多

(一) 没有正文的JSP自定义标签实现

(1):定义JSP自定义标签处理类

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.Tag;  
  7. import javax.servlet.jsp.tagext.TagSupport;  
  8. //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag  
  9. public class DateTagNoBody extends TagSupport {  
  10.  @Override  
  11.  public int doStartTag() throws JspException {  
  12.   HttpServletRequest request;  
  13.   // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象  
  14.   request = (HttpServletRequest) pageContext.getRequest();  
  15.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat("yyyy-MM-dd");  
  16.   String date = formater.format(new Date());  
  17.   JspWriter out = pageContext.getOut();  
  18.   try {  
  19.    out.print(date);  
  20.   } catch (IOException e) {  
  21.    e.printStackTrace();  
  22.   }  
  23.   // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。  
  24.   return Tag.SKIP_BODY;  
  25.  }  

(2) 定义tld文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <taglib> 
  3.    <tlibversion>1.0</tlibversion> 
  4.    <jspversion>1.1</jspversion> 
  5.   <tag> 
  6.     <name>displayDate</name> 
  7.     <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass> 
  8.     <bodycontent>empty</bodycontent> 
  9.   </tag>           
  10. </taglib> 

(3) JSP页面动态引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:displayDate/> 
  9.   </body> 
  10. </html> 

注意:动态引用和静态引用的区别。

为了进行静态引用,首先必须将下面的项加入到web.xml 文件中:

  1. <?xml version="1.0" encoding="ISO-8859-1" ?> 
  2. <Web-app>         
  3.    <taglib> 
  4.       <taglib-uri>myTags</taglib-uri> 
  5.       <taglib-location>/WEB-INF/lib/DateTagLib.tld</taglib-location> 
  6.    </taglib>                 
  7. </Web-app> 

然后,将JSP 声明加入到所有需要使用自定义标记库的页面中:

  1. <%@ taglib uri="myTags" prefix="c" %> 

指定的uri 属性与在web.xml 文件中指定的taglib-uri 值相匹配。

在进行标记库的静态引用时,JSP 声明必须查询 web.xml 文件以执行库查询。这意味着如果移动或者重命名了库,或者希望在 web.xml 文件中加入更多的库,就必须停止服务器、更新 web.xml 文件、然后重新启动服务器。动态方法让JSP页直接指向 TLD 位置,因而是在解释JSP页面时进行处理。

(二)  没有正文的但带有属性的JSP自定义标签标签实现

(1):定义JSP自定义标签处理类

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.Tag;  
  7. import javax.servlet.jsp.tagext.TagSupport;  
  8. //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag  
  9. public class DateTagNoBody extends TagSupport {  
  10.    
  11.  private String pattern;  
  12.  @Override  
  13.  public int doStartTag() throws JspException {  
  14.   HttpServletRequest request;  
  15.   // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象  
  16.   request = (HttpServletRequest) pageContext.getRequest();  
  17.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);  
  18.   String date = formater.format(new Date());  
  19.   JspWriter out = pageContext.getOut();  
  20.   try {  
  21.    out.print(date);  
  22.   } catch (IOException e) {  
  23.    e.printStackTrace();  
  24.   }  
  25.   // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。  
  26.   return Tag.SKIP_BODY;  
  27.  }  
  28.    
  29.  //必须实现setXX()方法  
  30.  public void setPattern(String pattern){  
  31.   this.pattern = pattern;  
  32.  }  

(2) 定义tld文件

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <taglib>  
  3.    <tlibversion>1.0</tlibversion>  
  4.    <jspversion>1.1</jspversion>  
  5.   <tag>  
  6.     <name>displayDate</name>  
  7.     <tagclass>cn.com.chenlly.tag.DateTagNoBody</tagclass>  
  8.     <bodycontent>empty</bodycontent>  
  9.     <!-- 定义属性 -->  
  10.     <attribute>  
  11.        <name>pattern</name> <!-- 属性名字 -->  
  12.        <type>String</type>  <!-- 属性类型 -->  
  13.        <requried>false</requried> <!-- 是否必须 -->  
  14.        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式  -->  
  15.   </attribute>  
  16.   </tag>  
  17. </taglib> 

(3)JSP页面动态引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:displayDate pattern='yyyy-MM-dd'/> 
  9.    </br> 
  10.    <c:displayDate pattern='MM/dd HH:mm:ss'/> 
  11.   </body> 
  12. </html> 

(三) 有正文的且带有属性的JSP自定义标签实现

(1):定义JSP自定义标签处理类

  1. import java.io.IOException;  
  2. import java.util.Date;  
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.jsp.JspException;  
  5. import javax.servlet.jsp.JspWriter;  
  6. import javax.servlet.jsp.tagext.BodyContent;  
  7. import javax.servlet.jsp.tagext.BodyTagSupport;  
  8.  
  9. public class BodyTag extends BodyTagSupport {  
  10.    
  11.  private int count;  
  12.  
  13.  private HttpServletRequest reqeust;  
  14.  
  15.  private JspWriter out;  
  16.  
  17.    
  18.  public void init() {  
  19.   reqeust = (HttpServletRequest) pageContext.getRequest();  
  20.   out = pageContext.getOut();  
  21.  }  
  22.  
  23.  @Override  
  24.  public int doStartTag() throws JspException {  
  25.   init();  
  26.   return this.EVAL_BODY_INCLUDE;  
  27.  }  
  28.    
  29.  //设置当前标签体  
  30.  @Override  
  31.  public void setBodyContent(BodyContent bodyContent) {  
  32.   this.bodyContent = bodyContent;  
  33.   System.out.println("setBodyContent...");   
  34.  }  
  35.    
  36.  
  37. //需要初始化bodyContent  
  38.  @Override  
  39.  public void doInitBody() throws JspException {  
  40.   System.out.println("init.....");  
  41.  }   
  42.  
  43.  
  44.  @Override  
  45.  public int doAfterBody() throws JspException {  
  46.   if (count >= 1) {  
  47.    try {  
  48.     out.println(count);  
  49.     out.println("<Br>");  
  50.    } catch (IOException e) {  
  51.     e.printStackTrace();  
  52.    }  
  53.    count --;  
  54.    return this.EVAL_BODY_AGAIN;  
  55.   } else {  
  56.    return this.SKIP_BODY;  
  57.   }  
  58.  }  
  59.  
  60.  @Override  
  61.  public int doEndTag() throws JspException {  
  62.   java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(  
  63.     "yyyy-MM-dd");  
  64.   String date = formater.format(new Date());  
  65.   try {  
  66.    out.print(date);  
  67.   } catch (IOException e) {  
  68.    e.printStackTrace();  
  69.   }  
  70.   return this.EVAL_PAGE;  
  71.  }  
  72.  
  73.  // 必须实现setXX()方法  
  74.  public void setCount(int count) {  
  75.   this.count = count;  
  76.  }  

(2) 定义tld文件

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <taglib> 
  3.    <tlibversion>1.0</tlibversion> 
  4.    <jspversion>1.1</jspversion> 
  5.   <tag> 
  6.     <name>iterator</name> 
  7.     <tagclass>cn.com.chenlly.tag.BodyTag</tagclass> 
  8.     <bodycontent>jsp</bodycontent> 
  9.     <!-- 定义属性 --> 
  10.     <attribute> 
  11.        <name>count</name> <!-- 属性名字 --> 
  12.        <type>int</type>  <!-- 属性类型 --> 
  13.        <requried>false</requried> <!-- 是否必须 --> 
  14.        <rtexprvale>false</rtexprvale> <!-- 表示是否可以使用JSP表达式  --> 
  15.   </attribute> 
  16.   </tag> 
  17. </taglib> 

(3) jsp 页面动态引用

  1. <%@ page language="java" pageEncoding="UTF-8"%> 
  2. <%@ taglib uri="/WEB-INF/bodytag.tld" prefix="c"%> 
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  4. <html> 
  5.   <head> 
  6.   </head> 
  7.   <body> 
  8.    <c:iterator count="10">HelloWorld!</c:iterator> 
  9.    <%  
  10.     out.println("Bye Bye");  
  11.     %> 
  12.   </body> 
  13. </html> 

效果图:

执行顺序

doStartTag()->setBodyContent()->doInitBody()->doAfterTag()->doEndTag()

如果doStartTag()返回的是EVAL_BODY_INCLUDE执行doAfterTag()方法,

如果它返回SKIP_BODY就执行doEndTag()方法。

setBodyContent()方法用于设置标签体内容,如果在计算BodyContent时需要进行一些初始化工作,

则在doInitBody()方法中完成。标签体内容执行完后,会调用doAfterBody()方法

在doAfterTag()方法中返回EVAL_BODY_AGAIN来重复执行doAfterTag()方法

返回SKIP_BODY值则执行doEndTag()方法。

在doEndTag()方法中返回EVAL_PAGE值,则执行此标签的后的其它代码,

返回SKIP_PAGE则不执行此页面的其它代码。

分享到:
评论

相关推荐

    浅谈Struts框架技术.

    Struts框架在JSP Model2架构上建立,实现了MVC模式,使得业务逻辑、数据显示和用户交互得以有效分离。 **MVC模式详解** MVC模式由模型(Model)、视图(View)和控制器(Controller)三部分组成。模型负责处理业务...

    浅谈Struts2拦截器的原理与实现.docx

    Struts2 拦截器是Struts2框架的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现对请求的预处理和后处理,从而增强应用程序的功能和控制流程。以下是对Struts2拦截器原理与实现的详细解析: ...

    浅谈SpringBoot 中关于自定义异常处理的套路

    浅谈SpringBoot 中关于自定义异常处理的套路 本文主要介绍了在 Spring Boot 项目中如何自定义异常处理的套路,包括静态异常页面和动态异常页面的定义方式。静态异常页面可以通过 HTTP 响应码来命名页面,例如 404....

    浅谈Servlet转发到JSP页面的路径问题(必看)

    - 自定义标签中的路径引用。 2. 当`/`代表Web站点的根路径时,它等价于`http://localhost:8080/`。这时,`/`用于浏览器处理的地址,例如: - 超链接:`&lt;a href="/TestServlet"&gt;To B&lt;/a&gt;` - `form`标签的`action`...

    浅谈tomcat一些细节配置

    【标题】:“浅谈Tomcat一些细节配置” Tomcat,作为Apache软件基金会的开源项目,是Java Servlet和JavaServer Pages(JSP)的容器,也是Java EE Web应用程序的标准实现。在实际开发和部署中,对Tomcat进行适当的...

    浅谈SpringMVC国际化支持

    在JSP页面中,我们可以使用JSTL的`fmt`标签库实现国际化。首先,引入`fmt`标签库: ```jsp &lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%&gt; ``` 然后,设置国际化资源文件: ```jsp ``` 最后,...

    浅谈java web中常用对象对应的实例化接口

    虽然在常规编程中用得不多,但在开发自定义JSP标签时非常关键。它提供了一个统一的接口来访问请求、响应、session、application等其他上下文对象,以及管理JSP页面的局部变量。 6. **Config对象**:Config对象是`...

    浅谈Struts2与Webwork的不同和相同点

    拦截器链使得请求处理更加模块化,控制器与Servlet API解耦,这使得Struts2在处理请求时更加灵活,允许开发者自定义拦截器来实现特定的功能。 其次,Struts2在命名和API上很大程度上沿用了WebWork的风格。许多...

    浅谈SpringMVC的执行流程

    `HandlerAdapter`是Spring MVC中的一个重要接口,它提供了一种统一的方式来调用Controller,无论Controller的实现方式如何。 4. **业务处理**: Controller执行相应的业务逻辑,这可能包括数据库查询、服务调用等...

    浅谈SpringMVC+Spring3+Hibernate4开发环境搭建

    5. **创建项目结构**:典型的项目结构包括src/main/resources下的配置文件、src/main/java下的业务层和服务层接口及实现、DAO层接口及实现,以及src/main/webapp下的Web资源,如静态文件、JSP页面等。 6. **引入...

    java offbiz 电子商务 系统 资料

    文档“ofbiz_cn.doc”和“浅谈OFBIZ.doc”可能包含了对Offbiz的基本介绍和中文教程,帮助初学者快速了解平台的核心概念和操作流程。这些文档可能会讲解如何安装和配置Offbiz环境,以及如何创建第一个项目。对于新手...

Global site tag (gtag.js) - Google Analytics