自定义标签库

来源:互联网 发布:皮鞋销售软件 编辑:程序博客网 时间:2024/06/05 20:17
 自定义标签处理类一般都继承TagSupport或BodyTagSupport
1.先看一个普通的最简单的自定义标签程序。
A:创建标签的处理类
Java代码 复制代码
  1. package com.test.tag;   
  2.   
  3. import java.io.IOException;   
  4.   
  5. import javax.servlet.jsp.JspException;   
  6. import javax.servlet.jsp.tagext.Tag;   
  7. import javax.servlet.jsp.tagext.TagSupport;   
  8.   
  9. @SuppressWarnings("serial")   
  10. public class HelloTag extends TagSupport {   
  11.   
  12.     //doStartTag返回的都是BODY相关,doEndTag返回的都是PAGE相关   
  13.     @Override  
  14.     public int doStartTag() throws JspException {   
  15.         try {   
  16.             //通过PageContext对象的getOut()方法获得JspWriter对象输出内容   
  17.             this.pageContext.getOut().write("hello");   
  18.         } catch (IOException e) {   
  19.             e.printStackTrace();   
  20.         }   
  21.         return Tag.EVAL_BODY_INCLUDE;   
  22.     }   
  23.   
  24. }  


B:创建标签库描述文件
Xml代码 复制代码
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
  3. <taglib>  
  4.     <tlib-version>1.0</tlib-version>  
  5.     <jsp-version>1.2</jsp-version>  
  6.     <short-name>hello taglib test</short-name>  
  7.     <uri>/hellotag</uri>  
  8.        
  9.     <tag>  
  10.          <!--Tag名字 -->  
  11.         <name>hello</name>  
  12.         <!-- 该Tag对应的处理类 -->  
  13.         <tag-class>com.test.tag.HelloTag</tag-class>  
  14.         <!-- 该 Tag的body内容为空  -->  
  15.         <body-content>empty</body-content>  
  16.     </tag>  
  17. </taglib>  


C.在JSP文件中引入标签库,然后插入标签
jsp里有两种引用方式:
<%@ taglib uri="/WEB-INF/hello.tld" prefix="aa" %>或者
<%@ taglib uri="/hellotag" prefix="aa" %>
Java代码 复制代码
  1. <%@ page language="java"  pageEncoding="UTF-8"%>   
  2. <%@ taglib uri="/hellotag" prefix="aa" %>   
  3.   
  4.   
  5. <html>   
  6.   <body>   
  7.     <aa:hello/>   
  8.   </body>   
  9. </html>  


输出结果为:hello

2.自定义标签库引用资源文件
A:首先在应用程序根目录下建立一个资源文件比如叫:helloworld.properties,内容为:
Java代码 复制代码
  1. hello.title=tagTitle   
  2. hello.content=tagContent  

B:建立一个Servlet,在启动时加载该Servlet,在init方法里读取helloworld.properties文件内容。
Java代码 复制代码
  1. package com.test.tag;   
  2.   
  3. import java.io.InputStream;   
  4. import java.util.Properties;   
  5.   
  6. import javax.servlet.ServletConfig;   
  7. import javax.servlet.ServletContext;   
  8. import javax.servlet.ServletException;   
  9. import javax.servlet.http.HttpServlet;   
  10.   
  11. @SuppressWarnings("serial")   
  12. public class TagServlet extends HttpServlet {   
  13.     public void init() throws ServletException {   
  14.         System.out.println("init not param");   
  15.     }   
  16.     //init(ServletConfig config)存在,则init()方法则不会执行。如果init(ServletConfig config)不存在,则init()方法会执行   
  17.     @Override  
  18.     public void init(ServletConfig config) throws ServletException {   
  19.         try{   
  20.             System.out.println("init have param");   
  21.             Properties p = new Properties();   
  22.             //通过ServletContext读取资源文件   
  23.             ServletContext context = config.getServletContext();   
  24.             InputStream in = context.getResourceAsStream("/helloworld.properties");   
  25.                
  26.             p.load(in);   
  27.             in.close();   
  28.             //设置属性key-value到context中   
  29.             context.setAttribute("prop", p);   
  30.         }catch(Exception e){   
  31.             e.printStackTrace();   
  32.         }   
  33.            
  34.     }   
  35.        
  36.   
  37. }  

