1. 程式人生 > 其它 >JavaWeb06_JSP、EL 表示式、JSTL標籤庫

JavaWeb06_JSP、EL 表示式、JSTL標籤庫

技術標籤:javawebjsp

JSP 本質上就是一個 Servlet,JSP 主要負責與使用者互動並將最終的介面呈現給使用者,它是一個HTML+JS+CSS+Java 的混合檔案。

當伺服器接收到一個字尾是 jsp 的請求時,將該請求交給 JSP 引擎去處理,每一個 JSP ⻚面第一次被訪問的時候,JSP 引擎會將它翻譯成一個 Servlet 檔案,再由 Web 容器呼叫 Servlet 完成響應。

單純從開發的⻆度看,JSP 就是在 HTML 中嵌入 Java 程式。

具體的嵌入方式有 3 種:

1、JSP 指令碼,執行 Java 邏輯程式碼

<% Java程式碼 %>

2、JSP 宣告:定義 Java 方法

<%!
	宣告Java方法
%>

3、JSP 表示式:把 Java 物件直接輸出到 HTML ⻚面中

<%=Java變數 %>

JSP的 9 個內建物件

1、request:表示一次請求,HttpServletRequest。
2、response:表示一次響應,HttpServletResponse。
3、pageContext:⻚面上下文,獲取⻚面資訊,PageContext。
4、session:表示一次會話,儲存使用者資訊,HttpSession。
5、application:表示當前 Web 應用,全域性物件,儲存所有使用者共享資訊,ServletContext。

6、config:當前 JSP 對應的 Servlet 的 ServletConfig 物件,獲取當前 Servlet 的資訊。
7、out:向瀏覽器輸出資料,JspWriter。
8、page:當前 JSP 對應的 Servlet 物件,Servlet。
9、exception:表示 JSP ⻚面發生的異常,Exception。

request 常用方法:
1、String getParameter(String key) 獲取客戶端傳來的引數。
2、void setAttribute(String key,Object value)通過鍵值對的形式儲存資料。
3、Object getAttribute(String key)通過 key 取出 value。

4、RequestDispatcher getRequestDispatcher(String path) 返回一個 RequestDispatcher 物件,該物件的 forward 方法用於請求轉發。
5、String[] getParameterValues() 獲取客戶端傳來的多個同名引數。
6、void setCharacterEncoding(String charset)指定每個請求的編碼。

response 常用方法:
1、sendRedirect(String path) 重定向,⻚面之間的跳轉。

轉發 getRequestDispatcher 和重定向 sendRedirect 的區別:
轉發是將同一個請求傳給下一個⻚面,重定向是建立一個新的請求傳給下一個⻚面,之前的請求結束生命週期。
轉發:同一個請求在伺服器之間傳遞,位址列不變,也叫伺服器跳轉。
重定向:由客戶端傳送一次新的請求來訪問跳轉後的目標資源,位址列改變,也叫客戶端跳轉。
如果兩個⻚面之間需要通過 request 來傳值,則必須使用轉發,不能使用重定向。


JSP 的4個內建物件作用域

page 作用域:對應的內建物件是 pageContext。只在當前⻚面有效。
request 作用域:對應的內建物件是 request。在一次請求內有效。
session 作用域:對應的內建物件是 session。在一次會話內有效。
application 作用域:對應的內建物件是 application。對應整個 WEB 應用。

網站訪問量統計示例:

<%
	Integer count= (Integer) application.getAttribute("count");
	if(count == null){
		count=1;
		application.setAttribute("count",count);
	}else{
		count++;
		application.setAttribute("count",count);
	}
%>
您是當前的第<%=count%>位訪客

EL 表示式

Expression Language 表示式語言,替代 JSP ⻚面中資料訪問時的複雜編碼,可以非常便捷地取出域物件(pageContext、request、session、application)中儲存的資料,前提是一定要先 setAttribute,EL 就相當於是在簡化 getAttribute

${變數名} 變數名就是 setAttribute 對應的 key 值。

1、EL 對於 4 種域物件的預設查詢順序:

pageContext -> request -> session -> application

