1. 程式人生 > >GoF單例設計模式、Servlet

GoF單例設計模式、Servlet

GoF單例設計模式
第一章 GoF設計模式概述
1-1 什麼是設計模式
設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、程式碼設計經驗的總結。
使用設計模式的目的:為了程式碼可重用性、可維護性。

1-2 GoF概述
《Design Patterns: Elements of Reusable Object-Oriented Software》(即後述《設計模式》一書),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。這幾位作者常被稱為"四人組(Gang of Four)"。
1-3 Gof設計模式共多少種
23種
第二章 單例模式
2-1 單例模式概述
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類,一個類只有一個例項(只有一個物件)。
2-2 單例模式之餓漢式
在這裡插入圖片描述


2-3 單例模式之懶漢式
在這裡插入圖片描述
2-4 實際專案開發中的應用
實際專案開發使用 餓漢式
懶漢式會涉及到執行緒的安全性問題


Servlet
第一章Servlet初識
1-1 Servlet在web開發中的作用
在這裡插入圖片描述
servlet:接收請求,做出響應

1-2 Servlet的建立步驟
見程式碼註釋
1-3 Servlet家族繼承結構
在這裡插入圖片描述
1-4 Servlet中Service方法的應用
在這裡插入圖片描述
總結:service方法已經由父類幫我們寫好,就是用來根據請求方式分配請求的,我們不要對他進行重寫.

1-5 Servlet的生命週期(以及load-on-startup的用法)
☆☆☆☆☆
什麼是servlet的生命週期,表示的是servlet的物件從建立到銷燬的全過程.

(1) 啟動伺服器,servlet物件沒有建立.
(2) 當我們的瀏覽器發出請求,用到指定servlet的時候,servlet物件才建立.servlet物件在建立完畢後,是以單例的形式儲存在了伺服器的記憶體中.當第2~第n次訪問的時候就不重新建立物件了,而是使用第一次訪問建立的那個(單例).
(3) 當servlet物件建立完畢後,馬上呼叫init方法執行初始化操作.
(4) 我們以後的請求真正是由doGet/doPost方法來進行處理.
(5) 關閉伺服器,servlet物件銷燬.
(6) 如果只正常關閉伺服器,servlet物件在銷燬前,要呼叫destroy方法進行最後的處理工作.
(7) 加入load-on-startup可以更改servlet的建立時機,由以前的用到時才建立更改為啟動伺服器的時候就建立(從單例來考量,是由懶漢式轉為餓漢式)
(8) 注意:servlet是單例,但是是一種假單例.
真單例:new不出來第二個物件
假單例:我們用的是以單例的形式存在的物件,但是可以手動new出來其他物件.servlet在外部類new出來新物件沒有任何意義.

第二章web開發的常見問題
2-1伺服器啟動時報錯,如何進行錯誤排查
如果伺服器中沒有專案存在,啟動伺服器報錯,說明伺服器本身出現了問題.有可能是某些配置檔案被我們破壞掉.在某些情況下檔案被破壞掉了沒有辦法排查,所以最簡單的方式是從新解壓一份tomcat伺服器,重新整合到eclipse.

如果伺服器中有專案存在,啟動伺服器報錯,說明是專案的問題,就去檢視專案中的web.xml檔案配置有沒有錯誤.
(1) url-pattern前面沒加/
(2) servlet-name沒有匹配項
(3) servlet-class配置錯誤,伺服器啟動不報錯,但是訪問返回500響應碼

2-2修改哪些檔案,必須重新啟動伺服器
(1) 修改前端檔案,不用重新啟動伺服器
(2) 修改後端servlet檔案,不用重新啟動伺服器,但是需要等待java檔案重新編譯成class檔案重新載入的過程.
在本階段,老師在修改完servelt檔案之後,為了保證程式測試的正確性,每一次都會重新啟動伺服器.
(3) 修改web.xml檔案,必須重新啟動伺服器.
注意:我們在對專案進行移入移除的過程中,必須首先關閉伺服器.
2-3使用快捷方式建立Servlet類的方式
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述在這裡插入圖片描述

以上形式會快速的為我們搭建一個servlet類以及servlet相關配置
在以後的實際專案開發中,該形式只做第一個模板來使用.
使用該形式有一個非常大的弊端:每次生成servlet,web.xml中的註釋全都被幹掉了.

