当前位置: 代码迷 >> Java相关 >> java学习笔记—自定义标签一(39)
  详细解决方案

java学习笔记—自定义标签一(39)

热度:92   发布时间:2016-04-22 20:22:08.0
java学习笔记—自定义标签1(39)

在实际的开发中,如为了简化JSP中出现大量的JSP脚本,那么我们需要使用标准标签库和EL表达式,但是和新标签库中提供的标签是有限的,不可能完全满足开发的需要。如:分页。因此需要学习如何自定义自己的标签库。

如果要实现自定义标签,那么需要如下几步:

  1. 编写标签处理类

需要继承或者实现相关的类或者接口

  1. 编写标签描述文件

该文件是一个XML文件,而且必须放在网站的WEB-INF目录中

  1. 在JSP中引入标签且使用

使用taglib指令引入标签库,随后使用。

自定标签的类体系

详细了解下一下几个类和接口:

---| JspTag接口

该接口是一个典型的标记接口。主要标记实现该接口的类可以处理标签。Seralizable

----| Tag接口

该接口主要描述的是标签处理类的共性,但是实现该接口的类不能处理标签体,该接口中定义了标签处理类和JSP页面之间的通信协议。而且提供生命周期方法如:在标签开始和接结束的时候自动执行的方法。

------| TagSupport类

主要负责处理标签的属性。

-------| BodyTagSupport类

该类主要的是处理标签的标签体。

  体验

1. 处理类

public class HelloHanler implements Tag {    private PageContext pageContext = null;    // 标签结束的时候执行    public int doEndTag() throws JspException {        return 0;    }    // 标签开始的时候执行    public int doStartTag() throws JspException {        // 给页面输出一个hello信息        JspWriter out = pageContext.getOut();        // 输出信息        String info = "hello custom tag";        try {            out.write(info);        } catch (IOException e) {            e.printStackTrace();        }        return 0;    }    // 获取其父标签    public Tag getParent() {        return null;    }    // 释放    public void release() {    }    // 设置jsp上下文对象    public void setPageContext(PageContext pc) {       this.pageContext = pc;    }    // 设置父标签    public void setParent(Tag t) {    }}

2. 描述文件

<?xml version="1.0" encoding="UTF-8"?><taglib     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-jsptaglibrary_2_1.xsd"    version="2.1">  <!-- 2. 编写标签库描述文件 -->    <tlib-version>1.0</tlib-version>  <short-name>jnb</short-name>   <tag>      <name>hello</name>    <tag-class>cn.itcast.test.HelloHanler</tag-class>    <body-content>empty</body-content>  </tag></taglib>   

3. 引入

<%@taglib uri="/WEB-INF/test.tld" prefix="jnb"%>     <br/><jnb:hello/>

JSP1.2进行自定义标签开发

  自定义一个现实日期的标签。

1. 实现可以处理标签属性的标签处理类

public class ShowDate extends TagSupport {    // 为了便于获取属性,那么直接在处理类中定义和属性同名的属性变量即可且提供get和set方法    private String pattern;    public String getPattern() {        return pattern;    }    public void setPattern(String pattern) {        this.pattern = pattern;    }    // 标签开始的时候自动执行    public int doStartTag() throws JspException {        // 创建日期对象        Date date = new Date();        // 创建格式化对象        SimpleDateFormat format = new SimpleDateFormat(getPattern());        // 格式化        String str = format.format(date);        // 获取JSP上下文对象        PageContext pageContext = this.pageContext;        // 获取JSP的OUT输出流        JspWriter out = pageContext.getOut();        // 输出        try {            out.write(str);        } catch (IOException e) {            e.printStackTrace();        }        return super.doStartTag();    }}

2. 描述文件

<taglib             ? 标签库描述文件的根元素    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-jsptaglibrary_2_1.xsd"     version="2.1">  <!-- 2. 编写标签库描述文件 -->    <tlib-version>1.0</tlib-version>        ? 指定标签库的版本(必须)  <short-name>jnb</short-name>            ? 指定标签库的简称(必须)  <tag>                                      ? 指定一个标签开始    <name>showdate</name>                    ? 标签名    <tag-class>cn.itcast.custom.ShowDate</tag-class>    ? 指定标签处理类    <body-content>empty</body-content>    ? 指定标签体,JSP(有)empty(没有)    <attribute>                            ? 描述属性        <name>pattern</name>                ? 属性名        <required>true</required>        ? 属性的说明信息        <rtexprvalue>true</rtexprvalue>    ? 属性值的说明信息    </attribute>  </tag></taglib>  

3.  引入和使用

<%@taglib uri="/WEB-INF/date.tld" prefix="date"%>     <date:showdate pattern="yyyy年MM月dd日 a E"/>

 

   实现带标签体的自定义标签

1. 标签处理类

public class ShowDateByBody extends BodyTagSupport {    // 为了便于获取属性,那么直接在处理类中定义和属性同名的属性变量即可且提供get和set方法    private String pattern;    public String getPattern() {        return pattern;    }    public void setPattern(String pattern) {        this.pattern = pattern;    }    // 标签开始的时候自动执行    public int doStartTag() throws JspException {        // 创建日期对象        Date date = new Date();        // 创建格式化对象        SimpleDateFormat format = new SimpleDateFormat(getPattern());        // 格式化        String str = format.format(date);        // 获取JSP上下文对象        PageContext pageContext = this.pageContext;        // 获取JSP的OUT输出流        JspWriter out = pageContext.getOut();        // 获取标签提的内容        BodyContent body = this.getBodyContent();        String tag_body = body.getString();        str = "<font color='red'>"+tag_body+"</font>"+str;        // 输出        try {            out.write(str);        } catch (IOException e) {            e.printStackTrace();        }        return super.doStartTag();    }}

2. 描述文件

  <tag>      <name>showdate2</name>    <tag-class>cn.itcast.custom.ShowDateByBody</tag-class>    <body-content>JSP</body-content>    <attribute>        <name>pattern</name>        <required>true</required>        <rtexprvalue>true</rtexprvalue>    </attribute>  </tag>

3. 引入和使用

<date:showdate2 pattern="yyyy-MM-dd">系统时间:</date:showdate2>

  相关解决方案