1:
java.sql.Timestamp a = new java.sql.Timestamp(System.currentTimeMillis());
2:
java.util.Date a = new java.util.Date();
3:
java.util.Date a;
a.setTime(System.currentTimeMillis());
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:
|
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屬性用來指定是否忽略。格式為:
<%@ page 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之前的編程方式,因此,在使用中應因地制宜地選擇適用的編程方法。
(三)SimpleTag
JSP 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; |
這個標記的TLD文件內容如下,它使用了XML schcma定義標記的使用方法。
程序例3如下:
|
程序例4中的JSP使用上面例3中定義的IterationSimpleTag,它根據Web請求參數中給定的“times”的值進行一定次數的循環。在每次循環中將輸出"sequence"的值。
例4:
<%@ taglib prefix="ictag"
uri="/WEB-INF/ics-jsp2.tld" %>
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:
<%@ taglib prefix="ictag"
tagdir="/WEB-INF/tags" %>
Tasks
|
Name:${name} |
Date:${date} |
Name:${name} |
Plan: |
(
五)其他特性
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 表達式
表達式語言的靈感來自于 ECMAScript 和 XPath 表達式語言,它提供了在 JSP
中簡化表達式的方法。它是一種簡單的語言,基于可用的命名空間(PageContext
屬性)、嵌套屬性和對集合、操作符(算術型、關系型和邏輯型)的訪問符、映射到 Java 類中靜態方法的可擴展函數以及一組隱式對象。
EL 提供了在 JSP 腳本編制元素范圍外使用運行時表達式的功能。腳本編制元素是指頁面中能夠用于在 JSP 文件中嵌入 Java 代碼的元素。它們通常用于對象操作以及執行那些影響所生成內容的計算。JSP 2.0 將 EL 表達式添加為一種腳本編制元素。
腳本編制元素具有三個從屬形式: