1. 程式人生 > >Servlet + (JSP、EL表示式、JSTL標籤庫)的 資料流轉

Servlet + (JSP、EL表示式、JSTL標籤庫)的 資料流轉

兩個Servlet之間的資料流轉:靠的是作用域
作用域是資料流轉的載體

  • 用request舉例
    傳統方式:在jsp介面中使用java指令碼段

servlet的流程:

  1. 設定請求編碼格式
    req.setCharacterEncoding("utf-8");
  2. 設定響應編碼格式
    resp.setContentType("text/html;charset=utf-8");
  3. 獲取請求資訊
    String msg = req.getParameter("msg")
  4. 處理請求資訊
    System.out.println("根據"+msg+"與資料庫進行資料互動...");
  5. 響應處理結果
    進行資料流轉
    //普通字串的流轉
    req.
    setAttribute("msg1","msg1普通字串的流轉"); //物件型別 User user = new User(1, "閃電", "打電動"); req.setAttribute("user",user); //集合型別 /*--------------------List集合----------------------------------------*/ //List集合 //儲存普通字串 List<String> list1 = new ArrayList<String>(); list.add("沙妖str"); list.add("雪妖str"
    ); list.add("火人str"); req.setAttribute("listStr", list1); //儲存物件 List<User> list2 = new ArrayList<User>(); User user2 = new User(2, "美隊", "打電動", new Address("美國")); User user3 = new User(3, "鋼鐵俠", "打電動", new Address("美國")); list.add(user2); list.add(user3); req.setAttriute("listObj", list2); /*---------------------Map集合----------------------------------------*/ //Map集合 //儲存普通字串 Map<String, String> map1 = new HashMap<String, String>(); map.put("k1", "北京str"); map.put("k2", "上海str"); map.put("k3", "廣州str"); req.setAttribute("mapStr", map1); //儲存物件 Map<String, User> map2 = new HashMap<String, User>(); map2.put("ok1", new User(3, "成龍", "打電動")); map2.put("ok2", new User(4, "小玉""打電動")); map2.put("ok3", new User(5, "特魯""吃")); map2.put("ok4", new User(6, "老爹""古老魔法")); req.setAttribute("mapObj", map2);
    請求轉發
    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=