JAVA网站制作之JSP中标签库的深切研讨
C#是盗用了Java的源代码,仿照开发的,原因是Java是开源的啊,盗了也白盗,还有一点,开发C#语言的团队是就是开发Java语言的团队,是微软重金挖过去的啊js标签库Taglib标签被界说和散布在一个称为标签库的布局中,一个标签库是由元信息和类构成的汇合:
1.标签处置器:完成定制标签功效的Java类。
2.标签附加信息(TEI):向JSP容器供应边辑以确认标签属性和创立变量的类。
3.标签库形貌器(TLD):形貌单个标签和全部标签库属性的XML文档。
标签处置器和标签附加信息必要定位在JSP容器类载进器能够找到的中央。标签库形貌器可在URL指定的符意地位。JSP1.1标准请求JSP容器承受一个打包成因定布局的JAR文件的标签库。TLD必需是/META-INF目次中名为taglib.tld的文件,JAR文件则复制到/WEB-INF/lib目次下。
1、标签完成
1.开辟步骤
a.界说标签的名字、属性、声明的变量和标签体的内容。
b.编写标签库形貌器TLD。
c.编写标签处置器。
d.在JSP页面中利用标签。
2.JSP页面在JSP容器中的转换步骤:
JSP页面存在三种情势:jsp文件、java文件和class文件。
a.指令元素<%@page%>、<%@include%>和<%@taglib%>向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语句。
2、标签库形貌器(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:属性值可否用表达式指定。
3、标签处置器
标签处置器是经由过程完成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.重载publicintdoStartTag()throwsJspException办法。
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接口的办法
publicvoidsetPageContext(PageContextctx)天生的servlet在哀求处置器实行别的义务前起首挪用此办法,完成类应保留高低文对象以便它能够在标签性命期中利用。从页面高低文中标签处置器能够会见一切JSP隐含对象。
publicvoidsetParent(Tagp)利用一个标答能够找到操纵栈中它下面的标签。在setPageContext后当即挪用。
publicTaggetParent()前往父标签。
publicintdoStartTag()throwsJsp在设置了页面高低文、父标签和入手下手标志中编码的属性后挪用。前往码标明JSP完成servlet是不是就评价标签体。
publicintdoEndTag()throwsJspException当碰到结否标志时挪用。前往码标明JSP是不是就继纽页面的其他部分。
publicvoidrelease()确保在页面加入前被挪用。开释资本偏重置标签处置器形态。
TagSupport类的办法
publicstaticTagfinAncestorWithClass(TagthisTag,Classcls)为所需的父标签处置器查找运转时标签栈。一个标签处置器能够供应其局限内人标签挪用的办法。
publicvoidsetId(Stringid)保留和检索在id属性中指定的名字。
publicvoidsetValue(Stringname,Objecto)在当地哈希表中设置指命名字的值。
publicObjectgetValue(Stringname)从当地哈希表中猎取指命名称的值。
publicvoidremoveValue(Stringname)从当地哈希表中删除指命名称的值。
publicEnumerationgetValues()前往哈希表中关头字的一个列举。
3.标签处置器的性命期
a.天生servlet必要创立标签处置器类的一个实例。完成体例一般是挪用JSP容器的工场类的一个办法,工场类包括一个标签处置器实例池以使其可重用不再处于激活形态的对象。
b.初始化标签处置器,使servlet获知其存在性。servlet经由过程挪用标签处置器的两个办法完成此历程:setPageContext(PageContextctx)和setParent(Tagparent)。
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类的办法
publicvoidflush()throwsIOException复写JspWrite.flush()办法以便它老是发生溢出。革新写进已生效,由于它没有毗连到将被写进的实践输入流中。
publicvoidclearBody()重置BodyContent缓存为空。
publicReadergetReader()前往Reader读取体内容。
publicStringgetString()前往包括体内容的一个字符串。
publicvoidwriteOut(Writew)将体内容写进指定输入。
publicJspWritegetEnclosingWrite()前往栈中下一个更高的写进者对象(多是另外一个BodyContent对象)。
BodyTag接口界说了一个新的整型常量
EVAL_BODY_TAG当doStartTag()前往时,使得新的BodyContent对象被创立并与此标签处置器相干联。当doAfterBody()前往时,使得JSPservlet在修正完此标签把持的恣意变量后再次评价体。
BodyTag接口的办法
publicvoidsetBodyContern(BodyContentout)在以后JspWriter已被写进,一个新的BodyContent在被创立后由Jspservlet挪用,它产生在doStartTag()以后。
publicvoiddoInitBody()throwsJspExceptionsetBodyContent()以后,体被评价前挪用的性命期办法。假如屡次评价体,此办法只挪用一次。
publicinitdoAfterBody()throwsJspException体被评价后,BodyContent写进者仍处于激活形态时挪用的性命期办法。此办法必需前往EVAL_BODY_TAG或SKIP_BODY,若前往EVAL_BODY_TAG时体再次被评价。
BodyTagSupport类的办法
publicintdoStartTag()throwsJspException复写TagSupport中的doStartTag()办法。
publicintdoEndTag()throwsJspException挪用TagSupport中的doEndTag()办法,前往了局。
publicvoidsetBodyContent(BodyContentout)在一回护成员变量bodyContent中保留新的体内容对象,子类可间接会见此对象。
publicvoiddoInitBody()throwsJspException缺省甚么都不做。被必要实行初始化的子类所复写。
publicintdoAfterBody()throwsJspException每次体被评价后由JSPservlet挪用,体同容对象仍处于激活形态。前往SKEP_BODY或EVAL_BODY_TAG则体再次被评价
publicvoidrelease()设置bodyContent对象为null,然后挪用super.release()。
publicBodyContentgetBodyContent()前往bodyContent变量。子类已能够会见回护变量,但此办法同意有关的标签处置类对此体内容发送输入。
publicJspWritergetPreviousOut()在bodyContent变量上挪用getEnclosingWriter()并前往了局的烦琐办法。
5.体标签处置器的性命期
a.天生servlet必要创立标签处置器类的一个实例。完成体例一般是挪用JSP容器的工场类的一个办法,工场类包括一个标签处置器实例池以使其可重用不再处于激活形态的对象。
b.初始化标签处置器,使servlet获知其存在性。servlet经由过程挪用标签处置器的两个办法完成此历程:setPageContext(PageContextctx)和setParent(Tagparent)。
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,可以下完成:
JspWriterout=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输入流中:
JspWriterout=pageContext.getOut();
out.println(bodyContent.getString());
大概
bodyContent.WriteOut(pageContext.getOut());
6.标签附加信息类
4、标签指令
taglib指令元素的目标是指定TLD的地位,设置在页面上与标签辨别开来的一个短别号。
语法:<%@taglibprefix=”tagprefix”uri=”taglibURI”%>
属性:prefix:用于标识标签库的独一标识。uri:标签库自己的URI。
uri不用指向一个实践文件,它是JSP容器能够在web.xml中查找实践文件地位的独一标识符。
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 是一种使网页(Web Page)产生生动活泼画面的语言 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? Java 编程语言的风格十分接近C、C++语言。 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 是一种突破用户端机器环境和CPU 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。 Java 编程语言的风格十分接近C、C++语言。 Java是一种计算机编程语言,拥有跨平台、面向对java 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
页:
[1]