使用JSTL改进JSP来简化网页的实现过程: 概述
这些输入让你的Web应用可使用JSTL标记库的表达语言(EL)版本。这些输入的位置有关系!如果你不肯定将他们输入到何处,关于web.xml选项和顺序的权威性指导在文档类型定义(DTD)中定义过:http://java.sun.com/j2ee/dtds/web-app_2_2.dtd。 5.当你创建了一个使用JSTL的JSP页时,将他输入到你的Web应用的主目录下,就像其它JSP和HTML页一样。你可以为该页任意取名,但是它必须有一个.jsp的扩展名。 基础原理 首先,所有的JSTL也是JSP页,JSTL只是JSP功能的一个超集。 同样,所有的JSTL标记是有效的XML。这意味着:如果你将JSTL标记之外的内容当作临时文本(通常是HTML)时,剩下的JSTL标记必须当作合法的XML来解释。这里有一些隐含的规则,它要求大部分XML语法都是正确的。 JSTL提供一组四个标准标记库(core核心、internationalization/format国际标准化/格式、XML和SQL)并支持EL。JSTL和EL的基本设计目的是简化网页开发和实现。 在本文中,我们遵循JSTL说明书的命名规则,并且把JSTL标记当作动作。一个JSTL标记对应于某个动作;调用动作明确的提醒我们:他们添加动态行为到一个另外的静态页上。 JSTL标记库有两个版本:一个用你以前使用的方法将JSP表达式插入,如<%= . . . %>,另一个使用一个JSTL EL.我会在后面进一步讨论在JSTL中的EL支持。 EL支持 要理解当前JSTL对EL支持的状态,让我们检查相关的说明书是怎样处理的。Java说明书请求(JSR)专家组成员决定:由于某种原因,EL规范说明应该是JSP说明书的一部份,而不是JSTL说明书的一部分。EL完整的说明书成为JSP2.0的一部分。因为JSTL1.0在JSP1.3之前已经完成,JSTL作者不得不对用于JSTL1.0的EL支持实现做一个合理的猜测(结果可能是相当好的)。一个JSTL维护版本将与JSP1.3说明书保持一致,并为了使EL适合JSP1.3说明书,JSTL维护版本做了一些修正。 本文描述的EL概要可能在即将发布的JSTL版本中有一点改动,但是任何改动都是微小的。 EL用于简单的语法定义了一套功能强大的语言,它很容易学习。它融合着JavaScript语言和Perl语言较好的部分的一些风格。EL表达式,集成了来自四种标准标记库的JSTL标记,提供了一个巨大的、灵活的属性集。 所有的EL表达式都被${}括起来。JSTL中的表达式总是JSTL标记中的属性值的一部分。表达式可以是属性的一部分或者合并和嵌入到一个字符串直接量中。JSTL属性也可以包含简单的字符串直接量。在接下来的JSTL中,我们在一个来自核心库的c:out动作中说明每种情况,这个核心库将它的value属性值送到JSP输出上:
EL也定义了一套规则用于强制表达式中的值转换为上下文相对应的类型。我们在这里不详细讨论这些规则;然而,它的方法与用Perl语言定义的方式非常相似(就像Perl语言中的做法一样,该方法理所当然的运行良好,但是,偶尔,也会出现可能不是你十分想要的那种结果,但你可以接受)。 EL为访问对象属性、集合元素、一组隐藏对象以及使用相关的、逻辑的和算术的操作符提供了支持。对于索引的属性来说,包括数组和java.util.List类在内,元素可用下列语法访问:
JavaBean属性和java.util.Map元素(它代表一系列名字/值对)都可以使用下列方法的一个访问得到。在以下的开头两个表达式里,我们可以访问到一个用JavaBean语言命名为aProperty的属性或者用关键字aProperty访问到一个Map实体。在第三个表达式中(注意:我已经省略了引号),我们用保存在变量aVariableContainingPropertyName中的一个名字访问了在anObject之内的一个元素:
在EL中定义了许多隐藏变量: JSTL标记库 ![]() 为了使用页中的核心标记库( 实际上,你使你的页对标记库的命名空间可见),在你的页首包含下列例子中的指令:
为了使用该标记库的标记,用你在你的包含语句中设计好的前缀,在你的页中给每个标记加上前缀:
核心数据库 让我们更详细的测试核心数据库,先看看他最通用的功能。 显示/设定值和异常处理 核心库的最基本的标记是c:out标记,它在页中显示一个EL表达式的值。一个使用c:out的表达式通常是这样:
上例中,value属性是我们送到页输出的表达式。我也说明了选项escapeXml的属性和默认属性。escapeXml的属性指定了XML字符(<、>、 &、 和 .)是否应该转化为相应的字符实体代码(这样他们可以让这些字符出现在一个HTML页中);默认属性用于EL不能估算出数值或者数值计算出来为空的情况。 注意:当EL支持完全贯穿整个JSP2.0的时候,你不需要使用c:out动作;你可以仅嵌套JSP表达式直接在页中。 另一个普遍使用的核心动作是c:set,它在页中设定一个变量。你可以用两种方法使用c:set动作,第一种方法设定在var属性中定义的变量到在value属性中定义的值上,方法如下:
上述的选择项scope属性指定了我们要在会话期范围内设定变量customerID;如果范围没有制定,范围默认为页。 c:set另一个强大的用途就是将c:set标记的体的内容赋给一个指定的变量:
在上例中,c:set动作定义了名为cellContents(在页的范围内)的变量,该变量拥有在标记的体中定义的内容。在这种情况下,体定义了一个HTML表格单元格元素,计算体中的c:out动作,并且该计算的结果包括在体中的字符串直接量值。 就像你预想的那样,JSTL进行异常处理有点早。在典型的JSP页中,你有两种异常处理的方法:试图/捕捉直接嵌入到页中的小脚本代码中的块;或者用一个JSP errorPage指令。JSP errorPage指令提供一个良好的捕捉所有异常的方法来处理页中任何可能的异常。JSTL用一个c:catch动作提供一个好的可选择的方式。这个c:catch动作提供一个更细粒度的有效方法来处理异常。而且没有嵌入Java代码到页中。一个c:catch动作是这样的:
c:catch动作有一个可选的属性,即一个指向抛出异常的变量。 你可能不怎么愿意使用c:remove标记。这个标记有用于变量名和范围的属性,并且可从指定的范围内删除指定的变量。 流程控制
下面我们展示了用c:choose、 c:when、 和 c:otherwise交换逻辑的JSTL的支持。一组c:when动作可能包括在一个备选的标记内,如果在c:when块中任何表达式计算值为真的话,就不用计算c:choose动作内的测试。如果c:when块中没有一个测试计算值为真的时候:如果出现c:otherwise动作内容时,则计算c:otherwise动作的内容:
c:foreach动作提供一个容易的方法来迭代一个集合的元素。如果你想只迭代集合的一部分的话,你可以分别用begin、 end、 和 step属性指定起点、终点和一个递增值。在下面的例子中,我们在变量customerNames中迭代一个集合的内容;在每个循环中,下一个元素输入到变量名内并在c:foreach动作的体内计算:
记得Java的StringTokenizer类吗?有了c:forTokens动作,你可以用JSTL获得类似的功能。这个程序片断可使用在delims属性中定义的定界符通过items String属性中的条目迭代。注意,items 属性不必是一个字符直接量;它可以是任何有效的EL表达式:
在接下来的完整的JSTL页中,我列出了已经传递到该页的所有参数。param 和paramValues对象是映射关键字到一个或多个值的Java Map集。在本例中,我们找出了用于集合的每个MapEntry的关键字即参数名,并且使用关键字来查找所有与关键字关联的参数值:
其他动作
在上面的代码中,param动作简单的定义了一组名值对。 JSP允许设计者用
指令包括其他页的内容。JSTL用JSTL c:import动作扩展了这个概念。c:import的主要优势是:你能指定一个任意的URL;也可以包含你的Web应用之外(W3C的任何地方)的页的内容或者你的服务器上的另一个Web应用内的页的内容。
如果你需要这些主题的更多的信息,请阅读Resources (http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p4.html#resources#resources)上的参考部分与国际化有关的参考文章。 格式标记库:格式动作
像数字格式化一样,JSTL页提供一个机制来解析一个代表日期的、进入Date对象的字符串:
查看java.util.DateFormat类,了解如何处理格式化和模式的更多详细的资料。 格式标记库:国际化动作 Java本地化的一个关键点是ResourceBundle类。JSTL动作允许你用这个类简单的工作。这个例子使用了fmt:bundle动作来得到与当前Locale 和 fmt:message动作对应的一个ResourceBundle动作,从而查看该资源包中的本地化的字符串:
经常,fmt:message动作简单的查看了对应于一个关键词的字符串。在上面的例子中,在ResourceBundle中的字符串包含了取代两个值的占位符。这些值在fmt:param动作中定义过,这就像Java MessageFormat类使用的方法。 有一些类似的动作可指定一个时区,时区可应用到在标记的体中计算的任何事上:
上述的fmt:bundle 和 fmt:timeZone动作有分别对应的fmt:setBundle和fmt:setTimeZone的动作。这些动作添加了可选的scope属性;因此,你可以使用这些动作在任何等同于应用范围的范围内设定一个资源捆绑或者一个时区。 如果你用非欧洲的locale类工作的话,你可能得担心编码的问题,JSTL支持用fmt:requestEncoding动作编码。 SQL标记库 JSTL 允许容易的数据库的集成。但是,值得注意的是:沙箱之外的JSTL的执行有一些限制。主要的问题与连接池有关。建立并维护到数据库的连接是很消耗资源的。JSTL SQL动作使得许多数据库连接建立起来,通常的,每个用户至少有一个。因此,JSTL SQL标记对于原型开发的或低容量的、基于Web的应用程序意义重大。但是它不适合于大规模的应用程序。一个可缩放的产品应用程序一般是在一个页面内处理数据库访问如隐藏数据库访问和处理像连接池之类的细节。但是,还是有方法允许你实现连接池和用一点自定义码来使用JSTL SQL动作(请看:"JSTL 1.0: What JSP Applications Need, Part 2" in Resources :http://www.javaworld.com/javaworld/jw-02-2003/jw-0228-jstl-p5.html#resources#resources). 我们看一些简单的例子。这些例子使用来自SQL库的JSTL标记。如果你熟悉SQL基础的话,你应该能够改编这些例子用在你的应用程序上。 在下面的程序片断中,我们建立了一条到一个数据库的连接,选择一组匹配一个订单ID的订单项目,并且在一个表格中显示item属性:
在下一个例子中,我会说明JSTL是如何支持数据库事务的,在数据库中,许多包含对表格多个改动的操作必须是对所有的,或者什么也不做:如果出现一个问题时,改动必须为空操作。在下面例子中,sql:update动作包含在一个sql:transaction动作内,如果在事务处理过程中,存在任何SQL错误的话,在事务范围内执行的所有操作都得重来。 sql:update动作的命名有一点误导:除了SQL UPDATE外,sql:update也支持INSERT 和 DELETE,甚至是SQL CREATE。实际上,它支持不产生结果的任何一条SQL操作。在下面的例子中,sql:update通过插入变量值到一个PreparedStatement中来执行一个UPDATE动作。在这个代码片断中,我们在两个账户之间传送钱(需要预先包装在一个事务中的某些东西的一个经典的例子):
XML标记库 使用标准的XML标记库,你所能做的完整的处理,特别是可扩展性单一语言变换说明(XSLT)的处理,对于另一篇文章来说是一个很好的主题。下面我会涵盖足够的让你开始的知识。 在JSTL的XML支持遵循XPath规范。XPath的重要功能之一是为访问XML著名的分层的信息提供一个清晰的语法。也许看到每件是如何工作的最容易的方法就是看看我们如何使用来自于一个真实JSTL页的一个片断里的标记:
在上面的输入和解析动作中,我们装载和解析了一个指定的XML文档到一个变量doc里。在上面的每个x:out动作中,我们使用了一个XPath表达式访问了解析的XML文档的元素,并且发送结果到JSP页输出中。 上面的设置表达式计算了一个XPath表达式并且将结果输入到一个限定范围的变量里(在上述例子中,它指在一个请求范围内)。 x:out 和x:set动作可以输出一个JspTagException。如果他们没有成功的话(极有可能因为XPath表达式指向并不存在的标记),你的页,像在所有其他情况下一样,应该智能的处理这些异常(要么通过传统的JSP errorPage指令,要么使用JSTL的c:catch动作), JSTL容易处理XSLT转换。在下面的示范页中,我们使用来自XML标记库中的x:transform动作,用一个XSLT stylesheet创建一个来自于XML源文档的一个格式化的页。x:transform动作最重要的属性是XML和XSLT属性,在下面的例子中,我们设置了一个来自于我们在同一页初始化的变量的xslt属性;我们也在动作的体中设置了XML属性。该动作默认为x:transform动作。 默认的,转换的结果送到页输出上;你也可以保存结果到一个带x:var属性的变量内:
你也能使用c:import动作再定义一个额外的源文档和stylesheet,就好像在这个示范的代码片断展示的一样::
结束语 至此,你应该对JSTL、它的四种标准标记库、和它如何使网页开发更为容易 有了很好的理解。现在你开始写一些JSTL! 【关于作者】 Steve Small从事Java开发多年,一直处于技术领导层和开发位置上。他先后为Boeing、 Amazon.com工作过,目前在沃什湾西雅图的PictureIQ公司供职。从1998年起,在华盛顿大学兼职开发和教学Java课程。http://www.javaworld.com/feedback 你可以通过这个链接引用该篇文章:http://johnsonchen916.blogdriver.com/tb.b?diaryId=17212 |
JSTL介绍
最新推荐文章于 2022-05-20 10:47:40 发布