1. 程式人生 > 其它 >[email protected] JSP中EL表示式

[email protected] JSP中EL表示式

1.EL表示式簡介

EL表示式:Expression Language,簡稱EL,我們一般稱為表示式語言,或者EL表示式,
後面還會學習到SpringEL表示式,對於JSP而言,EL表示式是在JSP2.0中新增的新的功能,
使用EL表示式可以方便的獲取域物件的資訊,獲取引數的資訊,
可以大量的減少JSP程式碼中Java的程式碼量,而且EL表示式的語法非常的簡單:${域物件資訊名稱或者引數名稱}。
範例:設定域物件資訊,並且使用EL表示式獲取
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//設定域物件的資訊,一般是在Servlet(Filter 和 Listener )中完成的
		pageContext.setAttribute("company", "北京萬邦易嵌科技有限公司");
	%>
	
	<h1>[之前的寫法]獲取Page域物件資訊:<%= pageContext.getAttribute("company") %></h1>
	<h1>使用EL表示式:${company}</h1>
</body>
</html>
使用EL表示式之後,相比之前的在JSP中使用scriptlet的形式,簡單了很多,
還有特別的好處,就是減少JSP中Java的程式碼量,除了這個好處之外,還有如下好處:
- 空值取代錯誤訊息
- 精確的訪問物件的屬性
- 可以訪問集合
- 可以使用運算子
空值取代錯誤訊息:在沒有設定域物件的情況下,使用原來的方式可以取得null,那麼肯定是存在問題的,
正常來說取得的應該是一個空串,那麼使用EL表示式取出的就是一個空串,程式碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//設定域物件的資訊,一般是在Servlet(Filter 和 Listener )中完成的
		pageContext.setAttribute("company", "北京萬邦易嵌科技有限公司");
	%>
	
	<h1>[之前的寫法]獲取Page域物件company資訊:<%= pageContext.getAttribute("company") %></h1>
	<h1>[之前的寫法]獲取Page域物件Tel資訊:<%= pageContext.getAttribute("tel") %></h1>
	
	<h1>使用EL表示式company:${company}</h1>
	<h1>使用EL表示式Tel:${tel}</h1>
</body>
</html>

在這裡插入圖片描述

使用EL獲取其他範圍域物件資訊,EL表示式不僅僅可以取得page域物件資訊,其他範圍的域物件資訊也依然可以獲取:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		pageContext.setAttribute("company", "北京萬邦易嵌科技有限公司");
		request.setAttribute("tel","13515967537");
		session.setAttribute("address","南昌昌北");
		application.setAttribute("code","9527");
	%>
	<h1>獲取page域物件:${company }</h1>
	<h1>獲取request域物件:${tel }</h1>
	<h1>獲取session域物件:${address }</h1>
	<h1>獲取application域物件:${code }</h1>
</body>
</html>
不同範圍相同名字的域物件資訊獲取,使用pageContext,request,session和application
分別設定相同名稱但是值不同的域物件資訊,使用EL表示式獲取的會是哪個域物件範圍的資訊呢?
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		pageContext.setAttribute("company", "北京萬邦易嵌科技有限公司");
		request.setAttribute("company","13515967537");
		session.setAttribute("company","南昌昌北");
		application.setAttribute("company","9527");
	%>
	<h1>獲取域物件:${company }</h1>
</body>
</html>
程式執行結果發現,獲取的域物件的資訊是page範圍的,
實際上我們知道以上的四個域物件的範圍從小到大依次是:page,request,session,application,
那麼EL表示式獲取的是從小到大。
設定了不同範圍相同名稱的域物件資訊,EL表示式獲取的結果是從小到大,
但是如果非要獲取大的範圍,而非小的範圍,如何處理呢?我們這個時候必須使用隱式物件,
通過隱式物件獲取具體的範圍的域物件資訊,隱式物件有四個,分別對應四種域物件範圍:
- page ---->pageScope
- request---->requestScope
- session---->sessionScope
- application--->applicationScope

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		pageContext.setAttribute("company", "北京萬邦易嵌科技有限公司");
		request.setAttribute("company","13515967537");
		session.setAttribute("company","南昌昌北");
		application.setAttribute("company","9527");
	%>
	<!-- 獲取指定範圍域物件資訊 -->
	<h1>獲取application域物件:${applicationScope.company }</h1>
	<h1>獲取session域物件:${sessionScope.company }</h1>
</body>
</html>

2.EL表示式語言內建物件

像上面程式中使用的隱式物件,也是稱為EL表示式語言的內建物件。

序號表示式內建物件說明
1pageScope表示查詢page域物件資訊
2requestScope表示查詢request域物件資訊
3sessionScope表示查詢session域物件資訊
4applicationScope表示查詢application域物件資訊
5pageContext表示的javax.servlt.jsp.PageContext物件
6param表示查詢傳遞到本頁面的引數
7paramValues表示查詢傳遞到本頁面的所有引數
8header表示查詢頭資訊的內容
9headerValues表示查詢所有頭資訊內容
10cookie表示查詢cookie的資料
11initParam表示查詢初始化配置的引數
範例1:使用EL表示式獲取傳遞到本頁面的單個引數和所有引數
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>name : <%= request.getParameter("name") %></h1>
	<h1>取得單個引數name:${param.name }</h1>
	<h1>取得單個引數age:${param.age }</h1>
	<h2>獲取所有引數的值:${paramValues}</h2>
