自定义的标签库
一、基本概念:

1.标签(Tag):
标签,通常也成为动作,是一组按照XML语法格式编写的代码片段,在JSP中,用来封装在页面中可重复利用的逻辑,通过标签可以使JSP网页变得简洁并且易于维护。由于标签是XML元素,所以它的名称和属性都是大小写敏感的

2.标签库(Tag library):
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。
SUN就推出了标准的JSTL。

3.标签库描述文件(Tag Library Descriptor): tld
标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。
loginServlet web.xml <servelt>
outTag xxx.tld <tag>

4.标签处理类(Tag Handle Class):
标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能

案例:
1. <c:hello> hello标签,jsp页面使用标签时输出hello
2. <c:out value="" default=""> 输出输入的值,如果没有值,输出default的值
3. <c:forEach items="${requestScope.book_list}" var="book">

二、创建和使用一个Tag Library的基本步骤:

---------------------------------------------
1. 创建标签的处理类
-- 继承TagSupport
-- 实现doStartTag和doEndTag方法
2. 创建标签库描述文件tld
3. 在JSP文件中引入标签库
4. 执行时如果有属性,会调用setXXX方法。

重点掌握:
pageContext属性
doStartTag()
doEndTag()
doAfterBody()

---------------------------------------------

统一资源定位符(URL,英语 Uniform / Universal Resource Locator 的缩写)也被称为网页地址,是因特网上标准的资源的地址(Address)

Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通用资源标志符(Uniform Resource Identifier, 简称"URI")进行定位。

1.创建标签的处理类(Tag Handler Class)
hello标签,在jsp页面使用标签时输出helloworld
out标签,功能类似JSTL的<c:out>
forEach标签,功能类似JSTL的<c:forEach>

-- 以继承TagSupport的方式去开发一个标签.TagSupport是Tag的一个实现,
我们只需去扩展它,并覆盖相应的方法,那么就可以实现标签的开发了
-- 实现doStartTag和doEndTag方法
--doStartTag()和doEndTag()返回值是在Tag Interface里定义的静态int
SKIP_BODY隐含0 就是跳过了开始和结束标签之间的代码。
EVAL_BODY_INCLUDE 隐含1 将body的内容输出到存在的输出流中。包括是jsp代码,也可以被输出
SKIP_PAGE 隐含5 忽略标签剩下的页面。
EVAL_PAGE 隐含6 继续执行标签下面的页

pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象
JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext方法,
设置pageContext。因此在标签处理类中可以直接访问pageContext变量

doAfterBody()这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,
如果标签体决定需要再计算一次则从doStartTag和doAfterBody返回EVAL_BODY_AGAIN。
前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。

2.创建标签库描述文件(Tag Library Descrptor File)
-- 在WEB-INF下添加一个mytag.tld文件
tld是taglib description 的缩写

<tag>
<name>out</name> 标签名称
<tag-class>org.hellohowlow.tags.OutTag</tag-class> 标签实现类
<body-content>JSP</body-content> 标签里面支持的内容
<attribute>
<name>var</name>
<required>true</required> 是否必须
<rtexprvalue>true</rtexprvalue> rtexprvalue的全称是 Run-time Expression Value, 它指定使用标签时能不能使用表达式来动态指定数据${name}.。true是可以,false是不可以。
</attribute>
</tag>

body-content的值:
tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。
empty:空标记,即起始标记和结束标记之间没有内容。
scriptless:接受文本、EL和JSP动作。最少用

3.在JSP文件中引人标签库

三、自定义JSP标签的处理过程:

1.在JSP中引入标签库:
<%@ taglib uri="http://org.hellohowlow.1401/jsp/jstl/core" prefix="hh" %>
2.在JSP中使用标签库标签:
<hh:hello/>
3.Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值
prefix="hh" uri="http://org.hellohowlow.1401/jsp/jstl/core"
4.Web容器自动到WEB-INF下面的tld文件中找到
<uri>http://org.hellohowlow.1401/jsp/jstl/core</uri>
5.从元素中获得对应的元素的值 hello
6.从.tld文件中找到与tagname对应的元素
<tag>
<name>hello</name> <!-- 标签的名称 -->
<tag-class>org.hellohowlow.tags.HelloTag</tag-class><!-- 标签的实现类 -->
<body-content>JSP</body-content> <!-- 标签里面支持的内容 -->
</tag>
7.Web容器根据元素的值创建相应的tag handle class的实例
<tag-class>org.hellohowlow.tags.HelloTag</tag-class>
8. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理

