更多>>所有分类  >学习指南  >学习资料  >开发JSP自定义行为>详细

开发JSP自定义行为
内容摘要:元素,一个,行动,标记,程序,,开发JSP自定义行为,java学习资料

王景辉主讲《新版标准日本语初级上下册》在线视频课程。 进入免费试听!

标签:元素,一个,行动,标记,程序, 开发JSP自定义行为 java学习资料

1需要应用一系列的类和接口,这些类和接口在JSP1.1规范中被称为标记扩大机制(tag extension mechanism),.  要开发一个自定义行动。实现标记处理程序所需要的所有接口和类都是在javax.servlet.jsp.tagext包中定义的。两个重要的接口分辨是Tag和BodyTag。为了使开发标记处理程序更加轻易,API定义了两个起支撑作用的类:TagSupport和BodyTagSupport。这两个类分辨为上面的两个接口供给了默认的实现。

2.  标记库是一个自定义行动的集合。在标记库中除了标记处理程序的类文件以外,标记库里还必须包含一个tld文件。这是一个XML文件,它把所有的自定义行动的名称映射到相应的标记处理程序类,而且对每一个自定义行动所支撑的所有属性进行了描写。类文件和tld可以被打包到一个JAR文件中以方便安装。

3.  开发,配置和应用一个简略的自定义行动通常需要做这几部分工作。

(1)       实现一个标记处理程序类。对这个类进行编译,然后把天生的类文件放到利用程序的WEB-INF/classes目录下。

(2)       创立TLD文件。看下面这个简略的实例。

<?xml version=”1.0” encoding=”ISO-8859-1” ?>

<!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>test</shortname>

 

 <tag>

  <name>hello</name>

  <tagclass>com.mycompany.HelloTag</tagclass>

  <bodycontent>empty</bodycontent>

  <attribute>

<name>name</name>

          </attribute>

         </tag>

        </taglib>

        把这个文件取名为*.tld,并把它放在利用程序的WEB-INF/tlds目录下。

(3)       现在你可以这样在JSP页面中应用自定义行动。

<%@ taglib uri=”/WEB-INF/tlds/mylib.tld” prefix=”test” %>

<html>

       <body bgcolor=”white”>

              <test:hello name=”maojb”/>

       </body>

</html>

当这个页面被恳求时,JSP容器就应用这个TLD来创造与自定义行动相对应的类。然后它将调用所有相应的方法,将相应的文本加进到应答中往。以上就是在最简略的情况下我们要做的所有事情。

4.  先来看一下最重要的Tag接口的方法:

public void setPageContext(PageContext pageContext);

public int doStartTag() throws JspException;

public int doEndTag() throws JspException;

 

然后我们懂得一下TagSupport类供给的对这些方法的实现。

Public class TagSupport implements Tag , Serializable {

Protected PageContext pageContext;

        …….

        Public void setPageContext(PageContext pageContext) {

        This.pageContext = pageContext;

        } //这个方法是在应用标记处理程序之前被JSP容器调用的。

 

        Public int doStartTag() throws JspException {

        Return SKIP_BODY;

        } //当碰到开端标记时,JSP容器将调用doStartTag()方法。

 

        Public int doEndTag() throws JspException {

        Return EVAL_PAGE;

        } //当碰到结束标记时,JSP容器将调用doEndTag()方法。

}

5.  开发一个不需要对行动元素体做任何事情的标记处理程序是非常简略的。然而,对于一个需要处理行动体的标记处理程序来说,还需要一些方法。这些方法是由BodyTag接口定义的,该接口扩大了Tag接口。

6.  一个有行动体的标记处理程序的履行过程。

(1)       setAttr1(“value1”)

(2)       setAttr2(“value2”)

(3)       doStartTag()

(4)       setBodyContent()

(5)       doInitBody()

(6)       doAfterBody()

(7)       doEndTag()

7.  BodyTagSupport类有很多实用的方法来处理行动体。

如:getBodyContent() , getPreviousOut()

8.  如何让多个行动互相协作。

内层行动是如何告诉外层行动自己定义参数信息之类的东西呢?这个标题的答案就在由TagSupport类实现的一些Tag接口方法和一个工具方法里。

这些Tag接口的方法是setParent()和getParent() 。一个嵌套的标记处理程序通常有一个对容纳它的父元素的引用。所以,一个在任意嵌套层次上的标记处理程序可以应用getParent()方法来得到它的父元素,然后可以得到父元素的父元素。可以一直这样下往,直到达到一个没有父元素的Tag(即getParent()返回了null)。这意味着已经达到了最外层。

 

通常说来,一个标记处理程序只对那个它要与之协同工作的父元素感爱好。所以,一个好的想法是开发一个方法,该方法将沿着层次结构不断向上追溯,直到找到标记处理程序感爱好的那个父元素。而这正是TagSupport类所实现的findAncestorWithClass()方法所做的工作。

Public static final Tag findAncestorWithClass(Tag from , Class klass) {

Boolean isInterface = false;

        

If(from == null || klass == null || (!Tag.class.isAssignableFrom(klass) &&

        !(isInterface = klass.isInterface()))) {

        return null;

        }//假如from或者klass为null , 或者klass是一个类并且没有实现Tag接口,显然当前Tag找不到klass类的父元素。

 

        for(;;) {

        Tag tag = from.getParent();

        If(tag == null) {

               Return null;

               } //表现没有父元素

        if((isInterface && klass.isInstance(tag)) || klass.isAssignableFrom(tag.getClass()))

               return tag; //假如klass是接口并且当前tag实现了该接口,那么找到了。

                              //或者当前tag是klass类型的,那么找到了。

        else

               from = tag;

        }

}