2-4使用run on server的方式快速釋出專案測試簡單應用
在這裡插入圖片描述
以上形式會自動的將專案部署到伺服器中,自動啟動伺服器,自動開啟eclipse中自帶的瀏覽器,自動輸入資源訪問地址,自動敲回車,顯示結果.
但是這種方式我們以後的實本際專案開發根就不用!!!
因為這種形式使用的是eclipse中自帶的瀏覽器,eclipse中自帶的瀏覽器很垃圾,測試簡單的應用還可以,一些相對複雜的應用測試不到效果.更重要的是,本來是錯誤的程式,eclipse中自帶的瀏覽器有可能會測試成功.
我們可以使用該形式,生成訪問路徑,然後將訪問路徑copy到我們本地的瀏覽器中進行測試,省掉了一個敲路徑的時間.
但是在本階段,不要使用這種形式,練習敲路徑!!!

2-5 copy專案及修改專案名的注意事項
在這裡插入圖片描述
2-6 web專案匯入jar包的方式及注意事項
在這裡插入圖片描述
將jar包複製貼上到WEB-INF/lib資料夾下之後,jar包會自動的構建到我們的專案中.
需要注意的是,我們將來的學習會在專案中匯入大量的jar包,每次匯入jar包後,需要看到jar包構建成功了,我們才能夠使用jar包中的類庫.
我們以後的jar包都需要存放在WEB-INF/lib下,自己建立的lib包就不能使用了.
WEB-INF/lib未來只存放jar包!!!
2-7清理開發環境及清理瀏覽器快取的方式
清理tomcat專案環境,將專案移除後,啟動一下空的伺服器,專案才能夠從webapps資料夾中徹底移除.
清除瀏覽器快取的方式
ctrl+shift+delete
在這裡插入圖片描述

2-8原有專案丟失tomcat開發環境,如何重新匯入
刪除tomcat的順序
先刪除 右鍵delete
在這裡插入圖片描述
然後刪除
在這裡插入圖片描述在這裡插入圖片描述

最後刪除
在這裡插入圖片描述
專案重新整合tomcat環境

在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

完成以上操作以後,tomcat的開發環境就回到專案中了
在這裡插入圖片描述
2-9實際專案開發中TODO的使用(tasks檢視的使用)

2-10 360瀏覽器的訪問問題
使用360安全瀏覽器
啟動伺服器後,由此瀏覽器第一次傳送的get方式的請求
doGet方法執行兩次

第三章get與post提交方式
3-1 get與post提交方式
http: get提交方式和post提交方式
get請求方式:
(1) 在瀏覽器地址輸入地址,敲回車訪問伺服器,為get請求方式,servlet中由doGet方法來處理請求.
(2) 點選超連結,連結到後臺servlet. 為get請求方式,servlet中由doGet方法來處理請求.
(3) 提交form表單, 為get請求方式,servlet中由doGet方法來處理請求.

post請求方式:
(1)提交form表單.method=”post”

3-2 請求引數的傳遞與接收

傳遞引數的方式:
url?key1=value2&key2=value2&key3=value3
例如
在這裡插入圖片描述
接收引數方式
在這裡插入圖片描述
作為提交表單操作
表單元素中的name屬性為key
我們提供的值為value

3-3 get提交和post提交的區別
get提交
(1) 引數傳遞
a. 顯示的將引數掛在url路徑的後面
b. 安全性 低
c. 大量引數的傳遞可能傳遞的不全
(2) 引數的中文的支援性
對於我們的示例,get請求提交的中文引數servlet接收到之後,顯示的仍然是中文,沒有出現亂碼.
但是以上結果,完全在於是我們的tomcat9的環境完美支援get請求中文引數的傳遞.
如果企業裡面使用的是較低版本的tomcat,那麼中文引數有可能會出現亂碼.
我們要為get請求方式設定utf-8的字元編碼
在tomcat conf/server.xml 6x行
URIEncoding=”UTF-8”就可以解決tomcat版本低get中文引數出現亂碼的問題
在這裡插入圖片描述

(3) 執行效率
get請求執行效率較高

post提交
(1) 引數傳遞
a. 引數沒有顯示的掛在url路徑的後面
(引數是以http協議請求體打包的形式進行傳遞)
b. 安全性 高
c. 不用擔心大量引數傳遞的問題(位址列不顯示,不用擔心超出瀏覽器位址列的字元數)
(2) 引數的中文的支援性
經過示例,post提交,中文引數出現了亂碼問題,servlet接收引數前,需要對接收的引數進行字元編碼處理.
在這裡插入圖片描述
以上程式碼僅針對post請求引數處理.
(3)執行效率
與get請求方式比較起來,執行效率相對較低.

