03.EL表達式和JSTL

使用傳統方式在Servlet和jsp之間傳數據

<%=request.getAttribute("str")%><br/>
<%=((Student)request.getAttribute("user"))%><hr/>
<%=request.getAttribute("list")%>
req.setAttribute("str","我是普通字符串數據");
//對象數據
Student stu = SqlService.Login("100000","123456");
req.setAttribute("user",stu);
//集合數據
List list = new ArrayList();
list = SqlService.FindAll();    //將數據庫全部信息傳給List
req.setAttribute("list",list);
//請求轉發
req.getRequestDispatcher("/index.jsp").forward(req,resp);

傳統缺陷:

​ 1.書寫比較繁瑣

​ 2.需要導包

​ 3.需要強轉

EL表達式

1.什麼是EL表達式?

​ 全稱:Expression Language; 一種寫法非常簡潔的表達式,語法簡單易懂,便於使用。表達式語言的靈感來自於ECMAscript和XPath表達式語言

2.EL表達式的作用

​ 作用:讓jsp書寫起來更加的方便。簡化在jsp中獲取作用域或者請求數據的寫法。也會搭配Jstl來進行使用。

3.使用EL表達式

​ 語法結構:$(expression);提供,和[ ]兩種運算符來獲取數據。

​ 使用:

​ a)使用EL表達式獲取請求數據

​ i. 獲取用戶請求數據

​ ii. 獲取請求頭數據

​ iii. 獲取Cookie數據

​ b)使用EL表達式獲取作用域數據

​ i. 獲取作用域數據

​ ii. 作用域查找順序

​ iii. 獲取指定作用域中的數據

​ c)使用EL表達式進行運算

​ i. 算術運算

​ ii. 關係運算

​ iii. 邏輯運算

​ d)EL表達式空值判斷 empty

EL表達式 (同上面一樣的效果)

${str}<br/>
${user}<hr/>
${list}

EL表達式獲取請求實體和請求頭和Cookie數據

El表達式的語法:

​ ${表達式}
​ 注意:

自帶響應功能

El表達式的使用:

​ El表達式獲取請求數據

​ 獲取用戶請求數據(請求實體)
​ ${param.鍵名} 獲取請求實體中一個鍵一個值的數據
​ ${paramValues.鍵名} 獲取請求實體中同鍵不同值的數據,返回的是String數組,可以使用角標直接獲取 例如:愛好

獲取請求頭數據

​ ${header} 返回所有的請求頭數據,鍵值對形式
​ ${header[“鍵名”]} 返回指定的鍵的請求頭數據
​ ${headerValues[“鍵名”]}

獲取Cookie數據

​ ${cookie} 獲取所有的Cookie對象 鍵值對
​ ${cookie.Cookie對象的鍵名} 獲取存儲了指定Cookie數據的Cookie對象
​ ${cookie.Cookie對象的鍵名.name} 獲取存儲了指定Cookie數據的Cookie對象的存儲的鍵
​ ${cookie.Cookie對象的鍵名.value}獲取存儲了指定Cookie數據的Cookie對象的存儲的值
​ EL表達式獲取作用域數據
​ 作用域對象:pageContext request session application
​ 作用域數據:我們使用setAttribute方法存儲的數據

獲取:

​ 普通字符串數據 ${鍵名}
​ 對象數據 ${鍵名.屬性名}

集合數據

​ list集合 ${鍵名[角標]}
​ Map集合 ${map集合作用域存儲的鍵名.map集合存儲的數據的鍵名}
​ 作用域數據查找順序:如果找到了則不再查找,如果找不到,則繼續查找下一個作用域,如果四個作用域中都沒有則什麼都不顯示
​ pageContext–>request–>session–>application

指定作用域獲取數據:

​ ${pageScope.鍵名} 指明獲取pageContext作用域中的數據
​ ${requestScope.鍵名} 指明獲取request作用域中的數據
​ ${sessionScope.鍵名} 指明獲取session作用域中的數據
​ ${applicationScope.鍵名} 指明獲取application作用域中的數據

EL表達式邏輯運算

​ 算術運算:+,-,*,/ 在EL表達式中可以直接進行算術運算
:{算術表達式} 例如 :{1+2}
​ 注意:+表示算術運算,不能進行字符串連接
​ 邏輯運算:&& || !
​ ${邏輯表達式}
​ 注意:沒有單& 和單|
​ 比較運算:== != >,>=,<,<=
​ ${比較表達式}
​ 三目運算:
​ ${條件?值:值}

