肥桃的Java學習記錄22:JSP

Archimontao發表於2020-10-22

1.什麼是JSP

JSP全名為Java Server Pages,中文名叫java伺服器頁面,其根本是一個簡化的Servlet設計,它 是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。JSP技術有點類似ASP技術,它是在傳統的網頁HTML檔案(.htm,.html)中插入Java程式段(Scriptlet)和JSP標記(tag),從而形成JSP檔案,字尾名為 (.jsp)。 用JSP開發的Web應用是跨平臺的,既能在Linux下執行,也能在其他作業系統上執行。
JSP將網頁邏輯與網頁設計的顯示分離,支援可重用的基於元件的設計,使基於Web的應用程式的開發變得迅速和容易。

.html 靜態頁面(包含固定的頁面內容)
.jsp 動態頁面(頁面資料可以動態更新,支援巢狀java程式碼和html程式碼)

2.JSP為什麼會出現

1.servlet展示資訊的不方便,引入了JSP。
2.JSP本質上也是一個servlet
3.JSP就是在HTML頁面中嵌入了java程式碼。

3.JSP中如何巢狀java程式碼

小指令碼(<% java程式碼%>)
宣告標籤 <%!變數或者方法宣告%>
表示式標籤 <%= 表示式%> 在頁面上顯示的效果
程式程式碼標籤 <%java程式碼%> 頁面上動態展示內容

page指令:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<body>
<%! int i=10;%><!--成員變數-->
<%! public void show(){}%> <!--成員方法-->
<%=i%> <!--輸出變數值-->
</body>

如果把一個資料存在request域中,取值操作如下:
在這裡插入圖片描述
jsp中的註釋

<!-- html註釋內容,檢視原始碼時能看到 -->
<%-- jsp註釋,檢視頁面原始碼時看不到 --%>

在Tomcat設定中可設定成隨時Update 這樣可以不同頻繁重啟。
在這裡插入圖片描述

4.JSP的原理

當瀏覽器訪問http://localhost:8080/day9_1/index.jsp。伺服器發現字尾為.jsp,它會根據路徑找到index.jsp文 件,會將index.jsp翻譯成index_jsp.java檔案,對這個java檔案進行編譯,產生一個index_jsp.class檔案,將class 檔案載入執行。將JSP翻譯成java檔案,它是將JSP中的所有的HTML程式碼通過流進行輸出,也就是說最終翻譯成class,被虛擬機器載入,它本質是servlet,它就會往回響應,響應回去就是把JSP中的HTML程式碼以流的方式寫回瀏覽器。所以在JSP中展示出了HTML程式碼在這裡插入圖片描述

5.JSP的內建物件

JSP中一共預先定義了9個這樣的物件,分別為:request、response、session、application、out、pagecontext、config、page、exception

1、request物件

request 物件是 javax.servlet.httpServletRequest型別的物件。 該物件代表了客戶端的請求資訊,主要用於接受通過HTTP協議傳送到伺服器的資料。(包括頭資訊、系統資訊、請求方式以及請求引數等)。request物件的 作用域為一次請求。

2、response物件

response 代表的是對客戶端的響應,主要是將JSP容器處理過的物件傳回到客戶端。response物件也具有作用域,它只在JSP頁面內有效。所屬型別:HttpServletResponse

3、session物件

session 物件是由伺服器自動建立的與使用者請求相關的物件。伺服器為每個使用者都生成一個session物件,用於儲存該使用者的資訊,跟蹤使用者的操作狀態。session物件內部使用Map類來儲存資料,因此儲存資料的格式為“Key/value”。 session物件的value可以使複雜的物件型別,而不僅僅侷限於字串型別。HttpSession

4、application物件

application 物件可將資訊儲存在伺服器中,直到伺服器關閉,否則application物件中儲存的資訊會在整個應用中都有效。與session物件相比,application物件生命週期更長,類似於系統的“全域性變數” ServletContext
區別:
request:單次請求
session:瀏覽器訪問期間(會話期間)
application:伺服器啟動期間,所存的資料可以跨瀏覽器

5、out 物件

用於在Web瀏覽器內輸出資訊,並且管理應用伺服器上的輸出緩衝區。在使用 out 物件輸出資料時, 可以對資料緩衝區進行操作,及時清除緩衝區中的殘餘資料,為其他的輸出讓出緩衝空間。待資料輸出完畢後,要 及時關閉輸出流。
示例:

out.print("<script type='text/javascript'>alert('使用者名稱不存在');location.href='index.jsp'</script>");