3-4 實際專案開發中對於get和post提交方式的使用
在我們的實際專案開發中,對於get提交和post提交如何選擇:
如果不涉及到安全性問題,如果不涉及到大量的引數的傳遞問題,一律使用get方式提交效率較高,否則一律建立表單使用post方式提交.

在我們實際專案開發中,servlet模板習慣於這樣來改造:
在這裡插入圖片描述

第四章url-pattern的使用
4-1 url-pattern的表現方式
/abc/myServlet1.do:精確路徑匹配
/abc/:部分路徑匹配
/
:萬用字元匹配
.do:字尾名匹配
注意:
(1)
.do前面不加/
(2)/abc/.do的形式不存在
(3)abc/
.do的形式不存在
如果使用的是字尾名形式的匹配,只有一種形式 *.do

4-2 url-pattern的優先順序
如果瀏覽器發出的請求路徑與web.xml中的多個url-pattern都匹配,那麼只執行一個servlet來處理我們的請求.選擇哪個servlet來處理我們的請求完全在於url-pattern路徑的優先順序.

精確路徑匹配 > 部分路徑匹配 > 統配符匹配 >字尾名匹配

第五章響應流
5-1 響應流的建立和基本使用
使用響應流為瀏覽器做出響應
在這裡插入圖片描述

5-2 使用響應流響應中文資訊
在這裡插入圖片描述 5-3 練習:使用響應流響應學生資訊列表
domain:領域模型(實體類)
所有屬性都是私有的,所有的存取操作都是由setter和getter來操作的

5-4 實戰:完成登入操作,如果登入成功,則在頁面上列印學生資訊列表,如果登入失敗,則在頁面列印失敗資訊。
使用者表 tbl_user
id int 6
username varchar 255
password varchar 255

學生表 tbl_student
id varchar 255
name varchar 255
age int 3

第六章轉發和重定向
6-1 轉發程式碼示例
(1)轉發到普通頁面
(2)轉發到WEB-INF下面的頁面
(3)轉發到另一個servlet

6-2 重定向程式碼示例
(1)重定向到普通頁面
(2)重定向到WEB-INF下面的頁面
(3)重定向到另一個servlet

6-3 轉發和重定向原理
在這裡插入圖片描述
在這裡插入圖片描述
6-4 練習:使用Servlet做連續轉發和重定向的操作
在這裡插入圖片描述

第七章ServletContext物件(上下文物件)
7-1 上下文物件概述及生命週期
上下文物件是專案中的全域性管理者(上下文物件在專案中只有一個)
上下文物件可以應用在每一個servlet中,為每一個servlet提供相應的服務.
每一個servlet都可以隨時隨地的取得上下文物件並使用.
上下文物件的生命週期
建立:當伺服器啟動,伺服器會自動的為我們建立一個上下文物件,該上下文物件就是以單例的形式儲存在伺服器上.
銷燬:伺服器關閉,上下文物件銷燬.

7-2 上下文物件的取得方式
見程式碼註釋
7-3 上下文物件的常用方法
(1)獲得全域性初始化引數
getInitParameter(String key)
搭配web.xml中的配置

encoding
utf-8

(2)作為域物件存取資料
	在servlet中,域物件一共有3個,上下文是其中一個,域物件是用來做存取值操作的.不同的域物件,存值之後的取值範圍也是不同的.
	上下文域物件的取值範圍是3個域物件中最廣的.
	當我們將值儲存到上下文域中,只要上下文物件還在,那麼裡面的值就還在.
	application.setAttribute(String key,Object value)
	application.getAttribute(String key) Object
	application.removeAttribute (“key”)

(3)獲取專案釋出路徑
	getRealPath("/")

第八章ServletConfig物件
8-1 ServletConfig物件概述
ServletConfig物件是Servlet物件的配置物件.
Servlet物件在建立完畢後,系統會馬上為我們創建出來一個相應的ServletConfig物件作為Servlet物件的配置物件.

ServletConfig物件是可以有多個的(每有一個servlet物件,就有一個ServletConfig物件)
在我們實際專案開發中,如果是對於企業級的專案開發,那麼ServletConfig物件肯定用不到.
ServletConfig物件主要是針對於將來的表現層框架的開發而使用的.

8-2 ServletConfig物件取得方式
ServletConfig config = this.getServletConfig();

