自定义标签

1 自定义标签概述

1.1 自定义标签的步骤

其实我们在JSP页面中使用标签就等于调用某个对象的某个方法一样,例如:<c:if test=””>,这就是在调用对象的方法一样。自定义标签其实就是自定义类一样!

l  定义标签处理类:必须是Tag或SimpleTag的实现类;

l  编写标签库描述符文件(TLD);

SimpleTag接口是JSP2.0中新给出的接口,用来简化自定义标签,所以现在我们基本上都是使用SimpleTag。

Tag是老的,传统的自定义标签时使用的接口,现在不建议使用它了。

1.2 SimpleTag接口介绍

SimpleTag接口内容如下:

l  void doTag():标签执行方法;

l  JspTag getParent():获取父标签;

l  void setParent(JspTag parent):设置父标签

l  void setJspContext(JspContext context):设置PageContext

l  void setJspBody(JspFragment jspBody):设置标签体对象;

请记住,万物皆对象!在JSP页面中的标签也是对象!你可以通过查看JSP的“真身”清楚的知道,所有标签都会变成对象的方法调用。标签对应的类我们称之为“标签处理类”!

标签的生命周期:

  1. 当容器(Tomcat)第一次执行到某个标签时,会创建标签处理类的实例;
  2. 然后调用setJspContext(JspContext)方法,把当前JSP页面的pageContext对象传递给这个方法;
  3. 如果当前标签有父标签,那么使用父标签的标签处理类对象调用setParent(JspTag)方法;
  4. 如果标签有标签体,那么把标签体转换成JspFragment对象,然后调用setJspBody()方法;
  5. 每次执行标签时,都调用doTag()方法,它是标签处理方法。

HelloTag.java

public class HelloTag implements SimpleTag {

private JspTag parent;

private PageContext pageContext;

private JspFragment jspBody;

public void doTag() throws JspException, IOException {

pageContext.getOut().print("Hello Tag!!!");[崔1]

}

public void setParent(JspTag parent) {

this.parent = parent;

}

public JspTag getParent() {

return this.parent;

}

public void setJspContext(JspContext pc) {

this.pageContext = (PageContext) pc;

}

public void setJspBody(JspFragment jspBody) {

this.jspBody = jspBody;

}

}

1.3 标签库描述文件(TLD)

标签库描述文件是用来描述当前标签库中的标签的!标签库描述文件的扩展名为tld,你可以把它放到WEB-INF下,这样就不会被客户端直接访问到了。

hello.tld

<?xml version="1.0" encoding="UTF-8"?>

<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xml="http://www.w3.org/XML/1998/namespace"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

                     http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">

<tlib-version>1.0</tlib-version>[崔2]

<short-name>itcast</short-name>[崔3]

<uri>http://www.itcast.cn/tags</uri>[崔4]

<tag>[崔5]

<name>hello</name>[崔6]

<tag-class>cn.itcast.tag.HelloTag</tag-class>[崔7]

<body-content>empty</body-content>[崔8]

</tag>

</taglib>

1.4 使用标签

在页面中使用标签分为两步:

l  使用taglib导入标签库;

l  使用标签;

<%@ taglib prefix="it" [崔9] uri="/WEB-INF/hello.tld"[崔10]  %>

......

<it:hello/>

2 自定义标签进阶

2.1 继承SimpleTagSupport

  继承SimpleTagSuppport要比实现SimpleTag接口方便太多了,现在你只需要重写doTag()方法,其他方法都已经被SimpleTagSuppport完成了。

public class HelloTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException {

this.getJspContext().getOut().write("<p>Hello SimpleTag!</p>")[崔11] ;

}

}

2.2 有标签体的标签

我们先来看看标签体内容的可选值:

<body-content>元素的可选值有:

l  empty:无标签体。

l  JSP:传统标签支持它,SimpleTag已经不再支持使用<body-content>JSP</body-content>标签体内容可以是任何东西:EL、JSTL、<%=%>、<%%>,以及html;

l  scriptless:标签体内容不能是Java脚本,但可以是EL、JSTL等。在SimpleTag中,如果需要有标签体,那么就使用该选项

l  tagdependent:标签体内容不做运算,由标签处理类自行处理,无论标签体内容是EL、JSP、JSTL,都不会做运算。这个选项几乎没有人会使用!

自定义有标签体的标签需要:

l  获取标签体对象:JspFragment jspBody = getJspBody();;

l  把标签体内容输出到页面:jspBody.invoke(null);

l  tld中指定标签内容类型:scriptless。

public class HelloTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException {

PageContext pc = (PageContext) this.getJspContext();

HttpServletRequest req = (HttpServletRequest) pc.getRequest();

String s = req.getParameter("exec");

if(s != null && s.endsWith("true")) {

JspFragment body = this.getJspBody()[崔12] ;

body.invoke[崔13] (null);

}

}

}

<tag>

<name>hello</name>

<tag-class>cn.itcast.tags.HelloTag</tag-class>

<body-content>scriptless</body-content>[崔14]

</tag>

<itcast:hello>

<h1>哈哈哈~</h1>

</itcast:hello>

2.3 不执行标签下面的页面内容

  如果希望在执行了自定义标签后,不再执行JSP页面下面的东西,那么就需要在doTag()方法中使用SkipPageException。

public class SkipTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException {

this.getJspContext().getOut().print("<h1>只能看到我!</h1>");

throw new SkipPageException();

}

}

<tag>

<name>skip</name>

<tag-class>cn.itcast.tags.SkipTag</tag-class>

<body-content>empty</body-content>

</tag>

<itcast:skip/>

<h1>看不见我!</h1>

