JAVA网站制作之JSP页面中的自界说标签
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。js|页面JSP页面中的自界说标签JSP页面中的自界说标签
StephanieBodoff
用于挪用Javaean组件中的操纵和实行哀求分拨的尺度JSP标签简化了JSP页面的开辟和保护。JSP手艺还供应了在自界说标签中封装其他静态功效的机制,这类自定标签是JSP言语的扩大。自界说标签一般是以标签库的情势呈现的,它界说了一组相干的自界说标签,并包括完成这些标签的对象。
能够由自界说标签实行的义务包含对隐式对象的操纵、处置表单、会见数据库和其他企业级服务,如电子邮件和目次、和实行流程把持。JSP标签库是由精晓Java编程言语和对会见数据库和其他服务十分熟习的开辟职员创立的,利用这些标签,Web使用程序开辟职员就能够把注重力放到内容的出现上,而不必操心思索怎样会见企业级服务。就像勉励将库开辟职员和库利用职员的事情分隔一样,自界说标签经由过程封装重复实行的义务使它们能够在多个使用程序中反复利用,从而进步了临盆率。
JSP手艺社区赐与标签库十分高的器重。有关标签库的信息和一些收费的库的地点,拜见
http://java.sun.com/products/jsp/taglibraries.html
甚么是自界说标签?
自界说标签是用户界说的JSP言语元素。当包括自界说标签的JSP页面转换为servlet时,这个标签就转换为一个名为taghandler的对象上的操纵。以后当JSP页面的servlet实行时,Web容器就挪用这些操纵。
自界说标签有丰厚的功效。它们能够
・经由过程从挪用页面传送的属性举行定制。
・会见JSP页面可使用的一切对象。
・修正由挪用页面熟成的呼应。
・相互通讯。能够创立并初始化JavaBean组件、在一个标签中创立援用该bean的变量、再在另外一个标签中利用这个bean。
・相互嵌套,能够在JSP页面中完成庞大的交互交互。
JSP页面示例
本章形貌利用和界说标签所触及的义务。本章用改写了的、在JSP页面示例中会商的JSP版本的Duke’sBookstore使用程序的部分演示这些义务,所做的改写使用了两个标签库的长处:Struts和tutorial-template。本章的第三节示例具体形貌了两个标签:Strutst中的iterate和tutorial-template标签库中的一组标签。
Struts标签库供应了构建完成模子-视图-把持计划形式的国际化Web使用程序的框架。Struts包含完全的一组自界说工具标签,用于处置:
・HTML表单
・模板
・JavaBeans组件
・逻辑处置
DukesBookstore使用程序利用Strutsbean和logic子库中的标签。
Tutorial-template标签库界说了一组用于创立使用程序模板的标签。模板是带有占位符的JSP页面,这些占位符必要在每屏幕中改动。每个占位符称为模板的参数。比方,一个复杂的模板大概包含在天生的屏幕上方的title参数,和一个JSP页面作为屏幕的定制内容的body参数。模板是用一组嵌进的标签创立的――definition、screen和parameter――它们用于构建DukesBookstore的屏幕界说表,并用insert标签将参数从表中拔出屏幕。
6-1显现了经由过程DukesBookstoreWeb组件的哀求流程:
・template.jsp,template.jsp断定每屏幕的布局。它利用insert标签用子组件构成屏幕。
・screendefinitions.jsp,它界说了每屏幕利用的子组件。一切屏幕都有不异的横幅,可是题目和注释分歧(由表15-1中的JSP页面列所指定)。
・Dispatcher,这是一个servlet,它处置哀求并转发给template.jsp。
6-1经由过程DukesBookstore组件的哀求流程
DukesBookstore使用程序的源代码位于在解紧缩教程包(见运转示例)时天生的docs/tutorial/examples/web/bookstore3目次中。要编译、部署并运转这个例子,你必要:
1.从以下地点下载Strutsversion1.0.2
http://jakarta.apache.org/builds/jakarta-struts/release/v1.0.2/
2.解紧缩Struts并将struts-bean.tld、struts-logic.tld和struts.jar从jakarta-struts-1.0/lib拷贝到<JWSDP_HOME>/docs/tutorial/examples/web/bookstore3。
3.在终端窗口,进进<JWSDP_HOME>/docs/tutorial/examples/bookstore3.
4.运转antbuild。Build方针会举行一切需要的编译并将文件拷贝到<JWSDP_HOME>/docs/tutorial/examples/web/bookstore3/build方针。
5.确保已启动了Tomcat。
6.运转antinstall。Install方针关照Tomcat已有了内容。
7.假如还没有做的话,就启动PointBas数据库服务器并到场数据(见从Web使用程序中会见数据库)。
8.翻开书店URLhttp://localhost:8080/bookstore3/enter。
有关诊断罕见成绩的匡助见罕见成绩及其办理计划和妨碍扫除。
利用标签
本节形貌JSP页面怎样利用标签,并先容分歧范例的标签。
要利用标签,页面编写者必需做以下两件事:
・声明包括标签的标签库
・让标签库完成关于Web使用程序可用
声明标签库
经由过程在利用任何自界说标签之前,将taglib指令到场页面中声明JSP页面将利用在标签库中界说的标签:
<%@tagliburi="/WEB-INF/tutorial-template.tld"prefix="tt"%>
uri属性暗示独一标识标签库形貌符(TLD)的URI,在标签库形貌符中形貌了uri。这个URI能够是间接大概非间接的。prefix属性界说了辨别指定标签库所界说的标签与其他标签库供应的标签的前缀。
标签库形貌符文件名必需有扩大名.tld。TLD文件贮存在WAR的WEB-INF目次中,大概在WEB-INF的子目次中。能够间接大概直接援用TLD。
上面taglib指令间接援用一个TLD文件名:
<%@tagliburi="/WEB-INF/tutorial-template.tld"prefix="tt"%>
这个taglib指令利用一个短的逻辑名直接援用TLD:
<%@tagliburi="/tutorial-template"prefix="tt"%>
在Web使用程序部署形貌符中将逻辑名映照到一个相对地位。要将逻辑名/tutorial-template映照为相对地位/WEB-INF/tutorial-template.tld,在web.xml中增加元素taglib:
<taglib>
<taglib-uri>/tutorial-template</taglib-uri>
<taglib-location>
/WEB-INF/tutorial-template.tld
</taglib-location>
</taglib>
让标签库完成可用
能够以两种体例让标签库完成对Web使用程序可用。完成了标签handler的类能够以非打包的情势贮存在Web使用程序的WEB-INF/classes子目次中。另外一种办法是,假如以JAR的情势公布库,就将它贮存在Web使用程序的WEB-INF/lib目次中。在多个使用程序中共享的标签库贮存在JavaWSDP的<JWSDP_HOME>/common/lib目次中。
标签范例
JSP自界说标签是用XML语法编写的。它们有一个入手下手标签和停止标签,大概另有注释:
<tt:tag>
body
</tt:tag>
不带注释的自界说标签以下暗示:
<tt:tag/>
复杂标签
一个复杂标签没有注释,也没有属性:
<tt:simple/>
带属性的标签
自界说标签能够带有属性。属性列在入手下手标签中,语法为attr="value"。像用参数定制办法的举动一样,属性值用于定制自界说标签的举动。在标签库形貌符中指定标签属性的范例(见带属性的标签)。
能够用一个常量大概运转时表达式设置属性值。常量和运转时表达式与属性范例之间的转换历程遵守在设置JavaBean组件属性中形貌的JavaBean组件属性划定规矩。
Strutslogic:present标签的属性决意是不是对标签的注释举行判别。鄙人面的例子中,一个属性指定必要一个名为的参数Clear:
<logic:presentparameter="Clear">
DukesBookstore使用程序页面catalog.jsp利用了运转时表达式设置属性的值,它决意Strutslogic:iterate标签要列举哪几本书。
<logic:iteratecollection="<%=bookDB.getBooks()%>"
id="book"type="database.BookDetails">
带注释的标签
自界说标签能够包括自界说和中心标签、剧本元素、HTML文本和入手下手与停止标签之间的、依附于标签的注释内容。
鄙人面的例子中,DukesBookstore使用程序页面showcart.jsp利用Strutslogic:present标签扫除购物车,而且假如哀求包括一个名为Clear的参数就打印一个动静。
<logic:presentparameter="Clear">
<%cart.clear();%>
<fontcolor="#ff0000"size="+2"><strong>
Youjustclearedyourshoppingcart!
</strong><br><br></font>
</logic:present>
选择用属性大概注释传送信息
正如最初两节中所展现的,能够将给定的数据作为标签的属性大概标签的注释传送。一样平常来讲,任何复杂字符串大概能够由对复杂表达式判别而天生的数据最好作为属性传送。
界说剧本变量的标签
自界说标签能够界说可在页面中的剧本中利用的变量。上面的例子展现了怎样界说并利用包括一个从JNDI查询中前往的对象的剧本变量。这类对象的例子包含企业bean、事件、数据库、情况项等等:
<tt:lookupegin();%>id="tx"type="UserTransaction"
name="java:comp/UserTransaction"/>
<%tx.b
在DukesBookstore使用程序中,有几个页面利用了Struts的面向bean的标签以界说剧本变量。比方,bookdetails.jsp利用了bean:parameter标签以创立剧本变量bookId并设置它并将它设置为哀求参数bookId的值。jsp:setProperty语句还设置bookDB对象的bookId属性为哀求参数bookId的值。bean:define标签提取书店数据库bookDetails属性bookDetails的值并将了局界说为剧本变量book:
<bean:parameterid="bookId"name="bookId"/>
<jsp:setPropertyname="bookDB"property="bookId"/>
<bean:defineid="book"name="bookDB"property="bookDetails"
type="database.BookDetails"/>
<h2><jsp:getPropertyname="book"property="title"></h2>
操纵标签
自界说标签能够经由过程共享对象相互互助。
鄙人面的例子中,tag1创立了一个名为obj1的对象,再由tag2前往这个对象。
<tt:tag1attr1="obj1"value1="value"/>
<tt:tag2attr1="obj1"/>
鄙人面的例子中,由一组嵌套标签中的核心标签创立的对象关于一切外部标签都是可用的。由于没无为对象定名,以是能够削减潜伏的定名抵触。这个例子展现在JSP页面中一组合作的嵌进标签会是甚么模样的。
<tt:outerTag>
<tt:innerTag/>
</tt:outerTag>
DukesBookstore页面template.jsp利用了一组合作标签订义使用程序的屏幕。在模板标签库中形貌了这些标签。
界说标签
要界说标签,必要:
・为该标签开辟一个taghandler和helper类
・在标签库形貌符中声明这个标签
本节形貌标签handler和TLD的属性,并注释怎样为在后面几节中先容的标签开辟taghandler和库形貌符元素。
标签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页面可以会见的一切其他隐式对象(哀求、会话和使用程序)。
隐式对象能够有与其相干联的定名属性。能够用Attribute办法会见这类属性。
假如标签是嵌进的,标签handler还能够会见与核心标签联系关系的handler称为parent)。
一组相干的标签handler类(标签库)通常为打包的且作为JAR文档部署。
标签库形貌符
标签库形貌符(TLD)是一个形貌标签库的XML文档。TLD包括有关全部库和库中包括的每个标签的信息。Web容器用TLD考证标签,JSP页面开辟工具也利用TLD。
TLD文件名必需有扩大名.tld。TLD文件也贮存在WAR文件的WEB-INF目次中大概在WEB-INF的子目次中。
TLD必需以指定XML的版本和文档范例界说(DTD)的XML文档叙言(prolog)入手下手。
<?xmlversion="1.0"encoding="ISO-8859-1"?><!DOCTYPEtaglibPUBLIC"-//SunMicrosystems,Inc.//DTDJSPTagLibrary1.2//EN""http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
Tomcat撑持版本1.1和1.2的DTD。不外,本章所会商的是1.2版本,由于在开辟的一切标签库中都应当利用最新的版本。模板库TLDtutorial-template.tld切合版本1.2。Struts库TLD切合版本1.1的DTD,它的元素要少,且个中一些元素利用了略微分歧的名字。
TLD的根是taglib元素。表16-2中列出了taglib的子元素:
表16-2taglib子子元素
元素
申明
tlib-version
标签库的版本
jsp-version
这个标签库请求的JSP标准版本
short-name
JSP页面编写工具能够用来创立助记名的可选名字
uri
独一标识该标签库的的URI
display-name
将由工具显现的可选名
small-icon
将由工具利用的可选小图标
large-icon
可被工具利用的可选年夜图标
description
可选的标签特定信息
listener
见listener元素
tag
见tag元素
listener元素
标签库能够指定一些事务监听器类(见处置Servlet性命周期事务)。这些监听器在TLD中作为listener元素列出,Web容器将初始化监听器类并以相似在WAR级界说的监听器的体例注册它们。与WAR级监听器分歧,这里没有指定标签库监听器注册的按次。listener元素的独一子元素是listener-class元素,它必需包括监听类的完整限制名。
tag元素
库中的每个标签都由给出其名字和其标签handler的类、在由标签创立的剧本变量上的信息和标签属性上的信息形貌。剧本变量信息能够在TLD中间接给出,也能够经由过程tagextrainfo类给出(见界说剧本变量的标签)。每个属性声明包括指明属性是不是是必须的、其值是不是能够由哀求时表达式断定和属性范例的内容(见属性元素)。
在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。
复杂标签
标签handler
复杂标签的handler必需完成Tag接口的doStartTag和doEndTag办法。在碰到入手下手标签时挪用doStartTag办法。由于复杂标签没有注释,以是这个办法前往SKIP_BODY。在碰到停止标签时挪用doEndTag办法。假如要对页面的其他部分举行判别,则doEndTag办法必要前往EVAL_PAGE,不然,它就前往SKIP_PAGE。
在第一节会商的复杂标签
<tt:simple/>
由以下标签handler完成:
publicSimpleTagextendsTagSupport{
publicintdoStartTag()throwsJspException{
try{pageContext.getOut().print("Hello.");
}catch(Exceptionex){
thrownewJspTagException("SimpleTag:"+
ex.getMessage());}
returnSKIP_BODY;}
publicintdoEndTag(){
returnEVAL_PAGE;
}
}
body-content元素
没有注释的标签必需用body-content元素声明它们的注释内容是空的:
<body-content>empty</body-content>
JSP页面中的自界说标签
自己的整个学习思路完全被老师的讲课思路所牵制,这样几节课听下来,恐怕自己的见解都应该是书里的知识点了,根本谈不上自身发现问题,分析问题,和解决问题能力的切实提高。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 是一种为 Internet发展的计算机语言 是一种语言,用以产生「小应用程序(Applet(s)) 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 是一种将安全性(Security)列为第一优先考虑的语言 Java是一种计算机编程语言,拥有跨平台、面向对java 是一种使网页(Web Page)产生生动活泼画面的语言 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
页:
[1]