JSP自定义标签的创建和使用

摘自http://jzinfo.iteye.com/blog/507387
http://wing123.iteye.com/blog/356585
参照http://my.oschina.net/aps/blog/107922
第一种方法:
创建的标签类,必须实现javax.servlet.jsp.tag接口.

下面是编写的一个简单的使用标签类的例子,该标签用来输出一行文字信息:

Tag类:userTagLib

Java代码

    /*
     * 标签处理类UserTagLibrary直接实现接口javax.servlet.jsp.tagext.tag接口
     * 已经全部实现了Tag接口中的6个方法
     * **/ 
    package com.longweir.taglib; 
     
    import javax.servlet.jsp.PageContext; 
    import javax.servlet.jsp.tagext.*; 
    import javax.servlet.http.*; 
    import java.io.*; 
     
    //实现接口Tag中的6个方法来编写Tag处理类 
     
    public class userTagLib implements javax.servlet.jsp.tagext.Tag  
    { 
        private PageContext pagecontext; 
        private Tag Parent; 
         
         
        public void setPageContext(PageContext pagecontext) 
        { 
            this.pagecontext=pagecontext; 
             
        } 
         
        public void setParent(Tag parent) 
        { 
            this.Parent=parent; 
        } 
         
        public Tag getParent() 
        { 
            return Parent; 
        }    
         
        //开始标签处理 
        public int doStartTag() 
        { 
            return SKIP_BODY;  //此处是空标签体,所以直接跳过 
        } 
         
        //结束标签体处理 
        public int doEndTag() 
        { 
            try 
            { 
                pagecontext.getOut().print("Hello,欢迎使用JSP标签对象"); 
            } 
            catch (Exception e) 
            {}       
            return EVAL_PAGE; //继续执行后续JSP页面代码 
        } 
         
        //空实现release方法 
        public void release() 
        { 
            //空实现 
        } 
     
    } 



编写tld标签库文件userTagLib.tld,用来映射处理的标签所对应的标签类:


Xml代码  收藏代码

    <?xml version="1.0" encoding="UTF-8" ?> 
    <!DOCTYPE taglib 
            PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 
            "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 
    <taglib> 
      <tlib-version>1.1</tlib-version> 
      <jsp-version>2.1</jsp-version> 
      <short-name>userTagLib</short-name> 
      <uri>/MyuserTagLib</uri> 
       
      <tag> 
          <name>Hello</name> 
          <tag-class>com.longweir.taglib.userTagLib</tag-class> 
          <body-content>empyt</body-content>   
      </tag> 
     
    </taglib> 



在web.xml文件中,配置标签库的信息


Xml代码  收藏代码

     <jsp-config> 
        <taglib> 
        <taglib-uri>/userTagLib</taglib-uri> 
        <taglib-location>/WEB-INF/tlds/userTagLib.tld</taglib-location> 
    </taglib> 
     </jsp-config> 





编写一个简单的hello01.jsp文件来显示标签内容:
Java代码  收藏代码

    <%@ page contentType="text/html;charset=GBK"%> 
    <%@ taglib uri="/userTagLib" prefix="myTag" %> 
     
    <html> 
      <head>   
        <title>HelloApp</title>     
        <meta http-equiv="pragma" content="no-cache"> 
        <meta http-equiv="cache-control" content="no-cache"> 
        <meta http-equiv="expires" content="0">  
      </head>   
      <body> 
        <b>Nice to meet you:${param.username}</b> <br> 
         
        <p>显示标签库中的信息</p> 
        <h1><myTag:Hello/></h1> 
      </body> 
    </html> 



提交页面:http://localhost:8085/hello/hello01.jsp?username=luoxianqiao   (username是提交的request参数)

显示结果为:


    Nice to meet you:luoxianqiao  
     
    显示标签库中的信息 
     
    Hello,欢迎使用JSP标签对象 





