第八章 标签开发
为什么要自定义标签:
虽然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)如果处理的是有界面的模板共享部分,既可以用标签,也可以标签文件,
不过由于标签文件实施起来更加简单,所以一般用标签文件