java怎么定义0x0d_java之海

ad7783aa1ba2a200a76d9324041d0431.gif

2006年3月23日

J2EE1.4

新特性之JSP 2.0的新特性

作者:务实工作室

发文时间:2003.10.27

SUN

的新版J2EE1.4提供了在J2EE中开发Web Service的基础,对开发工具做了一些重要的增强,在应用程序部署和服务器管理方面也提供了新的标准,在集成性和安全性方面有所增强,提升了J2EE开发Web应用程序的能力;在编程模型方面的重要变化包括JSP表达式语言、简化的标记库等;EJB 2.1中提供了新的timer服务,查询语言(QL)也有所增强;Jdbc3.0 API把通常的Jdbc API与扩充API结合起来;J2EE Connectors规范和独立于消息类型的EJB提供了对双向通信的支持。下面给大家重点介绍J2EE1.4中包含的JSP2.0、Servlet2.4、Jdbc3.0以及EJB2.1方面的新特性。

一、JSP 2.0的新特性

JSP 2.0

属于J2EE 1.4平台,它在JSP 1.2基础之上增加了新的功能。它保证了向下兼容,原先使用的JSP技术在JSP 2.0中都可以支持。JSP 2.0的新功能主要包括下面几部分:(一)运行环境变化1、web.xml格式变化我们知道JSP 1.2可以在Java 2标准版1.3版本运行,而JSP 2.0要求使用Java

2标准版1.4或更新版本,JSP 2.0使用由Servlet 2.4规定的Web程序部署描述格式。在Web程序描述文件web.xml中需要使用xml schema打头的格式。在web.xml中主要的变化是所有有关JSP的设置信息要放在标记中。下面程序例1显示了一个web.xml大致的样子。例1:

.......

http://www.icconcept.com/ics/sample-taglib

/WEB-INF/jsp/sample-taglib.tld

........

For config the ICW sample

application

JSPConfiguration

/jsp/datareset.jsp

true<

/el-ignored>

ISO-8859-1

true

/jsp/prelude.jspf

/jsp/coda.jspf

2

、JSP设置在标记提供了Web程序中JSP程序的设置信息。包括和两类元素。定义了Web程序使用的custom tag,它的用法和以前JSP 1.2中的用法相同。定义了一组JSP的特性。这些特性实际上对应JSP的page directive定义的特性。通过只不过可以方便地对多个具有相同属性的JSP统一定义。定义一个或多个URL样式,在中定义的属性会适用于匹配这些URL样式的所有JSP文件。在中的属性可以定义以下设置:(1)允许或禁止使用表达式语言(EL)在中可以设定是否允许对应的JSP使用JSTL表达式语言(EL)。如果属性标记被设定为false,JSP中的EL表达式会被处理;如果是true,Web容器会在转换JSP时忽略EL表达式。(2)允许或禁止使用scripting属性可以允许或禁止使用JSP的脚本语言(scripting)。如果这个属性标记对应为true,即scripting元素被禁止,则JSP中不能使用scriptlet,scripting表达式和declaration,否则会有转换错 误。当这个属性标记为false时,JSP可以像在1.2版本之前那样使用脚本语言。(3)声明JSP编码通过标记可以设置对应的JSP网页的编码。这个属性对应每个JSP中的pageEncoding属性,Web容器将根据这个属性对JSP内容进行编码。(4)对应隐含包括(Implicit Includes)在中可以在对应JSP中加入抬头(preludes)和结尾(coda),使用和属性可以设定在JSP网页中包括的preludes和coda的jspf文件。这些文件的位置相对于当前Web程序的context。当有超过一个preludes或coda元素在中时,JSP会按照其顺序加入到内容中。(二)引入表达式语言(EL)JSP 2.0的一个主要特点是它支持表达语言(expression language)。JSTL表达式语言可以使用标记格式方便地访问JSP的隐含对象和JavaBeans组件,JSTL的核心标记提供了流程和循环控制 功能。自制标记也有自定义函数的功能,因此基本上所有seriptlet能实现的功能都可以由JSP替代。在JSP 2.0中,建议尽量使用EL而使JSP的格式更一致。在web.xml的中可以控制一组JSP是否使用EL,在每个JSP中也可以指定是否该JSP使用EL。在page directive中的isELIgnored属性用来指定是否忽略。格式为:

="true|false"%>

如果设定为真,那么JSP中的表达式被当成字符串处理。比如下面这个表达式

${2000 % 20}