一般编写标签类直接继承自TagSupport即可,该类实现了接口IetreationTag接口,直接继承类实现的代码更简单,如下:

    package com.longweir.taglib; 
     
    import javax.servlet.http.*; 
    import javax.servlet.jsp.tagext.*; 
    import java.io.*; 
    import javax.servlet.jsp.PageContext; 
    import javax.servlet.jsp.JspWriter; 
     
    public class userTagLib2 extends javax.servlet.jsp.tagext.TagSupport  
    { 
     
        
        //结束标签体处理  
        public int doEndTag() 
        { 
            /*
            String paramvalue=null;
            paramvalue=pageContext.getRequest().getParameter(name);  //pageContext已在TagSupport中定义 
            JspWriter out=pageContext.getOut();     
            try
            {
                if (paramvalue!=null) 
                    out.print(paramvalue);
                else
                    out.print("参数未能获取");
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            
            */ 
            JspWriter out=pageContext.getOut(); 
            try 
            { 
                out.print("成功显示了标签内容"); 
            } 
            catch (Exception e) 
            { 
                e.printStackTrace(); 
            }        
            return EVAL_PAGE; //继续执行后续JSP页面代码 
        }    
     
    }
第二种方法:
jstl标签库的配置
* 将jstl.jar和standard.jar拷贝到WEB-INF/lib下(如果使用el表达式,不用拷贝这两个jar)

注意:jstl必须在能够支持j2ee1.4/servlet2.4/jsp2.0版本上的容器才能运行,这个环境
      是目前较为常用的环境
    
标签库的使用
* 采用taglib指令引入
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

 
自定义函数库:
1、定义类和方法(方法必须是public static)
2、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下
3、在jsp中采用taglib指令引入自定义函数库
4、采用 前缀+冒号(:)+函数名 调用即可

MyFunctions.java

Myfunctions.java代码 
public class MyFunctions { 
   
   public static String sayHello(String name) { 
      return "Hello " + name; 
   } 
  
}  
  
myfunctions.tld
自定义标签

Xml代码 
<?xml version="1.0" encoding="UTF-8" ?> 
 
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 
  version="2.0"> 
    
  <description>my functions library</description> 
  <display-name>my functions</display-name> 
  <tlib-version>1.0</tlib-version> 
  <short-name>my</short-name> 
  <uri>http://www.bjsxt.com/functions</uri> 
  
  <function> 
    <name>sayHello</name> 
    <function-class>com.bjsxt.struts.MyFunctions</function-class> 
    <function-signature>java.lang.String sayHello(java.lang.String)</function-signature> 
  </function> 
  
</taglib> 
  
jstl_fn.jsp

注意与前面的配置文件myfunctions.tld相对应,
prefix对应<short-name>my</short-name>
uri对应 <uri>http://www.bjsxt.com/functions</uri>
可使用以下面两种方式给name赋值:
1、${my:sayHello("David") }
2、request.setAttribute("name", "David");

Java代码 
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> 
<%@ taglib uri="http://www.bjsxt.com/functions" prefix="my" %> 
 
<% 
request.setAttribute("name", "David"); 
%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>testTemplate</title> 
  </head> 
  <body> 
    ${my:sayHello(name) } 
  </body> 
</html> 
 

补充:web-app version="2.4"
有时也需要在web.xml中添加对标签的定义:

Xml代码 
<jsp-config> 
    <taglib> 
        <taglib-uri>www.bjsxt.com/functions</taglib-uri> 
        <taglib-location>/WEB-INF/my.tld</taglib-location> 
    </taglib> 
</jsp-config> 


注意:
 
可能出现的异常
1、The function xxx must be used with a prefix when a default namespace is not specified
--- 在jsp页面中调用方式不正确,可能将 ":" 写成了 "."

2、The function xxx cannot be located with the specified prefix
--- a) 类中定义的方法不是 public static 的方法
      b) 类中的方法名称和jsp自带的标签元素冲突,重名等

你可能感兴趣的:(jsp,自定义标签)