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