《Java Web 程式設計與開發》讀書筆記——JSP程式設計基礎和JSP內建物件
本篇內容為讀馬月坤、趙全明兩位老師編著清華大學出版社出版的《Java Web 程式設計與開發》的讀書筆記。之前讀了一天的人民郵電出版社的《JSP程式設計慕課版》,可能是我沒有結合視訊的緣故,感覺效果不好,因而換了這本書。
有關HTML和JS的東西直接略過了。
JSP程式設計基礎
1、 因為JSP宣告中的變數是全域性變數,所以它可以在任何地方被使用。
2、 因為在JSP容器中,JSP會在執行前被轉化為Servlet,而對於每一個Servlet,在執行的時候通常只會產生一個例項,如果此時多個客戶端同時訪問某一個Servlet的全域性變數(例項變數),可能會引起多執行緒的問題,因此,在JSP中宣告變數、方法的時候要注意同步問題。
3、 所謂Scriptlet,其實就是插入到JSP程式中的Java程式碼段。在JSP中,可以在任何地方插入任何數量的Scriptlet,但是需要注意的是,Scriptlet不能相互巢狀。
4、 JSP表示式
其基本語法:<%=expression%>
(1) JSP表示式只能單獨出現,也就是說,不能再一對“<%”和“%>”之間出現多條語句;
(2) JSP表示式和普通的Java語句不同,不能用分號結束;
(3) JSP表示式的“<%=”、“%>”和expression只能在同一行上;
(4) “<%=”是一個完整的符號,中間不能有空格;
(5) 這個表示式必須能求職,表示式的值由伺服器負責計算,並將計算結果用字串的形式傳送到客戶端顯示;
(6) 表示式expression必須能夠轉換成字串形式。
5、/*看到這裡感覺整個檔案還是一個HTML檔案,只不過有的部分是需要伺服器計算然後把結果返回到客戶端來顯示的,Java程式碼就是伺服器端要執行的依據,不知道正確與否*/
JSP內建物件
1、 JSP的9個內建物件
內建物件 |
型別 |
描述 |
作用範圍 |
pageContext |
javax.servlet.jsp.PageContext |
代表當前正在處理的頁面中的所有物件 |
page |
request |
javax.servlet.http.HttpServletRequest |
封裝所有使用者請求 |
request |
response |
javax.servlet.http.HttpServletResponse |
JSP向客戶端傳送響應資料 |
page |
session |
javax.servlet.http.HttpSession |
跟蹤客戶訪問特定網路時間段的客戶資訊 |
session |
application |
javax.servlet.ServletContext |
表示所有使用者的共享資訊 |
application |
config |
javax.servlet.ServletConfig |
伺服器配置可以取得初始化引數 |
page |
out |
javax.servlet.jsp.JspWriter |
頁面輸出 |
page |
page |
java.lang.Object |
代表當前頁,取得當前頁的屬性和方法 |
page |
exception |
java.lang.Throwable |
代表當前頁中的所有異常 |
page |
2、 內建物件的作用範圍
在JSP中提供了4種屬性的作用範圍(scope)。所謂屬性的作用範圍,指的就是一個內建物件可以在多少個頁面中儲存並繼續使用。四種屬性範圍分別如下:
page:只在一個頁面中儲存屬性,跳轉之後無效(不管是否人為干預);
request:只在一次請求中儲存,伺服器跳轉之後依然有效(可以跨越多個頁面,但必須在一次請求之內,再次人為干預則無效);
session:再一次會話範圍中,無論何種跳轉都可以使用,但是新開啟的瀏覽器無法使用;
application:在整個伺服器上儲存,所有使用者或所有的web應用都可以使用。
3、 不管是在單一頁面中設定/取得屬性值還是跨頁面設定/取得屬性值,在取得屬性值時都要加入強制型別轉換。
4、 關於request屬性範圍的理解:request表示的是客戶端的請求,正常情況下,一次請求伺服器只會給予一次迴應,這時如果是伺服器端跳轉,請求的位址列沒有改變,也就是相當於迴應了一次;而如果位址列改變了,就相當於發出了第二次請求,則第一次請求的內容肯定就已經消失了,所以無法取得。
一個例子:requestDemo01.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
request.setAttribute("name","zqm");
request.setAttribute("password","123456");
%>
<jsp:forward page="requestDemo02.jsp"/>
</body>
</html>
requestDemo02.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String name =(String)request.getAttribute("name");
String password = (String)request.getAttribute("password");
%>
<h1>name:<%=name %></h1>
<h1>password:<%=password %></h1>
<a href = "requestDemo03.jsp">點選我進入到第三個頁面</a>
</body>
</html>
requestDemo03.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String name = (String)request.getAttribute("name");
String password = (String)request.getAttribute("password");
%>
<h1>name:<%=name %></h1>
<h1>password:<%=password %></h1>
</body>
</html>
執行截圖如下:
點選連結後:
由於這裡需要頁面瀏覽者第二次干預,所以和前兩個頁面不再是同一個請求,點選這個超連結無法取得前面設定的屬性值對。
5、 如果現在希望一個屬性在設定之後可以在任何一個與設定頁面相關的頁面中取得,就可以使用session屬性範圍,使用session設定屬性之後,不管是客戶端跳轉還是伺服器端跳轉,只要屬性設定了就可以取得。
6、 如果希望設定一個屬性,可以讓所有的使用者(每一個session)都能看得見,則可以降屬性範圍設定為application。/*session的意思為會議、階段,看來在這裡可以看做是一個使用者與伺服器的“會議”,這裡好像不太好描述,意會即可*/
7、 request內建物件是使用最多的一個物件,其主要作用是接受客戶端傳送來的請求資訊,如請求引數、傳送的頭資訊等。
request內建物件常用功能:獲取使用者輸入資訊、處理亂碼、獲得客戶端伺服器等的相關資訊。
8、 page物件代表JSP物件本身,或者說代表編譯後的Servlet物件,也就是JSP頁面對應的Servlet類的實現物件。
9、 pageContext物件是一個比較特殊的物件。它相當於頁面中所有其他物件功能的最大集大成者,即使用它可以訪問本頁面中所有其他物件,例如request、response以及out等。
10、 session物件表示目前個別使用者的會話狀態,用來識別每個使用者。session物件是一個JSP內建物件,它在第一個JSP頁面被裝載時自動建立,完成會話期管理。從一個客戶開啟瀏覽器並連線到伺服器開始,到客戶關閉瀏覽器離開這個伺服器結束,被稱為一個會話。當一個客戶訪問一個伺服器時,可能會在這個伺服器的幾個頁面之間反覆連線,反覆重新整理一個頁面,伺服器應當通過某種辦法知道這是同一個客戶,這就需要session物件。/*我們平時登入網銀網頁的時候好像就有這種體會*/
11、 當一個客戶首次訪問伺服器上的一個JSP頁面時,JSP引擎產生一個session物件,同時分配一個String型別的ID號,JSP引擎同時將這個ID號傳送到客戶端,存放在cookie中,這樣session物件和客戶之間就建立了一一對應的關係。當客戶再次訪問連線到該伺服器的其他頁面時,不再分配給客戶新的session物件,直到客戶關閉瀏覽器後,伺服器端該客戶的session物件才取消,並且和客戶的會話對應關係消失。當客戶重新開啟瀏覽器再連線到該伺服器時,伺服器為該客戶再建立一個session物件。有時,使用者可能會忘記退出登入或關閉瀏覽器,這時,往往需要制定會話持續時間,也就是沒有請求操作的持續時間,預設是30分鐘的過期時間。
12、 application物件開始於伺服器的啟動,直到伺服器關閉,在此期間,此物件將一直存在。在JSP伺服器執行時刻,僅有一個application物件,它由伺服器建立,也由伺服器自動清除,不能被使用者建立和清除。開發人員只能建立這個application物件的同步副本。 application物件可以儲存和獲取應用的有效屬性物件,獲取伺服器資訊,返回web應用名,返回指定檔案的MIME型別,獲取初始引數,獲取指定path的實際路徑,進行日誌管理。