自定义JSP标签(tag)浅议

js

因为版本变化的关系,这篇文章未必有普适性

看这篇文章之前应该先看Sun的文章并最好动手实践之

http://java.sun.com/developer/technicalArticles/xml/WebAppDev3/

并且知道J2EE API文档的位置在

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/index.html

自定义Tag其实并不是一件很困难的事情,就是猛一接触,不知道该从何下手。推荐先看看Sun公司的一篇文章,看完了,大致就有了一个印象。在这里无意去翻译这篇简单的文章,而是从这篇文章展开去说说。要说明的一点就是sun的文档中代码都是完全可用的,但是因为排版问题,代码的分行有些地方不正确,直接copy的时候要仔细整理一下代码,否则有可能会通不过编译,部署的时候会给你一大堆异常。

自定义Tag使用的包是javax.servlet.jsp.tagext,如果编译有问题,可以去Tomcat的\common\lib文件夹下面找jsp-api.jar引用上就可以了。

这个包里面的类和接口,基本上我们主要关心的就是以“Tag”结尾的那几个,接口Tag和BodyTag,类TagSupport和BodyTagSupport,还有一个接口IterationTag,不过一般不会用到。其他的我们都可以看作是辅助类,帮助获取信息什么的。我们可以仔细看看J2EE的API文档里面关于这个包的类说明。

上面类名里面的Body的意思可能一下子比较难理解。tag指的就是像<tagname></tagname>这样的东西,Body就是夹在tag中间的东西,比如<tagname>I am Body</tagname>。这么一来,这个tag也就成了BodyTag,因为它可以带Body。所以设计tag也要事先考虑好带不带Body,不过现实考虑,好像没有Body的tag应该也比较少吧。

Tag接口是这些类里面的根,所以先看看里面有什么。API文档里面那个Lifecycle图画的很粗糙,不过也能大致看清楚。我们也不过分纠缠细节,大致关心的就是doStartTag() 和doEndTag() 这一段。每当你写的tag在Jsp页面里面要被解释的时候,服务器就自动调用你的类里面的doStartTag()函数来完成你定义的逻辑,当解析完标签后调用doEndTag()。实现Tag接口来定制自己的tag无疑是最灵活的。但是,难度也比较大,我们定义自己的tag的时候完全不必要搞得这么有内涵。

BodyTag跟Tag类也差别不大,BodyTag继承自Tag和IterationTag,因为涉及了Body的原因,逻辑要复杂一些。API文档里面的Lifecycle图也比较清晰。有必要好好看看。里面主要说明的就是函数调用的顺序。但是在具体应用中,不一定都要按部就班的走完这整个Lifecycle,如果要想控制这些调用的路线。就要借用函数的返回值了,在上一个函数返回特定的值(都是已经定义好的常数)就可以改变服务器调用下一个函数的行为来完成你自己的逻辑。看到这里我也不禁佩服这些写类库的人,能想出这么个办法来解决问题。

为了方便我们开发,又提供了两个带“Support”的类来“支持”我们,方便我们开发。一般情况下我们只要继承这两个类中的一个,而且我觉得BodyTagSupport也更常用一些好像。要说明的一点就是两个Support类中TagSupport是BodyTagSupport的父类。类中的getId()和setId()这两个函数名并不是死的,这两个“Id”应该在你的程序中替换成你的标签名,比如你的tag名字是tagname,就是<tagname>,那么函数名就变成了getTagname ()和getTagname ()。这样的搞法原来在其他地方也有领教。(注意tagname第一个字母在函数名中大写)变化的名字有服务器自己去处理,无需编程者自己操心。原来函数名都是可以变化的,一定要注意。

说到这里可以结合Sun的文档的代码看看,就明白了。

至于部署和.tlb文件的格式,Sun文档上也都有。不再赘述。最后附上整理的返回值列表,这个我认为比较重要。

英文Evaluate大致是“评估,求值”的意思,这里我们可以理解为服务器“读取,读入,处理”的意思,翻译的时候我就随语境变通一下,下面加了下划线,如果有不当,请指正。

EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用

EVAL_PAGE:继续处理页面,doEndTag()函数可用

SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用

SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用

EVAL_BODY_TAG:已经废止,由EVAL_BODY_BUFFERED取代

EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法

EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的。我观察了一下JSTL的源代码,想看看它的ForEach怎么编制的,但是一看里面逻辑异常复杂,短时间不能看出头绪,所以在这里也不敢妄言,如果哪位仁兄有研究,还请不吝赐教。

