最简单的taglib

转载 2015年11月19日 09:16:13

刚接触JSP,发现页面顶部总是有<%@ taglib uri="..." prefix="..." %>这样的指令,本着不懂就查的精神,去百度了一下,发现下面这篇文章说的蛮简单易懂的,于是拽过来学习记录下。

Taglib 原理和实现之什么是Taglib

 

 1、问题:Tag究竟是什么?如何实现一个Tag?

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

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

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

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

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

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

  3)编写tld文件。

  4)在jsp页面导入tld

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

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

  2、一个简单的例子:OutputTag

package diegoyun;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport; //注:这里需要导入Tomcat/lib目录下的jsp-api.jar
/**
* @author chenys
*/
public class OutputTag extends TagSupport
{
private String name=null;
public void setName(String name)
{
this.name = name;
}

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

  简要说明:

  1、如何输出到jsp页面:

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

  记住这个方法就可以了。

  2、输出后如何作处理

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

  编写tld

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-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

  编写jsp页面

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

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

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

转自http://www.zhujiangroad.com/program/JSP/3423.html?jdfwkey=p4vos2

相关文章推荐

Taglib自定义标签之三简单仿JSTL中带标签体的ForEach循环

上2篇文章分别了介绍了taglib的无属性状态和有带属性状态,但是都是分别都是独立的闭标签,这次带来的是带属性的和带标签体的例子,仿照jstl中的forEach循环构造一个简单的循环标签. Java代...
  • aionbo
  • aionbo
  • 2017年02月09日 21:53
  • 364

pager taglib简单解析,够实用

本示例思路是这样的:从servlet到数据库取分页信息,然后响应到jsp页面,当点击jsp页面的页码(1,2,3,4.......)时,再请求servlet(如何加包去百度,我不说) 这是servle...

Spring3.x_Struts2.x_Hibernate3.x整合之分页pager-taglib的简单使用

Spring3.x_Struts2.x_Hibernate3.x整合之分页pager-taglib的简单使用 首先创建分页对象: package org.oms.spring.model.page...
  • rzg813
  • rzg813
  • 2014年10月20日 00:07
  • 1118

比较简单的pager-taglib-2.0分页

找了很多jsp在ssh中的分页技术,发现使用标签库的这套是比较简单的,但代码量依旧不少…… 为一张表增加个分页栏有时候需要在三个类上动刀…… 增加Action后自然要修改xml…… 比起.net...

在web.xml中无法配置<taglib>的问题

自定义标签库时,在web.xml中无法配置的问题 原因在于: servlet 2.3的配置不需要标签的,   servlet 2.4容器中需要在中。 (实际上,区分就在web.xml一开...

分页控件:pager-taglib与SpringMVC结合实例2

body{ margin: 10px; min-height: 500px; } form{ margin: 0; } select{ width: 130px; } fieldset{ m...

jsp 自定义taglib的uri问题透析(新手级)

我们经常会在写程序中用到自定义TAG,因为它更好的实现了代码的重用。对于一些初学者在学习中就会有一些问题,这里我们先说下uri的路径问题。 很多朋友认为这里是写路径的,可是如果你有了一定的经验后就会发...
  • zax0zax
  • zax0zax
  • 2012年02月23日 22:49
  • 612

Taglib的打包部署和使用方式详解(转载)

1. Taglib的编写   Taglib用于将呈现逻辑进行封装。   它必须继承自TagSupport类。   下面是一个简单的例子:     ...

shiro权限验证标签 taglib

shiro taglib

JSP:JSP指令元素:page指令,include指令,taglib指令

JSP指令元素:page指令,include指令,taglib指令 一,指令元素(directive elements):控制所生成的servlet结构。  JSP指令用于“转换阶段”提供整个JS...
  • yw987
  • yw987
  • 2017年06月18日 17:05
  • 234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最简单的taglib
举报原因:
原因补充:

(最多只允许输入30个字)