1、第十章,自定义标签,2,回顾,EL (Expression Language) 表示表达式语言JSP 标准标签库专家组和 JSP 2.0 专家组共同开发了 JSP ELJSP 表达式语言用于访问存储于 JavaBean 中的数据JSP 表达式语言可以用于任何静态文本和标准标签或自定义标签,3,目标,理解自定义标签实现简单的自定义标签重用带标签文件的内容,4,什么是自定义标签?,Jsp中的动作元素本质上是一段java代码,在jsp页面被转换为Servlet期间,jsp容器遇到动作元素的标签,就用预先定义的对应于该标签的java代码来替代它自定义标签实际上是一个实现了特定接口的java类,封装了一
2、些常用功能,在运行时,标签被相应的代码所替代,标签的集合就构成了标签库标签取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计人员。,5,自定义标签是遵循 格式的标准 HTML 标签,嵌入 Java 代码,标签处理程序文件,前缀,自定义标签,什么是自定义标签?, ,6,标签库的示例如下:JSP 标准标签库 (JSTL) - 提供两组标签,一组使用 EL(Expression Language,表达式语言),而另一组不使用 EL(下一章内容)JRun 标签库 - 不再提倡使用的标签库,但是它构成 JSTL 的基础Struts TagLib - 提供允许开发人员实现模型
3、-视图-控制器 (MVC) 设计模式的标签(二年内容),标签库,按照功能或实现进行分组的自定义标签的集合,7,JSP自定义标签的优点,分离了程序逻辑和表示逻辑将Java代码从HTML中剥离,便于美工维护页面减少了JSP页面中的脚本,减少了维护成本提供了可重用的功能组件,8,Jsp中标签的分类,要开发自定义标签,其核心就要编写标签处理器类JSP1.2中的标签(传统的标签)JSP2.0中新增的标签简单标签标签文件,9,JSP 页面,应用程序部署描述符,标签处理程序的组件,标签库描述符,标签处理程序,标签库,10,实现方式,实现方式,自定义标签,标签处理程序,标签文件,自定义标签,11,标签处理程序
4、,Java 文件,实现或扩展 Tag、IterationTag 或 BodyTag 接口,定义 doStartTag() 方法,通过调用 release() 方法取消引用标签处理程序实例,需要标签库描述符来实现,标签处理程序,12,标签库API,标签库API定义在javax.servlet.jsp.tagext包中,Tag接口:开发一个标签所要完成的基本接口iterationTag:增加了迭代功能bodyTag:开发带有标签体的标签,13,开发标签,我们开发标签时一般通过继承BodyTagSuport类来实现自定义标签,14,Tag接口,15,传统标签的处理过程,通过setPageContex
5、t()实例化上下文设置上一级标签如果没有设为null设置属性调用doStartTag()方法调用doEndTag()方法释放空间,doStartTag()返回的两个值:EVAL_BODY_INCLUDE:标签体需要执行SKIP_BODY:忽略标签体,doEndag()返回的两个值:EVAL_PAGE:执行jsp页面剩余部分 SKIP_PAGE:忽略jsp页面的剩余部分,16,开发步骤,开发标签类编写标签描述文件(.tld文件)在web.xml指定标签库的引用,17,Step1:开发标签类,18,Step2:在.tld文件中配置标签,在WEBINF目录下建立tlds目录,在这个目录下放置标签库描
6、述文件*.tld,指明没有标签体,19,Step3:在web.Xml中配置标签库信息,20,Step4:Jsp页面中使用标签,21,标签的类型,不带属性和主体的简单标签如:不带主体但有属性的标签如带有主体和属性的标签主体内容开发迭代标签,22,不带主体但有属性的标签,开发MaxTag.java在tld文件中加入,maxtag oldtag.MaxTag empty num1 true/表明该属性是必备的 true/表明可以接受运行时表达式 num2 true true ,23,基本的标签生命周期,24,开发带body的标签,编写GreetTag.java编写.tld文件编写测试文件,注意这里引
7、用标签库的语句至此介绍了三种引用标签库的方式:第一种:需要仔web.xml文件中设置元素。第二种:直接将页面的taglib指令的uri属性制定为tld文件的位置第三种:直接在tld文件中设置元素,BodyTagDemo,25,简单标签的开发,简单标签为jsp2.0新增的内容,开发过程比较简单,一般我们只要重写doTag()方法,实现标签的业务逻辑就行了,对应的接口是SimpleTag接口SimpleTagSupport类实现了SimpleTag接口见SimpleTagDemo,setJspContext()setParent(),设置标签的属性,setJspBody(),doTag(),26,
8、标签文件,传统标签和简单标签的开发,需要使用java语言编写标签处理类,而标签文件允许使用jsp语法来定制标签。存储在WEB-INF/tags目录中,扩展名为.tag的文件。标签文件的语法与jsp页面的语法类似,在jsp页面中可以使用的语法在标签文件中也可以使用。不同之处在于:Jsp中的page指令在标签文件中不能使用。标签文件中增加了tag指令、attribute指令和variable指令和两个标准动作元素只能在标签文件中使用,27,标签文件,包含 JSP 元素的文本文件,page 指令不能用于标签文件中,标签文件,使用特殊标准动作标签如 和 ,28,标签 文件例1,容器会自动搜索/WEB-
9、INF/tags目录及其子目录下所有扩展名为.tag的文件,这些文件被识别为标签文件。,hello.tag,29,标签 文件,标签文件本质上就是简单标签在标签文件中所写的代码被转换为java类中doTag()方法中的代码指令:用于声明自定义标签的属性:类似于jsp中的page指令动作:对自定义标签的主体进行操作,结果发送到JspWriter:将JspFragment类型的属性的执行结果输出到JspWrite对象,或者保存到指定的范围变量中,30,标签 文件例,见tagFileDemo2,31,为什么使用标签文件,可以简洁的在JSP页面上构建模板便于程序员和页面编辑人员的分工,便于各自维护代码和
10、页面非常好的分离了页面内容和表现形式标签文件具有良好的可重用性,32,标签文件注意问题,标签文件应放到/WEB-INF/tags/目录下。Tags目录下可以有子目录,每一个子目录就是一个标签库,33,总结,自定义标签在 JSP 页面中嵌入少量的 Java 代码自定义标签遵循标准 HTML 标签格式。可以通过创建 Java 类或创建标签文件来实现自定义标签使用 Java 类文件实现的自定义标签,需要标签处理程序和标签库描述符文件用 Java 类文件实现的自定义标签,必须扩展或实现 javax.servlet.jsp.tagext 包使用标签文件实现的自定义标签,不需要标签库描述符 使用标签文件实现的自定义标签可以与 JSP 引擎 2.0 和更高版本一起使用标签库有助于按照类似的功能对自定义标签进行分类,