:包里面的其他类还没有研究,如果有研究再另行写个文档。

时间: 2024-10-06 19:25:00

自定义JSP标签(tag)浅议的相关文章

netbeans-java 自定义jsp标签,页面编译时提示无法找到setter method

问题描述 java 自定义jsp标签,页面编译时提示无法找到setter method 5C 我自己写了个实现分页的自定义jsp标签,该标签有GroupSizePageIndex以及PageSize属性,在jsp页面给这几个属性赋值时,netbeans提示找不到相应属性的setter method编译也通不过,原话如:org.apache.jasper.JasperException: PWC6339: Cannot find a setter method for the attribute

JSP自定义分页标签TAG全过程_JSP编程

首先我们需要在WEB-INF/tld/目录下创建page.tld文件 <?xml version="1.0" encoding="ISO-8859-1"?> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>page</short-name> <u

自定义JSP标签类应该可以获取九大内置对象?不能?能,求指导?

问题描述 我想在自定义的JSP标签中获取数据库中的数据,设计上应该是先放入request,然后再从request中获取.请问如何在自定义的JSP标签中获取request对象? 问题补充: 在自定义的JSP标签类 中获取JSP内置对象 ? 解决方案 pageRequest可获取其他8个解决方案二:struts2标签的例子:<s:if test="#request.type=='ip'">...</s:if>#request.* 点后面跟的是request里的key

掌握自定义 JSP 标签

js 想要在 JavaServer Pages (JSP) 应用程序中添加自定义标签吗?本教程将为您展示如何用这些标签编写类似于 JSP 技术自带操作 ?? 如 jsp:useBean.jsp:getProperty 和 jsp:forward ?? 的自定义操作.介绍如何用特定于自已的域的表示逻辑的自定义操作来扩展 JSP 语法. 在 JSP 应用程序中添加 自定义标签 的能力可以使您将工作重点放到以文档为中心的开发方式上.可以使 Java 代码不出现在 JSP 页中,从而使这些页面更容易维护

JSP自定义标签由浅到深详细讲解(一)

一.基本概念: 1.标签(Tag): 标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本.由于标签是XML元素,所以它的名称和属性都是大小写敏感的 2.标签库(Tag library): 由一系列功能相似.逻辑上互相联系的标签构成的集合称为标签库. 3.标签库描述文件(Tag Library Descriptor): 标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系.它是一个配置文件,和web

JSP自定义标签由浅到深详细讲解(二)

十一.ServletContext类的常用API: 1.getContext(String uripath):返回服务器中uripath所代表的ServletContext对象 2.getInitParameter(String name):返回ServletConfig对象中name参数的值 3.getMineType(String file):返回file参数代表的文件的MIME类型 4.getRequestDispatcher(String path):返回path代表的RequestDi

JSP自定义简单标签入门之带有属性

上面写的那个简单标签来控制页面中标签内容的重复次数是固定的,这就是权限"写死了",这是非常不好的行为,因为其灵活性太差.所以下面就介绍一种使用属性来控制标签内容输出次数的方法. 准备工作 创建实现了SimpleTag接口的实现类(或者是继承了SimpleTagSupport类的子类) 在类中为相应的属性字段添加setter方法,注意字段名称一定要一致.否则会出错滴 在tld文件中进行相关约束项的声明,不同于不带属性的简单标签的声明方式,这里多了一个attribute子标签,内有name

jsp标签-想知道fld文件可以像xml文件一样用SAX或DOM解析吗

问题描述 想知道fld文件可以像xml文件一样用SAX或DOM解析吗 像通过java类解析配置jsp标签的fld文件获取自定义jsp标签的人 种类以及属性.去不知道该通过哪种方式进行解析,不知道fld文件可以像xml文件一样用SAX或DOM解析吗.求高手指点 解决方案 //Dompackage XML_homework;import java.io.File;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;i

Coldtags suite 4.15发布 JSP标签的集合工具

Coldtags suite是一款自定义JSP标签的集合工具.JSP开发者为一般的编程设计提供了300多种自定义JSP标签,能够加快你的J2EE架构和开发,而无须更多额外代码.它包括自定义标签类似于在http://www.aliyun.com/zixun/aggregation/13480.html">.NET框架中的Web控件. Coldtags suite 4.15版本添加新的组件,总数达到415多个控制元件,对现有的组件进行了更新. 软件信息:http://www.servletsu