在isELIgnored="true"时输出为${2000 % 20},而isELIgnored="false"时输出为100。Web容器默认isELIgnored="false"。虽然JSP 2.0可以使JSP中完全使用表达语言而避免scriptlet,在实际编程中,应该根据程序的功能要求和编程人员的自身条件选择合适的方式。使用表达语 言的JSP比较方便规整,但是由于需要将标记进行转换,在第一次被调用时会比较慢;有些编程人员由于对Java比较了解,因而更习惯JSP 1.2之前的编程方式,因此,在使用中应因地制宜地选择适用的编程方法。(三)SimpleTagJSP 2.0中加入了新的创建自制标记的API,javax.servlet.jsp.tagext.SimpleTag定义了用来实现简单标记的接口。和JSP 1.2中的已有接口不同的是,SimpleTag接口不使用doStartTag()和doEndTag()方法,而提供了一个简单的doTag()方 法。这个方法在调用该标记时只被使用一次。而需要在一个自制标记中实现的所有逻辑过程、循环和对标记体的评估等都在这个方法中实现。从这个方面来讲,SimpleTag和IterationTag可以达到同等的作用。但SimpleTag的方法和处理周期要简单得多。在SimpleTag中还有用来设

置JSP内容的seUspBody()和getJspBody()方法。Web容器会使用setJspBody()方法定义一个代表JSP内容的JspFragment对象。实现SimpleTag标记的程序可以在doTag方法中根据需要多次调用getJspBody().invoke()方法

以处理JSP内容。例如,程序例2 SimpleTag根据指定的次数(times)进行循环并输出当前序号(sequence)。程序的结构比较简单,所有逻辑都在doTag方法中实现。例2:

package ICW.taglib;

import

javax.servlet.jsp.JspException;

import

javax.servlet.jsp.tagext.SimpleTagSupport;

import java.util.HashMap;

import java.io.IOException;

public class IterationSimpleTag

