dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>java>jsp>文章内容
Taglib 原理和实现之什么是Taglib
来源:未知     作者:    
  1、问题:Tag究竟是什么?如何实现一个Tag?

  一个tag就是一个普通的类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。而这两个类是由jsp容器提供的,无须开发人员自己实现。换句话说,你只需把实现了业务逻辑的类继承TagSupport或者BodyTagSupport,再做一些特别的工作,你的类就是一个Tag。并且它自己负责和页面的交互,不用你多操心。

  “特别的工作”通常有以下几个步骤:

  1)提供属性的set方法,此后这个就可以在jsp页面设置。以jstl标签为例 <c:out value=""/>,这个value就是数据到tag之间的入口。所以tag里面必须有一个setValue方法,具体的可以不叫value。例如

setValue(String data){this.data = data;}

  这个“value”的名称是在tld里定义的。取什么名字都可以,只需tag里提供相应的set方法即可。

  2)处理 doStartTag 或 doEndTag 。这两个方法是 TagSupport提供的。 还是以<c:out value=""/>为例,当解析这个标签的时候,在“<”处触发 doStartTag 事件,在“>”时触发 doEndTag 。通常在 doStartTag 里进行逻辑操作,在 doEndTag 里控制输出。

  3)编写tld文件。

  4)在页面导入tld

  这样,你的页面就可以使用自己的tag了。

  通常你会发现自己绝大多数活动都集中在 doStartTag 或 doEndTag 方法里。确实如此,熟悉一些和类之后,写taglib很容易。正如《设计》的作者所言:里面的逻辑稍微有点复杂,但毕竟没有火箭上天那么难。

  2、一个简单的例子:OutputTag

package diegoyun;
import x..jsp.Exception;
import x..jsp.Writer;
import x...tagext.TagSupport;
/**
* @author chenys
*/
public class OutputTag extends TagSupport
{
private String name=null;
public void setName(String name)
{
this.name = name;
}

public int doStartTag() throws Exception{
try
{
Writer out = pageContext.getOut();
out.print("Hello! " + name);
}
catch (Exception e)
{
throw new Exception(e);
}
return EVAL_PAGE;
}
}

  简要说明:

  1、如何输出到页面:

  调用JspWriter Writer out = pageContext.getOut();out.print......

  记住这个方法就可以了。

  2、输出后如何作处理

  会返回几个值之一。EVAL_PAGE 表示tag已处理完毕,返回页面。还有几个值,例如 EVAL_BODY_AGAIN 和EVAL_BODY_INCLUDE等,后面我们会作讨论

  编写tld

<? version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD Tag Library 1.2//EN"
"http://.sun.com/dtd/web-taglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</-version>
<short-name>diego</short-name>
<!--OutputTag-->
<tag>
<name>out</name>
<tag-class>diegoyun.OutputTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>

  在WEB-INF下新建tlds文件夹,把这个文件取名为diego.tld,放到tlds文件夹下。路径应该这样:WEB-INF\tlds\diego.tld
关于tld的简单说明:

  short-name:taglib的名称,也称为前缀。比如<c:out value=""/> 里的“c”

  name:tag的名字。例如<c:out value=""/> 里的"out”,我们的类也取名为out,由于有前缀作区分,不会混淆

  tag-class:具体的tag类。带包名

  body-content:指tag之间的内容。例如<c:out value=""> ...... </c> 起始和关闭标签之间就是body-content。由于没有处理body-content,所以上面设为empty

  <attribute>里的name:名字。例如<c:out value=""/>里的value。名字可任意取,只要类里提供相应的set方法即可。

  required:是否必填。

  rtexprvalue:是否支持运行时表达式取值。这是tag的强大功能。以后我们会讨论。暂时设为false

  编写页面

<%@ page language=""%>
<%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%>
<html>
<body>
Test Tag:
<diego:out name="diegoyun"/>
</body>
</html>

  我的编程环境是eclipse+.启动服务器,如果一切按照上面步骤的话,就能看到 Test Tag: Hello! diegoyun 字样

  最简单的tag就这么出来了。并不难,是不是?

 

 

上一篇:Taglib 原理和实现之支持El表达式   下一篇:深入剖析JSP和Servlet对中文的处理
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·JSP入门实例教程
·什么是Servlet
·JSP常用内置对象使用说明
·JSP自定义标签由浅到深详细讲解
·JSP自定义标签由浅到深详细讲解
·Java Servlet技术
·Javax.servlet API的特征
·一个简单的jsp注册页面
·JSTL操作数据库示例
·JSP入门实例教程13-MVC模式
·JSP入门实例教程12-jstl处理数
·JSP入门实例教程11-jstl处理xml
  相关文章
·Taglib 原理和实现之支持El表达
·深入剖析JSP和Servlet对中文的处
·Taglib 原理和实现之嵌套和属性
·提升JSP应用程序的七大绝招
·JSP和Struts解决用户退出问题
·jsp读取大对象CLOB并生成xml文件
·Taglib原理和实现之循环的Tag
·一个读取xml文件内容的类
·JSP安全编程实例浅析
·JSP中读文件和写文件的例子
·利用JSP 2.0开发Web应用程序
·用JDOM包实现生成XML文件的简单
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763