【JavaEE】JSP表示式--EL表示式用法

Windsor90發表於2017-02-09

1、JSP中EL表示式的概述

EL表示式,全名是Expression Language,它原本是JSTL1.0為了方便存取資料所自定義的語言。
當時EL只能在JSTL標籤中使用,JSP2.0 後,EL成為JSP規範的一部分,並增加了新的特性。
在JSP頁面中使用EL表示式,可以獲取並顯示頁面資料,並可以簡化對變數和物件的訪問。
可得到PageContext屬性值
可直接訪問JSP內建物件,如Page,request, session, application

1.1語法結構:${expression}

1.2[]與.運算子

EL 提供”.”和”[ ]”兩種運算子來存取資料。注意:當要存取的屬性名稱中包含一些特殊字元,如.或?等並非字母或數字的符號,就一定要使用”[ ]”。如果要動態取值時,就可以用”[ ]”來做,而”.”無法做到動態取值。

1.3變數的訪問

${name}, 取出某一範圍中名稱為name的變數資料。
在沒有指定範圍的name,所以它會依序從Page、Request、Session、Application範圍查詢;
如果找到username,就直接返回,不再繼續找下去,但是假如全部的範圍都沒有找到時,就返回null。
屬性範圍在EL表示式中名稱:
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope

2、Jsp EL中的有效表示式

有效表示式可以包含:文字、操作符、變數(物件引用)和函式呼叫。

2.1 Jsp表示式語言定可以在表示式中使用的文字

Boolean:true 和 false
Integer:與 Java 類似
Floating Point:與 Java 類似
String:任何由單引號或雙引號限定的字串
Null:null

2.2 操作符

JSP 表示式語言提供以下操作符,其中大部分是 Java 中常用的操作符
算術型、邏輯型、關係型、空和條件型。

2.3 隱式物件

Jsp表示式語言定義了一組隱式物件,其中許多物件在 JSP script 和表示式中可用
pageContext:JSP 頁的上下文
它可以用於訪問 JSP 隱式物件,如請求request、響應response、會話session、輸出out、servletContext 等。
例如,${pageContext.response} 為頁面的響應物件賦值。

param:將請求引數名稱對映到單個字串引數值,通過呼叫 ServletRequest.getParameter (String name) 獲得
表示式 $(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.valuecookiecookie使

{cookie.name.value} 返回帶有特定名稱的第一個 cookie 值。 如果請求包含多個同名的 cookie,則應該使用
{headerValues.name} 表示式。

initParam :將上下文初始化引數名稱對映到單個值,
通過呼叫 ServletContext.getInitparameter(String name) 獲得。

2.4 訪問範圍的變數

如 Web 上下文、會話、請求、頁面。
pageScope將頁面範圍的變數名稱對映到其值。
例如,EL 表示式可以使用 pageScope.objectNameJSP使

{pageScope.objectName} 訪問一個 JSP 中頁面範圍的物件, 還可以使用
{pageScope.objectName.attributeName} 訪問物件的屬性。
requestScope
將請求範圍的變數名稱對映到其值。該物件允許訪問請求物件的屬性。
例如,EL 表示式可以使用 requestScope.objectNameJSP使
{requestScope.objectName} 訪問一個 JSP 請求範圍的物件, 還可以使用
{requestScope.objectName.attributeName} 訪問物件的屬性。

sessionScope
將會話範圍的變數名稱對映到其值。該物件允許訪問會話物件的屬性。
例如:${sessionScope.name}

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

3、定義EL函式的開發步驟

EL不支援字串操作,字串操作在使用中比較多的,所以我們定義EL函式
EL函式是對El表示式的不足之處進行補充。

3.1 定義一個普通類,提供實現功能的靜態方法(EL函式只能呼叫靜態方法)

package cn.edu.jsp;

public class MyFunctions {  

    public static String toUppercase(String s){
        return s.toUpperCase();
    }
}

3.2 EL函式進行配置:

在WEB-INF目錄下建立一個副檔名為tld [Tag Libary Definition] (標籤庫定義)的xml檔案。
short-name:最好與檔名一致
uri:名稱空間
:函式的定義
name:函式名
function-class:類的全路徑
function-signature:函式方法

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>myfn</short-name>
    <uri>http://www.itheima.com/jsp/functions</uri>
    <function>
        <name>toUppercase</name>
        <function-class>com.itheima.jsp.MyFunctions</function-class>
        <function-signature>java.lang.String toUppercase( java.lang.String )</function-signature>
    </function>
</taglib>

3、在JSP中使用自定義的EL函式

首先:通過taglib指令引入外部的函式庫,prefix對應的是short-name
<%@ taglib uri=”http://www.it.com/jsp/functions” prefix=”myfn”%>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.it.com/jsp/functions" prefix="myfn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>使用EL函式</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
    <%
    pageContext.setAttribute("s", "abcdefg");
     %>
     ${myfn:toUppercase(s)}
     <hr/>
     ${fn:contains("Tomcat","cat")}
     <hr/>
     ${fn:split("2008-09-08","-")[0] }<br/>
     ${fn:split("2008-09-08","-")[1] }<br/>
     ${fn:split("2008-09-08","-")[2] }<br/>
     <hr/>
     <%
     pageContext.setAttribute("data", "<h1>Java EE</h1>");
      %>
      ${fn:escapeXml(data)}
  </body>
</html>

相關文章