6、pageContext 物件

pageContext 物件的作用是取得任何範圍的引數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等物件。pageContext物件的建立和初始化都是由容器來完成的,在JSP頁面中可以直接使用pageContext物件。

7、config 物件

config 物件的主要作用是取得伺服器的配置資訊。通過 pageConext物件的 getServletConfig() 方法可以獲取一個config物件。當一個Servlet 初始化時,容器把某些資訊通過config物件傳遞給這個 Servlet。 開發者可以在web.xml 檔案中為應用程式環境中的Servlet程式和JSP頁面提供初始化引數。

//將image路徑轉換成伺服器端的路徑
String url= config.getServletContext().getRealPath("/image");
<h1>url=<%=url %></h1>

8、page 物件

page 物件代表JSP本身,只有在JSP頁面內才是合法的。 page隱含物件本質上包含當前 Servlet介面引用的變數,類似於Java程式設計中的 this 指標。

9、exception 物件

exception 物件的作用是顯示異常資訊,只有在包含 isErrorPage=“true” 的頁面中才可以被使用,在一般的JSP頁面中使用該物件將無法編譯JSP檔案。excepation物件和Java的所有物件一樣,都具有系統提供的繼承結構。exception 物件幾乎定義了所有異常情況。在Java程式中,可以使用try/catch關鍵字來處理異常情況; 如果在JSP 頁面中出現沒有捕獲到的異常,就會生成 exception 物件,並把 exception 物件傳送到在page指令中設定的錯誤頁面中,然後在錯誤頁面中處理相應的 exception 物件。
(1)先在可能發生錯誤的頁面中新增errorPage屬性:

<%@ page pageEncoding="utf-8" errorPage="error.jsp"
contentType="text/html;charset=UTF-8" language="java" %>

(2)在error.jsp頁面中設定isErrorPage=“true” 的屬性(使用exception物件之前,需要先將當前頁面設定成錯誤頁面)

<%@ page language="java" isErrorPage="true" import="java.util.*" pageEncoding="UTF-8"%>

jsp的作用域:
pageContext -> request -> session -> application
當前頁面 單次請求有效 當前會話期間 伺服器執行期間有效

6.JSP的指令

JSP指令用來設定整個JSP頁面相關的屬性,如網頁的編碼方式和指令碼語言。 語法格式如下:

<%@ directive attribute="value" %>

directive:指令名稱 attribute 屬性名 value:屬性值

指令名稱描述
page定義網頁依賴屬性,比如指令碼語言、error頁面、快取需求等等
include包含其他檔案
taglib引入標籤庫的定義

1、Page指令

Page指令為容器提供當前頁面的使用說明一個JSP頁面可以包含多個page指令Page指令的語法格式:

<%@ page attribute="value" %>
屬性名屬性值描述
languagejava解釋該JSP檔案時採用的語言,一般為java語言,預設為java
extends任何類的全名編譯該JSP檔案時繼承哪個類,JSP為Servlet,因此當指明繼承普通類時需要 實現Servlet的init、destroy等方法
import任何包名、類名引入該JSP中用到的類、包等,import是唯一可以宣告多次的page指令屬性,一個import可以引用uogelei,中間用英文逗號隔開<%@ page import=包名.類名,包名.類名%>
sessiontrue、false該JSP內是否內建Session物件,如果為true,則內建Session物件,可直接 使用,否則反之,預設為true
autoFlushtrue, false是否執行快取,如果為true,則使用out.println()等方法輸出的字串並不是立刻到達客戶端伺服器的,而是暫時存到快取裡,快取滿了或者程式行完畢或者執行out.flush()操作時才到客戶端,預設為true。
buffernone 或者數字KB指定快取大小,當autoFlush設為true時有效,例如<%@ page buffer=10kb%>
isThreadSafetrue, false是否執行緒安全,如果為true,則執行多個執行緒同時執行該jsp程式,否則只執行一個執行緒,其餘執行緒等待,預設為false
isErrorPagetrue, false指定該頁面是否為錯誤顯示頁面,如果為true,則該JSP內建有一個Exception物件exception,可直接使用,否則沒有,預設為false
errorPage某個JSP頁面的相對路徑指明一個錯誤頁面,如果該JSP程式丟擲一個未捕捉的異常,則轉到errorPage指定的頁面,errorPage指定的頁面通常isErrorPage屬性為true,且內建的exception物件為未捕捉的異常
contentType有效的文件型別客戶端瀏覽器根據該屬性判斷文件型別,例如 HTML格式為text/html、純文 本 格 式 為 text/plain 、 JPG 圖 像 為 image/jpeg 、 GIF 圖 像 為 image/gifWORD文件為application/msword,該屬性常跟著charset設 置編碼一起,作用是通知伺服器和瀏覽器都使用同一個碼錶
pageEncodingUTF- 8,ISO-8859-1等

