本文介绍标签库中JSP Servlet调用,包括介绍标签实现,标签库描述器,标签处理器和标签指令。

标签库Taglib

标签库中JSP Servlet调用(jsp页面调用servlet)  JSP Servlet调用 第1张

标签被界说和散布在一个称为标签库的结构中,一个标签库是由元信息和类组成的调集:
1.标签处理器:完结定制标签功用的Java类。
2.标签附加信息(TEI):向JSP容器供给边辑以承认标签特点和创立变量的类。
3.标签库描绘器(TLD):描绘单个标签和整个标签库特点的XML文档。

标签处理器和标签附加信息需求定位在JSP容器类载入器能够找到的当地。标签库描绘器可在URL指定的符意方位。JSP1.1标准要求JSP容器承受一个打包成因定结构的JAR文件的标签库。TLD有必要是/META-INF目录中名为taglib.tld的文件,JAR文件则复制到/WEB- INF/lib目录下。

一、标签完结

1.开发进程
a.界说标签的姓名、特点、声明的变量和标签体的内容。
b.编写标签库描绘器TLD。
c.编写标签处理器。
d.在JSP页面中运用标签。

2.JSP页面在JSP容器中的转化进程:

JSP页面存在三种办法:JSP文件、java文件和class文件。
a.指令元素、和向JSP容器供给转化时信息。
b.HTML行在_JSPService()办法中依次序转化到out.print()语名中。
c.脚本元素的声明被原封不动地复制到_JSPService()办法外的源码中。
d.脚本元素的表达式在_JSPService()办法中依次序转化到out.print()语名中。
e.脚本元素的Scriptlet被原封不动地复制到_JSPService()办法中。
f.行为元素被转化为履行其功用的运转时逻辑代码。
g.定制标签被扩展到调用其相应标签处理器中办法的Java句子中。

3.标签在JSP容器中的转化进程:
a.JSP容器运用taglib指令元素定位标签库描绘器,将页面中用到的定制标签和TLD相匹配。
b.读取标签库描绘器的标签列表和每一标签相关的类姓名。
c.在页面中遇到一个标签时,查找与具有指定姓名的标签前缀相关的一个标签库。
d.容器运用在TLD中找到的标签结构信息生成一系列完结标签功用的Java句子。

二、标签库描绘器(TLD)

标签库描绘器是一个描绘整个标签库符号信息和库中每个标签处理器及其特点的XML文档。

标签库描绘器的DTD由一个简略的元素组成,此元素包括下列一些子元素。

整个标签库符号信息
◆tlibversion 标签库版别号。是一个点式十进制数,最多为4组小数点分隔的数字组成。
◆JSPversion 标签库所需的JSP标准***版别。例如JSP1.1
◆shortname 标签库的缩写名。JSP能够运用该姓名作为库中标签的缺省前缀。
◆uri 标签库仅有URI的元素。典型URL方位来自可下载taglib的方位。
◆info 标签库描绘信息。
每个标签处理器及其特点tag 在TLD中参加标签,描绘组成库的每个标签。name 与标签库的姓名前缀一同运用的标签的姓名, 是JSP容器仅有的标签标识。tagclass 完结标签的标签处理器类的全名。teiclass 标签附加信息(TEI)类的全名。TEI类给出关于标签处理器创立变量及对标签司性履行的恣意有效性验证的信息。bodycontent 描绘标签处理器怎么运用标签体的内容。有三种取值:
◆empty:标明标签体有必要为空;
◆JSP:标明脚本元素和模板及其它标签相同被评价。
◆tagdependent:体内容被原封不动写入BodyContent,其它脚本元素以源码办法呈现,而不被JSP容器解说。

info 标签的人工可读描绘性信息。attribute 运用标签时被编码的特点信息。用于界说标签的特点。特点名:特点的姓名。
◆true|false:特点在标签用到的方位是否要被编码。
◆true|false:特点值能否用表达式指定。

三、标签处理器

标签处理器是经过完结JSP容器调用的一系列预界说办法履行定制标签行为的一个Java类。

标签处理器完结了标签的行为,标签处理器是Java类。

1.标签处理器的工作办法
a.导入javax.Servlet.JSP和javax.Servlet.JSP.tagext包。
b.完结javax.Servlet.JSP.tagext包中的Tag接口或BodyTag接口。BodyTag是Tag的子接口。
c.承继TagSupport类或BodyTagSuppoert类。它们是上述接口的缺省完结。
d.重载public int doStartTag()throws JSPException办法。

2.标签处理器的接口与完结
◆javax.Servlet.JSP.tagext.Tag是完结标签的最基本的接口。
◆javax.Servlet.JSP.tagext.TagSupport是完结Tag接口的详细类。