9.  通过行动创立新的变量

当自定义行动创立一个变量时,它必须与JSP容器合作。

对于一个标记处理程序来说,创立一个新的对象并使得其他行动和JSP脚本代码可以访问这个对象,需要两件事情:

(1)       JSP容器必须知道对象的名称和Java类型,这样它才干为变量声明天生代码。

(2)       变量必须被放置在某个JSP作用域内,这样才干通过findAttribute()方法找到它,并能赋值给这个变量。

第一件事由一个名为TagExtraInfo的类来完成。当你为一个引进对象的行动开发标记处理程序时,你必须创立TagExtraInfo类的一个子类。JSP容器在天生代码的时候就需要这样一个类的实例。

10.              开发迭代行动

开发迭代行动时,通常也需要一个TagExtraInfo子类,这样才干在loop的过程中访问loopID变量。

11.              如何创立TLD

当JSP容器将自定义行动元素转化成创立并调用正确的标记处理程序的代码时,JSP容器还需要关于哪个标记处理程序实现哪个自定义行动元素的信息。而这些信息都是从TLD那里获得的。另外,JSP容器还应用TLD信息来验证行动元素的属性列表是否正确。

 

TLD是一个XML文件,它包含了一个库中所有自定义行动的信息。应用自定义行动的JSP页面必须能辨认相应的TLD,还能够利用taglib指令元素在页面中辨认出用于行动的名称空间前缀。如:

<%@ taglib uri=”/WEB-INF/tlds/orataglib_1_0.tld” prefix=”ora” %>

….

<ora:redirect page=”main.jsp”/>

JSP页面里碰到前缀匹配的行动时,JSP页面就会用TLD来查找它需要的信息。

 

TLD文件中的内容:

(1)       最顶部:标准的XML声明和一个DOCTYPE声明。(这两个声明指定了文件的文档类型定义Document Type Definition , DTD)。

(2)       <taglib>元素: TLD的主元素,它包含了描写库的所有特定元素。

(3)       <tlibversion>元素:指定标记库的版本。必须

(4)       <jspversion>元素:指定了库所依附的JSP规范的版本。默认值为1.1。可选

(5)       <shortname>元素:必须元素。这个元素的值中不能包含空格或其他特别字符,也不能以数字或下划线开头。

(6)       <uri>元素:可选,字符规矩同上。

(7)       <info>元素:可选,

(8)       TLD中至少还必须包含一个<tag>元素。<tag>元素中包含了描写自定义行动的各个方面的其他元素:<name> <tagclass> <teiclass> <bodycontent> <info> <attribute>

l     <name>元素是必须的。它包含了自定义行动元素对应的名称,这个名称是唯一的。

l     <tagclass>元素也是必须的。

l     假如行动引进了变量,或者需要进行语法验证,那么就要应用<teiclass>元素。这个元素是可选的,用来制定TagExtraInfo子类的全名。

l     <bodycontent>元素是一个可选元素,它的三个可能值为:empty , JSP或tagdependent。

l     <info>元素是可选的,用来描写行动的目标。

l     tag元素还必须为行动的每个属性设置<attribute>元素。当然每个元素中也包含了描写属性的另外一些元素:<name>,<required>和<rtexprvalue>

12.              语法验证

(1)       最简略的语法验证是:

当JSP容器将一个JSP页面转化成Servlet时,它会将自定义行动元素和TLD中行动元素的规范进行比较。这样就可以验证语法上的毛病。

(2)       某些语法验证就要复杂很多了。如:一些属性依附于其他属性是否涌现。有些属性是排他的,假如应用了这个就不能应用那个。某个可选的属性必须和其它的可选属性一起应用。为了验证这些依附性,JSP容器必须向标记处理程序的TagExtraInfo子类寻求支撑。

 

在JSP容器检查完一切它自己能检查的以后,它会为行动查找TagExtraInfo子类(由<teiclass>元素定义)。假如定义了TagExtraInfo子类,它就将所有属性信息放到TagData类的一个实例中,并调用TagExtraInfo的isValid()方法,参数是装有信息的TagData类。

13.              如何重用标记处理程序

建议在release()方法中完成重置所有属性的工作。

14.              如何打包和安装标记库

在完成开发后,你可能希看将所有的标记处理程序类,TagExtraInfo类,标记处理程序类中应用的bean和TLD打包到一个JAR文件里。这样可以使得在利用程序中安装库更加轻易。TLD在JAR文件中必须被存为/META-INF/taglib.tld。

(1) 为了创立JAR文件,按照下面的结构来安排目录下的文件。

META-INF下:taglib.tld

将所有类放在com目录上

文件结构设置好就应用jar命令创立一个JAR文件:

jar cvf maojb.jar META-INF com

(2) 将JAR文件拷贝到利用程序的WEB-INF/lib目录下。

编辑推荐:
用web.xml控制Web应用的行为
Struts 用户指南
开发JSP自定义行为
Struts 系列之二 ------- Struts标记库
EnterpriseJavaBean的结构优点的探讨

内容提示:元素,一个,行动,标记,程序,,java学习资料,开发JSP自定义行为
标签:元素,一个,行动,标记,程序, 开发JSP自定义行为 java学习资料
java相关金牌课程
java相关的文章
最新java学习资料
热门java文章
  • 地域:
  • 高级搜索
 
CopyRight2007-2009 zcedunet.cn 智程教育网版权所有  湘ICP备09000531号 互联网违法举报中心 | 版权保护投诉指引