总结:
1. 创建标签的处理类
-- 继承TagSupport
-- 实现doStartTag和doEndTag方法,如果需要多次在body之后进行业务处理,需要重写doAfterBody方法。
2. 创建标签库描述文件tld
注意:tld中的attribute对应标签处理类的property属性(set/get)。
3. 在JSP文件中引入标签库
<%@ taglib uri="http://org.hellohowlow.1401/jsp/jstl/core" prefix="hh"%>
4. 执行时如果有属性,会调用setXXX方法。

JSP自定义标签开发步骤的更多相关文章

  1. javaweb学习总结(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  2. JSP自定义标签开发入门《转》

    JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; ...

  3. javaweb(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  4. JSP自定义标签开发入门

    一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...

  5. JEECMS自定义标签开发步骤2

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...

  6. JEECMS自定义标签开发步骤

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...

  7. jsp自定义标签开发

    参考:http://blog.csdn.net/lw001x/article/details/7589302

  8. 【JSP】自定义标签开发入门

    JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...

  9. Java jsp 自定义标签

    1 自定义标签 1.1 引入 需求: 向浏览器输出当前客户的IP地址 (只能使用jsp标签) 1.2 第一个自定义标签开发步骤 1)编写一个普通的java类,继承SimpleTagSupport类,叫 ...

随机推荐

  1. php基础篇:echo 与 print 的区别

    在实际使用中, print 和 echo 两者的功能几乎是完全一样.可以这么说,凡是有一个可以使用的地方,另一个也可以使用.但是,两者之间也还是一个非常重要的区别:在 echo 函数中,可以同时输出多 ...

  2. SDUT OJ 2054 双向链表的实现 (结构体node指针+遍历 *【模板】)

    双向链表 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 学会了单向链表,我们又多了一种解决问题的能力,单链表利用一个指针就能在内 ...

  3. Swift语言学习(三)基础操作符

    操作符是用于检测.更改或者组合值的特殊符号或短语.例如,加法操作符 (+) 将两个数字加到一起 (如 let i = 1 + 2).更复杂的例子包括逻辑与操作符 && (如 if en ...

  4. oracle自动表分析

    oracle 表的统计信息,跟他的执行计划很有关联 执行计划的正常是否,跟SQL的执行速度很有关系 首先讲解一下如何查看一个数据库的是否开启自动统计分析 1.查看参数:STATISTICS_LEVEL ...

  5. codeforces 690D1 D1. The Wall (easy)(dfs)

    题目链接: D1. The Wall (easy) time limit per test 0.5 seconds memory limit per test 256 megabytes input ...

  6. I.MX6 u-boot 2009 lvds hdmi lcd 补丁

    /************************************************************************* * I.MX6 u-boot 2009 lvds ...

  7. 「LuoguT36048」 Storm in Lover

    Description 平成二十四年(2012年),5月11日,东京,某弓道场. "呐,呐,海未酱,你听说了吗?几天后的那场弓道大会?啊-!"橙发少女兴奋地拿着一张传单一样的纸跑向 ...

  8. 洛谷P2473奖励关——状压DP

    题目:https://www.luogu.org/problemnew/show/P2473 还是对DP套路不熟悉... 像这种前面影响后面,而后面不影响前面的问题就应该考虑倒序递推: 看n只有15那 ...

  9. javascript的回调函数

    函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.F ...

  10. hexo博客实现多终端共享&webhook自动化部署

    摘要:好不容易搭建了hexo,还不满足.想要实现在小程序上也能访问博客,又不想再写一个后台.每次更新文章到服务器之后,希望能自动同步到网站上面.如果你有这样的需求,那么希望这篇文章能帮助到你. 我的配 ...