blogjava's web log

blogjava's web log
...

jsp自定义标记--笔记


可以创建自己的标记
自定义动作是通过自定义标记来调用
自定义标记提供了可重用、可维护及可移植的内容生成解决方案
自定义标记的集合称为标记库

自定义标记是显式设计的,用于在 JSP 页面中添加功能,包括页面内容(如HTML)的动态生成

 
定义自定义标记的步骤:
  1.为标记开发标记处理程序和助手类
  2.  在标记库描述文件 Web.xml 中声明标记
   tagdemojsp-------->webxml-------->mytag.tld---------> 标记处理程序类
 标记处理程序类
执行与自定义标记关联的动作的 Java 对象
必须实现javax.servlet.jsp.tagext包的Tag或Body Tag接口
支持以下方法:
setPageContext(),    setParent()
doStartTag(), doEndTag()  and release()


doStartTag()
自定义标记开始时调用
返回在标记接口中定义的 int 常量的EVAL_BODY_INCLUDE或 SKIP_BODY,以决定是否处理标记的主题部分。
doEndTag()
在自定义标记结束时调用
返回 EVAL_PAGE 或 SKIP_PAGE。如果它返回 EVAL_PAGE或SKIP_PAGE,以决定是否处理页面的其余部分。

标记库描述文件

标记库描述文件 (TLD) 是描述标记库的 XML 文档。JSP 容器使用TLD来验证标记。
TLD 包含关于作为整体的库以及包含在库中的每个标记的信息。
TLD还包含各种标记元素,每种元素均作了详细解释。

标记元素的信息
<tag>
  
<name>Greeting</name>
<tagclass>examples.servlets.Greeting</tagclass>
  
<bodycontent>empty</bodycontent>
  
<info>Tag with Parameter</info>
</tag>

标记属性的信息
<attribute>
    
<name>num1</name>
    
<required>true</required>
    
<rtexprvalue>false</rtexprvalue>
</attribute>

标记库描述文件

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
  
<tlibversion>1.0</tlibversion>
  
<jspversion>1.1</jspversion>
  
<shortname>mytag</shortname>
  
<uri></uri>
</taglib>

web.xml声明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  
<taglib>
   
<taglib-uri>mycusttag</taglib-uri>
   
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
  
</taglib>
</web-app>


在JSP中使用标记库
<html>
  
<title> Custom JSP Tag example </title>
    
<%@ taglib uri="mycusttag" prefix="mytag" %>
    Here comes the tag:
<p>
  
<body bgcolor=wheat>
    
<i><mytag:Greeting/></i>
    
<p>There went the tag.</p>
  
</body>
</html>

下面看个例子。。
功能是输出给定指定数 的行数。。

新建一个类继承 BodyTagSupport  类
代码如下:
package tagtest.mytag;

import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyContent;

public class LoopTag extends BodyTagSupport {

    
private int count;
    
public LoopTag() {
    }


    
public void setCount(int count) {
        
this.count = count;
    }

    
public int doStartTag() throws JspTagException
     
{
         System.out.println(
"doStartTag");
         
if(count>0)
         
{
             
return EVAL_BODY_TAG;
         }

         
else
         
{
              
return SKIP_BODY;
         }

     }

     
/**
    *覆盖doAfterBody方法
    
*/

   
public int doAfterBody() throws JspTagException
   
{
       System.out.println(
"doAfterBody"+count);
       
if(count>1)
       
{
               count
--;
               
return EVAL_BODY_TAG;
        }

        
else
        
{
           
return SKIP_BODY;
        }

   }

   
public int doEndTag() throws JspTagException
   
{
     System.out.println(
"doEndTag");
       
try
       
{
            
if(bodyContent != null)
            
{
                    bodyContent.writeOut(bodyContent.getEnclosingWriter());
            }

       }

       
catch(java.io.IOException e)
       
{
               
throw new JspTagException("IO Error: " + e.getMessage());
       }

       
return EVAL_PAGE;
   }


   
public void doInitBody() throws JspTagException{
      System.out.println(
"doInitBody");
     }

     
public void setBodyContent(BodyContent bodyContent)
     
{
          System.out.println(
"setBodyContent");
          
this.bodyContent=bodyContent;
     }

}


在WEB-INF 下新建mytag.tld 文件。。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">


<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>2.0</jspversion>
<shortname>mytag</shortname>

<tag>
<name>Loop</name>
<tagclass>tagtest.mytag.LoopTag</tagclass>
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
web.xml 文件加上一句
  <taglib>
    
<taglib-uri>/WEB-INF/mytag.tld</taglib-uri>
    
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
  
</taglib>
新建JSP页。。
<%@ page contentType="text/html; charset=GBK" %>
<!--这里加上这句-->
<%@ taglib uri="/WEB-INF/mytag.tld" prefix="mytag" %>

<html>
<head>
<title>
firstTag
</title>
</head>
<body bgcolor="#ffffff">
<!--count 要循环的次数-->
<mytag:Loop count="10">
wujunjunjunjun
<br>
</mytag:Loop>
</body>
</html>
上面写的10  运行后页面应该打印10行 wujunjunjunjun了。。

posted on 2006-04-05 22:56 record java and net 阅读(533) 评论(1)  编辑  收藏 所属分类: Jsp&&Web

评论

# re: jsp自定义标记--笔记 2006-09-16 19:23 ert

retert  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

常用链接

留言簿(44)

新闻档案

2.动态语言

3.工具箱

9.文档教程

友情链接

搜索

最新评论