EL 全名爲Expression Language。 html
EL表達式可用在全部的HTML和JSP標籤中做用是代替JSP頁面中複雜的JAVA代碼。 java
EL主要做用以下:
(1)獲取數據:
EL表達式主要用於替換JSP頁面中的腳本表達式,以從各類類型的web域 中檢索java對象、獲取數據。(例如:某個web域 中的對象,訪問javabean的屬性、訪問list集合、訪問map集合、訪問數組)
(2)執行運算:
利用EL表達式能夠在JSP頁面中執行一些基本的關係運算、邏輯運算和算術運算,以在JSP頁面中完成一些簡單的邏輯運算。如:${user==null}
(3)獲取web開發經常使用對象
EL 表達式定義了一些隱式對象,利用這些隱式對象,web開發人員能夠很輕鬆得到對web經常使用對象的引用,從而得到這些對象中的數據。
(4)調用Java方法
EL表達式容許用戶開發自定義EL函數,以在JSP頁面中經過EL表達式調用Java類的方法。
mysql
EL表達式是JSP 2.0規範中的一門技術 。所以,若想正確解析EL表達式,需使用支持Servlet2.4/JSP2.0技術的WEB服務器。 程序員
注意:當有些Tomcat服務器如不能使用EL表達式時:
(1)升級成tomcat6;
(2)在JSP中加入<%@ page isELIgnored="false" %>。
web
<%@ page isELIgnored="true"%> 表示是否禁用EL語言,TRUE表示禁止,FALSE表示不由止。JSP2.0中默認的啓用EL語言。
spring
${expression}
EL 提供.和[]兩種運算符來存取數據。 sql
當要存取的屬性名稱中包含一些特殊字符,如.或?等並不是字母或數字的符號,就必定要使用 []。例如: 數據庫
${user.My-Name}應當改成:
${user["My-Name"] }若是要動態取值時,就能夠用[]來作,而.沒法作到動態取值。例如:
//data是一個變量 ${sessionScope.user[data]}
EL存取變量數據的方法很簡單,例如:${username}。它的意思是取出某一範圍中名稱爲username的變量。由於咱們並無指定哪個範圍的username,因此它會依序從Page、Request、Session、Application範圍查找。假如途中找到username,就直接回傳,再也不繼續找下去,可是假如所有的範圍都沒有找到時,就返回空字符串。 express
屬性範圍在EL中的名稱
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope 數組
若是咱們須要指定變量的尋找範圍,能夠在EL表達式中指定搜尋範圍。如:
${pageScope.username}
${requestScope.username}
${sessionScope.username}
${applicationScope.username}
在Spring中,全部邏輯處理單元返回的結果數據,都將做爲Attribute被放置到HttpServletRequest 對象中返回(具體實現可參見Spring源碼中org.springframework.web.servlet.view.InternalResourceView.exposeModelAsRequestAttributes方法的實現代碼),也就是說SpringMVC 中,結果數據對象默認都是requestScope。所以,在Spring MVC中,如下尋址方法應慎用:
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
與範圍有關的EL隱含對象包含如下四個:pageScope、requestScope、sessionScope和applicationScope,它們基本上就和JSP的pageContext、request、session和application同樣。在EL中,這四個隱含對象只能用來取得範圍屬性值,即getAttribute(String name),卻不能取得其餘相關信息。
例如:咱們要取得session中儲存一個屬性username的值,能夠利用下列方法取得username的值:
session.getAttribute("username")在EL中則使用下列方法:
${sessionScope.username}
與輸入有關的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。
例如:咱們要取得用戶的請求參數時,能夠利用下列方法:
request.getParameter(String name) request.getParameterValues(String name)在EL中則可使用param和paramValues二者來取得數據:
${param.name} ${paramValues.name}
1)cookie
JSTL並無提供設定cookie的動做。
例:要取得cookie中有一個設定名稱爲userCountry的值,可使用${cookie.userCountry}來取得它。
2)header和headerValues
header儲存用戶瀏覽器和服務端用來溝通的數據。
例:要取得用戶瀏覽器的版本,可使用${header["User-Agent"]}。
另外在鮮少機會下,有可能同一標頭名稱擁有不一樣的值,此時必須改成使用headerValues 來取得這些值。
3)initParam
initParam取得設定web站點的環境參數(Context)。
例:通常的方法
String userid = (String)application.getInitParameter("userid");可使用EL表達式獲取:
${initParam.userid}
4)pageContext
pageContext取得其餘有關用戶要求或頁面的詳細信息。
${pageContext.request.queryString} 取得請求的參數字符串 ${pageContext.request.requestURL} 取得請求的URL,但不包括請求之參數字符串 ${pageContext.request.contextPath} 服務的web application 的名稱 ${pageContext.request.method} 取得HTTP 的方法(GET、POST) ${pageContext.request.protocol} 取得使用的協議(HTTP/1.一、HTTP/1.0) ${pageContext.request.remoteUser} 取得用戶名稱 ${pageContext.request.remoteAddr } 取得用戶的IP 地址 ${pageContext.session.new} 判斷session 是否爲新的 ${pageContext.session.id} 取得session 的ID ${pageContext.servletContext.serverInfo} 取得主機端的服務信息
5.1 算術運算符有五個:+、-、*或$、/或div、%或mod
例:${5+5} 結果是10
5.2 關係運算符有六個:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
例:${5>6} 結果是false
5.3 邏輯運算符有三個:&&或and、||或or、!或not
例:${true and false} 結果是false
5.4 其它運算符有三個:Empty運算符、條件運算符、()運算符
例:${empty param.name}、${A?B:C}、${A*(B+C)}
在JSP頁面中調用EL函數庫的步驟:
1)在工程中導入JSTL包。
2)在JSP頁面中導入EL函數庫。
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>3 )在須要的位置調用EL函數。例如:
${fn:length(list)}
JSP1.1規範中新增了自定義標籤庫規範。
自定義標籤的好處:
能夠將jsp頁面一大段很複雜的代碼簡化成使用一個標籤完成,保持頁面代碼的可讀性。
把jsp中的java代碼隱藏起來,有利於和美工的協同合做。
能夠將jsp頁面重複的代碼封裝後重復使用。
JSP2.1新版的TagLib容易寫了不少。具體實現和使用方法:
第一步,自定義標籤:
在WEB-INF/tags目錄下放一個hello.tag文件,內容以下,先聲明瞭編碼,和傳入的變量,剩下就是普通的JSP內容了:
<%@tag pageEncoding="UTF-8"%> <%@ attribute name="user" type="java.lang.String" required="true"%> Hello, <%==username%>
第二步,使用自定義標籤:
在jsp中指向以前的目錄,以tag文件名做爲tag名稱進行調用:
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> <tags:hello username="admin"/>
JSTL(JavaServer Pages Standard Tag Library,JSP標準標籤庫)。
從JSP1.1規範開始,JSP就支持在JSP中使用自定義標籤了,自定義標籤的普遍使用,致使了程序員對相同功能的標籤重複定義。爲了解決這個問題,JSTL就誕生了。
JSTL只能運行在支持JSP1.2和Servlet2.3規範的容器上。
JSTL包含兩部分:標籤庫和EL表達式語言。
標籤庫目前支持四種標籤:
1. Core
說明:支持JSP中的一些基本操做。
頁面引入標籤:
<%@ taglib prefix='c' uri="http://java.sun.com/jsp/jstl/core" %>頁面使用標籤示例:
<c:set var="ctx" value="${pageContext.request.contextPath}" />
2. XML processing
說明:支持XML文檔的處理
頁面引入標籤:
<%@ taglib prefix='x' uri="http://java.sun.com/jsp/jstl/x" %>頁面使用標籤示例:
<x:parse var="doc" xml="${citizenXML}" />
3. I18N capable formatting
說明:支持JSP頁面的國際化。
頁面引入標籤:
<%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %>
頁面使用標籤示例:
<fmt:formatDate value="${now}" type="date" />
4. Database access(sql)
說明:支持JSP對數據庫的操做。
頁面引入標籤:
<%@ taglib prefix='sql' uri="http://java.sun.com/jsp/jstl/sql" %>頁面使用標籤示例:
<sql:setDataSource var="mysqlDS" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="root" password="" />
咱們使用最多的是Core核心標籤庫。更多關於JSTL的資料能夠訪問http://www.codejava.net/java-ee/jstl/。