8-3 ServletConfig物件常用方法
(1)獲得web.xml中配置的servlet-name
String name = config.getServletName();
System.out.println(name);*/

(2)根據key獲取value
		getInitParameter(String key)

/ServletConfig config = this.getServletConfig();
String encoding = config.getInitParameter(“encoding”);
System.out.println(encoding); //utf-8
request.setCharacterEncoding(encoding);
response.setContentType(“text/html;charset=”+encoding);
/
配合web.xml中的配置(注意配置在servlet-class的下方)
(3)取得上下文物件
ServletContext application=this.getServletConfig().getServletContext();
也可以寫成 ServletConfig config= this.getServletConfig();
8-4 搭配init方法的注意事項
在這裡插入圖片描述
super.init(config)不能去掉,如果去掉了這一行,config物件就不能建立了.上下文物件也拿不到了.

第九章web開發中文亂碼解決方式總結
9-1 get請求引數字元編碼的處理
conf/server.xml 6x 埠號
URIEncoding=”UTF-8”

9-2 post請求引數字元編碼的處理
request.setCharacterEncoding(“UTF-8”);

9-3響應流字元編碼的處理
response.setContentType(“text/html;charSet=utf-8”);

9-4通過jdbc往資料庫裡面存值的字元編碼的處理
要求資料
後臺 utf-8
資料庫安裝的過程中,配置的是UTF-8環境
建立的資料庫為UTF-8的格式

如果遇到安裝資料庫的過程中,配置的不是UTF-8的環境.
應急的措施
url? characterEncoding=UTF-8
在這裡插入圖片描述

9-5通用處理方式
String str11= new String(str1.getBytes(“ISO8859-1”),“utf-8”);

第十章web站點的預設歡迎頁的設定
歡迎頁的設定指的是,當我們的請求傳送到伺服器,路徑僅僅只是顯示到專案,沒有指定具體的資源路徑,那麼我們配置的歡迎頁會自動的響應出來.
在這裡插入圖片描述

• 我們可以同時配置多個歡迎頁,按照從上向下的配置順序,有哪個,就響應哪個.
• 不論我們配置的歡迎頁是一種什麼型別的頁面,我們習慣於將歡迎頁命名為index,因為index是我們web開發中一種約定俗成的初始頁名字的叫法.
在這裡插入圖片描述
(3)歡迎頁我們一般來講都是配置的是前端資源,但是也可以配置成為後端資源.
在這裡插入圖片描述
這種用法很少見,但是如果要這麼用,注意路徑的寫法,前面不加/
(4)常見應用方式
將歡迎頁設定為index.html,然後index.html頁面載入完畢後,再自動跳轉到login.html
第十一章Servlet執行緒的安全性問題
在我們的實際專案開發中,沒有需求會使用到servlet中的成員變數,所以為了執行緒的安全性問題,我們不使用成員變數就可以了.以後不用servlet中的成員變量了,使用區域性變數,每根執行緒來了以後,區域性變數為每一個執行緒獨立的分配一份,
絕對不會出現執行緒安全問題。

第十二章 實戰
12-1驗證登入,當我們登入失敗,提示"使用者名稱密碼不匹配",3秒以後跳轉到登入頁面,若登入成功,可檢視學生列表
方式1:
常見的響應頭-refresh
響應頭格式:
refresh:秒數;url=跳轉的路徑
設定定時重新整理:
response.setHeader(“refresh”,“3;url=/z1/login.htm”);

這種方式只能搭配響應流的形式來完成
	response.setHeader("refresh","3;url=/z1/index.html");
	PrintWriter out = response.getWriter();
	out.write("<html>");
	out.write("<body>");
	out.write("3秒鐘之後,跳轉到登入頁");
	out.write("</body>");
	out.write("</html>");

方式2:在頁面完成頭資訊的設定

首先重定向到一個倒計時頁面
response.sendRedirect("/z1/ts.html");

在該頁面設定
<meta http-equiv="refresh" content="3;url=/z1/index.html">

登入成功後代碼重構
在這裡插入圖片描述
12-2統計在伺服器啟動期間,系統被訪問的總次數
int count = 0;
當用戶登入成功後,訪問總次數加1
count++;

count應該儲存在哪?
根據我們的需求,第一次登入之前,count變數就應該有了,當伺服器關閉,count變數銷燬.
上下文域

12-3 完成註冊操作
對於tbl_user表的新增操作

12-4 完成對於學生資訊列表的刪除操作
delete from tbl_student where id=?