JSP标签从1.0 开始就已经出现啦,现在JSP都2.0了出现了两个版本,所以我们在用的时候第一是Jar包要注意版本,还有一个要注意版本的地方就是web.xml和.Tld这两个XML文件。
我最开始的时候摸不到头绪,两个配置文件的版本不一致结果导致页面报错找不到标签,还发了个帖子询问,但是大家都误以为是配置的错误,还郁闷了好几天后来再发现这个原因。
1. 配置文件的头信息
Web.Xml 2.0
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
Test.tld 2.0
<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/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>SimpleTag</description>
<tlib-version>1.0</tlib-version>
Web.Xml 1.x
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
Test.tld 1.x
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>html</shortname>
<uri>http://jakarta.apache.org/struts/tags-html</uri>
头信息的版本匹配很重要,本文就在此举例头信息,以下的XML文件格式大家要注意匹配版本
(以下的例子都是1。X版本)
2如何配置标签
配置标签是写标签中最有挑战性的事情,下面说说应该如何配置。
首先要配置web.xml
<taglib>
<taglib-uri>/aaa</taglib-uri>
<taglib-location>/WEB-INF/test.tld</taglib-location>
</taglib>
然后是test.tld
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>Application Tag Library</shortname>
<uri>/mytag</uri>
<info>学习标签</info>
<tag>
<name>hello</name>
<tagclass>com.TestTld</tagclass>
<bodycontent>empty</bodycontent>
<info>向菜头学习</info>
<attribute>
<name>begin</name>
<required>true</required>
</attribute>
<attribute>
<name>end</name>
<required>true</required>
</attribute>
</tag>
</taglib>
TLD的根是taglib元素。表16-2中列出了taglib的子元素:
表16-2 taglib子子元素
元素
说明
tlib-version
标签库的版本
jsp-version
这个标签库要求的JSP规范版本
short-name
JSP页面编写工具可以用来创建助记名的可选名字
uri
唯一标识该标签库的的URI
display-name
将由工具显示的可选名
small-icon
将由工具使用的可选小图标
large-icon
可被工具使用的可选大图标
description
可选的标签特定信息
listener
见listener元素
tag
见tag元素
在tag元素中的TLD中指定标签。在表16-3中出了tag的子元素:
表16-3 标签子元素
元素
说明
name
唯一标签名
tag-class
标签handler类的完全限定名
tei-class
javax.servlet.jsp.tagext.TagExtraInfo的可选子类。见提供有关脚本变量的信息。
body-content
正文内容类型。见body-conten元素和 body-content元素。
display-name
由工具显示的可选名
small-icon
可以由工具使用的小图标
large-icon
可以由工具使用的大图标
description
可选的标签特定的信息
variable
可选的脚本变量信息。见提供有关脚本变量的信息。
attribute
标签属性信息。见Attribute 元素。
下面几节描述开发在标签类型中介绍的每一种类型的标签所需要的方法和TLD。
之后是在页面上加上声明
<%@ taglib uri="/aaa" prefix="mytag"%>
使用起来就变得非常简单了
<mytag:hello begin="aa" end="bd"/>
以上就是标签的整个配置过程。
2. class的编写
标签handler
标签handler是由Web容器调用的一个对象,用于执行带有自定义标签的JSP页面时对这个标签进行判断。标签handler必须实现Tag或者BodyTag接口。接口可以用于接受现有Java对象并使它成为标签handler。对于新创建的处理器,可以用TagSupport和BodyTagSupport类作为基类。这些类和接口包含在javax.servlet.jsp.tagext包中。
JSP页面的servlet在对标签处理的不同阶段调用由Tag和BodyTag接口定义的标签handler。遇到自定义标签的开始标签时,JSP页面的servlet调用方法以初始化相应的handler,然后调用handler的doStartTag方法。遇到自定义标签的结束标签时,调用处理器的doEndTag方法。在标签handler需要与标签的正文交互时调用其他方法,见带正文的标签。为了提供标签handler的实现,必须实现在处理标签的不同阶段调用的方法,在表16-1中汇总了这些方法。
表16-1标签handler方法
标签handler类型
方法
简单
doStartTag, doEndTag, release
属性
doStartTag, doEndTag, set/getAttribute1...N, release
正文、判断且无交互
doStartTag, doEndTag, release
正文、迭代判断
doStartTag, doAfterBody, doEndTag, release
正文、交互
doStartTag, doEndTag, release, doInitBody, doAfterBody, release
标签handler可以使用一个能让它得以与JSP页面通信的API。到API的入口点是页面上下文对象(javax.servlet.jsp.PageContext),通过它标签handler可以获取JSP页面能够访问的所有其他隐式对象(请求、会话和应用程序)。
隐式对象可以有与其相关联的命名属性。可以用[set|get]Attribute方法访问这种属性。
如果标签是嵌入的,标签handler还可以访问与外围标签关联的handler称为parent)。
一组相关的标签handler类(标签库)一般是打包的且作为JAR文档部署。
简单标签的handler必须实现Tag接口的doStartTag和doEndTag方法。在遇到开始标签时调用doStartTag方法。因为简单标签没有正文,所以这个方法返回SKIP_BODY。在遇到结束标签时调用doEndTag方法。如果要对页面的其他部分进行判断,则doEndTag方法需要返回EVAL_PAGE,否则,它就返回SKIP_PAGE。
每当你写的tag在Jsp页面里面要被解释的时候,服务器就自动调用你的类里面的doStartTag()函数来完成你定义的逻辑,当解析完标签后调用doEndTag()。实现Tag接口来定制自己的tag无疑是最灵活的。但是,难度也比较大,我们定义自己的tag的时候完全不必要搞得这么有内涵。
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的时候是很有用的。
TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport。
交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。
用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport。
2 doStartTag(),doEndTag()
doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。
预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE.
如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:
doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页
如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是
doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页
下面来看一段程序:
package com;
import java.io.*;
import java.util.Properties;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class TestTld extends TagSupport ...{
private String begin = null; //参数
private String end = null; //参数
public TestTld() ...{} //构造
public String getBegin() ...{return begin;}
public void setBegin(String begin) ...{this.begin = begin;}
public String getEnd()...{return end;}
public void setEnd(String end)...{this.end = end;}
public int doStartTag() throws JspTagException...{//这个方法不用所以直接返回值
return EVAL_BODY_INCLUDE;
}
public int doEndTag() throws JspException ...{//重点在这个方法上
JspWriter out = pageContext.getOut(); //重要
String sum = begin +""+ end;
System.out.print(sum);
// pageContext.setAttribute("sum", sum); //返回一个值
try ...{
out.println("beginend= "+sum);//标签的返回值
} catch (IOException e) ...{
e.printStackTrace();
}
return SKIP_BODY;
}
public void release() ...{
super.release();
}
}
下面看一下显示的效果:
<mytag:hello begin="aa" end="bd"/>
beginend=aabd
//------------------------------------------------------------------
<mytag:hello begin="aa" end="bd"/>
<%=sum%>
beginend=aabd
aabd
3.最后说一下2.0的新方法
SimpleTagSupport类别顾名思义,就是可以处理一些简单的自订标签需求,它是在JSP 2.0之后新增的类别,对于一些简单的自订标签页求,您可以继承它来实作标签处理类别,而不用为了处理一些TagSupport、 BodyTagSuppourt类别中回传值的问题。
为了使用上的简单而降低了复杂性,另一方面就是SimpleTagSupport类别所处理的功能受了些限制,它只处理标签与本体,要不要显示本体文字取决于您,对于标签之后的页面则不在SimpleTagSupport处理的范围之内(虽然您还是可以使用forward之类的方式来决定要不要显示之后的页面,但直接实作TagSupport会更方便一些),另外SimpleTagSupport类别的本体文字不能设定为JSP,这也是使用 SimpleTagSupport上的一些限制。
下面说一下例子:
package demo.tags;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class SimpleTagFrag extends SimpleTagSupport ...{
private JspFragment _frag1;
private JspFragment _frag2;
public void setFragment1(JspFragment frag1) ...{
_frag1 = frag1;
}
public void setFragment2(JspFragment frag2) ...{
_frag2 = frag2;
}
public void doTag() throws JspException, IOException ...{
_frag2.invoke(null);
_frag1.invoke(null);
}
}
传过来的值都变成了JspFragment类的,看到了么就是这么简单,只实现一个doTag就行了,配置是一样的。输出的时候只要调用.invoke()方法就完成啦,很简单吧
4.现有的开源库
我们最方便能拿到的就是JSTL和Struts的标签了,有兴趣的可以深入研究一下,《JSP2.0》这本书里面有详细的讲解
[url]
分享到:
相关推荐
JSP自定义标签JSP自定义标签JSP自定义标签JSP自定义标签JSP自定义标签JSP自定义标签
本人自行研究JSP自定义标签的学习笔记 目录如下: 目录 一、概述 1 1.1 使用简单标签机制 2 1.2 使用标签文件 3 二 、自定义标签简介 3 2.1 自定义标签概念 3 2.2 标签相关概念 3 2.3 如何创建自定义标签 3 三、自...
jsp自定义标签jsp自定义标签jsp自定义标签
jsp自定义标签jsp自定义标签jsp自定义标签jsp自定义标签
jsp 自定义标签 一个简单的自定义标签实现
使用jsp自定义标签的功能实现权限的控制。(如果用户没有某个模块的删除权限,就不现实这个删除按钮) 在整个项目中所有的页面都可以引入自定义的标签去做到权限的控制。 自定义标签文件 删除 可以控制页面中的每...
java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp自定义标签非常好用大家下载学习java jsp...
是jsp自定义标签学习,从基础到实践。是一个比较好的适合初学者学习的材料
在网上学习jsp自定义标签的时候, 出现了异常, 在网上寻找了好久, 都没有找到合适的答案, 自己通过摸索最后成功, 分享给大家, 希望能够帮助到你, 自定义标签不能放在java Project中, 只能在java web Project中才可以.
创建JSP自定义标签.doc 创建JSP自定义标签.doc 创建JSP自定义标签.doc
jsp、jstl自定义标签实现的分页,实现的还是比较好的,没有在request、session等范围保存过数据,在pageContext范围内保存过集合的数据, 实现的方法还是比较简单的,适用性还是比较广的,我是实在是没分了,平时也...
JSP自定义标签。在自定义标签的起始和结束标签之间的部分为标签体(Body)。 标签处理程序类:定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。 标签库描述符(TLD)文件:描述标签库的XML文档,向JSP引擎...
JSP自定义Table标签demo JSP自定义Table标签demo JSP自定义Table标签demo
jsp自定义迭代标签 jsp自定义迭代标签
jsp自定义标签库实现数据列表显示,包括代码,文档,希望对大家有帮助.