在jsp1.2时代已经有标记库了, 并且功能强大,但标记库的编程和调用都比较复杂,导 致真正使用到WEB开发中的还是不多。JSP2.0推出的简单标记库扩展解决了以上的问题。 简单标记库相对JSP1.2中的标记库来说,优点在于: 对后台程序员来说:结构更简单,实现接口更少,可以轻松实现后台程序
JSP 2.0中加入了新的创建自制标记的API:javax.servlet.jsp.tagext.SimpleTag,该 API定义了用来实现简单标记的接口。和JSP 1.2中的已有接口不同的是,SimpleTag接口 不使用doStartTag()和doEndTag()方法,而提供了一个简单的doTag()方法。这个方法在 调用该标记时只被使用一次。而需要在一个自制标记中实现的所有逻辑过程、循环和对 标记体的评估等都在这个方法中实现。从这个方面来讲,SimpleTag可以和IterationTa g达到同等的作用。但SimpleTag的方法和处理周期要简单得多。在SimpleTag中还有用来 设置JSP内容的setJspBody()和getJspBody()方法。Web容器会使用setJspBody()方法定 义一个代表JSP内容的JspFragment对象。实现SimpleTag标记的程序可以在doTag方法中 根据需要多次调用getJspBody().invoke()方法以处理JSP内容。 对于前台WEB页面制作人员:在JSP1.2时代,Taglib页面调用实际上是比较复杂的,Simpl eTag+EL表达式语言极大的简化了Taglib调用,真正达到不懂JAVA的人员也可以轻松编写 JSP页面的目的。
一个Taglib页面的编写和调用包括三个流程:
1. 后台程序员编写要被调用的程序
简单标志扩展实现示例:
java程序 RepeatSimpleTag.java://放到WEB-INF/classes/jsp2/examples/simpletag 下面 package jsp2.examples.simpletag;
- package jsp2.examples.simpletag;
- import javax.servlet.jsp.JspException;
- import javax.servlet.jsp.tagext.SimpleTagSupport;
- import java.util.HashMap;
- import java.io.IOException;
- public class RepeatSimpleTag extends SimpleTagSupport {
- private int num;
- public void doTag() throws JspException, IOException {
- for (int i=0; i<num; i++) {
- getJspContext().setAttribute("count",
- String.valueOf( i + 1 ) );
- getJspBody().invoke(null);
- }
- }
- public void setNum(int num) {
- //这个用来设置num的值,这个方法将在tld文件中调用
- this.num = num;
- }
- }
----------------------------
2. 编辑Tag标志描述文件,这个文件要放在WEB-INFjsp2下面,并且这个文件要以tld为 文件结尾。
repeatTaglib.tld (标志库描述文件,放在WEB-INF下面的jsp2下面)
- < ?xml version="1.0" encoding="UTF-8" ?>
- < taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org
- /2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2e
- e web-jsptaglibrary_2_0.xsd" version="2.0">
- < description>A tag library exercising SimpleTag handlers.< /description>
- < tlib-version>1.0< /tlib-version>
- < short-name>SimpleTagLibrary< /short-name>
- < uri>/SimpleTagLibrary< /uri>
- < tag> < !--这里是开始标志描述-->
- < name>repeat< /name> < !--这里设定的标志名称,供jsp文件调用-->
- < tag-class>jsp2.examples.simpletag.RepeatSimpleTag< /tag-class>
- < !--对应的java文件路径-->
- < body-content>scriptless< /body-content>
- < variable> < !--设置要获取的变量返回值-->
- < description>Current invocation count (1 to num)< /descri
- ption>
- < name-given>count< /name-given>
- < /variable>
- < attribute> < !--设置java类中变量,调用java文件中的setNum()方法-->
- < name>num< /name>
- < required>true< /required>
- < rtexprvalue>true< /rtexprvalue>
- < /attribute>
- < /tag> < !--//这里是结束标志描述-->
- < /taglib>
----------------------------
3.JSP页面人员就可以直接调用了。
- < %@ taglib prefix="repeattag" uri="/WEB-INF/jsp2/repeatTaglib.tld" %>
- < html>
- < body>
- < br>
- < repeattag:repeat num="5">//向标记库文件中的repeat标记付值
- 获得返回值{count} of 5< br>//得到返回结果(java程序中实现了循环)
- < /repeattag:repeat>
- < /body>
- < /html>
看这么简单就可以得到想要的结果,方便吧。
----------------------------
使用标签文件(JSP fragment): 使用简单标签扩展机制的另一种简单的方法是通过标签文件。 标签文件是一种资源文件,网页作者可以利用它抽取一段JSP代码,通过定制功能来实现 代码的复用。换句话说,标签文件允许JSP网页作者使用JSP语法创建可复用的标签库。 标签文件的扩展名必须是“.tag”。表面上标签文件文件和jsp1.2中的jsp:include 指 令中的包含文件好像是一样的,但实际上还是有一些不同的,标签文件一般功能比较短小 简单而且重复使用率高的一些代码。
----------------------------
一个简单的标签文件 SimpleTag.tag 这个文件放到WEB-INF/tags下面
- < h4>hello,welcome to here ,here is a simple tag Example< /h4>
- char.jsp
- < %@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
- < HTML>
- < BODY>
- < H2>Tag File Example< /H2>
- < P>< B>The output of my first tag file is< /B>: < tags:SimpleTag/>
- < /BODY>
- < /HTML>
如果其他JSP页面中还要使用这个标签文件,同样也可以实现这调用这个标志库文件,达到 简单的代码复用的目的。
----------------------------
标签文件(JSP fragment)的基本特点是可以使处理JSP的容器推迟评估JSP标记属性。我 们知道一般JSP是首先评估JSP标记的属性,然后在处理JSP标记时使用这些属性,而JSP fragment提供了动态的属性。也就是说,这些属性在JSP处理其标记体时是可以被改变 的。标签文件是用文本文件格式(JSP语法)实现自制标记,这也是JSP2.0的一个主要新功能。
----------------------------
标签文件的动态复用 标签文件可以作为模板使用。指令attribute类似于TLD中的< attribute>元素,允许声明 自定义的动作属性。
- < %@ attribute name="color" %>
- < %@ attribute name="bgcolor" %>
- < %@ attribute name="title" %>
- < TABLE border="0" bgcolor="${color}">
- < TR> < TD>< B>${title}< /B>< /TD> < /TR>
- < TR> < TD bgcolor="${bgcolor}"> < jsp:doBody/> < /TD> < /TR>
- < /TABLE>
- 以下是调用这个Tag文件的jsp文件
- < %@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
- < HTML>< BODY>
- < TABLE border="0">
- < TR valign="top">
- < TD>
- < tags:display color="#ff0000" bgcolor="#ffc0c0" title="Travel"> Last French
- Concorde Arrives in NY
- Another Travel Headline
- Yet Another Travel Headline
- < /tags:display>
- < /TD>
- < TD> < tags:display color="#00fc00" bgcolor="#c0ffc0" title="Technology"> Jav
- a for in-flight entertainment
- Another Technology Headline
- Another Technology Headline
- < /tags:display>
- < /TD>
- < TD> < tags:display color="#ffcc11" bgcolor="#ffffcc" title="Sports"> America
- n Football NBA Soccer
- < /tags:display>
- < /TD>
- < /TR>
- < /TABLE> < /BODY> < /HTML>
每次设定 Tag文件中的相关的属性,而Tag标志文件则根据设定的属性显示相应的结果。可以说在JSP2.0中使用标签库是大大的方便了。