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代码  收藏代码

     
                PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 
            "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 
     
      1.1 
      2.1 
      userTagLib 
      /MyuserTagLib 
       
       
          Hello 
          com.longweir.taglib.userTagLib 
          empyt   
     
 
     
   
 



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


Xml代码  收藏代码

      
         
        /userTagLib 
        /WEB-INF/tlds/userTagLib.tld 
   
 
    
 





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

    <%@ page contentType="text/html;charset=GBK"%> 
    <%@ taglib uri="/userTagLib" prefix="myTag" %> 
     
     
         
        HelloApp     
         
         
          
         
       
        Nice to meet you:${param.username}
 
         
       

显示标签库中的信息

 
       

 
       
     



提交页面: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代码 
 
 
  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"> 
    
  my functions library 
  my functions 
  1.0 
  my 
  http://www.bjsxt.com/functions 
  
   
    sayHello 
    com.bjsxt.struts.MyFunctions 
    java.lang.String sayHello(java.lang.String) 
 
 
  
 
  
jstl_fn.jsp

注意与前面的配置文件myfunctions.tld相对应,
prefix对应my
uri对应 http://www.bjsxt.com/functions
可使用以下面两种方式给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"); 
%> 
 
 
 
   
    testTemplate 
   
   
    ${my:sayHello(name) } 
   
 
 

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

Xml代码 
 
     
        www.bjsxt.com/functions 
        /WEB-INF/my.tld 
   
 
 


注意:
 
可能出现的异常
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,自定义标签)