通常状况下承继tagSupport类而不直接完结Tag接口通常是有利的。除了对一切必需办法供给了缺省完结外、还保存了pageContext目标及对嵌套标签的支撑。

Tag接口包括4个常量,标明doStartTag()和doEndTag()办法或许的回来码。
EVAL_BODY_INCLUDE 当doStartTag()回来时,指明Servlet应对标签体进行评价。
SKIP_BODY 当doStartTag()回来时,指明Servlet应忽视标签体。
EVAL_PAGE 当doEndTag()回来时,指明页面其他部分应被评价。
SKIP_PAGE 当doEndTag()回来时,指明页面其他部分就被越过。

Tag接口的办法

public void setPageContext (PageContext ctx) 生成的Servlet在恳求处理器履行其它使命前首要调用此办法,完结类应保存上下文目标以便它能够在标签生命期中运用。从页面上下文中标签处理器能够拜访一切JSP隐含目标。
public void setParent(Tag p) 运用一个标答能够找到操作栈中它上面的标签。在setPageContext后当即调用。
public Tag getParent() 回来父标签。
public int doStartTag() throws JSP 在设置了页面上下文、父标签和开端符号中编码的特点后调用。回来码标明JSP完结Servlet是否就评价标签体。
public int doEndTag()throws JSPException 当遇到结否符号时调用。回来码标明JSP是否就继纽页面的其他部份。
public void release() 保证在页面退出前被调用。开释资源并重置标签处理器状况。

TagSupport类的办法
public static Tag finAncestorWithClass(Tag thisTag, Class cls) 为所需的父标签处理器查找运转时标签栈。一个标签处理器能够供给其规模内人标签调用的办法。
public void setId(String id) 保存和检索在id特点中指定的姓名。
public void setValue(String name, Object o) 在本地哈希表中设置指定姓名的值。
public Object getValue (String name) 从本地哈希表中获取指定称号的值。
public void removeValue (String name) 从本地哈希表中删去指定称号的值。
public Enumeration getValues() 回来哈希表中关键字的一个枚举。

3.标签处理器的生命期
a.生成Servlet需求创立标签处理器类的一个实例。完结办法通常是调用JSP容器的工厂类的一个办法,工厂类包括一个标签处理器实例池以使其可重用不再处于激活状况的目标。
b.初始化标签处理器,使Servlet获悉其存在性。Servlet经过调用标签处理器的两个办法完结此进程:setPageContext(PageContext ctx)和setParent(Tag parent)。
c.假如标签具有特点,特点的取值经过处理器供给setter办法传入到目标。特点setter办法是一个标签支撑特点所需的仅有办法。
d.页面的上下文和父标签已被调置,并已具有特点。此刻调用标签处理器的doStartTag()办法,该办法能够读取这些变量并履行完结标答功用所需的核算和操作。doStartTag()办法有必要回来一个整型数。回来EVAL_BODY_INCLUDE则正常处理标签体,回来 SKIP_BODY则从初始JSP页面中直到此标签完毕符号处的内容均被疏忽。
e.标签体被评价或忽视后调用标签处理器的doEndTag()办法,回来EVAL_PAGE则页面的其他部分被评价,回来SKIP_PAGE则Servlet代码当即从_JSPService()中回来。

4.体标签处理器的接口与完结
javax.Servlet.JSP.tagext.BodyTag是Tag的子接口。
javax.Servlet.JSP.tagext.BodyTagSupport是完结BodyTag类。
BodyContent是javax.Servlet.JSP.JSPWriter的子类,但与其父类有所区别。
BodyContent目标的内容不主动写了入Servlet的输出流,而是堆集在一字符串缓存中。当标签体完结后其目标仍可在doEndTag()办法中能够使用,由getString()或getReader()办法操作。并在必要时修正及写入康复的JSPWriter输出流。
BodyContent类的办法
public void flush()throws IOException 复写JSPWrite.flush()办法以便它总是发生溢出。改写写入已失效,由于它没有连接到将被写入的实践输出流中。
public void clearBody() 重置BodyContent缓存为空。
public Reader getReader() 回来Reader读取体内容。
public void writeOut(Write w) 将体内容写入指定输出。
public JSPWrite getEnclosing Write() 回来栈中下一个更高的写入者目标(或许是另一个BodyContent目标)。

BodyTag接口界说了一个新的整型常量

EVAL_BODY_TAG 当doStartTag()回来时,使得新的BodyContent目标被创立并与此标签处理器相关联。当doAfterBody()回来时,使得JSP Servlet在修正完此标签操控的恣意变量后再次评价体。