C:创建标签库的处理类:
Java代码 复制代码
  1. package com.test.tag;   
  2.   
  3. import java.util.Properties;   
  4.   
  5. import javax.servlet.jsp.JspException;   
  6. import javax.servlet.jsp.PageContext;   
  7. import javax.servlet.jsp.tagext.Tag;   
  8. import javax.servlet.jsp.tagext.TagSupport;   
  9.   
  10. @SuppressWarnings("serial")   
  11. public class HelloTagByResource extends TagSupport {   
  12.     private String title;   
  13.     public String getTitle() {   
  14.         return title;   
  15.     }   
  16.     public void setTitle(String title) {   
  17.         this.title = title;   
  18.     }   
  19.     //在doStartTag和doEndTag里写都可以。不要误认为:"遇到标签的起始标记时,还没有解析到其属性title,所以放在doStartTag里写会报错"   
  20.     @SuppressWarnings("static-access")   
  21.     @Override  
  22.     public int doStartTag() throws JspException {   
  23.         try{   
  24. //          Properties p = (Properties)this.pageContext.getAttribute("ps",this.pageContext.APPLICATION_SCOPE);   
  25.             Properties p = (Properties)this.pageContext.getAttribute("ps",PageContext.APPLICATION_SCOPE);   
  26.             String str = p.getProperty(title);   
  27.             this.pageContext.getOut().print(str);   
  28.         }catch(Exception e){   
  29.             e.printStackTrace();   
  30.         }   
  31.         return Tag.EVAL_BODY_INCLUDE;   
  32.     }   
  33. //  @Override   
  34. //  public int doEndTag() throws JspException {   
  35. //      try{   
  36. ////            Properties p = (Properties)this.pageContext.getAttribute("ps",this.pageContext.APPLICATION_SCOPE);   
  37. //          Properties p = (Properties)this.pageContext.getAttribute("ps",PageContext.APPLICATION_SCOPE);   
  38. //          String str = p.getProperty(title);   
  39. //          this.pageContext.getOut().print(str);   
  40. //      }catch(Exception e){   
  41. //          e.printStackTrace();   
  42. //      }   
  43. //      return Tag.EVAL_PAGE;   
  44. //  }   
  45.   
  46.        
  47.        
  48. }  

D:创建自定义标签的描述文件
Xml代码 复制代码
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
  3. <taglib>  
  4.     <tlib-version>1.0</tlib-version>  
  5.     <jsp-version>1.2</jsp-version>  
  6.     <short-name>hello taglib test</short-name>  
  7.     <uri>/hellotag</uri>  
  8.        
  9.     <tag>  
  10.          <!--Tag名字 -->  
  11.         <name>hello</name>  
  12.         <!-- 该Tag对应的处理类 -->  
  13.         <tag-class>com.test.tag.HelloTag</tag-class>  
  14.         <!-- 该 Tag的body内容为空  -->  
  15.         <body-content>empty</body-content>  
  16.     </tag>  
  17.        
  18.     <tag>  
  19.          <!--Tag名字 -->  
  20.         <name>message</name>  
  21.         <!-- 该Tag对应的处理类 -->  
  22.         <tag-class>com.test.tag.HelloTagByResource</tag-class>  
  23.         <!-- 该 Tag的body内容为空  -->  
  24.         <body-content>empty</body-content>  
  25.         <!-- 属性定义 -->  
  26.         <attribute>  
  27.             <name>title</name>  
  28.             <required>true</required>  
  29.         </attribute>  
  30.     </tag>  
  31. </taglib>  

E:jsp里引用
Java代码 复制代码
  1. <%@ page language="java"  pageEncoding="UTF-8"%>   
  2. <%@ taglib uri="/hellotag" prefix="aa" %>   
  3.   
  4.   
  5. <html>   
  6.   <body>   
  7.     <aa:message title="hello.title"/><br/>   
  8.     <aa:message title="hello.content"/>   
  9.   </body>   
  10. </html>