EL表達式的empty判斷

​ ${empty 鍵名}
​ 作用:
​ 判斷該鍵是否有存儲有效數據

<h3>獲取用戶請求數據(請求實體)</h3>
<%=request.getParameter("uname") %>--${param.uname} <br />
<%=request.getParameterValues("fav")[1] %>--${paramValues.fav[1]}
<h3>獲取用戶請求頭數據</h3>
<%=request.getHeader("User-Agent") %>--${header["User-Agent"]}--${headerValues["Accept-Language"][0]}
<h3>獲取Cookie數據</h3>
${cookie} <br />
${cookie.JSESSIONID} <br />
${cookie.JSESSIONID.name}--${cookie.JSESSIONID.value}

EL表達式獲取作用域數據

作用域對象: pageContext request session application

作用域數據: 我們使用setAttribute方法存儲的數據

獲取:

​ 普通字符串數據 ${鍵名}

​ 對象數據${鍵名.屬性名}

​ 集合數據

​ list集合{鍵名[角標]}

​ Map集合 ${map集合作用域存儲鍵名.map集合存儲數據的鍵名}

​ 作用域查找順序,如果找到了則不再查找,如果找不到則繼續查找下一個作用域,如果四個作用域都沒有則什麼都不顯示

指定作用域獲取數據:

​ ${pageScope.鍵名} 指名獲取pageContext作用域中的數據

​ ${requestScope.鍵名}指名獲取request作用域中的數據

​ ${sessionScope.鍵名}指名獲取session作用域中的數據

​ ${applicationScope.鍵名}指名獲取application作用域中的數據

EL表達式邏輯運算

​ 算術運算:+,-,*,/ 在EL表達式中可以直接進行算術運算
:{算術表達式} 例如 :{1+2}
​ 注意:+表示算術運算,不能進行字符串連接
​ 邏輯運算:&& || !
​ ${邏輯表達式}
​ 注意:沒有單& 和單|
​ 比較運算:== != >,>=,<,<=
​ ${比較表達式}
​ 三目運算:
​ ${條件?值:值}

EL表達式的empty判斷

${empty 鍵名}
作用:
判斷該鍵是否有存儲有效數據

JSTL

​ JSTL是apache對EL表達式的擴展(也就是說JSTL依賴EL),JSTL是標籤語言!JSTL標籤使用起來非常方便,它與JSP動作標籤一樣,只不過它不是JSP內置的標籤,需要我們自己導包,以及指定標籤庫而已!

操作域對象的標籤:

c:set 向域對象中放入數據 setAttribute

c:out 從域對象中取出數據 getAttribute

c:remove 從域對象中移除數據 removeAttribute

c:set/out/remove標籤的使用

  <%--向四個域中放入數據   setAttribute--%>
  <c:set var="msg" value="pageScopeMsg" scope="page" ></c:set>
  <c:set var="msg" value="requestScopeMsg" scope="request" ></c:set>
  <c:set var="msg" value="sessionScopeMsg" scope="session" ></c:set>
  <c:set var="msg" value="applicationScopeMsg" scope="application" ></c:set>
  <%--從四個域中取出數據--%>
  ${pageScope.msg}
  ${requestScope.msg}
  ${sessionScope.msg}
  ${applicationScope.msg}
  <hr/>

  <%--c remove 移除指定域中的數據的 removeAttribute --%>
  <c:remove var="msg" scope="page"></c:remove>
  <c:remove var="msg" scope="session"></c:remove>
  <c:remove var="msg" scope="request"></c:remove>
  <c:remove var="msg" scope="application"></c:remove>

<hr/>
  <%--shiyong c out 標籤取出域對象中的數據  getAttribute--%>
  <c:out value="${pageScope.msg}" default="msg信息未找到"></c:out>
  <c:out value="${requestScope.msg}" default="msg信息未找到"></c:out>
  <c:out value="${sessionScope.msg}" default="msg信息未找到"></c:out>
  <c:out value="${applicationScope.msg}" default="msg信息未找到"></c:out>

c:if標籤的使用

<%
pageContext.setAttribute("score",(int)(Math.random()*100+1));
%>

