今天主要學習EL表達式和 JSTL
思維導圖:
一.EL表達式
1.概述:
EL表達式是可以嵌入在JSP的頁面的當中的,本質上是爲的去減少JAVA代碼的編寫,因爲從原則上來說,JSP裏面JAVA代碼越少越好,甚至不出現任何JAVA代碼。
2.EL表達式的格式:
在JSP的內置表達式當中,所有的操作都是使用 <% %>進行,其實這種操作符號是非常反人類的,絕大部分的語言基本都不會出現這種操作符號。正常的操作符號應該是"$",比如mybits/ajax/juqey/php..類型的框架和語言都是採用"$"。
而EL表達式爲了符合正常的表達式的操作定義習慣,也是使用了$.
${表達式}
注意:
因爲JSP當中,默認是支持EL表達式的,所以我們直接使用,但是回想下我們之前學JSP的時候,是可以禁止EL(注意)
3.EL獲取作用域 不同類型的數據:
EL獲取普通字符串
獲取上下文作用域
${applicationScope.key_con}
獲取會話作用域
${sessionScope.key_sess}
獲取請求作用域
${requestScope.key_req}
獲取JSP作用域
${pageScope}
簡寫:
${key}
注意:
當作用域的名字不一致,取出各自作用域的值.
當作用域的名字一致,按照findAttribute的方式,從小到大去尋找作用域
4.EL獲取普通對象的數據
request.setAttribute("u",user);
${u.username}
${u.password}
5.EL獲取數組或者集合
request.setAttribute("l",list);
${l}
${l[0]}
${l[1]}
${l[2]}
6.EL獲取Map集合
request.setAttribute("map",map);
${map}
${map.u1}
${map.u1.username}
或者
${map['day01.user'].username} (這種方式,主要是避免在請求名當中,命名存在了".",比如 day01.user 上面的方式就沒法獲取)
7.EL的內置11個對象:
對象調用getxxx()方法,例如pageContext.getRequest()可以寫爲${pageContext.request)
pageContext對象來獲取當前項目的名稱:
${pageContext.request.contextPath}
8.EL的運算符:
算數運算符:
+ - * /
邏輯運算符:
&& || !
比較運算符:
> < >= <= ==
三元運算符:
(true) ? xx : xx
判空運算符(爲null或者沒有元素值都爲空):
empty
${empty list2}
9.注意:
(1)EL的主要作用其實就是減少JSP頁面當中的輸出語句的編寫(本質上就是少些代碼,完成輸出)
(2)EL如果獲取到的數據是一個null,則不會顯示到頁面
二.JSTL
1.JSTL概念:
JSTL是JSP的標籤庫,可以嵌入在JSP頁面當中,使用標籤的形式完成大部分的業務邏輯功能,JSTL的出現和EL的出現是一樣的;主要也是爲了解決減少JSP頁面大量編寫Java代碼的問題的,但是EL解決的輸出的問題,而JSTL解決的是邏輯問題,一般JSTL基本上都是和EL搭配使用。學習JSTL一共要學習5個庫,但是隨着開發態勢的不斷調整,JSP的優勢幾乎喪失,目前所謂的5個庫,在代碼當中基本只能見到核心庫。
2.JSTL的核心標籤庫:
核心標籤(core): 核心標籤庫,我們學習的重點;
格式化標籤 :只需要學習兩個標籤即可;
SQL 標籤( sql):數據庫標籤庫,不需要學習了,它過時了;
XML 標籤: 不需要學習了,它過時了。
JSTL 函數: 主要定義對字符串操作的函數庫,在EL表達式中運行。
3.如何使用JSTL:
(1)先導入Jar包
javax.servlet.jsp.jstl.jar
jstl-impl.jar
(2)在JSP頁面使用taglib指令導入JSTL的標籤庫
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
(3)測試導入是否成功
在頁面輸入 <c: 看有沒有core庫的代碼提示,有一些編譯器可能沒有,那麼就只能寫好再去測。
4.JSTL的常用標籤:
JSTL的核心庫當中存在很多的標籤,但是目前常用的標籤只有if和foreach標籤,其餘的幾乎見不到,萬一見到就百度
5.if標籤的使用:
if標籤的屬性:
test:用於判斷表達式
scope:可以將執行的結果保存到一個指定的作用域當中(基本不用)
var:可以將執行的屬性的執行結果保存當某個作用域的某個屬性的名稱(基本不用)
<c:if test="${num == 5}">
<span style="color: red">這個值大於5</span>
</c:if>
注意:
JSTL沒有else和else if
6.foreach標籤的屬性:
var:代表的循環當中的變量(循環變量)
begin:代表這個var的初始化值(循環初始化值)
end:代表判斷條件的結束的值(循環的結束值,結束值本身也算)
step:代表執行多少次(循環每次自增的次數)
items:代表需要遍歷的容器
varStatus:定義一個計數器對象,默認從1開始
操作普通循環:
<c:forEach var="i" begin="0" end="5" step="1">
${i}<br/>
</c:forEach>
操作foreach循環:
<c:forEach var="str" items="${list}" varStatus="num">
{str}<br/>
${num.count}
</c:forEach>
7.JSTL的判斷和循環的對比
8.三層架構和MVC的開發模式:
JSP的開發模式:但是在SUM公司推出jsp之後,其實也提供一個對應的開發模式,到目前爲止,JAVAWEB的開發至少經歷了兩代甚至三代的開發模式的變革
9.Model1代的開發模式
10.Model2代的開發模式