Servlet + (JSP、EL表示式、JSTL標籤庫)的 資料流轉
兩個Servlet之間的資料流轉:靠的是作用域
作用域是資料流轉的載體
- 用request舉例
傳統方式:在jsp介面中使用java指令碼段
servlet的流程:
- 設定請求編碼格式
req.setCharacterEncoding("utf-8");
- 設定響應編碼格式
resp.setContentType("text/html;charset=utf-8");
- 獲取請求資訊
String msg = req.getParameter("msg")
- 處理請求資訊
System.out.println("根據"+msg+"與資料庫進行資料互動...");
- 響應處理結果
//普通字串的流轉 req.
req.geRequestDispatcher("msg.jsp").forward(req,resp); return;
req.sendRedirect("main.jsp");
get請求中傳資料:
localhost:8080/Myservlet/MySource?fm1=你好&fm2=JSP世界
jsp中獲取資料:
<b><%=request.getAttribute("msg1")%></b><br/> //介面輸出:msg1普通字串的流轉
<%=((User)request.getAttribute("user")).getName()%><br/> //介面輸出:閃電
<%!-- ********************************List集合********************** --%>
<%=((ArrayList)req.getAttribute("listStr")).get(1)%><br/> //介面輸出:雪妖str
<%=((User)((ArrayList)req.getAttribute("listObj")),get(1)).getName()%><br/> //介面輸出:鋼鐵俠
<%=(ArrayList<User>)req.getAttribute("listObj").get(0).getName()%><br/> //介面輸出:美隊
<%!-- *******************************Map集合************************* --%>
<%=((HashMap)req.getAttribute("mapStr")).get("k1")%> //介面輸出:北京str
<%=((User)((HashMap)req.getAttribute("mapObj")).get("ok4")).getSkill()%> //介面輸出:古老魔法
傳統作用域資料:
缺點:
1. 需要導包
2. 需要強轉
3. 獲取資料麻煩
所以使用EL表示式
EL表示式
1、全稱:Expression Language,一種寫法非常簡介的表示式。
2、作用:讓 jsp 書寫起來更加的方便。不需要導包、不需要強轉、方便
3、語法結構:${表示式}
,提供{}
和[]
兩種運算子來存取資料。
- 獲取請求資料:
request物件儲存了請求資料 => param.鍵名 直接返回值
request物件儲存了請求資料 => paramValues.鍵名 返回的是陣列 - 通過setAttribute方法儲存到作用域物件中的資料
${鍵名} 返回所對應的值
注意:如果是普通字串,則直接返回
如果是物件,則返回的是物件
使用:
a) 獲取請求資料
i. 獲取使用者請求資料
ii. 獲取請求頭資料
${header}
iii. 獲取 Cookie 資料
${cookie}
b) 獲取作用域資料
i. 獲取作用域資料
ii. 作用域查詢順序
=> 從小到大查詢,找到就不再獲取;
pageContext:當前介面
request:一次請求
session:一次會話
application:專案內,伺服器啟動時建立,伺服器關閉 是消亡
iii. 獲取指定作用域中的資料
${pageScope.msg1}
${requestScope.msg1}
${sessionScope.msg1}
${applicationScope.msg1}
c) 運算操作
i. 算術運算
${1+2}—— ${2*2} —— ${4/2} —— ${4%3}
${1+“2”} => 輸出:3
ii. 關係運算
${4== 4} —— ${4>2}
${sex==1 ? ‘男’ : ‘女’ }
iii. 邏輯運算
&& 、|| 、!
d) 空值判斷 empty
${empty obj} //輸出true、false
EL 中獲取資料 :
${param.fm1} //獲取get請求中的資料;介面輸出:你好
<b>${msg1}</b><br/> //介面輸出:msg1普通字串的流轉
<%=((User)request.getParameter("user")).getName()%><br/>
${user.name}<br/> //介面輸出:閃電
<%!-- ********************************List集合************ --%>
<%=((ArrayList)req.getAttribute("listStr")).get(1)%><br/>
${listStr[1]}<br/> //介面輸出:雪妖str
<%=((User)((ArrayList)req.getAttribute("listObj")),get(1)).getName()%><br/>
${listObj[1].name}<br/> //介面輸出:鋼鐵俠
<%=(ArrayList<User>)req.getAttribute("listObj").get(0).getName()%><br/>
${listObj.name}<br/> //介面輸出:美隊
<%!-- *******************************Map集合*************** --%>
<%=((HashMap)req.getAttribute("mapStr")).get("k1")%>
${mapStr.k1} //介面輸出:北京str
<%=((User)((HashMap)req.getAttribute("mapObj")).get("ok4")).getSkill()%>
${mapObj.k1.skill} //介面輸出:古老魔法
JSTL 標籤庫
1、 什麼是 JSTL 標籤庫
JSTL 是 apache 對 EL 表示式的擴充套件(也就是說 JSTL 依賴 EL)
JSTL 是標籤語言!JSTL 標籤使用以來非常方便,它與 JSP 動作標籤一樣,只不過它不是 JSP 內建的標籤,需要我們自己導包,以及指定標籤庫而已!
如果你使用 MyEclipse 開發 JavaWeb,那麼在把專案釋出到 Tomcat 時,你會發現,MyEclipse 會在 lib 目錄下存放 jstl 的Jar 包!如果你沒有使用 MyEclipse 開發那麼需要自己來匯入這個JSTL 的 Jar 包:jstl-1.2.jar。
2、 JSTL 標籤庫的作用
用來提升在 JSP 頁面的邏輯程式碼的編碼效率, 使用標籤來替換邏輯程式碼的直接書寫,高效,美觀,整潔,易讀。
3、 使用 JSTL 標籤庫
a) 內容:
i. 核心標籤庫(學習)
ii. 格式化標籤庫(瞭解)
iii. 函式標籤庫(瞭解)
iv. XML 標籤庫(瞭解)
v. SQL 標籤庫(瞭解)
b) 使用:
i. 導包
ii. 使用 taglib 標籤引入資源 ( 核心標籤庫 )
<%taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
iii. 核心標籤庫
<%request.setAttribute("str", "I'm OK!");%>
//1. 基本標籤<c:out ></c:out> => 輸出
<c:out value="哈哈"></c:out><br/> //介面輸出:哈哈
<c:out value="${str}" default="hiahia"></c:out><br/> //介面輸出:I'm OK!
${str}
//2. 基本標籤<c:set ></c:set> => 設定域中的資料
<c:set var="msg" value="msg:I’m pageContext" scope="page"><c:set> //向當前作用域中設定值
<c:set var="msg" value="msg:I’m request" scope="request"><c:set>
<c:set var="msg" value="msg:I’m session" scope="session"><c:set>
<c:set var="msg" value="msg:I’m application" scope="application"><c:set>
<c:out value="${msg}"></c:out><br/> //介面輸出:I’m pageContext
<c:out value="${requestScope.msg}"></c:out><br/> //介面輸出:I’m requestContext
<c:out value="${sessionScope.msg}"></c:out><br/> //介面輸出:I’m sessionContext
<c:out value="${applicationScope.msg}"></c:out><br/> //介面輸出:I’m applicationContext
//3. 基本標籤<c:remove />
<c:remove var="msg" scope="request" /> //在不指定作用域的情況下,4個作用域全刪
<c:out value="${msg}"><c:out><br/>
//4. 邏輯標籤<c:if test="${表示式}"> 前端程式碼 <c:if>
<c:set var="a" value="4"></c:set>
<c:if test="${a>2}">
<h4>今天天氣有點涼 ·…· </h4><br/>
</c:if>
//5. 邏輯標籤<c:choose ><c:when test=""></c:when>...<c:otherwhise></c:otherwhise></c:choose>
<c:set var="score" value="90"></c:set>
<c:choose >
<c:when test="${score>=95}">A+</c:when>
<c:when test="${score>=90}">A</c:when>
...
<c:otherwhise>
<c:set var="msg" value="不及格"></c:set>
<c:out value="${msg}"></c:out>
</c:otherwhise>
</c:choose>
//6.迴圈標籤<c:forEach begin="1" end="4" step="2"></c:forEach>
<c:set var="info"
value=