<%--
test 相當於 if(判斷條件)
var  判斷條件的結果 保存到域對象中 數據的名稱
scope 控制操作的域
--%>
分數:${score} 級別:
<c:if test="${score ge 90 and score le 100}" var="f1" scope="page">A</c:if>
<c:if test="${score ge 80 and score lt 90}"  var="f2" scope="page">B</c:if>
<c:if test="${score ge 70 and score lt 80}"  var="f3" scope="page">C</c:if>
<c:if test="${score ge 60 and score lt 70}"  var="f4" scope="page">D</c:if>
<c:if test="${ score lt 60}" var="f5" scope="page">E</c:if>

<hr>
${f1}
${f2}
${f3}
${f4}
${f5}
<hr>

<%--結束var屬性實現一個雙分支--%>
<c:if test="${score ge 60}"  var="flag" scope="page">及格</c:if>
<c:if test="${!flag}">不及格</c:if>

c:choose 標籤的使用

<c:choose>
    <c:when test="${score ge 90}">A</c:when>
    <c:when test="${score ge 80}">B</c:when>
    <c:when test="${score ge 70}">C</c:when>
    <c:when test="${score ge 60}">D</c:when>
    <c:otherwise>E</c:otherwise>
</c:choose>

迭代標籤

c:foreach打印99乘法表

forEach中的屬性

> var: 迭代變量, 存放在pageContext作用域

> begin: 迭代起始值

> end: 迭代結束值

> step: 迭代變量變化的步長

<%--
var  用於定義變量
begin 用於定義變量的起始值
end   用於定義變量的結束值
step  用於定義變量的步長  默認值1
for(int i = 0; i<= 10 ;i++)

foreach 循環沒迭代一次 就會向page域中放入一個 i= * 值
--%>
<c:forEach var="i" begin="1" end="9" step="1">
    <c:forEach var="j" begin="1" end="${i}" step="1">
        ${j}*${i}= ${i*j} &nbsp;
    </c:forEach>
    <br/>
</c:forEach>

格式化標籤庫:

fmt標籤有如下屬性:

屬性 描述 是否必要 默認值
value 要顯示的數字
type NUMBER,CURRENCY,或 PERCENT類型 Number
pattern 指定一個自定義的格式化模式用與輸出
currencyCode 貨幣碼(當type="currency"時) 取決於默認區域
currencySymbol 貨幣符號 (當 type="currency"時) 取決於默認區域
groupingUsed 是否對數字分組 (TRUE 或 FALSE) true
maxIntegerDigits 整型數最大的位數
minIntegerDigits 整型數最小的位數
maxFractionDigits 小數點後最大的位數
minFractionDigits 小數點後最小的位數
var 存儲格式化數字的變量 Print to page
scope var屬性的作用域 page
符號 描述
0 代表一位數字
E 使用指數格式
# 代表一位數字,若沒有則顯示 0,前導 0 和追尾 0 不顯示。
. 小數點
, 數字分組分隔符
; 分隔格式
- 使用默認負數前綴
% 百分數
? 千分數
¤ 貨幣符號,使用實際的貨幣符號代替
X 指定可以作爲前綴或後綴的字符
' 在前綴或後綴中引用特殊字符

fmt:formatDate標籤有如下屬性:

屬性 描述 是否必要 默認值
value 要顯示的日期
type DATE, TIME, 或 BOTH date
dateStyle FULL, LONG, MEDIUM, SHORT, 或 DEFAULT default
timeStyle FULL, LONG, MEDIUM, SHORT, 或 DEFAULT default
pattern 自定義格式模式
timeZone 顯示日期的時區 默認時區
var 存儲格式化日期的變量名 顯示在頁面
scope 存儲格式化日誌變量的範圍 頁面

fmt:formatDate標籤格式模式

代碼 描述 實例
G 時代標誌 AD
y 不包含紀元的年份。如果不包含紀元的年份小於 10,則顯示不具有前導零的年份。 2002
M 月份數字。一位數的月份沒有前導零。 April & 04
d 月中的某一天。一位數的日期沒有前導零。 20
h 12 小時制的小時。一位數的小時數沒有前導零。 12
H 24 小時制的小時。一位數的小時數沒有前導零。 0
m 分鐘。一位數的分鐘數沒有前導零。 45
s 秒。一位數的秒數沒有前導零。 52
S 毫秒 970
E 周幾 Tuesday
D 一年中的第幾天 180
F 一個月中的第幾個周幾 2 (一個月中的第二個星期三)
w 一年中的第幾周r 27
W 一個月中的第幾周 2
a a.m./p.m. 指示符 PM
k 小時(12 小時制的小時) 24
K 小時(24 小時制的小時) 0
z 時區 中部標準時間
' 轉義文本
'' 單引號
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章