JavaWeb06_JSP、EL 表示式、JSTL標籤庫
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。
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。
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]}