J2EE1.4
新特性之JSP 2.0的新Ҏ?
作者:务实工作?/span>
发文旉Q?span lang="EN-US">2003.10.27
SUN
的新?span lang="EN-US">J2EE1.4提供了在J2EE中开?span lang="EN-US">Web Service的基Q对开发工具做了一些重要的增强Q在应用E序部v和服务器理斚w也提供了新的标准Q在集成性和安全性方面有所增强Q提升了J2EE 开?span lang="EN-US">Web应用E序的能力;在编E模型方面的重要变化包括JSP表达式语a、简化的标记库等Q?span lang="EN-US">EJB 2.1中提供了新的timer服务Q查询语aQ?span lang="EN-US">QLQ也有所增强Q?span lang="EN-US">Jdbc3.0 API把通常?span lang="EN-US">Jdbc API与扩?span lang="EN-US">APIl合hQ?span lang="EN-US">J2EE Connectors规范和独立于消息cd?span lang="EN-US">EJB提供了对双向通信的支持。下面给大家重点介绍J2EE1.4中包含的JSP2.0?span lang="EN-US"> Servlet2.4?span lang="EN-US">Jdbc3.0以及EJB2.1斚w的新Ҏ?
一?span lang="EN-US">JSP 2.0的新Ҏ?/span>
JSP 2.0
属于J2EE 1.4q_Q它?span lang="EN-US">JSP 1.2基础之上增加了新的功能。它保证了向下兼容,原先使用?span lang="EN-US">JSP技术在JSP 2.0中都可以支持?span lang="EN-US">JSP 2.0的新功能主要包括下面几部分:
(一)q行环境变化
1?span lang="EN-US">web.xml格式变化
我们知道JSP 1.2可以?span lang="EN-US">Java 2标准?span lang="EN-US">1.3版本q行Q?span lang="EN-US">JSP 2.0要求使用Java
2标准?span lang="EN-US">1.4或更新版本,JSP 2.0使用?span lang="EN-US">Servlet 2.4规定?span lang="EN-US">WebE序部v描述格式?span lang="EN-US">
?span lang="EN-US">WebE序描述文gweb.xml中需要?span lang="EN-US">xml schema打头的格式。在web.xml中主要的变化是所有有?span lang="EN-US">JSP的设|信息要攑֜标记中。下面程序例1昄了一?span lang="EN-US">web.xml大致的样子?span lang="EN-US">
?span lang="EN-US">1Q?span lang="EN-US">
|
2
?span lang="EN-US">JSP讄
在标记提供了WebE序?span lang="EN-US">JSPE序的设|信息。包括和两类元素。定义了WebE序使用?span lang="EN-US">custom tagQ它的用法和以前JSP 1.2中的用法相同。定义了一l?span lang="EN-US">JSP的特性。这些特性实际上对应JSP?span lang="EN-US">page directive定义的特性。通过只不q可以方便地对多个具有相同属性的JSPl一定义?span lang="EN-US">
定义一个或多个URL样式Q在中定义的属性会适用于匹配这?span lang="EN-US">URL样式的所?span lang="EN-US">JSP文g。在中的属性可以定义以下设|:
(1)允许或禁止用表辑ּ语言(EL)
在中可以讑֮是否允许对应?span lang="EN-US">JSP使用JSTL表达式语a(EL)。如果属性标记被讑֮?span lang="EN-US">falseQ?span lang="EN-US">JSP中的EL表达式会被处理;如果?span lang="EN-US">trueQ?span lang="EN-US">Web容器会在转换JSP时忽?span lang="EN-US">EL表达式?span lang="EN-US">
(2)允许或禁止?span lang="EN-US">scripting
属性可以允许或止使用JSP的脚本语a(scripting)。如果这个属性标记对应ؓ trueQ即scripting元素被禁止,?span lang="EN-US">JSP中不能?span lang="EN-US">scriptletQ?span lang="EN-US">scripting表达式和declarationQ否则会有{换错 误。当q个属性标CؓfalseӞJSP可以像在1.2版本之前那样使用脚本语言?span lang="EN-US">
(3)声明JSP~码
通过标记可以讄对应?span lang="EN-US">JSP|页的编码。这个属性对应每?span lang="EN-US">JSP中的pageEncoding属性,Web容器根据这个属性对JSP内容q行~码?span lang="EN-US">
(4)对应隐含包括(Implicit Includes)
在中可以在对?span lang="EN-US">JSP中加入抬?span lang="EN-US">(preludes)和结?span lang="EN-US">(coda)Q用和属性可以设定在JSP|页中包括的preludes?span lang="EN-US">coda?span lang="EN-US">jspf文g。这些文件的位置相对于当?span lang="EN-US">WebE序?span lang="EN-US">context。当有超q一?span lang="EN-US">preludes?span lang="EN-US">coda元素在中ӞJSP会按照其序加入到内容中?span lang="EN-US">
(?span lang="EN-US">)引入表达式语a(EL)
JSP 2.0的一个主要特Ҏ它支持表达语a(expression language)?span lang="EN-US">JSTL表达式语a可以使用标记格式方便地访?span lang="EN-US">JSP的隐含对象和JavaBeanslgQ?span lang="EN-US">JSTL的核心标记提供了程和@环控?功能。自制标C有自定义函数的功能,因此基本上所?span lang="EN-US">seriptlet能实现的功能都可以由JSP替代。在JSP 2.0中,量使用EL而JSP的格式更一致?span lang="EN-US">
?span lang="EN-US">web.xml的中可以控制一l?span lang="EN-US">JSP是否使用ELQ在每个JSP中也可以指定是否?span lang="EN-US">JSP使用EL。在page directive中的isELIgnored属性用来指定是否忽略。格式ؓQ?span lang="EN-US">
<%@ page isELIgnored
Q?span lang="EN-US">"true|false"%> |
如果讑֮为真Q那?span lang="EN-US">JSP中的表达式被当成字符串处理。比如下面这个表辑ּ
${2000 % 20}
?b>isELIgnoredQ?span lang="EN-US">"true"时输Zؓ${2000 % 20}Q?b>isELIgnoredQ?span lang="EN-US">"false"时输Zؓ100?span lang="EN-US">Web容器默认isELIgnoredQ?span lang="EN-US">"false"?span lang="EN-US">
虽然JSP 2.0可以?span lang="EN-US">JSP中完全用表达语a而避?span lang="EN-US">scriptletQ在实际~程中,应该ҎE序的功能要求和~程人员的自w条仉择合适的方式。用表达语 a?span lang="EN-US">JSP比较方便规整Q但是由于需要将标记q行转换Q在W一ơ被调用时会比较慢;有些~程人员׃?span lang="EN-US">Java比较了解Q因而更习惯JSP 1.2之前的编E方式,因此Q在使用中应因地制宜地选择适用的编E方法?span lang="EN-US">
(?span lang="EN-US">)SimpleTag
JSP 2.0中加入了新的创徏自制标记?span lang="EN-US">APIQ?span lang="EN-US">javax.servlet.jsp.tagext.SimpleTag定义了用来实现简单标记的接口。和 JSP 1.2中的已有接口不同的是Q?span lang="EN-US">SimpleTag接口不?span lang="EN-US">doStartTag()?span lang="EN-US">doEndTag()ҎQ而提供了一个简单的doTag()?法。这个方法在调用该标记时只被使用一ơ。而需要在一个自制标C实现的所有逻辑q程、@环和ҎC的评估等都在q个Ҏ中实现。从q个斚w来讲Q?span lang="EN-US"> SimpleTag?span lang="EN-US">IterationTag可以辑ֈ同等的作用。但SimpleTag的方法和处理周期要简单得多。在SimpleTag中还有用来设
|?span lang="EN-US">JSP内容?span lang="EN-US">seUspBody()?span lang="EN-US">getJspBody()Ҏ?span lang="EN-US">Web容器会?span lang="EN-US">setJspBody()Ҏ定义一个代?span lang="EN-US">JSP内容?span lang="EN-US"> JspFragment对象。实?span lang="EN-US">SimpleTag标记的程序可以在doTagҎ中根据需要多ơ调?span lang="EN-US">getJspBody().invoke()Ҏ
以处?span lang="EN-US">JSP内容?span lang="EN-US">
例如Q程序例2 SimpleTagҎ指定的次?span lang="EN-US">(times)q行循环q输出当前序?span lang="EN-US">(sequence)。程序的l构比较单,所有逻辑都在doTagҎ中实现?span lang="EN-US">
?span lang="EN-US">2Q?span lang="EN-US">
package ICW.taglib; |
q个标记?span lang="EN-US">TLD文g内容如下Q它使用?span lang="EN-US">XML schcma定义标记的用方法?span lang="EN-US">
E序?span lang="EN-US">3如下Q?span lang="EN-US">
|
E序?span lang="EN-US">4中的JSP使用上面?span lang="EN-US">3中定义的IterationSimpleTagQ它ҎWebh参数中给定的“times?/span>的D行一定次数的循环。在每次循环中将输出"sequence"的倹{?span lang="EN-US">
?span lang="EN-US">4Q?span lang="EN-US">
<%@ taglib prefix="ictag"
uri="/WEB-INF/ics-jsp2.tld" %>
Reminder:
|
(
?span lang="EN-US">)使用JSP
fragment
JSP 2.0
中的一个主要功能是JSP fragmentQ它的基本特Ҏ可以使处?span lang="EN-US">JSP的容器推q评?span lang="EN-US">JSP标记属性。我们知道一?span lang="EN-US">JSP是首先评?span lang="EN-US">JSP标记的属性,然后在处?span lang="EN-US">JSP标记 时用这些属性,?span lang="EN-US">JSP fragment提供了动态的属性。也是_q些属性在JSP处理其标C时是可以被改变的?span lang="EN-US">JSP需要将q样的属性定义ؓ javax.servlet.jsp.tagext.JspFragmentcd。当JSP标记讄成这UŞ式时Q这U标记属性实际上的处理方法类g?
C。在实现标记的程序中Q标记属性可以被反复评估多次。这U用法称?span lang="EN-US">JSP fragment?span lang="EN-US">JSP fragmentq可以定义在一?span lang="EN-US">SimpleTag处理E序中用的自制标记动作。像前面例子说明的,getJspBodyq回一?span lang="EN-US"> JspFragment对象q可以在doTagҎ中多ơ用。需要注意的是,使用JSP fragment?span lang="EN-US">JSP只能有一般的文本?span lang="EN-US">JSP actionQ不能有scriptlet?span lang="EN-US">scriptlet表达式?span lang="EN-US">
我们可以单地认ؓJSP fragment是一D可以重复用的JSP。一D?span lang="EN-US">JSP fragment可以被传递到另一?span lang="EN-US">JSP中ƈ被用。与JSP include概念不同的是Q?span lang="EN-US">JSP fragment一般功能比较短简单而且重复使用率高?span lang="EN-US">
JSP fragment一般在标记体内或标C内定义。每ơ当含有JSP fragment的标记被使用ӞWeb容器生成一?span lang="EN-US">JspFragment对象Q这个对象和当前JSP?span lang="EN-US">page scope联系h。同Ӟq个JspFragment对象和包含它的父标记建立联系?span lang="EN-US">JspFragment对象可以有两U调用方式:使用Java~写 的标记处理程序,或者用标记文?span lang="EN-US">(tag file)。标记文件可以用,或者动作?span lang="EN-US">JSP fragment?span lang="EN-US"> JSP标记文g可以?span lang="EN-US">JSP fragment共同工作?span lang="EN-US">CustomTag都是以编E方式实现的?span lang="EN-US">JSP标记文g是用文本文g格式(JSP语法)实现自制标记Q这也是JSP 2.0的一个主要新功能。一个标记文件可以对应一个标讎ͼ可以不需tld文g定义该标记的Ҏ。这P即ɾ~程人员不熟?span lang="EN-US">JavaQ也可以使用JSP语法 定义自己的标记。标记文件一般?span lang="EN-US">.tag为后~q放?span lang="EN-US">WebE序?span lang="EN-US">/WEB-INF目录下?span lang="EN-US">
E序?span lang="EN-US">5中的taskstatus.jsp使用了两?span lang="EN-US">JSP fragment。这?span lang="EN-US">JSP的功能是昄一l?span lang="EN-US">Task的名U和完成日期Q它通过定义了两D?span lang="EN-US">JSPfragment(名称?span lang="EN-US">onSehedule?span lang="EN-US">delayed)。在标记内的JSP是JSPfragmentQ而标记被一个包围。这个标记是一个通过标记文g定义的自制标讎ͼ它的定义文g?span lang="EN-US">/WEB-INF/tags目录下。标记文件的名称和标记名UC致ؓ“listTasks.tag"。这个标C使用到前面定义的两个JSP fragment?span lang="EN-US">
?span lang="EN-US">5:
<%@ taglib prefix="ictag"
tagdir="/WEB-INF/tags" %>
Tasks
|
Name:${name} |
Date:${date} |
Name:${name} |
Plan: |
(
?span lang="EN-US">)其他Ҏ?/span>
JSP2.0
q有一些其他特性变化,比如严格修正?span lang="EN-US">I18N的语法规则,改进JSP对应XML语法从而允怋?span lang="EN-US">namespaces{。这些ƈ不是核心功能Q大家可以参?span lang="EN-US">java.sun.com的有兌料了解功能的l节Q这里就不再阐述?/span>
Sun Microsystems ?1997 q下半年推出?Servlet APIQ将它定位ؓ CGI 开发h员用的一U功能强大的工具Q这些开发h员正在寻找比 CGIQ通用|关接口Q编E更高效和轻便的优秀解决Ҏ。但是,开发h员很快就发现 Servlet API 有其自n的缺点,从代码的可维护性和可扩展性方面来看,该解x案难以实施。在某种E度上,q种~点促团队开发一U允许在 HTML 中嵌? Java 代码的解x??JavaServer Pages (JSP) 因此而出现?/p>
不久以后Q开发h员意识到表达与商务逻辑混合在一L复杂 JSP 不易于理解和维护。不能编? scriplet 的页面制作h员所面的另一个问题是׃标准标记集而带来的 JSP 限制。这些限制得难点变成利?JSP 实施自定义标记的机制来创?JSP 自定义标记?
JSP 标准标记?(JSTL) 是自定义标记库的集合Q它许?JSP 应用E序通用的核心功能封装ؓ单的标记。它不再需要?JSP scriptlet
和表辑ּQ而用表辑ּ的更高语法。它q实C通用目的的功能,如P代和条g化、数据管理格式化、XML
操作、数据库讉K、国际化和对本地化信息敏感的格式化标C?SQL 标记。JSTL 1.0 推出?EL 的概念,但只限于 JSTL 标记。在
JSP 2.0 中,您可以用带模板文本?ELQ甚臛_以通过 javax.servlet.jsp.el 获得~程方式的访问?br />
在我们了?JSTL 如何适应环境以及?JSTL 表达式语a相关的限制以后,我们来看 JSP 2.0 的重要优点之一 ?JSP 表达式语a (EL)。我们将特别涉及C下内容:
JSP 表达式语a定义
在无脚本?JSP 面中支?EL 的机?/a>
表达式语a语法
JSP EL 中有效的表达?/a>
使用 EL 表达?/a>
表达式语a的灵感来自于 ECMAScript ?XPath 表达式语aQ它提供了在 JSP
中简化表辑ּ的方法。它是一U简单的语言Q基于可用的命名I间QPageContext
属性)、嵌套属性和寚w合、操作符Q算术型、关pd和逻辑型)的访问符、映到 Java cM静态方法的可扩展函C及一l隐式对象?br />
EL 提供了在 JSP 脚本~制元素范围外用运行时表达式的功能。脚本编制元素是指页面中能够用于?JSP 文g中嵌?Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计。JSP 2.0 ?EL 表达式添加ؓ一U脚本编制元素?br />
脚本~制元素h三个从属形式Q?