欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-25 21:58:24
...
摘自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 自定义标签