2、Include指令

JSP可以通過include指令來包含其他檔案。被包含的檔案可以是JSP檔案、HTML檔案或文字檔案。包含的檔案就好像是該JSP檔案的一部分,會被同時編譯執行。
Include指令的語法格式如下:

<%@ include file="檔案相對 url 地址" %>

include 指令中的檔名實際上是一個相對的 URL 地址。
如果您沒有給檔案關聯一個路徑,JSP編譯器預設在當前路徑下尋找。

3、Taglib指令

JSP API允許使用者自定義標籤,一個自定義標籤庫就是自定義標籤的集合。Taglib指令引入一個自定義標籤集合的定義,包括庫路徑、自定義標籤。

<%@ taglib uri="uri" prefix="" %>

uri屬性確定標籤庫的位置,prefix屬性指定標籤庫的字首(可自定義)。

7.JSP出現的狀態碼

狀態碼訊息描述
100Continue只有一部分請求被伺服器接收,但只要沒被伺服器拒絕,客戶端就會延續這個請求
101Switching Protocols伺服器交換機協議
200OK請求被確認
201Created請求時完整的,新的資源被建立
202Accepted請求被接受,但未處理完
300Multiple Choices一個超連結表,使用者可以選擇一個超連結並訪問,最大支援5個超連結
301Moved Permanently被請求的頁面已經移動到了新的URL下
302Found被請求的頁面暫時性地移動到了新的URL下
303See Other被請求的頁面可以在一個不同的URL下找到
400Bad Request伺服器無法識別請求
403Forbidden禁止訪問所請求的頁面
404Not Found伺服器無法找到所請求的頁面
405Method Not Allowed請求中所指定的方法不被允許
500Internal Server Error請求不完整,伺服器遇見了出乎意料的狀況
501Not Implemented請求不完整,伺服器不提供所需要的功能
502Bad Gateway請求不完整,伺服器從上游伺服器接受了一個無效的響應
503Service Unavailable請求不完整,伺服器暫時重啟或關閉
504Gateway Timeout閘道器超時
505HTTP Version Not Supported伺服器不支援所指定的HTTP版本

8.EL表示式

1、什麼是Expression Language

表示式語言最初定義於JSTL1.0部分
在JSP2.0中,EL從JSTL中剝離出來,放置在JSP規範中,稱為JSP2.0規範的一部分在JSP中使用EL表示式,可以簡化物件和變數的訪問是EL表示式

2、EL表示式語法

語法格式:${需要展示資訊的名字} 注意:
當表示式沒有指定變數或者物件的範圍時,
那麼容器會依次從pageContext—>request—>session—>application中查詢該變數或物件,我們可以通過隱含 物件獲得指定作用域的值:
pageScope物件,用於獲取當前頁面的屬性值requestScope物件,用於獲取請求範圍的屬性值sessionScope物件,用於獲取會話範圍的屬性值applicationScope物件,用於獲取程式範圍的屬性值語法:
${requestScope.key}

3、EL中基礎操作符

術語定義
算術型+ 、-、 * /(div) 除 、 %(mod) 餘數
邏輯型and、&&、or、||、!、not
關係型==、eq、!=、ne、、gt、<=、le、>=、ge。可以與其他值進行比較,或與布林型、字串型、整型或浮點型文字進行比較。
EmptyEmpty操作符是一個字首操作符用於判斷一個值是否為null或者為empty如String str = “”; ${empty str} 返回值為true;
條件型A ?B :C。根據 A 賦值的結果來賦值 B 或 C。

示例:

單個變數:${a+10}<br> 單個變數:${s}<br>
單個物件:${key.屬性名}
//物件型別
Users u=new Users(); u.setName("王老五");
u.setPass("abc"); pageContext.setAttribute("u1",u); user.name=${u1.name} user.pass=${u1.pass}
// list集合物件:

List list=new ArrayList();
list.add("劉能");
list.add(30);
list.add(u); pageContext.setAttribute("list2",list); list1=${list2[0]}<br/> list2=${list2[1]}<br/> list3=${list2[2].pass}<br/>

