仓酷云
标题:
JAVA教程之一篇先容JSP标签库很具体的文章,能够做...
[打印本页]
作者:
活着的死人
时间:
2015-1-18 11:12
标题:
JAVA教程之一篇先容JSP标签库很具体的文章,能够做...
Java的B/s开发是通常是javaweb开发,又叫J2EE开发,J2SE是手机开发。C#的C/s和B/s开发是说.net和Asp开发。。u在这里说明一点;资深一点的Java和C#程序员都明白一点js|参考|参考手册尺度的JSP标志能够挪用JavaBeans组件大概实行客户的哀求,这年夜年夜下降了JSP开辟的庞大度和保护量。JSP手艺也同意你自界说taglib,实在换句话说,taglib能够当作是对JSP标志的一种扩大,正如xml是对html的一种扩大一样。taglib一般界说在tag标签库中,这类标签库寄存着你本人界说的tag标签。简而言之,假如利用taglib,那末你能够计划本人的JSP标志!
一样平常来讲,自界说tag标签次要用于操纵埋没对象、处置html提交表单、会见数据库或别的企业级的服务,诸如邮件和目次操纵等等。自界说tag标签的利用者一样平常都是那些对java编程言语十分精晓,并且对数据会见和企业级服务会见都十分熟习的程序员,关于HTML计划者来讲,使得他能够不往存眷那些较庞大的贸易逻辑,而将精神放在网页计划上。同时,它也将库开辟者和库利用者举行公道合作,自界说tag标签将那些反复事情举行封装,从而年夜年夜进步了临盆力,并且可使得tag库可用于分歧的项目中,完善地表现了软件复用的头脑。
在这篇文章中,我们次要会商:
・甚么是自界说tag标签?
・怎样利用tag标签?
o声明要利用的tag库
o找到与之对应的tag处置类
otag标签的范例
・自界说tag标签
otag处置类
otag库形貌
otag标签示例
o带属性的tag
o带body的tag
o界说了剧本变量的tag
o具有合作干系的tag
・自界说tag标签
o一个迭代tag的例子
o一个模板tag库
otag处置类究竟是如何被挪用的?
甚么是自界说的tag?
一个自界说的tag标签是用户界说的一种JSP标志。当一个含有自界说的tag标签的JSP页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为tag处置类的对象举行的操纵。因而当JSP页面被jsp引擎转化为servlet后,实践上tag标签被转化成了对tag处置类的操纵。
自界说tag标签有良多特征,诸如:
・能够在JSP页面中自界说tag标签的属性
・会见JSP页面中的一切对象
・能够静态地修正页面输入
・相互这间能够互相通讯。你能够先创立一个JavaBeans组件,然后在一个tag中挪用此JavaBeans组件,同时能够在另外一个tag中挪用它。
・tag同意互相嵌套,能够在一个JSP页面中完成一些庞大的交互。
利用tag标签
本节次要形貌如何在JSP页面中利用tag标签,和tag标签的分歧范例。
要利用tag标签,JSP程序员必需做2件事:
・声明此tag标签的tag库
・完成此tag标签
声明tag标签地点的tag库
假如要利用tag标签,则使用JSP的taglib唆使符来指定其tag库(注重:taglib要在在利用此tag标签之前声明)
<%@tagliburi=”/WEB-INF/tutorial-template.tld”prefix=”tt”%>
uri属性界说了独一的标签库形貌(以下简称TLD),它能够是间接是tld文件名或一个举世无双的名字。prefix是用来区分别的TLD中和本TLD中有重名的tag的一种手腕。
TLD必需以.tld作为扩大名,而且寄存在以后使用的WEB-INF目次或其子目次下。你能够经由过程它的文件名间接援用它,也能够经由过程其余体例直接地援用它。
以下taglib唆使符间接援用一个TLD:
<%@tagliburi=”/WEB-INF/tutorial-template.tld”prefix=”tt”%>
以下的taglib唆使符经由过程一个逻辑称号直接地援用一个TLD:
<%@tagliburi=”/tutorial-template”prefix=”tt”%>
假如是直接援用TLD的话,那你必需还要在web.xml中界说此逻辑称号与tld文件之间的映照,详细做法是在web.xml中到场一个名为taglib的元素:
<taglib>
<taglib-uri>/tutorial-template</taglib-uri>
<taglib-location>
/WEB-INF/tutorial-template.tld
</taglib-location>
</taglib>
完成此tag标签
为了完成tag标签,你有2种办法来寄存tag处置类。1、让tag处置类以.class的体例寄存于以后使用的WEB-INF/class子目次下,2、假如tag处置类是以JAR包的情势存在的话,那能够放在以后使用的WEB-INF/lib目次下,假如tag处置类要在多个使用中共享,那末它就应放在jsp服务器上的common/lib目次下,关于tomcat来讲,就是tomcat/common/lib目次下。
tag标签范例
自界说的tag标签遵守XML语法。它有一个入手下手标志和一个停止标志,有的另有body(即文本节点):
<tt:tag>
body
</tt:tag>
一个不带body的tag标签以下:
<tt:tag/>
复杂的tag标签
一个没有body和属性的tag标签以下:
<tt:simple/>
带属性的tag标签
自界说标签能够有本人的属性。属性一样平常在入手下手标志中界说,语法为attr=”value”。属性的感化相称于自界说标签的一个参数,它影响着tag处置类的举动。你能够在TLD中具体界说它。
你能够用一个String常量给一个属性赋值,也能够经由过程表达式给它赋值,如<%=...%>。以struts为例,它的logic:present标签就是用的String常量来给属性赋值:
<loglic:presentparameter=“Clear”>
而另外一个标签logic:iterate是用表达式来给属性赋值:
<logci:iteratecollection=”<%=bookDB.getBooks()%>”
id=”book”type=”database.BookDetails”>
带body的tag标签
一个自界说标签能够包括别的自界说标签、剧本变量、HTML标志或别的内容。
鄙人述例子中,此JSP页面利用了struts的logic:present标签,假如些标签订义了parameter=”Clear”的属性,则将扫除购物车的内容,然后打印出一条信息:
<logic:presentparameter=”Clear”>
<%cart.clear();%>
<fontcolor=”#ff0000”size=”+2”><strong>
你选择了扫除购物车!
</strong></font>
</logic:present>
究竟是用属性仍是用body来传送信息?
如上所述,我们既能够经由过程属性,也能够经由过程body来传送信息。但一样平常来讲,对照复杂的范例,如字符串或复杂表达式最好接纳属性来传送信息。
界说剧本变量的tag标签
所谓剧本变量,是指JSP中能够挪用的变量或对象。它可由tag标签发生。以下示例论述了一个tag标签订义了一个名为tx的由JNDI所界说的事件处置对象。剧本变量能够是ejb对象、事件、数据库毗连等等:
<tt:lookupid=”tx”type=”UserTransaction”name=”java:comp/UserTransaction”/>
<%tx.begin();%>
...
具有合作干系的tag标签
自界说tag标签之间能够经由过程共享对象来完成合作。鄙人述例子中,标签tag1创立了一个名为obj1的对象,在标签tag2仍能够反复利用obj。
<tt:tag1attr1=”obj1”value1=”value”/>
<tt:tag2attr1=”obj1”/>
在以下这个例子傍边,假如外层的tag标签创立了一个对象,那末其内层的一切tag标签都可使用这个对象。因为如许发生的对象没有一个指定的名字,那末就能够将少重名的抵触。这个例子论述了一系列合作的嵌套对象。
<tt:outerTag>
<tt:innerTag/>
</tt:outerTag>
Tag处置类
Tag处置类必需完成Tag接口或BodyTag接口,不外如今一样平常都盛行从TagSupport或BodyTagSupport类中承继,这些类或接口都能够在javax.servlet.jsp.tagext包中找到。
当JSP引擎看到本人的JSP页面中包括有tag标签时,它会挪用doStartTag办法来处置tag标签的开首,挪用doEndTag办法来处置tag标签的停止。
下表申明分歧范例的tag所必要分歧的处置历程:
Tag处置类的办法
Tag标签范例
所挪用的办法
基础标签
doStartTag,doEndTag,release
带属性的标签
doStartTag,doEndTag,set/getAttribute1...N,release
带内容的标签
doStartTag,doEndTag,release
带内容的标签,且内容反复轮回
doStartTag,doAfterBody,doEndTag,release
带内容的标签,且内容与JSP交互
doStartTag,doEndTag,release,doInitBody,doAfterBody,release
一个tag处置类能够经由过程javax.servlet.jsp.PageContext来与JSP交互,经由过程javax.servlet.jsp.PageContext类,tag处置类能够会见JSP中的request、session和application对像。
假如tag标签是相互嵌套的,那内层的tag处置类能够经由过程它的parent属性来会见下层的tag处置类。
一样平常情形都将一切的tag处置类打成了JAR的包,以便于公布。
Tag库形貌(简称TLD)
Tag库是用xml言语形貌的,TLD包含了tag库中一切tag标签的形貌,它一样平常用来被jsp服务器用来校验tag的语法准确性,大概被jsp开辟者用来开辟新的标签。
TLD的文件扩大名必需为.tld,并且必需放在以后WEB使用的WEB-INF目次或其子目次中。
一个TLD的内容的开首必需恪守尺度的XML开首,用于形貌DTD和xml的版本,比方:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN""
http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd
">
TLD必需以<taglib>来作为它的根元素,<taglib>的子元素以下表:
<taglib>的子元素
Element
Description
tlib-version
Tag库的版本
jsp-version
Tag库所必要的jsp的版本
short-name
助记符,tag的一一般名(可选)
uri
用于断定一个独一的tag库
display-name
被可视化工具(诸如Jbuilder)用来显现的称号(可选)
small-icon
被可视化工具(诸如Jbuilder)用来显现的小图标(可选)
large-icon
被可视化工具(诸如Jbuilder)用来显现的年夜图标(可选)
description
对tag库的形貌(可选)
listener
拜见上面listener元素
tag
拜见上面tag元素
Listener元素
一个tag库大概界说一些类做为它的事务侦听类,这些类在TLD中被称为listener元素,jsp服务器将会实例化这些侦听类,而且注册它们。Listener元素中有一个叫listener-class的子元素,这个元素的值必需是该侦听类的完全类名。
Tag元素
每一个tag元素在tag库中都要指出它的名字、类名、剧本变量、tag的属性。个中剧本变量的值能够间接在TLD中界说或经由过程tag附加信息的类来获得。每一个属性形貌了这个属性是不是能够省略,它的值是不是能够经由过程<%=…%>如许的JSP语法来取得,和属性的范例。
每个tag在TLD中对应一个tag元素,下表是tag元素的子元素:
Tag元素的子元素
元素称号
形貌
name
举世无双的元素名
tag-class
Tag标签对应的tag处置类
tei-class
javax.servlet.jsp.tagext.TagExtraInfo的子类,用于表达剧本变量(可选)
body-content
Tag标签body的范例
display-name
被可视化工具(诸如Jbuilder)用来显现的称号(可选)
small-icon
被可视化工具(诸如Jbuilder)用来显现的小图标(可选)
large-icon
被可视化工具(诸如Jbuilder)用来显现的年夜图标(可选)
description
此tag标签的形貌
variable
供应剧本变量的信息(同tei-class)(可选)
attribute
Tag标签的属性名
以下章节先容关于分歧范例的tag,怎样详细地完成它们。
复杂的tag
tag处置类
复杂的tag处置类必需完成Tag接口的doStartTag和doEndTag办法。当jsp引擎碰着tag标签的开首时,doStartTag被挪用,由于复杂的tag没有body,以是此办法将前往SKIP_BODY。当jsp引擎碰着tag标签的开头时,doEndTag被挪用,假如余下的页面还要被盘算,那它将前往EVAL_PAGE,不然将会前往SKIP_PAGE。
以下是例子:关于标签<tt:simple/>,它的tag处置类完成以下:
publicSimpleTagextendsTagSupport
{
publicintdoStartTag()throwsJspException
{
try{
pageContext.getOut().print(“Hello.”);
}catch(Exceptione){
thrownewJspTagException(“SimpleTag:“+e.getMessage());
}
returnSKIP_BODY;
}
publicintdoEndTag()
{
returnEVAL_PAGE;
}
}
注重:假如tag标签没有内容的话,那必需界说body-content元素为空,比方
<body-content>empty</body-content>
带属性的tag标签
tag处置类
关于tag标签的每一个属性,你必需按照JavaBeans标准来界说其属性,和get和set办法。以struts的logic:present标签为例,
<logic:presentparameter=”Clear”>
与此响应,此tag处置类应有以下办法和界说:
protectedStringparameter=null;
publicStringgetParameter()
{
returnthis.parameter;
}
publicvoidsetParameter(Stringparameter)
{
this.parameter=parameter;
}
注重:假如你的属性名为id,并且你的tag处置类是从TagSupport类承继的,那你就不必要界说它的属性和set和get办法,由于他们早已在TagSupport被界说过了。
Attribute元素
关于tag标签的每一个属性,你必需界说它是不是必需的,它的值是不是能够用诸如<%=…%>的表达式来取得,和它的范例(可选),假如不指定它的范例,那就默许为是java.lang.String范例。假如rtexprvalue元素被界说为true或yes,那末在type元素中就界说了attribute的前往范例。
<attribute>
<name>attr1</name>
<required>true|false|yes|no</required>
<rtexprvalue>true|false|yes|no</rtexprvalue>
<type>attribute的前往范例(只用当rtexprvalue为真是才无效)</type>
</attribute>
假如tag的某个属性不是必需的,那tag处置类会主动供应一个缺省值。
比方,在logic:present这个tag标签中界说了一个属性叫parameter,但它不是必需的,并且它能够被诸如<%=…%>的表达式来赋值。
<tag>
<name>present</name>
<tag-class>org.apache.struts.taglib.logic.PresentTag</tag-class>
<body-content>JSP</body-content>
…
<attribute>
<name>parameter</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
…
</tag>
属性元素的校验
有关于tag标签的无效值能够从tag库的申明文档中取得,当JSP页面被编译时,jsp引擎会强迫性地参照TLD中界说的划定规矩举行反省。
另有一个办法也能够举行属性元素的校验,就是先承继类TagExtraInfo,然后挪用它的isValid办法。这个类同时也起到供应tag中界说的剧本变量信息的感化。
IsValid办法经由过程TagData对象来传送属性信息,它包含着tag的一切的属性名-值的信息。因为校验产生在运转时候,因而这个属性的值将被赋值为TagData.REQUEST_TIME_VALUE。
比方tag标签<tt:twaattr1=”value1”/>在TLD中界说以下:
<attribute>
<name>attr1</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
这个界说申明了attr1能在运转时代被赋值。
以下的isValid办法反省attr1属性的值是不是属于Boolean范例。注重因为attr1能在运转刻被赋值,那末isValid办法必需反省tag用户是不是对此tag举行了运转时候赋值。
PublicclassTwaTEIextendsTagExtraInfo
{
publicbooleanisValid(Tagdatadata)
{
Objecto=data.getAttribute(“attr1”);
If(o!=null&&o!=TagData.REQUEST_TIME_VALUE)
{
if(((String)o).toLowerCase().equals(“true”)||
((String)o).toLowerCase().equals(“false”))
returntrue;
else
returnfalse;
}
else
returntrue;
}
}
带body的tag
tag处置类
假如tag标签含有内容,那儿那边理体例会稍微有些分歧,并且还要视tag处置类是不是要与body交互的情形而定。假如要与body交互,那我们以为tag处置类要大概要对body举行操纵。
Tag处置类不与body交互
假如tag处置类不与body交互,tag处置类应当完成Tag接口或从TagSupport中派生,假如body要被盘算,那末doStartTag办法应前往EVAL_BODY_INCLUDE,不然应前往SKIP_BODY。
假如tag处置类要对body重复运算,则它应当完成IterationTag或从TagSupport中派生。假如tag处置类以为body还未盘算完的话,那它的doStartTag办法和doAfterBody办法必需前往EVAL_BODY_AGAIN。
Tag处置类与body交互
假如tag处置类与body交互,那tag处置类应完成BodyTag接口或从BodyTagSupport中派生。这类tag处置类一样平常要完成doInitBody和doAfterBody办法。
Body同意一些办法来读写它的内容。Tag处置类能够挪用body内容的getString或getReader办法来从body中提失信息,也可用writeOut(out)办法来将body的内容写进到out对象中。个中out对象经由过程tag处置类的getPreviousOut办法来取得。
假如body的内容必要被盘算,那末doStartTag办法必需前往EVAL_BODY_BUFFERED,不然,它将前往SKIP_BODY。
doInitBody办法
此办法在body内容已设好,但未被盘算之前被挪用。你能够依据分歧的body内容来制订初始化战略。
doAfterBody办法
此办法在body内容已被盘算落后行挪用。
和doStartTag办法一样,doAfterBody办法前往一个唆使符唆使是不是要持续盘算body,假如要持续盘算,则doAfterBody应前往EVAL_BODY_BUFFERED,不然,它应前往SKIP_BODY。
release办法
tag处置类挪用此办法将它的形态重置为初始形态,并开释一切的公有资本。
以下的例子读取body的内容(个中含有一条sql语句),然后将它传送给一个对象,让它举行查询。因为此处body不须从头盘算,以是doAfterBody会前往SKIP_BODY。
PublicclassQueryTagextendsBodyTagSupport
{
publicintdoAfterBody()throwsJspTagException
{
BodyContentbc=getBodyContent();
//将body的内容以字符串的格局提掏出来
Stringquery=bc.getString();
//扫除body
bc.clearBody();
try{
Statementstmt=connection.createStatement();
Resultresult=stmt.executeQuery(query);
}catch(SQLExceptione){
thrownewJspTagException(“queryTag:“+e.getMessage());
returnSKIP_BODY;
}
}
body-content元素
因为tag大概会有body,你必需用body-content元从来指定body内容的范例:
<body-content>JSP|tagdependent</body-content>
假如body的内容是定制的或外部的tag、剧本元素、或HTML广本,则回类为JSP范例。其他的范例,好比下面代码所述的?D?D将sqlstatement类传给querytag的这类范例应当标为tagdependent。
注重:实践上body-content的值其实不影响tag处置类对body内容的处置,它仅仅是被tag编纂工具用来形貌此body的内容。
用tags界说剧本变量
tag处置类
tag处置类卖力创立或设置页面中界说的剧本变量,用pageContext.setAttribute(name,value,scope)或pageContext.setAttribute(name,value)办法来完成。一样平常来讲,tag处置类经由过程剧本变量的称号来猎取它,剧本变量的称号一样平常可用get办法来取得。
假如剧本变量的值依附于tag处置类中的高低文中某一对象,那它可用pageContext.getAttribute(name,scope)办法来找到谁人对象。一样平常的处置历程是tag处置类先找到剧本变量,再对其举行处置,然后用pageContext.setAttribute(name,object)的办法来设置它的新值。
对象的保存周期(scope)以下表:
对象的保存周期表
名字
可会见局限
保存周期
page
以后页面
一向无效,除非页面向客户提交呼应或重定向到一个新页面
request
以后页面或以后页面重定向到的页面
一向无效,除非页面向客户提交呼应
session
以后页面或在统一扫瞄器窗口中的页面
一向无效,除非封闭以后扫瞄器、超时、收集妨碍
application
全部web使用程序的一切哀求
一向无效,除非产生收集妨碍、服务器妨碍
供应关于剧本变量的信息
以下示例界说了一个名为“book”的剧本变量,用来会见程序中关于书的信息:
<bean:defineid=”book”name=”bookDB”property=”bookDetails”type=”database.BookDetails”/>
<fontcolor=”red”size=”+2”>
<%=messages.getString(“CartRemoved”)%>
<strong><jsp:getPropertyname=”book”property=”title”/></strong>
</font>
当包括此tag的JSP页面被编译时,jsp引擎会主动天生关于此book的同步的代码(同步能够制止几个客户同时会见此book时酿成的抵触),要天生同步代码,jsp引擎必要晓得此剧本变量的以下信息:
・剧本变量称号
・剧本变量所属的类
・此剧本变量是不是援用了一个新的或已存在的对象
・此剧本变量的无效性
有两种举措能够向jsp引擎供应关于剧本变量的信息:在TLD中界说variable子元素,或用tei-class子元素界说一个分外tag信息类。用variable最复杂,但大概下降了一些天真性。
Variable元素
Variable元素有以下子元素:
・name-given?D?D给出的名字,是一个常量
・name-from-attribute?D?D属性名,在编译时给出的属性名
name-given或name-from-attribute二者必需选一,但以下子元素是可选的:
・variable-class?D?D变量的范例,缺省为java.lang.String。
・declare?D?D此剧本变量是不是援用了一个新对象,缺省为True。
・scope?D?D剧本变量的局限,缺省为NESTED。下表形貌了scope的几品种型:
剧本变量的无效局限
值
无效性
办法
NESTED
在tag标签的入手下手和停止之间
假如tag处置类完成BodyTag接口,则在doInitBody和doAfterBody中挪用,不然在doStartTag中挪用
AT_BEGIN
从tag标签的入手下手一向到页面停止
假如tag处置类完成BodyTag接口,则在doInitBody、doAfterBody和doEndTag中挪用,不然在doStartTag和doEndTag中挪用
AT_END
从tag标签的停止一向到页面停止
在doEndTag中挪用
以struts为例,它的bean:define标签的完成遵守JSP1.1标准,此标准请求利用分外tag信息类来界说剧本变量。Variable元素是JSP1.2标准中到场的。以bean:define标签为例,你能够界说以下variable元素:
<tag>
<variable>
<name-from-attribute>id</name-from-attribute>
<variable-class>database.BookDetails</variable-class>
<declare>true</declare>
<scope>AT_BEGIN</scope>
</variable>
</tag>
分外tag信息类
假如要界说一个分外tag信息类,你要承继javax.servlet.jsp.TagExtraInfo类。一个TagExtraInfo类必需完成getVariableInfo办法,此办法前往一个叫VariableInfo的数组类,它包含以下信息:
・变量名
・变量所属类名
・此变量是不是援用了一个新对象
・此变量的无效局限
jsp引擎将一个名为data的参数传给getVariableInfo办法,data中包含tag标签中的一切“属性名?D?D属性值”对。它能够用来向VariableInfo对象供应剧本变量的名字和类名。
以struts为例,它在bean:define标签中界说了一个名为DefineTei的分外tag信息类,用来向剧本变量供应信息。因为剧本变量的称号(book)和类名(database.BookDetails)是经由过程tag标签的属性来传送的,它们一样平常界说在VariableInfo的构建代码中,而且可用data.getAttributeString办法来失掉这些信息。假如要同意book剧本变量能在从tag入手下手直到全部JSP页面停止的局限内都可用的话,那它的局限应设为AT_BEGIN。以下所示:
publicclassDefineTeiextendsTagExtraInfo
{
publicVariableInfo[]getVariableInfo(TagDatadata)
{
Stringtype=data.getAttributeString(“type”);
If(type==null)
type=“java.lang.Object”;
returnnewVariableInfo[]{
newVariableInfo(data.getAttributeString(“id”),
type,
true,
VariableInfo.AT_BEGIN)
};
}
}
注重:关于分外tag信息类的类名必需要在TLD中的tag标签下的tei-class子元素中界说。因而,DefineTei的tei-class中的界说看起来以下:
<tei-class>
org.apache.struts.taglib.bean.DefineTagTei
</tei-class>
具有合作干系的tag
tag经由过程共享对象来举行合作,JSP手艺撑持2种体例的对象共享。
第一种办法是利用pageContext对象举行对象的共享(可撑持JSP页面和tag处置类之间的共享),假如在一个tag处置类中要挪用由另外一个tag处置类创立的对象,可挪用pageContext.getAttribute(name,scope)办法。
第二各体例的共享是关于tag之间有嵌套干系而言的,外层的tag所创立的对象关于内层的tag来讲是能够共用的。这类情势的共享的优点是削减了大概存在的重名抵触。
要会见一个嵌套tag创立的对象,tag处置类必需先找到此嵌套tag对象,可用TagSupport的静态办法TagSupport.findAncestorWithClass(from,class)或TagSupport.getParent办法。前者在当不断定此tag是不是为嵌套tag对象时利用。一旦它的父类被找到,它就可以会见其一切静态或静态创立的对象。静态创立的对象是父类的成员,而静态创立的对象多是父类的公有对象。诸云云类的对象能够用tag处置类的setValue办法来保留,用getValue办法来取得。
下例论述了以上两种共享对象的办法。在这个例子傍边,一个查询tag反省一个名为connection的属性名是不是在doStartTag中被设置。假如connection属性被设置,tag处置类从pageContext中失掉这个connection对象。不然,此tag处置类先找到它的父tag处置类,然后从它的父tag处置类中找到connection对象。
publicclassQueryTagextendsBodyTagSupport
{
privateStringconnectionId;
publicintdoStartTag()throwsJspException
{
Stringcid=getConnection();
if(cid!=null)
{
//存在一个connectionid,利用它。
connection=(Connection)pageContext.getAttribute(cid);
}
else
{
ConnectionTagancestorTag=(ConnectionTag)findAncestorWithClass(this,
ConnectionTag.class);
if(ancestorTag==null)
{
thrownewJspTagException(“一个没有connection属性的查询标签必需被一个connection标志嵌套。”);
}
connection=ancestorTag.getConnection();
}
}
}
此查询标签在JSP页面中的挪用情势能够从以下2种界说中任选一种:
<tt:connectionid=”con01”...>...</tt:connection>
<tt:queryid=”balances”connection=”con01”>
SELECTaccount,balanceFROMacct_table
wherecustomer_num=<%=request.getCustno()%>
</tt:query>
或
<tt:connection...>
<x:queryid=”balances”>
SELECTaccount,balanceFROMacct_table
wherecustomer_num=<%=request.getCustno()%>
</x:query>
</tt:connection>
与此同时,在TLD中必需指定connection属性为可选的,界说以下:
<tag>
...
<attribute>
<name>connection</name>
<required>false</required>
</attribute>
</tag>
首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。
作者:
小妖女
时间:
2015-1-20 17:05
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者:
蒙在股里
时间:
2015-1-20 21:10
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者:
金色的骷髅
时间:
2015-1-30 05:19
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者:
海妖
时间:
2015-2-1 09:59
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者:
变相怪杰
时间:
2015-2-7 02:28
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者:
不帅
时间:
2015-2-9 22:07
Java是一种计算机编程语言,拥有跨平台、面向对java
作者:
乐观
时间:
2015-2-19 22:55
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者:
山那边是海
时间:
2015-3-6 15:45
是一种语言,用以产生「小应用程序(Applet(s))
作者:
若天明
时间:
2015-3-10 23:24
Java 编程语言的风格十分接近C、C++语言。
作者:
灵魂腐蚀
时间:
2015-3-11 05:39
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者:
老尸
时间:
2015-3-11 05:49
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者:
活着的死人
时间:
2015-3-25 03:08
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2