我的Blog我做主^_^

          走向一條通往JAVA的不歸路...

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            64 隨筆 :: 68 文章 :: 77 評(píng)論 :: 0 Trackbacks

          期待已久的日子即將到來(lái): 最新版 JavaServer Pages (JSP) 2.0規(guī)范即將和其他的J2EE 1.4一同發(fā)布。新的JSP版本有一個(gè)新的飛躍,采用了新的方式:由于新的語(yǔ)言表達(dá)式(Expression Language,以下簡(jiǎn)稱為EL)和JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)(JSP Standard Tag Library ,以下簡(jiǎn)稱為JSTL)這兩種新的方式,在頁(yè)面中不需要用java,對(duì)于開發(fā)一般的應(yīng)用來(lái)說,重用代碼變得更加容易。更具體來(lái)說,JSP 2.0帶來(lái)了以下的優(yōu)點(diǎn):

          • 首次被JSTL 1.0引入的EL現(xiàn)在被合并到JSP規(guī)范中,就像應(yīng)用template text一樣地使用所有的標(biāo)準(zhǔn)的和定制的組件。
          • 新的EL已經(jīng)被擴(kuò)展,具備一個(gè)函數(shù)調(diào)用機(jī)制,JSTL1.1整合了一系列經(jīng)常需要使用的函數(shù)。
          • 新增加的變量和servlet 規(guī)范定義的錯(cuò)誤處理機(jī)制被更好地組織起來(lái)。通過新增加的變量,JSP error pages 現(xiàn)在可以提供更多的錯(cuò)誤信息。
          • 容器因?yàn)楦訃?yán)格的語(yǔ)法檢查可以更容易地找出發(fā)生的錯(cuò)誤。
          • 所有的J2EE 1.4規(guī)范(包括JSP 2.0 和 Servlet 2.4),為了聲明部署的規(guī)則描述而應(yīng)用了XML schema。這樣的好處之一是你現(xiàn)在可以通過任何順序列出web.xml文件中的描述。JSP 2.0也增加了一些新的配置選項(xiàng)用于部署描述,允許通過全局的配置來(lái)代替基于每頁(yè)的配置。
          • 由于更具伸縮性的規(guī)則和新的自定義action element,現(xiàn)在就像編寫XML文件一樣,編寫JSP頁(yè)面變得更加容易。
          • 定制的標(biāo)簽庫(kù)現(xiàn)在可以開發(fā)成一系列的標(biāo)簽文件(具有JSP元素的文本文件),標(biāo)簽處理器可以使用新的、簡(jiǎn)化的標(biāo)簽處理器的API。與此同時(shí),新規(guī)范加入了一些新的特性,比如:支持在jsp頁(yè)面上顯示動(dòng)態(tài)屬性列表和可執(zhí)行片斷屬性。

          在眾多的書籍中,這是頭一個(gè)講解JSP 2.0新特性的文章。在這一部分,我們將看到和EL相關(guān)的信息,其他的新特性留到后面。在這里我假定讀者已經(jīng)熟悉JSP 1.2,而且至少聽說過JSTL。

          你可能對(duì)這本第三版的《JavaServer Pages》感興趣。這本書中,我盡可能在細(xì)節(jié)上講述所有的內(nèi)容,而且并不認(rèn)為你對(duì)JSP或者JSTL了解一切。這本書預(yù)計(jì)在2003年12月 出版,但是你現(xiàn)在可以在 http://www.amazon.com 、Barnes&Noble,或者其他在線書店預(yù)訂。

          EL( The Expression Language )

          如果過去使用過JSTL,那么你可能已經(jīng)熟悉了EL。EL在JSTL 1.0規(guī)范中被引入,用來(lái)在運(yùn)行期間對(duì)Java表達(dá)式中action element屬性賦值提供另一種選擇。當(dāng)JSTL EL已經(jīng)非常迅速的流行起來(lái)情況下,還是存在一個(gè)問題: JSTL EL 表達(dá)式僅僅可以與JSTL和custom action一起使用,怎樣才能使用非標(biāo)準(zhǔn)API對(duì)EL表達(dá)式求值?

          JSP 2.0中,JSP容器自己可以理解EL表達(dá)式。這使你在所有過去只能應(yīng)用Java表達(dá)式的地方應(yīng)用EL表達(dá)式成為可能,比如:標(biāo)準(zhǔn)和定制action的屬性值,模板文本。

          在我們看具體的例子前,讓我們更進(jìn)一步的看看什么是EL。EL是從JavaScript中獲得啟發(fā)的一種語(yǔ)言,XPath(一種用來(lái)訪問XML文檔的語(yǔ)言),但是EL在對(duì)變量的null值和執(zhí)行更多數(shù)據(jù)類型的自動(dòng)類型轉(zhuǎn)換的處理上更加寬松。這些新特性對(duì)于web應(yīng)用非常重要,在這些應(yīng)用中輸入通常通過html表單的request parameter來(lái)得到。這些參數(shù)可能僅僅在某些請(qǐng)求下才能體現(xiàn)出來(lái),而且瀏覽器經(jīng)常將request parameter作為文本發(fā)送,然而應(yīng)用程序經(jīng)常需要把他們作為數(shù)字類型、布爾類型(true 或者 false)來(lái)使用。通過EL,你根本就很少需要關(guān)心缺少某些參數(shù)的值或者類型轉(zhuǎn)換。

          一個(gè)EL表達(dá)式包含變量和操作符。任何存儲(chǔ)在某個(gè)JSP作用范圍(如:page、 request、session、application)的bean能被作為一個(gè)EL變量來(lái)使用。另外,EL支持以下預(yù)定義的變量:

          變量名稱

          說明

          pageScope

          一個(gè)包含所有page scope范圍的變量集合 (a java.util.Map)

          requestScope

          一個(gè)包含所有request scope范圍的變量集合 (a java.util.Map)

          sessionScope

          一個(gè)包含所有session scope范圍的變量集合 (a java.util.Map)

          applicationScope

          一個(gè)包含所有application scope范圍的變量集合 (a java.util.Map)

          param

          一個(gè)包含所有請(qǐng)求參數(shù)的集合 (a java.util.Map),通過每個(gè)參數(shù)對(duì)應(yīng)一個(gè)String值的方式賦值

          paramValues

          一個(gè)包含所有請(qǐng)求參數(shù)的集合 (a java.util.Map),通過每個(gè)參數(shù)對(duì)應(yīng)一個(gè)String數(shù)組的方式賦值

          header

          一個(gè)包含所有請(qǐng)求的頭信息的集合, (a java.util.Map) ,通過每個(gè)頭信息對(duì)應(yīng)一個(gè)String值的方式賦值

          headerValues

          一個(gè)包含所有請(qǐng)求的頭信息的集合 (a java.util.Map) ,通過每個(gè)頭信息的值都保存在一個(gè)String數(shù)組的方式賦值

          cookie

          一個(gè)包含所有請(qǐng)求的 cookie集合 (a java.util.Map), ??通過每一個(gè)cookie(javax.servlet.http.Cookie)對(duì)應(yīng)一個(gè)cookie值的方式賦值

          initParam

          一個(gè)包含所有應(yīng)用程序初始化參數(shù)的集合(a java.util.Map) ,通過每個(gè)參數(shù)分別對(duì)應(yīng)一個(gè)String值的方式賦值

          pageContext

          一個(gè)javax.servlet.jsp.PageContext類的實(shí)例, 用來(lái)提供訪問不同的請(qǐng)求數(shù)據(jù)

          操作符描述了你對(duì)變量所期望的操作。如果你之前曾經(jīng)使用過任何編程語(yǔ)言的話,在EL表達(dá)式中所使用的操作符對(duì)你來(lái)說可能看起來(lái)很熟悉。因?yàn)樗鼈兒湍切┰诖蠖鄶?shù)語(yǔ)言中所支持的操作符一樣。

          Operator

          Description

          .

          訪問一個(gè)bean屬性或者 Map entry

          []

          訪問一個(gè)數(shù)組或者鏈表元素

          ()

          對(duì)子表達(dá)式分組,用來(lái)改變賦值順序

          ? :

          條件語(yǔ)句,比如: 條件 ? ifTrue : ifFalse.如果條件為真,表達(dá)式值為前者,反之為后者

          +

          數(shù)學(xué)運(yùn)算符,加操作

          -

          數(shù)學(xué)運(yùn)算符,減操作或者對(duì)一個(gè)值取反

          *

          數(shù)學(xué)運(yùn)算符,乘操作

          / or div

          數(shù)學(xué)運(yùn)算符,除操作

          % or mod

          數(shù)學(xué)運(yùn)算符,模操作(取余)

          == or eq

          邏輯運(yùn)算符,判斷符號(hào)左右兩端是否相等,如果相等返回true,否則返回false

          != or ne

          邏輯運(yùn)算符,判斷符號(hào)左右兩端是否不相等,如果不相等返回true,否則返回false

          < or lt

          邏輯運(yùn)算符,判斷符號(hào)左邊是否小于右邊,如果小于返回true,否則返回false

          > or gt

          邏輯運(yùn)算符,判斷符號(hào)左邊是否大于右邊,如果大于返回true,否則返回false

          <= or le

          邏輯運(yùn)算符,判斷符號(hào)左邊是否小于或者等于右邊,如果小于或者等于返回true,否則返回false

          >= or ge

          邏輯運(yùn)算符,判斷符號(hào)左邊是否大于或者等于右邊,如果大于或者等于返回true,否則返回false

          && or and

          邏輯運(yùn)算符,與操作賦。如果左右兩邊同為true返回true,否則返回false

          || or or

          邏輯運(yùn)算符,或操作賦。如果左右兩邊有任何一邊為true返回true,否則返回false

          ! or not

          邏輯運(yùn)算符,非操作賦。如果對(duì)true取運(yùn)算返回false,否則返回true

          empty

          用來(lái)對(duì)一個(gè)空變量值進(jìn)行判斷: null、一個(gè)空String、空數(shù)組、 空Map、沒有條目的Collection集合

          func(args)

          調(diào)用方法, func是方法名,args是參數(shù),可以沒有,或者有一個(gè)、多個(gè)參數(shù).參數(shù)間用逗號(hào)隔開

          一個(gè)EL表達(dá)式可以包含:數(shù)字、文本(在單引號(hào)或者雙引號(hào)之間)、布爾值、null值。

          因?yàn)橐粋€(gè)EL表達(dá)式可以出現(xiàn)在靜態(tài)文本出現(xiàn)的地方,因此你必須告訴JSP容器它應(yīng)該被當(dāng)作一個(gè)EL表達(dá)式來(lái)處理。你可以通過使用定界符來(lái)做到這一點(diǎn)。一個(gè)EL表達(dá)式總是以”${ }”來(lái)標(biāo)記(一個(gè)“$”符號(hào)和一個(gè)左花括號(hào),右花括號(hào))。這里有一個(gè)EL表達(dá)式,它將一個(gè)命名為amount的變量加5:

          ${amount + 5}

          如果你想要將5加到一個(gè)bean的property上,可以使用property訪問操作符:

          ${order.amount + 5}

          在當(dāng)前這個(gè)指定的bean或者collection集合中,Property訪問操作符(一個(gè)“.“符號(hào))告訴EL去尋找名字為amount的property。

          ${order['amount'] + 5}

          在[]之間的值必須是一個(gè)property的名字(就像上面的例子中那樣)或者是一個(gè)保存property名字的變量(或者是一個(gè)完整的EL子表達(dá)式)。

          EL表達(dá)式可以被用來(lái)賦值給任何標(biāo)準(zhǔn)的或者定制的JSP行為屬性(action attribute),這些行為屬性被標(biāo)記為可以接受動(dòng)態(tài)值(或者請(qǐng)求期間的屬性值,就象它被正式調(diào)用一樣):

          <c:out value="${order.amount + 5}"/>

          在JSP 2.0之前,你不得不使用Java表達(dá)式去給一個(gè)屬性動(dòng)態(tài)賦值。在過去的很多年中,這已經(jīng)成為語(yǔ)法混亂的一個(gè)普遍根源。

          最后,EL表達(dá)式可以在頁(yè)面中和模板直接混合使用。當(dāng)你生成HTML并且需要設(shè)置一個(gè)動(dòng)態(tài)值給一個(gè)屬性的時(shí)候,這非常方便:

          <input name="firstName" value="${customer.firstName}">

          JSP 1.2中,你不得不使用JSTL的<c:out>來(lái)實(shí)現(xiàn)同樣的事情,最后把各種不同類型的元素混合起來(lái),這導(dǎo)致程序理解起來(lái)非常的困難:

          <input name="firstName"

          value="<c:out value="${customer.firstName}"/>" >

          ?

          新JSTL 1.1 Tag Library 標(biāo)識(shí)符

          JSTL1.1發(fā)布的是一個(gè)初級(jí)的版本,主要目的是用來(lái)整合JSTL和JSP2.0 。最明顯的變化是JSTL1.0 “孿生函數(shù)庫(kù)”(一組庫(kù)用來(lái)接受EL表達(dá)式,另外一組用來(lái)接受JAVA表達(dá)式),而它們已經(jīng)被一組既可以用于EL表達(dá)式也可以用于JAVA表達(dá)式的函數(shù)庫(kù)所代替。

          在JSTL 1.1中使用以下標(biāo)識(shí)符:

          庫(kù)

          URI

          前綴

          Core

          http://java.sun.com/jsp/jstl/core

          c

          XML processing

          http://java.sun.com/jsp/jstl/xml

          x

          I18N formatting

          http://java.sun.com/jsp/jstl/fmt

          fmt

          Database access

          http://java.sun.com/jsp/jstl/sql

          sql

          Functions

          http://java.sun.com/jsp/jstl/functions

          fn

          如果你曾經(jīng)使用過JSTL1.0,你可能會(huì)注意到新的標(biāo)識(shí)符和舊的EL庫(kù)標(biāo)試符一模一樣,除了加入了“/jsp path” element。你也可能注意到在JSTL1.1中有一個(gè)庫(kù),包含了EL的函數(shù)。我們稍后就會(huì)看到。

          一個(gè)新的EL操作符

          在JSP頁(yè)面中一個(gè)非常普遍的需求就是:當(dāng)某個(gè)條件為真時(shí),要在網(wǎng)頁(yè)中包含一些文字。在JSP1.2和JSTL1.1中,用具有代表性的<c:if>來(lái)實(shí)現(xiàn),但是這樣做非常繁瑣。JSP2.0增加了一個(gè)新的條件操作符用于EL,以更加優(yōu)雅的方式來(lái)處理這樣的情況。這個(gè)條件操作符存在于很多編程語(yǔ)言中(比如:Java,C,JavaScript),因此你可能以前就見過它。它判斷一個(gè)布爾的條件,當(dāng)條件為真或者假時(shí),分別取不同的結(jié)果。

          一個(gè)能清楚說明它如何工作的例子:

          <select name="artist">
          <option value="1" ${param.artist == 1 ? 'selected' : ''}>
          Vesica Pisces
          <option value="2" ${param.artist == 2 ? 'selected' : ''}>
          Cortical Control
          <option value="3" ${param.artist == 3 ? 'selected' : ''}>
          Vida Vierra
          </select>

          在這里,我使用了EL表達(dá)式和條件操作符來(lái)選擇是否包含 html 中的 “selected”屬性,只有符合條件的 “option” 才被添加 “selected” 屬性。如果條件(param.artist==1)為真時(shí),前面的“selected” 才被添加到網(wǎng)頁(yè)中;否則就添加后面的(在這里是空字符串 ‘’)到頁(yè)面中。

          EL函數(shù)

          當(dāng)EL從JSTL規(guī)范中移到JSP規(guī)范中,它使用了一個(gè)如何進(jìn)行函數(shù)調(diào)用的技巧。這個(gè)EL函數(shù)語(yǔ)法非常簡(jiǎn)單:方法名,緊接著在圓括號(hào)中有一組參數(shù):

          <%@ taglib prefix="fn"
          uri="http://java.sun.com/jsp/jstl/functions" %>
          ${fn:length(myCollection)}

          這是一個(gè)屬于標(biāo)簽庫(kù)中的函數(shù),并且函數(shù)名字在頁(yè)面中所包含的前綴要指定taglib庫(kù)。在這個(gè)例子中,我使用了前綴fn,這是JSTL function庫(kù)默認(rèn)的前綴。

          標(biāo)簽庫(kù)描述符(Tag Library Descriptor,TLD)將函數(shù)名稱映射到一個(gè)由JAVA實(shí)現(xiàn)的靜態(tài)方法中:

          <function>
          <description>
          Returns the number of items in a collection or the number of characters in a string.
          </description>
          <name>length</name>
          <function-class>
          org.apache.taglibs.standard.functions.Functions
          </function-class>
          <function-signature>
          int length(java.lang.Object)
          </function-signature>
          </function>

          在這里最有趣的element是<function-signature>。它包含一個(gè)函數(shù)返回類型的聲明,靜態(tài)的方法的名字,在圓括號(hào)中聲明該方法所有參數(shù)的類型(可以沒有參數(shù)或者有多個(gè),參數(shù)間用逗號(hào)間隔開)。返回值類型和參數(shù)類型必須是java的原始類型(Object)或者是其他合法類型。

          這個(gè)靜態(tài)方法 length()在Jakarta Taglibs標(biāo)準(zhǔn)庫(kù)中用類似于下面的代碼實(shí)現(xiàn)的:

          public static int length(Object obj)
          throws JspTagException {
          if (obj == null)
          return 0;
          if (obj instanceof String)
          return ((String)obj).length();
          if (obj instanceof Collection)
          return ((Collection)obj).size();
          if (obj instanceof Map)
          return ((Map)obj).size();

          int count = 0;
          if (obj instanceof Iterator) {
          Iterator iter = (Iterator) obj;
          count = 0;
          while (iter.hasNext()) {
          count++;
          iter.next();
          }
          return count;
          }
          if (obj instanceof Enumeration) {
          Enumeration enum = (Enumeration) obj;
          count = 0;
          while (enum.hasMoreElements()) {
          count++;
          enum.nextElement();
          }
          return count;
          }
          try {
          count = Array.getLength(obj);
          return count;
          } catch (IllegalArgumentException ex) {}
          throw new JspTagException("Unsupported type"));
          }

          就像你所看到的,在那里沒有什么出奇的地方。它是一個(gè)常規(guī)的靜態(tài)方法,這個(gè)函數(shù)中通過對(duì)運(yùn)行期中的參數(shù)類別的判斷,找出參數(shù)的長(zhǎng)度。

          除了在這個(gè)方法中使用的length()方法,JSTL1.1標(biāo)簽庫(kù)還包含了許多其它經(jīng)常使用的函數(shù):

          函數(shù)

          描述

          fn:contains(string, substring)

          如果參數(shù)string中包含參數(shù)substring,返回true

          fn:containsIgnoreCase(string, substring)

          如果參數(shù)string中包含參數(shù)substring(忽略大小寫),返回true

          fn:endsWith(string, suffix)

          如果參數(shù) string 以參數(shù)suffix結(jié)尾,返回true

          fn:escapeXml(string)

          將有特殊意義的XML (和HTML)轉(zhuǎn)換為對(duì)應(yīng)的XML character entity code,并返回

          fn:indexOf(string, substring)

          返回參數(shù)substring在參數(shù)string中第一次出現(xiàn)的位置

          fn:join(array, separator)

          將一個(gè)給定的數(shù)組array用給定的間隔符separator串在一起,組成一個(gè)新的字符串并返回。

          fn:length(item)

          返回參數(shù)item中包含元素的數(shù)量。參數(shù)Item類型是數(shù)組、collection或者String。如果是String類型,返回值是String中的字符數(shù)。

          fn:replace(string, before, after)

          返回一個(gè)String對(duì)象。用參數(shù)after字符串替換參數(shù)string中所有出現(xiàn)參數(shù)before字符串的地方,并返回替換后的結(jié)果

          fn:split(string, separator)

          返回一個(gè)數(shù)組,以參數(shù)separator 為分割符分割參數(shù)string,分割后的每一部分就是數(shù)組的一個(gè)元素

          fn:startsWith(string, prefix)

          如果參數(shù)string以參數(shù)prefix開頭,返回true

          fn:substring(string, begin, end)

          返回參數(shù)string部分字符串, 從參數(shù)begin開始到參數(shù)end位置,包括end位置的字符

          fn:substringAfter(string, substring)

          返回參數(shù)substring在參數(shù)string中后面的那一部分字符串

          fn:substringBefore(string, substring)

          返回參數(shù)substring在參數(shù)string中前面的那一部分字符串

          fn:toLowerCase(string)

          將參數(shù)string所有的字符變?yōu)樾懀⑵浞祷?/font>

          fn:toUpperCase(string)

          將參數(shù)string所有的字符變?yōu)榇髮懀⑵浞祷?/font>

          fn:trim(string)

          去除參數(shù)string 首尾的空格,并將其返回

          結(jié)束語(yǔ):

          引自:http://www.oreilly.com.cn/news/jsppart1.php?c=java

          在這篇文章中,我從EL講到JSTL1.1規(guī)范、EL新特色和JSTL 1.1函數(shù)庫(kù)。接下來(lái)的部分我將要告訴你:關(guān)于JSP error-page的改進(jìn)和增強(qiáng); jsp:id 屬性帶來(lái)的益處;新的配置屬性描述符;JSP2.0如何使JSP操作XML變得更加容易;自定義標(biāo)簽庫(kù)的新特性。

          如果你想要嘗試JSP2.0的新特性,我建議你使用Apache Tomcat 5。它是最早實(shí)現(xiàn)了JSP新規(guī)范的容器之一。在公布最終版本的JSP 2.0規(guī)范之前,一個(gè)被標(biāo)記為“stable”版本的Tomcat是不能被發(fā)布的。但是最新的beta版已經(jīng)被證實(shí)是非常穩(wěn)定的,不要理會(huì)beta版的標(biāo)記。Tomcat 5在 the Jakarta Project site 可以下載。

          ?



          posted on 2007-01-08 15:18 java_蟈蟈 閱讀(267) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 繁昌县| 西乡县| 桑日县| 奉化市| 崇州市| 纳雍县| 九龙坡区| 策勒县| 体育| 越西县| 宁化县| 彭泽县| 杭锦旗| 辽宁省| 临猗县| 灵丘县| 曲靖市| 赣州市| 玛曲县| 菏泽市| 黄陵县| 怀远县| 罗田县| 黔东| 安平县| 榕江县| 陇南市| 南平市| 沅陵县| 铜梁县| 吴忠市| 怀来县| 廊坊市| 亳州市| 鄢陵县| 调兵山市| 抚顺市| 宕昌县| 乐昌市| 讷河市| 井陉县|