使用傳統方式在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}
</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 | 時區 | 中部標準時間 |
' | 轉義文本 | |
'' | 單引號 |