extends SimpleTagSupport{

private int times;

public void setTimes(int_times){

this.times=_times;

}

public void doTag() throws

JspException,IOException{

HashMap params=new HashMap();

for(int i=0; i

这个标记的TLD文件内容如下,它使用了XML schcma定义标记的使用方法。程序例3如下:

1.0

Jwad book simple tag

/JwadSimpleTag

Simple Tag Handler

iteration

ICW.taglib.IterationSimpleTag

scriptless

Iteration Tag

Current iterationnumber

sequence

times

true

true

程序例4中的JSP使用上面例3中定义的IterationSimpleTag,它根据Web请求参数中给定的“times”的值进行一定次数的循环。在每次循环中将输出"sequence"的值。例4:

uri="/WEB-INF/ics-jsp2.tld" %>

Interation Simple Tag

Reminder:

This is the ${sequence} Of ${times}

times of reminder

(

四)使用JSP

fragment

JSP 2.0

中的一个主要功能是JSP fragment,它的基本特点是可以使处理JSP的容器推迟评估JSP标记属性。我们知道一般JSP是首先评估JSP标记的属性,然后在处理JSP标记 时使用这些属性,而JSP fragment提供了动态的属性。也就是说,这些属性在JSP处理其标记体时是可以被改变的。JSP需要将这样的属性定义为javax.servlet.jsp.tagext.JspFragment类型。当JSP标记设置成这种形式时,这种标记属性实际上的处理方法类似于标

记体。在实现标记的程序中,标记属性可以被反复评估多次。这种用法称为JSP fragment。JSP fragment还可以定义在一个SimpleTag处理程序中使用的自制标记动作。像前面例子说明的,getJspBody返回一个JspFragment对象并可以在doTag方法中多次使用。需要注意的是,使用JSP fragment的JSP只能有一般的文本和JSP action,不能有scriptlet和scriptlet表达式。我们可以简单地认为JSP fragment是一段可以重复使用的JSP。一段JSP fragment可以被传递到另一个JSP中并被使用。与JSP include概念不同的是,JSP fragment一般功能比较短小简单而且重复使用率高。JSP fragment一般在标记体内或标记体内定义。每次当含有JSP fragment的标记被使用时,Web容器生成一个JspFragment对象,这个对象和当前JSP的page scope联系起来。同时,这个JspFragment对象和包含它的父标记建立联系。JspFragment对象可以有两种调用方式:使用Java编写 的标记处理程序,或者使用标记文件(tag file)。标记文件可以使用,或者动作使用JSP fragment。JSP标记文件可以和JSP fragment共同工作。CustomTag都是以编程方式实现的。JSP标记文件是用文本文件格式(JSP语法)实现自制标记,这也是JSP 2.0的一个主要新功能。一个标记文件可以对应一个标记,可以不需tld文件定义该标记的方法。这样,即使编程人员不熟悉Java,也可以使用JSP语法 定义自己的标记。标记文件一般使用.tag为后缀并放在Web程序的/WEB-INF目录下。程序例5中的taskstatus.jsp使用了两个JSP fragment。这个JSP的功能是显示一组Task的名称和完成日期,它通过定义了两段JSPfragment(名称为onSehedule和delayed)。在标记内的JSP就是JSPfragment,而标记被一个包围。这个标记是一个通过标记文件定义的自制标记,它的定义文件在/WEB-INF/tags目录下。标记文件的名称和标记名称一致为“listTasks.tag"。这个标记会使用到前面定义的两个JSP fragment。例5:

tagdir="/WEB-INF/tags" %>

JSP Fragment Sample

Using Tag Files

Tasks

Name:${name}

Date:${date}

Name:${name}

Plan:${pianDate}

Actural:${actDate}

(

五)其他特性

JSP2.0

还有一些其他特性变化,比如严格修正了I18N的语法规则,改进JSP对应XML语法从而允许使用namespaces等。这些并不是核心功能,大家可以参照java.sun.com的有关资料了解功能的细节,这里就不再阐述。

简单的表达式语言

Sun Microsystems 在 1997

年下半年推出了 Servlet API,将它定位为 CGI 开发人员使用的一种功能强大的工具,这些开发人员正在寻找比

CGI(通用网关接口)编程更高效和轻便的优秀解决方案。但是,开发人员很快就发现 Servlet API

有其自身的缺点,从代码的可维护性和可扩展性方面来看,该解决方案难以实施。在某种程度上,这种缺点促使团队开发一种允许在 HTML 中嵌入

Java 代码的解决方案 — JavaServer Pages (JSP) 因此而出现。

不久以后,开发人员意识到将表达与商务逻辑混合在一起的复杂 JSP 页不易于理解和维护。不能编写

scriplet 的页面制作人员所面临的另一个问题是由于标准标记集而带来的 JSP 限制。这些限制使得难点变成利用 JSP

实施自定义标记的机制来创建 JSP 自定义标记。

JSP 标准标记库 (JSTL) 是自定义标记库的集合,它将许多 JSP 应用程序通用的核心功能封装为简单的标记。它不再需要使用 JSP scriptlet

和表达式,而使用表达式的更高级语法。它还实现了通用目的的功能,如迭代和条件化、数据管理格式化、XML

操作、数据库访问、国际化和对本地化信息敏感的格式化标记以及 SQL 标记。JSTL 1.0 推出了 EL 的概念,但只限于 JSTL 标记。在

JSP 2.0 中,您可以使用带模板文本的 EL,甚至可以通过 javax.servlet.jsp.el 获得编程方式的访问。

在我们了解 JSTL 如何适应环境以及与 JSTL 表达式语言相关的限制以后,我们来看 JSP 2.0 的重要优点之一 — JSP 表达式语言 (EL)。我们将特别涉及到以下内容:

JSP 表达式语言定义

在无脚本的 JSP 页面中支持 EL 的机制

表达式语言语法

JSP EL 中有效的表达式

使用 EL 表达式

JSP 表达式语言定义

表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP

中简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext

属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型)的访问符、映射到 Java 类中静态方法的可扩展函数以及一组隐式对象。

EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式添加为一种脚本编制元素。

脚本编制元素具有三个从属形式:

声明

Scriptlet

表达式。

让我们来看代码中的这三种从属形式:

table.getColumn( )

在将 EL 添加到 JSP 工具包以后,可以使用更简单的语法来编写以上的代码,而获得与以上 JSP

元素相同的结果。EL 表达式的另一个优势是,可以在不允许使用上述任何脚本编制元素从属形式的无脚本的 JSP

页中使用它。但是必须注意,可以不使用三种脚本编制元素从属形式中的任一种来编写 JSP 页,而对 JSP

页是否应该为无脚本形式的选择则完全基于应用程序的需求。如果您希望明确分开表达与商务逻辑,则还可以选择将页面强制为无脚本形式。通过强制成为无脚本页

面,必须通过其他元素(如 JavaBean、EL 表达式、自定义操作和标准标记库)提供 JSP 页的动态行为。

在无脚本的 JSP 页中支持 EL 的机制

有两种机制可以确保页面不包含任何脚本编制元素。每种机制还提供在无脚本的 JSP 页中支持 EL 的方法。使用页面指示: 在使用页面指示时,您可以通过将 isELEnabled 指示的值相应地设为“true”或“false”,指定是否支持 EL,如下所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值