</body>
</html>

3.表示式取得其他常用的物件資訊

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 之前獲取絕對路徑方式,action=”<%= request.getContextPath()%>/jsp/1.jsp” -->
	<!-- 使用EL表示式獲取絕對路徑,取得專案的根目錄 -->
	<form action="${pageContext.request.contextPath }/jsp/1.jsp" method="post">
		姓名:<input type="text" name="name">
		年齡:<input type="text" name="age">
		<button>提交</button>
	</form>
	<!-- 使用EL表示式獲取客戶端IP -->
	<h2>客戶端IP:${pageContext.request.remoteAddr}</h2>
	<!-- 使用EL表示式獲取服務端IP -->
	<h2>服務端IP:${pageContext.request.localAddr}</h2>
	<!-- .....還可以獲取的內容太多了.... -->
	<!-- 獲取sessionID -->
	<h2>sessionId:${pageContext.session.id }</h2>
	<!-- 獲取本地埠 -->
	<h2>獲取本地埠:${pageContext.request.localPort }</h2>
</body>
</html>

4.EL表示式操作集合

在開發中,會有集合的資料加入到域物件中,在jsp頁面使用EL表示式獲得這些集合的資料。
但是如果集合需要迴圈的話,EL表示式幹不了,這個時候可以使用第三方的jstl標籤庫,需要額外的導包:
jstl.jar
standard.jar
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*,com.wanbangee.entities.*" %>
<!-- 匯入標籤庫 : 匯入jstl的核心庫,prefix字首-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.10.1.js"></script>
<script type="text/javascript">
$(function(){
	$("#logout").click(function(event){
		event.preventDefault();//取消元件的預設行為
		if(confirm("確認登出登入嗎?")){
			var href = $(this).attr("href");
			window.location.href = href;//執行重定向
			
		}
	//return false;//取消超連結的預設行為
	});
});
</script>
</head>
<body>
	<!--<h3>${bookInfos}</h3>取得集合,但迴圈不了集合-->
	
	<!-- 取得集合中某個元素  並且獲得此元素的bookName屬性-->
	<h3>${bookInfos[0].bookName}</h3>
	
	<h2>登入成功,歡迎您:${account.accName},您的賬戶餘額為:${account.accBalance}<a id="logout" href="${pageContext.request.contextPath}/jsp/logout.jsp">登出</a></h2>

	<table border="1">
		<caption>圖書資訊列表</caption>
		<tr>
			<th>圖書ID</th>
			<th>圖書名</th>
			<th>圖書單價</th>
			<th>圖書庫存</th>
			<th>操作</th>
		</tr>
		<!-- 
			遍歷El表示式取到的集合  bookInfos ,每次迴圈取得集合中的某個資料賦值給bookInfo
				c:forEach : 遍歷標籤
					- iteams : 遍歷的是哪個集合,通過EL表示式獲取集合中的域物件或者其他的資訊
					- var : 指定遍歷集合的每個元素要賦值的變數
					- begin : 指定集合從什麼位置開始遍歷,預設是0
					- end : 指定集合遍歷結束的位置,預設是集合長度-1
					- step : 步長,每次遍歷相隔的數量,預設是1
					- varStatus : 遍歷狀態,可以從此狀態中獲得到遍歷的元素在集合中的索引
					遍歷集合的狀態複製給新的變數,可以獲取index,fist,last 等等資訊
		-->
		<c:forEach var="bookInfo" items="${bookInfos}" varStatus="status">
		<tr>
			<td>${bookInfo.bookNo }</td>
			<td>${bookInfo.bookName }</td>
			<td>${bookInfo.bookPrice }</td>
			<td>${bookInfo.bookStock.stockNum }</td>
			<td><a href="javascript:;"> ${status.index}</a></td>
		</tr>
		</c:forEach>
		
	</table>
	
	
	<hr/>
	<h3>線上使用者列表</h3>
	<ul>
		
		<c:forEach items="${onlines }" var="account">
			<li>${account.accName }</li>
		</c:forEach>
	</ul>
	
</body>
</html>

5.表示式語言中操作運算子

表示式語言中可以使用算數運算子,關係運算符,邏輯運算子,三元運算子等等,這些運算子寫在jsp中,
可以使得jsp更加的簡介,但是一般較為複雜的運算,建議還是寫在業務層(Service),
在使用運算子的時候所有的運算操作都可以不考慮型別轉換的問題。
<tr>
		<td>${bookInfo.bookNo == 1}</td> <!-- 關係運算符 -->
		<td>${empty bookInfo.bookName }</td> <!-- 判斷是否為空,為空則true,不為空則false-->
		<td>${bookInfo.bookPrice * 2}</td> <!-- 數學運算子 -->
		<td>${bookInfo.bookStock.stockNum > 0 ? '有貨':'無貨'}</td> <!-- 三元運算子 -->
		<td><a href="javascript:;"> ${bookInfo.bookNo == 1 && bookInfo.bookStock.stockNum > 0}</a></td> <!-- 邏輯運算子-->
</tr>

總結

EL表示式能夠進行的操作很多,可以大量的減少jsp中的Java程式碼量,在jsp開發中,經常使用,但是html中不能夠使用。