按照上述的順序進行查詢,找到立即返回,在 application 中也無法找到,則返回 null

2、指定作用域進行查詢

pageContext:${pageScope.name}
request:${requestScope.name}
session:${sessionScope.name}
application:${applicationScope.name}

EL 執行表示式

${num1&&num2}
&& || ! < > <= <= ==
&& and
|| or
! not
== eq
!= ne
< lt
> gt
<= le
>= ge
empty 變數為 null,⻓度為0的String,size為0的集合

JSTL

JSP Standard Tag Library JSP 標準標籤庫,JSP 為開發者提供的一系列的標籤,使用這些標籤可以完成一些邏輯處理,比如迴圈遍歷集合,讓程式碼更加簡潔,不再出現 JSP 指令碼穿插的情況。
實際開發中 EL 和 JSTL 結合起來使用,JSTL 側重於邏輯處理,EL 負責展示資料。

JSTL核心標籤庫的使用
1、需要匯入 jar 包(jstl.jar 和 standard.jar)
2、在 JSP ⻚面開始的地方匯入 JSTL 核心標籤庫

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3、使用示例

<%
	List<User> list = new ArrayList<>();
	list.add(new User("blu",23));
	list.add(new User("kaka",12));
	pageContext.setAttribute("list", list);
%>
<table>
	<c:forEach items="${list}" var="user">
		<tr>
			<td>${user.name}</td>
			<td>${user.age}</td>
		</tr>
	</c:forEach>
</table>

JSTL 優點:
1、提供了統一的標籤
2、可以用於編寫各種動態功能

核心標籤庫常用標籤:

set:向域物件中新增資料(預設儲存的作用域是 pageContext,使用scope屬性指定作用域)

<%requset.setAttribute(key,value)%>

<c:set var="name" value="tom" scope="request"></c:set>

修改物件屬性(target 指定修改的目標物件,property 指定修改的目標屬性,value 指定修改的目標值):

<% 
	User user = new User(1,"張三",66.6,newAddress(1,"科技路"));
	request.setAttribute("user",user);
%>
<c:set target="${user}" property="name" value="李四"></c:set>

out:輸出(它和 EL 表示式直接輸出功能一樣,但它還可以使用 default 屬性指定預設值)

<%
	User user = new User("blu",23);
	request.setAttribute("user",user);
%>
<c:out value="${user.age}" default="未定義"></c:out>

${user.age}

remove:刪除域物件中的值

<c:remove var="name" scope="page"/>

catch:捕獲異常

<c:catch var="error">
	<%
		int a = 10/0;
	%>
</c:catch>

${error}

在這裡插入圖片描述
條件標籤:if choose

<c:set var="num1" value="1"></c:set>
<c:set var="num2" value="2"></c:set>
<c:if test="${num1>num2}">ok</c:if>
<c:if test="${num1<=num2}">fail</c:if>
<hr/>
<c:choose>
	<c:when test="${num1>num2}">ok</c:when>
	<c:otherwise>fail</c:otherwise>
</c:choose>

在這裡插入圖片描述
迭代標籤 foreach

begin:迭代開始下標
end:迭代結束下標
step:迭代步長(預設為1)
varStatus:狀態資訊(index:從0開始的下標,count:從1開始的序號)

<c:forEach items="${list}" var="str" begin="2" end="3" step="2" varStatus="sta">
	${sta.count}、${str}<br/>
</c:forEach>

JSTL格式化標籤庫

引入:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

使用示例:

<% request.setAttribute("date", new Date()); %>
	
${date}
<hr>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>

在這裡插入圖片描述


JSTL函式標籤庫

引入:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

使用示例:

<%
	request.setAttribute("info", "Hello, BLU!");
%>
	
${fn:contains(info, "BLU")}<br/>
${fn:startsWith(info, "He")}<br/>
${fn:endsWith(info, "U!")}<br/>
${fn:indexOf(info, ",")}<br/>
${fn:replace(info, "Hello", "Hi")}<br/>
${fn:substring(info, 0, 5)}<br/>
${fn:split(info,",")[0]}-${fn:split(info,",")[1]}

在這裡插入圖片描述