第八章 标签开发 为什么要自定义标签: 虽然Jsp里面付带有很多的标签,这是这些标签的功能和个数毕竟有限,为了得到功能更强大 并满足用户需要的标签,就要自己定义标签。自定义标签有两大优点: A:实现代码重用 B:封装数据的操作,把数据的表示与实现分离 D:虽然JavaBean以可以达到上述的要求,但是由于JavaBeanJavaBean不能与 jsp页面进行通信(不能在JavaBean中使用隐式对像), 所以有时我们不得不将"极少量"的 java代码 嵌入到HTML中 E:而标签由于可以使用jsp的所有元素,所以可以很好的与Html进行无缝连接,从而增加了jsp页面的可维护性与重用性 如何来自定义标签: A:编写标签处理程序,处理程序就是一普通的Java类,这个类必须要继承自BodyTagSupport, 并实现其中的重要的两个方法 public class TagTest extends BodyTagSupport { public int doStartTag() throws JspException { } public int doEndTag() throws JspException { } } B:编写标签库的描述文件(*.tld)注意一定要放在WEB-INF文件夹下面 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> //库的版本,随便写 <jsp-version>1.0</jsp-version> //jsp的版本,随便写 <short-name>tagtest</short-name> //标签的缩写名 <tag> <name>tagtest</name> //标签唯一名称,该名字决定了使用标签的名字 <tag-class>tagapp.TagTest</tag-class> //标签处理器类名 <body-content>jsp</body-content> //内容类型。一般为Jsp,表示可以是jsp中的任何内容 </tag> </taglib> C:使用标签: 1:先导入标签库:<%@ taglib uri="WEB-INF/TagTest.tld" prefix="chen" %> 2:通过<前缀:标签名>标签体</前缀:标签名> 编写标签库要注意的几项: 1:javax.servlet.jsp.tagext.*。提供创建标签库所需要的接口与类 2:在doStartTag()里面不能访问BodyContent主体内容,因为此时主体内容还没有产生 3:如果在doStartTag()里面返回值为SKIP_BODY,则表示跳过了主体内容,则在doEndTag 里面也不能访问BodyContent主体内容,否则会出现异常 4:所以如果要访问主体内容的操作,必须省略doStartTag()或在doStartTag()方法中 返回EVAL_BODY_BUFFERED表示不跳过主体内容,然后在doEndTag()方法中去处理 5:doEndTag()方法可以返回EVAL_Page(表示执行标签后面的页面代码)或 SKIP_PAGE(表示执行完标签之后就停止页面内容执行)一般返回EVAL_Page 6:要在标签中进行输出,可以通过 pageContext类的一个getOut()方法: JspWriter out = pageContext.getOut(); out.println("字符串")进行输出 7:要在标签中访问Jsp中的隐式对像: HttpServletResponse response=(HttpServletResponse)pageContext.getResponse(); HttpServletRequest request=(HttpServletRequest)pageContext.getRequest(); pageContext.getSession() 8:要在标签中访问Jsp标签中的标签体的内容(一般在doEndTag中): this.bodyContent.getString(); 标签的分类: A:简单标签: 格式:<前缀:标签名/> 特点:没有属性也没有标签体 定义方法:只要实现doStartTag()方法,并返回SKIP_BODY 举例: 1)自定义一个标签,能够自动产生网页的Log画面 2)自定义一个标签,能够自动产生一个登录窗体 3)自定义一个标签,能够产生一个关闭超连接 B:有标签体的标签 格式:<前缀:标签名>内容</前缀:标签名> 特点:没有属性,但是有标签体 定义方法: 一般有标签体的标签,都是希望标签处理器能够对标签体进行操作,如上所述由于 doStartTag本身不能对标签体进行引用,所以要对标签体进行操作只需要实现doEndTag(),并返回EVAL_Page 举例: 1)自定义一个标签,用来把标签的体中的英文字母由小写转换成为大写 2)自定义一个标签,以标签体作为消息提示来弹出一个对话框 C:有属性的标签(****) 格式:<前缀:标签名 属性名1=值1 属性名2=值2/> 特别:有属性,但是没有标签体 定义方法: 1)首先定义属性,通过set与get定义属性 2)由于没有标签体,所以只要实现doStartTag()方法,并返回SKIP_BODY 3)书写Tld标签描述文件。 <taglib> <tlib-version>1.0</tlib-version> //库的版本,随便写 <jsp-version>1.0</jsp-version> //jsp的版本,随便写 <short-name>tagtest</short-name> //标签的缩写名 <tag> <attribute> <name>num</name> //属性名 <required>true</required>//是否必须 <rtexprvalue>true</rtexprvalue>//是否支持jsp表达式来为属性赋值,一般为true </attribute> <attribute> <name>num</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> .................. <name>tagtest</name> //标签唯一名称,该名字决定了使用标签的名字 <tag-class>tagapp.TagTest</tag-class> //标签处理器类名 <body-content>jsp</body-content> //内容类型。一般为Jsp,表示可以是jsp中的任何内容 </tag> </taglib> 举例: 1)编写一个标签,有两个属性num1,与num2求出其中的最大值 2)编写一个属性,传入一条不返回结果的sql语句,这个标签会自动执行对应的sql语句 3)编写一个标签,可以实现数据信息少量显示。主要以下属性: title,moreUrl,detailUrl,keyFiled,textFiled,sql; 4)编写一个标签,传入商品类别,标签会查询出所有该类别的商品信息. 标签文件 什么是标签文件: 1)传统的共享Jsp页面代码的方法是将代码放入一个单独的文件中,在需要的地方包含 这个文件。<%@ include file="share.jsp"> 2)标签文件提供了一种更好的构建和重用模板的内容的共享方法 3)可以在标签文件中使用所有的Jsp元素。在标签文件中不能使用page指令 4)使用标签文件不需要实现任何类和接口,不使用doStartTag()和doEndTag()方法 5)不需要编写标签库的描述文件 6)一般而言,自定义标签用来处理业务逻辑,而标签文件用来实现界面模板共享(****) 如何创建并使用标签文件: 1)选择File--->NewFile--->从文件类型中选择tag 2)保存标签文件,注意一定要把标签文件保存在WEB-INF/tags文件夹下面 3)在标签文件的第一行写上:<%@ tag body-content="scriptless" pageEncoding="gbk" %> 其中body-content可以取: empty:表示是空标签,没有标签体 scriptless:表示在标签文件中可以接受文本、EL、JSP动作 pageEncoding:用来指示标签文件所使用的编码。如果不指定会出现乱码 一般选择scriptless 4)通过<%@ attribute name="uid" %>指令可以为标签文件设置属性,在使用标签时 可以传递属性给标签文件,从而实现标签文件的动态调用 5)对于attribute指定的属性变量名,只能够通过EL来访问,不能通过 <% %>来访问 6)可以在标签文件内部使用<jsp:doBODY>来引用标签文件体的内容 7)标签文件的使用: A)<%@ taglib tagdir="/WEB-INF/tags" prefix="chen" %> 导入标签文件 B)<前缀:标签文件/> 或 <前缀:标签文件>标签体<前缀:标签文件/> 8)标签文件要与jstl(jsp标准标签库)结合,才能发挥它的最大作用 标签文件应用举例: 1)通过标签文件实现,用于实现顶部和左边固定,右边变化。 A)做一个标签:top.tag 实现如下功能:首页|新闻快递|天气预报|在线娱乐|联系我们 B)做一个标签:left.tag 实现登录框与推荐文章列表功能 C)做页面jsp1,jsp2,jsp3去使用top.tag、left.tag 2)自定义一个标签文件,用来实现传入商品数量,单价,实付款,输出应付款,和找零 3)自定义一个标签文件,能够自动产生一个登录窗体并设置一个表单的action属性,用来指定 登录窗体跳转的目的地 4)自定义一个显示少量热点新闻的标签文件 A)定义属性:title 标题 B)定义属性: titleColor:标题颜色 C)定义属性: detialColor:明细部分颜色 D)明细部分的内容,由<jsp:doBody>获得 什么时候用标签,什么时候用标签文件 1)如果处理的是没有界面的业务逻辑,并且必须使用scriptlet(java程序)就用标签 2)如果处理的是有界面的模板共享部分,既可以用标签,也可以标签文件, 不过由于标签文件实施起来更加简单,所以一般用标签文件

评论