jsp taglib 自定义标签

jsp taglib 自定义标签

jsp taglib 自定义标签。

标准的JSP 标记可以调用JavaBeans组件或者执行客户的请求,这大大降低了JSP开发的复杂度和维护量。

<script type=text/javascript> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript></script>

JSP技术也允许你自定义taglib,其实换句话说,taglib可以看成是对JSP标记的一种扩展,正如xml是对html的一种扩展一样。taglib通常定义在tag标签库中,这种标签库存放着你自己定义的tag标签。简而言之,如果使用taglib,那么你可以设计自己的JSP标记!

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

通常有以下几个步骤:

[1]jsp taglib提供属性的set方法,此后这个属性就可以在jsp页面设置。以jstl标签为例 c:out value=""/,这个value就是jsp数据到tag之间的入口。

所以tag里面必须有一个setValue方法,具体的属性可以不叫value。

 例如

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


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

[2]jsp taglib处理 doStartTag 或 doEndTag 。这两个方法是 TagSupport提供的。

还是以c:out value=""/为例,当jsp解析这个标签的时候,在“<”处触发 doStartTag 事件,在“>”时触发 doEndTag 事件。

通常在 doStartTag 里进行初始化,流程选择操作,在 doEndTag 里后续页面输出控制。


[3]编写tld文件,就是把编写的tag组件的信息以xml形式告诉容器,它才好进一定步骤解释tag组件。


[4]在jsp页面导入tld。这样,你的jsp页面就可以使用自己的tag组件了。

一般来说,自定义tag标签主要用于操作隐藏对象、处理html提交表单、访问数据库或其它企业级的服务,诸如邮件和目录操作等等。

自定义tag标签的使用者一般都是那些对java编程语言非常精通,而且对数据访问和企业级服务访问都非常熟悉的程序员,对于HTML设计者来说,使得他可以不去关注那些较复杂的商业逻辑。

而将精力放在网页设计上。同时,它也将库开发者和库使用者进行合理分工,自定义tag标签将那些重复工作进行封装,从而大大提高了生产力,而且可以使得tag库可用于不同的项目中,完美地体现了软件复用的思想。

通常你会发现自己绝大多数活动都集中在 doStartTag 或 doEndTag方法里,如果在服务器端处理标签中的正文或则是嵌套标签时的话,还是过问一下doAfterBody。


一个简单的例子:OutputTag

package test;   
import javax.servlet.jsp.JspException;   
import javax.servlet.jsp.JspWriter;   
import javax.servlet.jsp.tagext.TagSupport;   
  
public class OutputTag extends TagSupport {   
private String name=null;   
public void setName(String name) {   
this.name = name;   
}   
public int doEndTag() throws JspException   
{   
try {   
JspWriter out = pageContext.getOut();   
out.print("Hello! " + name);   
  } catch (Exception e) { throw new JspException(e); }   
return EVAL_PAGE;   
}   
}
 

  
jsp taglib简要说明:


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 Library 1.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>test</short-name>   
<!--OutputTag-->   
<tag>   
<name>out</name>   
<tag-class>test.OutputTag</tag-class>   
<body-content>empty</body-content>   
<attribute>   
<name>name</name>   
<required>false</required>   
<rtexprvalue>false</rtexprvalue>   
</attribute>   
</tag>   
</taglib>
 

  
在WEB-INF下新建tlds文件夹,把这个文件取名为test.tld,放到tlds文件夹下。引用时的路径应该这样:

WEB-INF/tlds/test.tld

关于tld的简单说明:


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


name:tag的名字。例如“c:out value=""/” 里的"out”,我们的类也取名为out,由于有前缀作区分,不会同其他库的同名tag组件混淆
tag-class:完整的tag组件路径,记着带包名body-content:指tag之间的内容。

例如c:out value="" ...... /c 起始和关闭标签之间就是body-content。由于没有处理body-content ,所以上面设为empty,如果是嵌套标签,或则是要在服务器端处理标签体的话,就是jsp了“attribute”里的name:属性名字。例如c:out value=""/里的value。

名字可任意取,只要类里提供相应的set方法即可。
required:是否必填属性。
rtexprvalue:是否支持运行时表达式取值就是是否可以<%=%>或则是${}方式传值。
这是tag的强大功能。


编写jsp taglib页面

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

 

启动服务器,如果一切按照上面步骤的话,就能看到 Test Tag: Hello! TEST 字样。最简单的tag就这么出来了。并不难,是不是?


Tag系列的Interface里定义的静态int,通过他们也能一窥tag组键的执行流程,这几个静态值分别是:


SKIP_BODY : 跳过了开始和结束标签之间的代码,一般是在doStartTag中使用。


EVAL_BODY_INCLUDE :处理嵌套的标签,一般是在doStartTag中使用,由负责处理标签正文的tag接口提供。


EVAL_BODY_BUFFERED :对包含的内容进行解析 一般是在doStartTag中使用,由负责处理标签正文的bodyTag接口提供,目的是通知jsp容器作好读取正文的工作(创建一个body- content包装正文和获取存放操作结果的out对象,便于以后的操作和输出)。

EVAL_BODY_AGAIN:处理标签正文,嵌套标签的iteratorTag接口的使用。


SKIP_PAGE : 忽略剩下的页面,一般是在doEndTag中使用。


EVAL_PAGE : 继续执行下面的页, 一般是在doEndTag中使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值