簡單的運算式語言

來源:互聯網
上載者:User
文章目錄
  • 文字
  • 操作符
  • 隱式對象

 

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,如下所示:


    • 使用部署描述符的元素:

      當使用部署描述符的元素時,您可以通過在 標記間包含布爾值“true”或“false”,指定是否支援 EL,如下所示:

      ...


      *.jsp
      true
      true


      ....
    運算式語言文法

    JSP 運算式語言允許頁面製作人員使用簡單文法訪問組件,如:

       ${expr}

    在以上的文法中,expr 代表有效運算式。必須注意,該運算式可以與靜態文本混合,還可以與其他運算式結合成更大的運算式。

    JSP EL 中的有效運算式

    有效運算式可以包含文字、操作符、變數(對象引用)和函數調用。我們將分別瞭解這些有效運算式中的每一種:

    文字

    JSP 運算式語言定義可在運算式中使用的以下文字:

    文字 文字的值

    Boolean

    true 和 false

    Integer

    與 Java 類似。可以包含任何正數或負數,例如 24、-45、567

    Floating Point

    與 Java 類似。可以包含任何正的或負的浮點數,例如 -1.8E-45、4.567

    String

    任何由單引號或雙引號限定的字串。對於單引號、雙引號和反斜線,使用反斜線字元作為逸出序列。必須注意,如果在字串兩端使用雙引號,則單引號不需要轉義。

    Null null

    讓我們來看一些使用文字作為有效運算式的樣本:

    ${false} 
    ${3*8)
    操作符

    JSP 運算式語言提供以下操作符,其中大部分是 Java 中常用的操作符:

    術語 定義

    算術型

    +、-(二元)、*、/、div、%、mod、-(一元)

    邏輯型

    and、&&、or、||、!、not

    關係型

    ==、eq、!=、ne、、gt、<=、le、>=、ge。可以與其他值進行比較,或與布爾型、字串型、整型或浮點型文字進行比較。

    空操作符是首碼操作,可用於確定值是否為空白。

    條件型 A ?B :C。根據 A 賦值的結果來賦值 B 或 C。

    讓我們來看一些使用操作符作為有效運算式的樣本:

    ${ (6 * 5) + 5 } 
    ${empty name}
    隱式對象

    JSP 運算式語言定義了一組隱式對象,其中許多個物件在 JSP scriplet 和運算式中可用:

    術語 定義

    pageContext

    JSP 頁的上下文。它可以用於訪問 JSP 隱式對象,如請求、響應、會話、輸出、servletContext 等。例如,${pageContext.response} 為頁面的響應對象賦值。

    此外,還提供幾個隱式對象,允許對以下對象進行簡易訪問:

    術語 定義

    param

    將請求參數名稱映射到單個字串參數值(通過調用 ServletRequest.getParameter (String name) 獲得)。getParameter (String) 方法返回帶有特定名稱的參數。運算式 $(param.name) 相當於 request.getParameter (name)。

    paramValues

    將請求參數名稱映射到一個數值數組(通過調用 ServletRequest.getParameter (String name) 獲得)。它與 param 隱式對象非常類似,但它檢索一個字串數組而不是單個值。運算式 ${paramvalues.name) 相當於 request.getParamterValues(name)。

    header

    將要求標頭名稱映射到單個字串頭值(通過調用 ServletRequest.getHeader(String name) 獲得)。運算式 ${header.name} 相當於 request.getHeader(name)。

    headerValues

    將要求標頭名稱映射到一個數值數組(通過調用 ServletRequest.getHeaders(String) 獲得)。它與頭隱式對象非常類似。運算式 ${headerValues.name} 相當於 request.getHeaderValues(name)。

    cookie 將 cookie 名稱映射到單個 cookie 對象。向伺服器發出的用戶端請求可以獲得一個或多個 cookie。運算式 ${cookie.name.value} 返回帶有特定名稱的第一個 cookie 值。如果請求包含多個同名的 cookie,則應該使用 ${headerValues.name} 運算式。
    initParam 將上下文初始化參數名稱映射到單個值(通過調用 ServletContext.getInitparameter(String name) 獲得)。

    除了上述兩種類型的隱式對象之外,還有些對象允許訪問多種範圍的變數,如 網路內容、會話、請求、頁面:

    術語 定義

    pageScope

    將頁面範圍的變數名稱映射到其值。例如,EL 運算式可以使用 ${pageScope.objectName} 訪問一個 JSP 中頁面範圍的對象,還可以使用 ${pageScope.objectName.attributeName} 訪問對象的屬性。

    requestScope

    將請求範圍的變數名稱映射到其值。該對象允許訪問請求對象的屬性。例如,EL 運算式可以使用 ${requestScope.objectName} 訪問一個 JSP 請求範圍的對象,還可以使用 ${requestScope.objectName.attributeName} 訪問對象的屬性。

    sessionScope

    將會話範圍的變數名稱映射到其值。該對象允許訪問會話對象的屬性。例如:


    $sessionScope.name}

    applicationScope

    將應用程式範圍的變數名稱映射到其值。該隱式對象允許訪問應用程式範圍的對象。

    必須注意,當運算式根據名稱引用這些對象之一時,返回的是相應的對象而不是相應的屬性。例如:即使現有的 pageContext 屬性包含某些其他值,${pageContext} 也返回 PageContext 對象。

     

    使用 EL 運算式

    EL 運算式可用於兩種情況:

    • 作為標準操作和自訂動作中的屬性值
    • 在 JSP 檔案的模板文本中,如 HTML 或非 JSP 元素 — 在這種情況下,模板文本中的運算式被賦值並插入到當前的輸出中。但是,必須注意,如果標記的主體被聲明為與標記相關,則不會對錶達式賦值。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.