JSP中怎么自定义标签

JSP中怎么自定义标签,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

创新互联建站长期为1000多家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为江津企业提供专业的成都做网站、网站建设,江津网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。

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

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

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

(2) 定义tld文件

     1.0    1.1        displayDate     cn.com.chenlly.tag.DateTagNoBody     empty              

(3) JSP页面动态引用

<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%>                   

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

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

                    myTags       /WEB-INF/lib/DateTagLib.tld                     

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

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

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

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

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

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

import java.io.IOException;  import java.util.Date;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.jsp.JspException;  import javax.servlet.jsp.JspWriter;  import javax.servlet.jsp.tagext.Tag;  import javax.servlet.jsp.tagext.TagSupport;  //无正文标签类继承的是TagSupport类 实现的接口是Tag。 如果有正文的标签类继承的是BodyTagSupport类 实现的接口是BodyTag  public class DateTagNoBody extends TagSupport {      private String pattern;   @Override   public int doStartTag() throws JspException {    HttpServletRequest request;    // 是TagSupport类中定义的一个属性,它是javax.servlet.jsp.PageContext的对象    request = (HttpServletRequest) pageContext.getRequest();    java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(pattern);    String date = formater.format(new Date());    JspWriter out = pageContext.getOut();    try {     out.print(date);    } catch (IOException e) {     e.printStackTrace();    }    // doStartTag() 方法返回 SKIP_BODY 。当然其原因是我们的简单日期标记没有正文。    return Tag.SKIP_BODY;   }      //必须实现setXX()方法   public void setPattern(String pattern){    this.pattern = pattern;   }  }

(2) 定义tld文件

       1.0     1.1          displayDate      cn.com.chenlly.tag.DateTagNoBody      empty                     pattern          String           false          false           

(3)JSP页面动态引用

<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/datetag.tld" prefix="c"%>                   
        

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

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

import java.io.IOException;  import java.util.Date;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.jsp.JspException;  import javax.servlet.jsp.JspWriter;  import javax.servlet.jsp.tagext.BodyContent;  import javax.servlet.jsp.tagext.BodyTagSupport;   public class BodyTag extends BodyTagSupport {      private int count;    private HttpServletRequest reqeust;    private JspWriter out;       public void init() {    reqeust = (HttpServletRequest) pageContext.getRequest();    out = pageContext.getOut();   }    @Override   public int doStartTag() throws JspException {    init();    return this.EVAL_BODY_INCLUDE;   }      //设置当前标签体   @Override   public void setBodyContent(BodyContent bodyContent) {    this.bodyContent = bodyContent;    System.out.println("setBodyContent...");    }      //需要初始化bodyContent   @Override   public void doInitBody() throws JspException {    System.out.println("init.....");   }      @Override   public int doAfterBody() throws JspException {    if (count >= 1) {     try {      out.println(count);      out.println("
");     } catch (IOException e) {      e.printStackTrace();     }     count --;     return this.EVAL_BODY_AGAIN;    } else {     return this.SKIP_BODY;    }   }    @Override   public int doEndTag() throws JspException {    java.text.SimpleDateFormat formater = new java.text.SimpleDateFormat(      "yyyy-MM-dd");    String date = formater.format(new Date());    try {     out.print(date);    } catch (IOException e) {     e.printStackTrace();    }    return this.EVAL_PAGE;   }    // 必须实现setXX()方法   public void setCount(int count) {    this.count = count;   }  }

(2) 定义tld文件

     1.0    1.1        iterator     cn.com.chenlly.tag.BodyTag     jsp                  count         int          false         false        

(3) jsp 页面动态引用

<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/WEB-INF/bodytag.tld" prefix="c"%>               HelloWorld!    <%      out.println("Bye Bye");      %>    

效果图:

JSP中怎么自定义标签

执行顺序

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则不执行此页面的其它代码。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


分享文章:JSP中怎么自定义标签
文章起源:http://scyanting.com/article/ggpsej.html