一、EL表達式: Expression Language提供了在 JSP 腳本編制元素范圍外(例如:腳本標簽)使用運行時表達式的功能。腳本編制元素是指頁面中能夠用於在JSP 文件中嵌入 Java 代碼的元素。它們通常用於對象操作以及執行那些影響所生成內容的計算
1)語法結構
${expression}
2)[]與.運算符
EL 提供.和[]兩種運算符來存取數據。
當要存取的屬性名稱中包含一些特殊字符,如.或?等並非字母或數字的符號,就一定要使用 []。
例如:${user.My-Name}應當改為${user["My-Name"] }
如果要動態取值時,就可以用[]來做,而.無法做到動態取值。
例如:${sessionScope.user[data]}中data 是一個變量
3)變量
EL存取變量數據的方法很簡單,例如:${username}。它的意思是取出某一范圍中名稱為 username的變量。
它會依序從Page、Request、Session、Application范圍查找(范圍從小到大)。
如果找到則停止,並且不顯示null,而是不顯示值,這也是el表達式的優點,同時也是使用EL表達式取值進行判斷時應該注意的
例如:在js中使用s標簽並配合EL表達式取值做判斷
var username = ${username};
<s:if test="username ==null">這樣的判斷是錯誤的,因為EL表達式如果去不出值,是不會顯示null的
正確的方式為:<s:if test='username ==""'>(注意單引號和雙引號的使用)或者:<s:if test="${username ==null}">
屬性范圍在EL中的名稱 使用方式: 相當於:
Page PageScope ${ pageScope.page_name }
Request RequestScope ${ requestScope.request_name } <%=request.getAttribute("request_name");%>
Session SessionScope ${ sessionScope.session_name } <%=session.getAttribute("session_name");%>
Application ApplicationScope ${ applicationScope.application_name } <%=application.getAttribute("application_name");%>
二、有效表達式
有效表達式可以包含文字、操作符、變量(對象引用)和函數調用。
1)文字:
文字文字的值
Boolean true 和 false 例如:${true}
Integer 與 Java 類似。可以包含任何正數或負數,例如 24、-45、567 例如:${23+45}
Floating Point 與 Java 類似。可以包含任何正的或負的浮點數,例如 -1.8E-45、4.567
String 任何由單引號或雙引號限定的字符串。對於單引號、雙引號和反斜杠,使用反斜杠字符作為轉義序列。
必須注意,如果在字符串兩端使用雙引號,則單引號不需要轉義。
Null null
2)操作符
JSP 表達式語言提供以下操作符,其中大部分是 Java 中常用的操作符:
術語定義
算術型 +、-(二元)、*、/、div、%、mod、-(一元)
邏輯型 and、&&、or、||、!、not
關系型 ==、eq、!=、ne、、gt、<=、le、>=、ge。可以與其他值進行比較,或與布爾型、字符串型、整型或浮點型文字進行比較。
空空操作符是前綴操作,可用於確定值是否為空。例如:${empty user.username} ${not empty user.username}
條件型 A ?B :C。根據 A 賦值的結果來賦值 B 或 C。
3)隱式對象
最常用的隱式對象有${param}和${paramValues}.
param 將請求參數名稱映射到單個字符串參數值(通過調用 ServletRequest.getParameter (String name) 獲得)。
getParameter (String) 方法返回帶有特定名稱的參數。表達式 $(param . name) 相當於 < %=request. getParameter(“username”)% >
例如在一個頁面地址欄里面傳的參數可以在另一個頁面中通過這樣的方式取出
paramValues 將請求參數名稱映射到一個數值數組(通過調用 ServletRequest.getParameter (String name) 獲得)。
它與 param 隱式對象非常類似,但它檢索一個字符串數組而不是單個值。表達式 ${paramvalues. name) 相當於 request.getParamterValues(name)。
header 儲存用戶瀏覽器和服務端用來溝通的數據(通過調用 ServletRequest.getHeader(String name) 獲得)。
例:要取得用戶瀏覽器的版本,可以使用${header["User-Agent"]}。表達式 ${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) 獲得)。
表達式${initParam.userid}相當於application.getInitParameter("userid");
pageContext取得其他有關用戶要求或頁面的詳細信息。
${pageContext.request.queryString} 取得請求的參數字符串 相當於<%=request.getQueryString()%>
${pageContext.request.requestURL} 取得請求的URL,但不包括請求之參數字符串 <%=request.getRequestURL()%>
${pageContext.request.contextPath} 服務的web application 的名稱 相當於<%=request.getContextPath()%>
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的協議(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用戶名稱
${pageContext.request.remoteAddr } 取得用戶的IP 地址
${pageContext.session.new} 判斷session 是否為新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主機端的服務信息
另外:上面提到的pageScope、requestScope、sessionScope 和 applicationScope也都是EL的隱式對象
例如:<%=user.getAddr( ) %> 等價於 ${user.addr} (user為一個變量,在action或者severlet中存放於指定的作用域中,addr為user的屬性)
三、特別強調
1、注意當表達式根據名稱引用這些對象之一時,返回的是相應的對象而不是相應的屬性。
例如:即使現有的 pageContext 屬性包含某些其他值,${pageContext} 也返回 PageContext 對象。
2、注意 <%@ page isELIgnored="true" %> 表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默認的啟用EL語言。
四、JSTL(C)標簽:
由於EL表達式不能循環取出集合對象的值,所以可以通過使用jstl標簽中的方法解決這個循環取出集合對象的問題
jstl是建立在el表達式基礎上的語言,屬於jsp外部的一個標准標簽,庫導入標簽格式為:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL部分介紹:
1、 <c:out value="${屬性名}"></c:out>:輸出標簽
2、迭代標簽
語法:<c:forEach items="userList" var="user" varStatus=“status” begin=“int“ end=”int” step=“int” >
//循環體
<c:out value="${status.index}"></c:out>
<c:out value="${status.count}"></c:out>
<c:out value="${ user.name }"></c:out>
<c:out value="${ user.age }"></c:out>
</c:forEach>
說明:1)items:是集合,用EL表達式;
2)var:變量名,存放items ,代表集合中每一條數據
3)varStatus: 顯示循環狀態的變量,有一下幾個屬性:
①index:從0開始; 顯示當前迭代的索引值
②count:元素位置,從1開始; 顯示當前迭代顯示的行位置,通過配合判斷語句,實現給奇、偶行着不同的色,以進行分區
③first:如果是第一個元素則顯示true;
④last:如果是最后一個元素則顯示true;
4)begin:循環的初始值(整型);
5)end: 循環結束 ;
6)step:步長,循環間隔的數值;
3、 <c:if test="判斷語句"></c:if>:若果滿足test中的條件,則執行<c:if></if>標簽對之間的的語句,相當於if....的結構功能
4、<c:choose>:由於JSTL沒有形如if (){…} else {…}的條件語句,所以這種形式的語句只能用<c:choose>
結構形式:
<c:choose>
<c:when test="判斷語句1">執行語句1</c:when>
<c:when test="判斷語句2">執行語句1</c:when>
..........
<c:otherwise>前面都不符合,執行此默認語句
</c:otherwise>
</c:choose>:用於選擇標簽對之間滿足條件的語句,相當於switch語句
5、、<c:redirect>標簽
說明:標簽將請求重新定向到另外一個頁面,它有以下屬性
例子: <c:redirect url="http://www.baidu.com/login.jsp"/>
將請求重新定向到http://www.baiddu.com/login.jsp頁,相當於response.setRedirect ("http://www.yourname.com/login.jsp");
6、<c:param>標簽
說明:<c:param>標簽用來傳遞參數給一個重定向或包含頁面,它有以下屬性
例子: <c:redirect url="http://www.baidu.com/login.jsp">
<c:param name="paramName" value="paramValue"/>
</c:redirect>
這個就在地址欄里面顯示的形式為:http://www.baidu.com/login.jsp?paramName=paramValue
五、<fmt:>格式化標簽,並顯示
說明:需要導入 <%@ taglib prefix="fmt" http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt" %>
1)格式化日期<fmt:formatDate value=“” pattern=“yyyy-MM-dd HH:mm:ss”/>
Value:通過EL表達式或<%new Date() %> 取的日期值;
Pattern:輸出的日期格式;訴訟
例如:
<fmt:formatDate value="${date }" pattern="yyyy-MM-dd"/>
<fmt:formatDate value="${date }" pattern="yyyy年MM月dd日"/>
2) 格式化數字<fmt:formatNumber value="${number}" pattern="###,###.##" />