BodyTag接口的办法
public void setBodyContern (BodyContent out) 在当时JSPWriter已被写入,一个新的BodyContent在被创立后由JSP Servlet调用,它发生在doStartTag()之后。
public void doInitBody() throws JSPException setBodyContent()之后,体被评价前调用的生命期办法。假如屡次评价体,此办法只调用一次。
public init doAfterBody() throws JSPException 体被评价后,BodyContent写入者仍处于激活状况时调用的生命期办法。此办法有必要回来EVAL_BODY_TAG或SKIP_BODY,若回来 EVAL_BODY_TAG时体再次被评价。

BodyTagSupport类的办法
public int doStartTag() throws JSPException 复写TagSupport中的doStartTag()办法。
public int doEndTag() throws JSPException 调用TagSupport中的doEndTag()办法,回来成果。
public void setBodyContent (BodyContent out) 在一维护成员变量bodyContent中保存新的体内容目标,子类可直接拜访此目标。
public void doInitBody() throws JSPException 缺省什么都不做。被需求履行初始化的子类所复写。
public int doAfterBody() throws JSPException 每次体被评价后由JSP Servlet调用,体同容目标仍处于激活状况。回来SKEP_BODY或EVAL_BODY_TAG则体再次被评价
public void release() 设置bodyContent目标为null,然后调用super.release()。
public BodyContent getBodyContent() 回来bodyContent变量。子类现已能够拜访维护变量,但此办法答应无关的标签处理类对此体内容发送输出。
public JSPWriter getPreviousOut() 在bodyContent变量上调用getEnclosingWriter()并回来成果的简洁办法。

5.体标签处理器的生命期
a.生成Servlet需求创立标签处理器类的一个实例。完结办法通常是调用JSP容器的工厂类的一个办法,工厂类包括一个标签处理器实例池以使其可重用不再处于激活状况的目标。
b.初始化标签处理器,使Servlet获悉其存在性。Servlet经过调用标签处理器的两个办法完结此进程:setPageContext(PageContext ctx)和setParent(Tag parent)。
c.假如标签具有特点,特点的取值经过处理器供给setter办法传入到目标。特点setter办法是一个标签支撑特点所需的仅有办法。
d.页面的上下文和父标签已被调置,并已具有特点。调用标签处理器的doStartTag()办法,该办法能够读取这些变量并履行完结标答功用所需的核算和操作。
doStartTag()办法有必要回来一个整型数。
◆回来EVAL_BODY_TAG则正常处理标签体(跳到e);
◆回来SKIP_BODY则从初始JSP页面中直到此标签完毕符号处的内容均被疏忽。(跳到f)
e.假如回来EVAL_BODY_TAG时,则正常处理标签体。
e1.在栈中保存当时的JSPWriter目标,创立新的BodyContent目标,并将其置为JSP页面的out目标保存在上下文规模内名为name的特点中。并用它的setBodyContent()办法。
e2.调用doInitBody()办法进行初始化。
e3.处理标签体。将输出写入BodyContent目标中,此进程依赖于TLD的标签元素,有三种或许取值。
e4.调用doAfterBody()办法,将体内体内容写入JSPWriter,可如下完结:
◆JSPWriter out=bodyContent.getEnclosingWriter();
◆out.println(bodyContent.getString());//bodyContent.writeOut(out);
◆bodyContent.clear();
e5.doAfterBody()办法回来两种或许:
◆回来EVAL_BODY_TAG时,再对标签体进行评价,这是数组和枚举被循环处理的典型状况。
◆回来SKIP_PAGE时,持续页面的其他部份。
e6.体内容完结,因而创立它的进程被反向:
调用pageContent.popBody()办法检索前面的JSPWriter目标。将写入者设置回out隐含目标。
f.标签体被评价或忽视后调用doEndTag()办法,答应标签处理器像输出流发回内容。
回来EVAL_PAGE则页面的其他部分被评价;
回来SKIP_PAGE则Servlet代码当即从_JSPService()中回来。
g. 此刻体的内容在受维护的bodyContent目标中依然可用。能够将它写入Servlet输出流中:
◆JSPWriter out=pageContext.getOut();
◆out.println(bodyContent.getString());或许
◆bodyContent.WriteOut(pageContext.getOut());

6.标签附加信息类

四、标签指令

taglib指令元素的意图是指定TLD的方位,设置在页面上与标签区别开来的一个短别号。

语法:

特点:prefix:用于标识标签库的仅有标识。uri:标签库自身的URI。

uri不用指向一个实践文件,它是JSP容器能够在web.xml中查找实践文件方位的仅有标识符。

【修改引荐】

  1. Future Response Servlet特性
  2. 简略介绍Servlet实例运转
  3. 浅析ServletQueryForConnPool测验
  4. Tomcat Java Servlet引擎安全设定
  5. Jetty-Servlet容器额定功用
转载请说明出处
知优网 » 标签库中JSP Servlet调用(jsp页面调用servlet)

发表评论

您需要后才能发表评论