第六天:JSP EL表達式 jstl标簽
1.Jsp原理:
Jsp本質上是一個Servlet,項目中的jsp頁面在使用者第一次通路的時候會被翻譯成java類,這個java(org.apache.jasper.runtime.HttpJspBase)類會繼承httpServlet
什麼是JSP:
* Java Server Pages(Java伺服器端的頁面)
為什麼要學習JSP:
* SUN公司推出的Servlet自身有缺陷,沒有辦法與ASP,PHP進行競争.推出了動态網頁開發技術JSP.
使用JSP:
* JSP = HTML + Java代碼 + JSP自身的東西.
執行JSP的過程:
* JSP翻譯成Servlet,編譯這個Servlet的類,生成class檔案.得到執行.
JSP的腳本
- <%! %> 聲明腳本 :翻譯成Servlet中的成員内容. 定義變量,方法,類. -- 不建議.
- <% %> 代碼塊腳本 :翻譯成Servlet中service方法内部的内容. 定義類,變量
- <%= %> 輸出腳本 :翻譯成Servlet中service方法中out.print();
JSP的注釋
- HTML的注釋 :<!-- 注釋 -->
在jsp翻譯的時候會被翻譯到servelt代碼中使用輸出語句輸入到浏覽器中
- Java代碼的注釋 :// 單行注釋 /*多行注釋*/ /** 文檔注釋 */
- JSP的注釋 :<%-- JSP的注釋 --%>
内容不會被翻譯
JSP的指令:
- 指令的文法:
<%@ 指令名稱 屬性名稱=”屬性值” 屬性名稱=”屬性值” ...%>
JSP中有三個指令:page指令, include指令, taglib指令.
- JSP中page指令:<%@ page %> -- 設定JSP的.
* language :JSP腳本中使用的語言.現在隻能寫java.
* contentType :設定浏覽器打開這個JSP的時候采用的預設的字元集的編碼.
* pageEncoding :設定檔案儲存到本地硬碟,以及生成Servlet後,Servlet儲存到硬碟上的編碼.
* import :在JSP中引入類對象.但是import可以出現多次.
* isELIgnored :設定在JSP中是否忽略EL表達式.預設值是false不忽略.
* errorPage :設定錯誤友好頁面的提示.指定目前頁面出錯之後跳轉的錯誤頁面
* isErrorPage :通過這個設定顯示JSP的錯誤資訊. 如果值設定成true,那麼在這個頁面中可以直接使用一個execption對象擷取錯誤資訊
- JSP中的include指令:訓示JSP包含其他的頁面.
<%@ include file="logo.jsp" %>
<%@ include file="menu.jsp" %>
<h1>BODY部分</h1>
<%@ include file="footer.jsp" %>
- JSP中的taglib指令:訓示JSP引入标簽庫.
<%@ taglib uri="标簽的URI的路徑" prefix="标簽的别名" %>
JSP的内置對象(重點)
- JSP的内置對象:在JSP中可以直接使用的對象.
- JSP中有9大内置對象:
- page内置對象 :真實對象是Object,就是JSP翻譯成Servlet後的類的引用.
- out内置對象 :out和response.getWriter是不是同一個對象?差別是什麼?
* 不是out真實對象JspWriter ,response獲得Writer是PrintWriter.
- pageContext内置對象 :
* 獲得其他的8個内置對象 :編寫通用性代碼或者架構的時候.
* 向JSP的四個域中存取資料 :
JSP的四個域範圍:
* PageScope:目前頁面中有效.pageContextPageContext
* RequestScope:一次請求範圍.requestHttpServletRequest
* SessionScope:一次會話範圍.sessionHttpSession
* ApplicationScope:應用範圍applicationServletContext
2. EL表達式:
Jsp + javaBean(jsp開發模式一)
問題:前端代碼和伺服器代碼耦合(項目難以維護)
要解決這個問題,我們就要盡量的在jsp頁面中少寫java代碼(jsp中不要寫java代碼)
EL的概述
- 什麼是EL:
- 為什麼學習EL:
* 簡化JSP的代碼,而且減少<%%>
- 使用EL表達式:
* 文法:${ EL表達式 }
1.1 EL的常用功能:
1.1.1 EL擷取資料
注意:El表達式隻能擷取域對象中的資料
PageContext
Request
Session
Application(ServeltContext)
1.存取是普通的單值資料
<%=pageContext.getAttribute("name") %>
<%=request.getAttribute("name") %>
<%=session.getAttribute("name") %>
<%=application.getAttribute("name") %>
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
注意:
1. 通過域對象調用方法如果值沒有擷取的是null對象,El表達式擷取資料如果沒有擷取到傳回””
2. ${ name }類似findAttribute("name") 先從pageContext域中查找,沒找到去request域中查詢,沒有找到去session域中找,沒有找到就去application域中找
2. 擷取數組(List集合)的資料
${ arrs[0] }
${ arrs[1] }
${ arrs[2] }
${ arrs[3] }
3. 擷取Map集合的資料
4. 擷取對象的資料
${ user.id }
${ user.username }
${ user.password }
注意:el表達式擷取對象屬性值的時候,如果屬性找不到,會直接報錯
5. 擷取對象的集合的資料
<%
User user1 = new User(1,"aaa","123");
User user2 = new User(2,"bbb","123");
User user3 = new User(3,"ccc","123");
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
pageContext.setAttribute("userList", userList);
%>
${ userList[0].id } - ${ userList[0].username } - ${ userList[0].password }<br/>
${ userList[1].id } - ${ userList[1].username } - ${ userList[1].password }<br/>
${ userList[2].id } - ${ userList[2].username } - ${ userList[2].password }<br/>
pageContext 用來擷取request對象 在jsp頁面中動态擷取項目的虛拟路徑
${pageContext.request.contextPath}
3.JSTL
1.1 JSTL的概述
- 什麼是JSTL:
- 為什麼學習JSTL:
* JSTL和EL結合 替換頁面中<%%>
- JSTL版本:
* JSTL1.0 :不支援EL表達式.
* JSTL1.1 和 1.2 :支援EL表達式.
- JSTL的标簽庫:包含了五類标簽.
* core(核心标簽),fmt(國際化标簽),xml(XML标簽),sql(SQL标簽),fn(JSTL提供EL函數庫)
- 使用JSTL:
* 1.引入JSTL的相關的依賴jar包.
* 在頁面中引入标簽庫.<%@ taglib uri=”” prefix=””%>
JSTL的核心标簽的用法
* if--條件判斷
* forEach---循環周遊
例子:
<%--
Created by IntelliJ IDEA.
User: lz
Date: 2021/12/17
Time: 12:29
To change this template use File | Settings | File Templates.
--%>
<%--jsp指令聲明--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--EL表達式擷取資料 域對象可以共享資料,他們都有setAttribute和getAttribute方法用來設定資料和擷取資料--%>
${requestScope.username}
<%--jstl是要結合el表達式的--%>
<c:if test="${not empty username}">
歡迎您,${username}
</c:if>
<c:forEach var="i" begin="0" end="11" step="2">
${i} <br/>
</c:forEach>
</body>
</html>
package com.swlz.jsp;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servletJSPDemo1")
public class ServletJSPDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("username","jackson");//域對象(共享資料)
request.getRequestDispatcher("/user.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
今日學習感受:人生的路很長,需要自己一點一滴去慢慢創造屬于自己的人生,選擇自己的人生,自己既然選擇了一條路,無論如何都要堅持下去,加油,追夢人!!!最後一句話:天生我材必有用!!!!