2.4 带有属性的标签

  一般标签都会带有属性,例如<c:if test=””>,其中test就是一个boolean类型的属性。完成带有属性的标签需要:

l  在处理类中给出JavaBean属性(提供get/set方法);

l  在TLD中部属相关属性。

public class IfTag extends SimpleTagSupport {

private boolean test;

public boolean isTest() {

return test;

}

public void setTest[崔15] (boolean test) {

this.test = test;

}

@Override

public void doTag() throws JspException, IOException {

if(test) {

this.getJspBody().invoke(null);

}[崔16]

}

}

<tag>

<name>if</name>

<tag-class>cn.itcast.tag.IfTag</tag-class>

<body-content>scriptless</body-content>

<attribute>[崔17]

<name>test</name>[崔18]

<required>true</required>[崔19]

<rtexprvalue>true</rtexprvalue>[崔20]

</attribute>

</tag>

<%

pageContext.setAttribute("one", true);

pageContext.setAttribute("two", false);

%>

<it:if test="${one }">xixi</it:if>[崔21]

<it:if test="${two }">haha</it:if>[崔22]

<it:if test="true">hehe</it:if>[崔23]


[崔1]获取out对象,输出Hello Tag!!!

[崔2]指定当前标签库的版本

[崔3]指定当前标签库的简称,这个名称无所谓了,随便起。

[崔4]指定标签库的uri

[崔5]部署一个标签!一个<tag>表示一个标签。

[崔6]指定标签的名称

[崔7]指定标签处理类

[崔8]指定标签体内容类型为空类型,即没有标签体。

[崔9]指定标签库前缀

[崔10]指定标签库的tld文件位置

[崔11]向页面输出!注意,不能向页面输出<%%>东西!

[崔12]获取当前标签的标签体对象

[崔13]向页面输出标签体内容。

[崔14]指定标签体内容为scriptless,即标签体内容可以是正常的html,也可以是EL或JSTL

[崔15]该方法会在doTag()之前被调用,传入属性值。

[崔16]如果test为true,执行标签体内容,否则什么都不做。

[崔17]声明属性

[崔18]属性名称为test

[崔19]为true表示属性是必须的,为false表示属性为可选的。

为true表示 [崔20]属性值可以为EL或JSTL,否则表示只能是常量。

[崔21]可以看到xixi

[崔22]不会执行haha

[崔23]可以看到hehe

学习笔记_Java_day13_JSTL_自定义标签库(9)的更多相关文章

  1. JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)

    一.自定义标签,步骤 * 确定需求 * <my:date /> 输出当前系统的时间 yyyy-MM-dd hh:mm:ss:SSS * 编写Java类 新建包名:com.yxl.tag,新 ...

  2. Android学习笔记_41_TabHost自定义标签和TraceView性能测试

    一.tabhost第一种用法,通过在帧布局放入定义好的page页面来实现,这样导致在当前activity下代码量比较大. 1.页面布局: |        |        |        |    ...

  3. 1.4(学习笔记)JSP自定义标签

    一.JSP自定义标签 JSP自定义标签,可以通过实现Tag接口.继承TagSupport类来设置标签功能. 后续通过配置文件将标签和具体的实现类关联. 二.自定义第一个标签(实现Tag接口) 自定义标 ...

  4. JavaWeb学习笔记——JSTL核心标签库

  5. JavaWeb学习笔记——JSP标准标签库JSTL

  6. JavaWeb学习篇之----自定义标签&&JSTL标签库详解

    今天来看一下自定义标签的内容,自定义标签是JavaWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面 ...

  7. 学习日常笔记<day14>自定义标签

    1自定义标签 1.1第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类 /** * 标签处理器类 * @author APPle * 1)继 ...

  8. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  9. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

随机推荐

  1. CodeForces 370A Rook, Bishop and King

    此题看似很简单,但实际上有不少细节,WA点不少.分情况处理即可. #include<cmath> #include<cstdio> #include<string> ...

  2. feed4junit 实现junit4框架体系下数据驱动

    junit 是一款很好用的测试框架,但是该框架在并行和数据驱动方面没有提供支持,往往我们队这2个需求是很迫切的,不过有需求就会有人去做,有心思的人出现了,feed4junit 出现了,弥补了junit ...

  3. JSP---演示ErroPage、isErroPage和jsp:forword标签

    属性说明: language – 示例:language="java" import -如: (注意多个引用之间使用逗号分开.) <%@ page import=" ...

  4. codeforces Round #347 (Div. 2) C - International Olympiad

    思路:从后往前一位一位的模拟,每次判断一下当前枚举的数是否之间枚举过了.或者当前枚举数过小,小于1989. #include<cstdio> #include<cstring> ...

  5. [html]js打开指定页面

    1.在当前窗口打开 location.href = "http://www.baidu.com"; 2.可以设置开发方式 window.open("http://www. ...

  6. IBOutlet & IBAction

    IBOutlet UILabel *label; 这个label在Interface Builder里被连接到一个UILabel.此时,这个label的retainCount为2. 所以,只要使用了I ...

  7. NOIopenjudge 407:Heritage

    总时间限制:  5000ms 内存限制:  65536kB 描述 Your rich uncle died recently, and the heritage needs to be divided ...

  8. SQLite 入门教程(二)创建、修改、删除表 (转)

    转于 SQLite 入门教程(二)创建.修改.删除表 一.数据库定义语言 DDL 在关系型数据库中,数据库中的表 Table.视图 View.索引 Index.关系 Relationship 和触发器 ...

  9. 实现GetHashCode时要遵循的规则

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:实现GetHashCode时要遵循的规则.

  10. Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!具体解释!)

    Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone C ...