// map集合:
k1=${map1.k1}<br>
k2=${map1.k2.username}--- ${map1.k2.password}

判斷變數是否有值或是否存在:${empty key值} List list2=new ArrayList(); list2.add("aa");
request.setAttribute("list222",list2);

判斷list中是否有資料:${empty list222}

9.JSTL

1、什麼是JSTL

JSP標準標籤庫(JSTL)是一個JSP標籤集合,它封裝了JSP應用的通用核心功能。
JSTL支援通用的、結構化的任務,比如迭代,條件判斷,XML文件操作,國際化標籤,SQL標籤。 除了這些,它還提供了一個框架來使用整合JSTL的自定義標籤。
根據JSTL標籤所提供的功能,可以將其分為5個類別。核心標籤 格式化標籤 sql標籤 xml標籤 jstl函式(後面詳細解釋)

2、JSTL的作用和語法格式

作用:簡化jsp頁面編寫程式碼語法格式:
1.下載 jakarta-taglibs-standard-1.1.2.zip 包並解壓,將 jakarta-taglibs-standard-1.1.2/lib/ 下的兩個 jar 檔案:standard.jar 和 jstl.jar 檔案拷貝到 /WEB-INF/lib/ 下。
2.在JSP頁面中引入<%@ taglib prefix=”頁面使用的名稱” uri=”功能範圍的路徑”%>

功能範圍Uri字首
corehttp://java.sun.com/jsp/jstl/corec
i18nhttp://java.sun.com/jsp/jstl/fmtfmt
sqlhttp://java.sun.com/jsp/jstl/sqlsql
xmlhttp://java.sun.com/jsp/jstl/xmlx
functionshttp://java.sun.com/jsp/jstl/functionfn

3、核心標籤

①核心標籤是最常用的 JSTL標籤。引用核心標籤庫的語法如下:

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

② 核心標籤的分類
表示式操作 out、set、remove、catch 流程控制 if、choose、when、otherwise 迭代操作 forEach、forTokens
URL操作 import、param、url、redirect Set標籤
<c:set> 主要用來將變數儲存至JSP範圍中 或是JavaBean的屬性或Map物件中

名稱說明是否必須寫預設值
Value要被儲存的值
var存入的變數名稱
scopevar變數的JSP範圍Page
targetJavaBean或Map物件
property指定target物件的屬性

<c:out>主要用來顯示資料的內容

名稱說明是否必須寫預設值
value需要顯示出來的值
default如果value的值為null,則顯示default的值
escapeXml是否轉換特殊字元,如:<轉換成 & lt;True

<c:remove> 主要負責移除變數

名稱說明是否必須寫預設值
Var欲移除的變數名稱
Scopevar變數的jsp範圍Page

<c:if> 主要用於進行if判斷,如果為true,則輸出標籤體中的內容

名稱說明是否必須寫預設值
Test表示式的結果為true,則執行體內容,false則相反
var如果 用來儲存test運算的結果(true或false)
scopeVar變數的JSP範圍page

<c:choose>,<c:when>,<c:otherwise> 作用相當於if-else

名稱說明必須預設
test如果表示式的結果為true,則執行體內容,false則相反

<c:forEach> 迴圈控制,它可以將陣列,集合(Collection)中的成員循序瀏覽一遍。

名稱說明必須預設值
var用來存放現在指定的成員
items被迭代的集合物件
varStatus用來存放現在指的相關成員資訊
begin開始的位置0
end結束的位置最後一個成員
step每次迭代的間隔數1

4、格式化標籤

1、fmt:formatDate 作用:將日期型別格式化為指定模式的字串屬性
value:將要被格式化的資料
pattern:格式化的模式,與SimpleDateFormat的引數設定一樣
var:格式化後的字串所要存放的變數,若不指定var,則會將格式化的結果直接顯示在頁面scope:變數存放的域屬性空間,預設page
type:其取值為date、time、both,表示給出的value是日期、時間、還是兩者都包含,預設是date
2、fmt:parseDate 作用:用於將指定字串轉化為日期型別
Value伺服器獲取的時間Pattern:轉換的格式

Var:頁面顯示的變數
3、fmt:formatNumber 按照指定格式對數字進行格式化屬性
maxIntegerDigits:整數部分最多的位數
minIntegerDigits:整數部分最少的位數maxFrctionDigits:小數部分最多的位數minFrctionDigits:小數部分最少的位數var: 存 儲 格 式 化 結 果 的 變 量 scope:var屬性的作用域
integerOnly:是否只解析整型數true或者浮點數false

相關文章