–简介
–标签接口和类
–标签的分类
–标签实例

? HelloWorld 简单标签
?有属性的标签
?有标签体,有属性的标签
?嵌套标签
?循环标签
----------------------------------------------------------------------------
? 简介
–标签在JSP页面中被调用
–标签对应一个Java 处理类,来处理标签逻辑
–好处是,是页面中尽量少写代码
? 标签接口和类
–JSP所有标签都实现了javax.servlet.jsp.JspTag接口
?这个接口有两个之间接口:
? SimpleTag
–JSP 2.0 中新增的接口
? Tag
–是一个经典的必须实现的接口
–它有一个直接接口是IterationTag
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第1张图片
? 标签的分类
–不带属性和标签体的简单标签
–不带标签体,但是有属性的标签
–带标签体,且有属性的标签
? 标签实例
–HelloWorld 简单标签
–有属性的标签
–有标签体,有属性的标签
–嵌套标签
–循环标签
先来看下如何实现简单的标签哈~
MyTag.java
此类实现了Tag接口
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第2张图片 
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第3张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第4张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第5张图片
下面我们继承TagSupport抽象类,这样更简单一些哈~
MyTag2.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第6张图片
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第7张图片
MyTag2.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第8张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第9张图片
下面我们输出一个下拉列表哈~
MyTag3.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第10张图片
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第11张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第12张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第13张图片 
下面从数据库取出下拉列表内容,并将其定义为标签。
  JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第14张图片
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第15张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第16张图片
MyTag4.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第17张图片
PositionService.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第18张图片
ConnectionUtil.java
package com.michael.tag;    

import java.sql.Connection;    
import java.sql.DriverManager;    
import java.util.Properties;    

public class ConnectionUtil {    

         /**    
         * @param args    
         */
    
         public static void main(String[] args) {    
                ConnectionUtil cu = new ConnectionUtil();    
                System.out.println(cu.openConnection());    
        }    
         public Connection openConnection() {    
                String url = "";    
                String driver = "";    
                String user = "";    
                String password = "";    
                Properties prop = new Properties();    
                 try {    
                        prop.load( this.getClass().getClassLoader().getResourceAsStream( "DBConfig.properties"));    
                        driver = prop.getProperty( "driver");    
                        url = prop.getProperty( "url");    
                        user = prop.getProperty( "user");    
                        password = prop.getProperty( "password");    
                        Class.forName(driver);    
                        Connection conn = DriverManager.getConnection(    
                                        url, user, password);    
                         return conn;    
                } catch (Exception e) {    
                        e.printStackTrace();    
                }    
                 return null;    
        }    
         public Connection getConnection(String driver, String url, String user,    
                        String password) {    
                 // Class.forName()    
                 try {    
                        Class.forName(driver);    
                         // DriverManager get connection    
                        Connection conn = DriverManager.getConnection(url, user, password);    
                         return conn;    
                } catch (Exception e) {    
                        e.printStackTrace();    
                }    
                 return null;    
        }    

         public Connection getConnection() {    
                 // Class.forName()    
                 try {    
                        Class.forName( "com.mysql.jdbc.Driver");    
                         // DriverManager get connection    
                        Connection conn = DriverManager.getConnection(    
                                         "jdbc:mysql://localhost:3306/jsp_db", "root", "963963");    
                        return conn;    
                } catch (Exception e) {    
                        e.printStackTrace();    
                }    
                return null;    
        }    

}
Position.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第19张图片
DBConfig.properties
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第20张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第21张图片
数据库中有四条记录,我们看下能不能取出来哈~
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第22张图片
下面我们在数据库中增加一条记录测试一下哈~
  JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第23张图片
  JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第24张图片
以上四个标签都是没有属性的,下面我们测试有属性的标签,传递一个参数,循环的输出哈~
MyTag5.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第25张图片
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第26张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第27张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第28张图片
下面测试有标签体的标签,我们可以实现一个接口或者继承一个类哈~
先看实现接口的方法
MyTag6.java
package com.michael.tag;    

import java.io.IOException;    

import javax.servlet.jsp.JspException;    
import javax.servlet.jsp.PageContext;    
import javax.servlet.jsp.tagext.BodyContent;    
import javax.servlet.jsp.tagext.BodyTag;    
import javax.servlet.jsp.tagext.Tag;    

public class MyTag6 implements BodyTag{    
         private int count;    
         private BodyContent bodyContent;    
         public void setCount( int count) {    
                 this.count = count;    
        }    
         public void doInitBody() throws JspException {    
        }    

         public void setBodyContent(BodyContent bodyContent) {    
                 this.bodyContent = bodyContent;    
        }    

         public int doAfterBody() throws JspException {    
                 if(count>1){    
                        count--;    
                         return this.EVAL_BODY_AGAIN;    
                }    
                 return this.SKIP_BODY;    
        }    

         public int doEndTag() throws JspException {    
                 try {    
                         if(bodyContent!= null)    
                        bodyContent.print(bodyContent.getEnclosingWriter());    
                } catch (IOException e) {    
                        e.printStackTrace();    
                }    
                 return this.EVAL_PAGE;    
        }    

         public int doStartTag() throws JspException {    
                 if(count>0){    
                         return this.EVAL_BODY_INCLUDE;    
                }    
                 return this.SKIP_BODY;    
        }    

         public Tag getParent() {    
                 return null;    
        }    

         public void release() {    
        }    

         public void setPageContext(PageContext pageContext) {    
        }    

         public void setParent(Tag tag) {    
        }    
}
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第29张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第30张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第31张图片
下面我们实现抽象类来测试有标签体的标签哈~
MyTag7.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第32张图片
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第33张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第34张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第35张图片
在JSP2.0中还有一个新特征,具有SimpleTag接口,还有针对这个接口的实现类,如果使用这个接口就更方法了哈~
MyTag8.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第36张图片
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第37张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第38张图片
测试:
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第39张图片
下面我们实现针对这个接口的抽象类
MyTag9.java
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第40张图片
MyTag.tld
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第41张图片
MyTag.jsp
JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第42张图片
测试:
  JDBC+Servlet+JSP整合开发之27.JSP自定义标签_第43张图片
 
------------------------------------END-----------------------------------