Web初步認識:
軟體架構:
C/S:客戶端/服務器端
B/S:瀏覽器/服務器端
資源分類:
靜態資源:所有用戶訪問后,得到的展示結果都一樣
靜態資源可以直接被瀏覽器決議
如:html、css、JavaScript
動態資源:每個用戶訪問后,得到的結果可能不一樣,
動態資源需要先轉換為靜態資源,再回傳給瀏覽器
如:Servlet/jsp,php,asp…
網路通信三要素:
- IP:電子設備(計算機)在網路中的唯一標識,
- 埠:應用程式在計算機中的唯一標識,0~65536
- 傳輸協議:
基礎傳輸協議:
TCP:安全協議,三次握手,速度稍慢
UDP:不安全協議,速度快
Web服務器軟體:
服務器:安裝了服務器軟體的計算機
服務器軟體:接收用戶的請求,處理請求,做出回應,
Web服務器軟體:
主要功能是提供網上資訊瀏覽服務
常見的JAVA相關的Web服務器軟體:
WebLogic: Oracle公司,大型JavaEE服務器,支持所有的JavaEE規范,收費的,
WebSphere: IBM公司,大型JavaEE服務器,支持所有的JavaEE規范,收費的,
JBOSS: JBOSS公司,大型JavaEE服務器,支持所有的JavaEE規范,收費的,
Tomcat: Apache基金組織,中小型JavaEE服務器,僅僅支持少量的JavaEE規范,開源、免費的,
Servlet:
概念:server apple,運行在服務器端的小程式
Servlet就是一個介面,定義了Java類被瀏覽器訪問到(tomcat識別)的規則
將來我們自定義一個類,實作Servlet介面,復寫方法,
基本快速使用:
- 創建JavaEE專案
- 定義一個類,實作Servlet介面
- 實作介面中的抽象方法
- 配置Servlet:
web.xml中配置

Tomcat執行Servlet的原理:
1.當服務器接收到客戶端瀏覽器的請求后,會決議請求URL路徑,獲取訪問的Servlet的資源路徑
2.查找web.xml檔案,是否有對應的<url-pattern>標簽體內容
3.有則找到對應的<servlet-class>全類名
4.tomcat會將位元組碼檔案加載進記憶體并創建其物件
5.呼叫其方法

Servlet中的生命周期:
被創建:執行init方法,只執行一次(一般用于加載資源)
Servlet什么時候被創建?
- 默認情況下,第一次被訪問時創建
- 可以配置指定Servlet的創建時機
在<servlet>標簽下配置
1.第一次被訪問時,創建
*<load-on-startup>的值為負數
2.在服務器啟動時,創建
*<load-on-startup>的值為0或正數
inint方法只執行一次,說明一個Servlet在記憶體中只存在一個物件,Servlet是單例的
注意:多個用戶同時訪問時,可能存在執行緒安全問題,盡量不要在Servlet中定義成員變數,即使定義了成員變數,也不要對修改值
提供服務:執行service方法,執行多次
每次訪問Servlet時,Service方法都會被呼叫一次,
被銷毀:執行destroy方法,只執行一次
Servlet被銷毀時執行,服務器關閉時,Servlet被銷毀
Servlet3.0注解配置:
好處:
支持注解配置,可以不需要web.xml,
在實作類上使用@WebServlet注解,進行配置
@WebServlet("資源路徑")
Servlet體系結構:
Servlet --- 介面
|繼承
GenericServlet --- 抽象類
|繼承
HttpServlet --- 抽象類
GenericServlet:
該類將Servlet介面中的方法做了默認空實作,只將service()方法作為抽象
將來定義Servlet類時,可以繼承GenericServlet類,實作service方法即可,
HttpServlet:
該類對Http協議的封裝,簡化操作,
使用步驟:
- 定義類繼承HttpServlet
- 復寫doGet/doPost方法
Servlet相關配置:
urlpartten:Servlet訪問路徑
一個Servlet可以定義多個訪問路徑@WebServlet({"url1","url2"})
路徑定義規則:
1./xxx:一般路徑
2./xxx/xxx:多層路徑,目錄結構
3.*.do:*通配符
Http協議:
概念: Hyper Text Transfer Protocol 超文本傳輸協議,規定了 瀏覽器和萬維網之間互相通信的規則
傳輸協議:定義了客戶端和服務器端通信時,發送資料的格式
特點:
- 基于TCP/IP的高級協議
- 默認埠號:80
- 基于請求/回應模型:一個請求一個回應
- 無狀態的:每次請求之間相互獨立,不能獨立資料
歷史版本:
1.0版本:每一次請求回應都會建立新的連接
1.1版本:會復用請求
請求訊息:客戶端發送給服務器端的資料
回應訊息:服務器端發送給客戶端的資料
請求訊息資料格式:
請求行:
格式:
| 請求方式 | 請求url | 請求協議/版本 |
請求方式:
HTTP協議有七種請求方式,常用的兩種:
GET:
1. 請求引數在請求行中
2. 請求的URL長度有限制
3. 不太安全
POST:
1. 請求引數在請求體中
2. 請求的URL長度無限制
3. 相對安全
請求頭:客戶端瀏覽器告訴服務器一些資訊
請求頭名稱:請求頭值
常見的請求頭:
User-Agent:瀏覽器告訴服務器,訪問服務器使用的瀏覽器版本資訊
可以在服務器端獲取該頭的資訊,解決瀏覽器的兼容性問題
Referer: 告訴服務器,當前請求從哪里來的,
作用:防盜鏈、統計作業
請求空行:
空行,做分隔POST請求頭和請求體的作用
請求體:(正文)
封裝POST請求訊息的請求引數的
回應訊息資料格式:
回應行:
格式:
| 協議/版本 | 回應狀態碼 | 狀態碼描述 |
| HTTP/1.1 | 200 | OK |
回應狀態碼:服務器告訴客戶端瀏覽器本次請求和回應的一個狀態
狀態碼均由3位數字組成
狀態碼分類:
- 1xx:服務器接收客戶端訊息,但沒有接收完成,等待一段時間后,發送1xx狀態碼
- 2xx:成功,代表:200
- 3xx:重定向,
- 302(重定向) 表示臨時性重定向,訪問一個Url時,被重定向到另一個url上
- 304(訪問快取)標識訪問快取,代表上次的檔案已經被快取了,還可以繼續使用
- 4xx:客戶端錯誤,
- 404(請求路徑沒有對應的資源)
- 405(請求方式和對應的方法(doPost/doGet))
- 5xx:服務器端錯誤,
- 500(服務器內部出現例外)
回應頭:
請求頭名稱:請求頭值
常見的回應頭:
Content-Type:服務器告訴客戶端本次回應訊息體的資料格式及編碼格式
Content-disposition:服務器告訴客戶端以什么格式打開回應體資料
常用的值:
in-line:默認值,在當前頁面展示
attachment;filename=XXX:以附件格式打開回應體,用于檔案下載
回應空行:空格、分隔作用
回應體:傳輸的資料
Request物件:
request物件繼承體系結構
servletRequest --介面
|繼承
HttpServletRequest --介面
|實作
org.apache.catalina.connector.RequestFacade --類(Tomcat)
request功能:
獲取請求訊息資料:
獲取請求行資料:
例:GET / serlvet/deom01?name=zhangsan HTTP/1.1
常用方法:
獲取虛擬目錄:serlvet
getContextPath()
獲取請求的URI/URL:
getRequestURI():serlvet/deom01
getRequestURL():http://locahost/serlvet/deom01
URL:統一資源定位符
URI:統一資源識別符號
獲取請求頭資料
方法:
getHeader(String name):通過請求頭名稱獲取請求頭的值
Enumeration<String> getHeaderNames():獲取所有的請求頭名稱
獲取請求體資料
請求體:只有PSOT請求方式,才有請求體,在請求體中封裝了POST請求的請求引數
步驟:
1.獲取流物件
BufferedReader getReader():獲取字符輸入流
ServletInputStream getInputStream():獲取位元組輸入流
2.再從流物件中拿資料
獲取請求引數通用方式:get/post通用(常用)
String getParameter(String name):根據引數名稱獲取引數值
String[] getParameterValues(String name):根據引數名稱獲取引數值的陣列
Enumeration<String> getParameterNames():獲取所有請 求的引數名稱
Map<String,String[]> getParameterMap():獲取所有引數的Map集合
常見問題:
中文亂碼問題:
get方式:Tomcat8 已經將get方式亂碼問題解決了
post方式:中文資料會亂碼
解決:獲取引數前,設定request編碼

請求轉發(forword):一種在服務器內部的資源跳轉方式
步驟:
- 通過request物件獲取請求轉發器物件:
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher物件來進行轉發:
forward(ServletRequest request Servletponse reponse)
特點:
- 瀏覽器地址欄路徑不發生變化
- 只能轉發到當前服務器內部資源中
- 轉發是一次請求,可以使用request域物件共享資料
共享資料:
域物件:一個有作用范圍的物件,可以在范圍內共享資料
request域:代表一次請求的范圍,一般用于請求轉發的多個資源中共享資料
方法:
void setAttribute(String name,Object obj):存盤資料
Object getAttribute(String name):通過鍵獲取值
void removeAttribute(String name):通過鍵移除鍵值對
獲取ServletContext物件:
ServletContext getServletContext()
Response物件:
功能:設定回應訊息
設定回應行:
格式: HTTP/1.1 200 OK
設定狀態碼:
setStatus(int sc)
設定回應頭:
setHeader(String name,String value)
設定回應體:
使用步驟:
1.獲取輸出流
字符輸出流:PrintWriter getWriter()
默認編碼:ISO-8859-1
位元組輸出流:ServletOutputStream getOutputStream()
2.使用輸出流,將資料輸出到客戶端瀏覽器
亂碼問題:
獲取流之前設定流的編碼以及告訴瀏覽器回應體使用的編碼:
setContentType("text/html;charset=utf-8");
重定向:redirect (資源跳轉的方式)
sendRedirect(String name);
重定向的特點:
- 地址欄發送變化
- 重定向可以訪問其他站點(服務器)的資源
- 重定向是兩次請求,不能使用request域物件共享資料
ServletContext物件:
是一個全域物件, 服務器會給每一個專案(工程)都創建一個ServletContext物件
獲取ServletContext物件:
1.通過request物件:getServletContext()
2.通過HttpServlet獲取:getServletContext()
功能:
獲取MIME型別(檔案下載):
MIME型別:在互聯網通信程序中定義的一種檔案資料型別
格式:大型別/小型別 例: text/html image/jpeg
獲取String getMimeType(String file):
通過file名獲取對應的MIME型別,
域物件:共享資料
ServletContext物件范圍:共享所有用戶所有請求的資料
void setAttribute(String name,Object obj):存盤資料
Object getAttribute(String name):通過鍵獲取值
void removeAttribute(String name):通過鍵移除鍵值對
getRealPath(String Path):獲取檔案真實(服務器)路徑
會話技術:
會話:一次會話中包含多次請求和回應
一次會話:瀏覽器第一次給服務器發送請求,會話建立,直到一方斷開為止,
功能:共享資料
方式:
客戶端會話技術: Cookie
服務器端會話技術: Session
Cookie:
概念:客戶端會話技術,將資料保存到客戶端瀏覽器
基本使用步驟:
1.創建Cookie物件,系結資料:
new Cookie(String name,String value)
2.發送Cookie物件:
response.addCookie(Cookie cookie)
3.獲取Cookie,獲取資料:
request.getCookies():回傳Cookie陣列
實作的原理:
基于回應頭set-cookie和請求頭cookie傳輸實作
cookie的細節問題:
一次可不可以發送多個cookie?
可以
可以創建多個Cookie物件,使用response呼叫多次addCookie
cookie在瀏覽器中保存多長時間?
- 默認情況下,當瀏覽器關閉后,Cookie資料被銷毀
- 持久化存盤:
setMaxAgr(int seconds):
正數:將Cookie資料寫到硬碟,持久化存盤,
負數:默認值,跟隨瀏覽器關閉而死亡
0:洗掉Cookie資訊
cookie能否存盤中文?
- 在Tomcat 8 之前,cookie中不能直接存盤中文資料,
需要將中文資料轉碼 ---> 一般采用URL編碼
- 在Tomcat 8之后,cookie支持中文資料
但是特殊符號資料還是需要采用URL編碼
cookie共享問題?
- 在一個服務器中,部署多個Web專案,那么這些專案中Cookie能否共享?
- 默認情況下cookie不能共享
- setPath(String Path):設定cookie的獲取范圍,默認為當前的虛擬目錄
如果要多個專案共享,則將path設定"/"即可
- 不同的服務器之間Cookie能否共享?
- 默認情況下cookie不能共享
- setDomain(String path):
如果設定一級域名相同,那么多個服務器之間cookie可以共享
例: setDomain(".bai.com")
那么 tieba.baidu.com 和news.baidu.com中cookie可以共享
Cookie的特點和作用:
特點:
- Cookie存盤資料是在客戶端瀏覽器
- 瀏覽器對于單個Cookie大小有限制(4kb)以及同一個域名下總Cookie數量也有限制(20個)
作用:
- cookie一般用于存盤少量的不太敏感的資料(不安全)
- 在不登陸的情況下,完成服務器對客戶端的身份識別
Session:
概念:服務器端會話技術,在一次會話的多次請求間共享資料,將資料保存在服務器端的物件中,
基本使用步驟:
- 獲取HttpSession物件:
request.getSession()
- 使用HttpSession物件:
HttpSession物件:
Object getAttribute(String name):獲取
void setAttribute(String name,Object value):設定
void removeAttribute(String name):洗掉
原理:Session的實作是依賴于Cookie的,
Cookie中會有一個 JSESSIONID = XXXXX;
細節上的問題:
客戶端關閉后,服務器不關閉,兩次獲取Session是否為同一個?
- 默認情況下,不是
- 可以通過創建Cookie,鍵設定為 JSESSIONID,設定存活時間使Cookie持久化保存,
客戶端不關閉,服務器關閉,兩次獲取Session是否為同一個?
不是同一個,但是要確保資料不丟失
- session的鈍化:
在服務器正常關閉之前,將session物件序列化到硬碟上
- session的活化:
在服務器啟動后,將session檔案反序列化到記憶體中的session物件即可,
注意:在Tomcat中鈍化和活化均已實作,而在IDEA工具中只實作了鈍化,在服務器重新開啟時Work目錄會被洗掉然后重新創建所以無法實作活化操作,
Session什么時候被銷毀?
- 服務器關閉
- session物件呼叫invalidate(),自我銷毀
- session默認失效時間-->30分鐘
也可以通過tomcat中的web.xml組態檔中修改
Session的特點:
- session用于存盤一次會話的多次請求的資料,存盤在服務器端
- Session可以存盤任意型別,任意大小的資料
Session與Cookie的區別?
- Session存盤資料在服務器端,Cookie存盤資料在客戶端
- Session沒有資料大小限制,Cookie有限制
- Session資料安全,Cookie相對于不安全
Filter:過濾器
概念:當訪問服務器的資源時,過濾器可以將其請求攔截下來,完成一些特殊的功能
作用:一般用于完成通用的操作,如:登錄驗證、統一編碼處理、敏感字符過濾…
基本快速使用步驟:
- 定義一個類,實作介面Filter
- 復寫方法
- 配置攔截路徑
web.xml配置
注解配置
過濾器執行流程:
- 執行過濾器
- 執行放行后的資源
- 回來執行過濾器放行下的代碼
過濾器宣告周期方法:
- init:在服務器啟動后,創建Filter物件,然后呼叫該方法,只執行一次,用于加載資源
- doFilter:每次請求被攔截資源時,會執行,執行多次
- destroy:在服務器關閉后,Fileter物件銷毀,服務器正常關閉,呼叫該方法,執行一次,釋放資源
過濾器配置詳解:
攔截路徑配置:
- 具體資源路徑:/index.jsp 訪問該資源時,過濾器才執行
- 攔截目錄: /user/* 訪問/user下的所有資源時,過濾器都會執行
- 后綴名攔截: *.jsp 訪問所有后綴名jsp資源時,過濾器都會執行
- 攔截所有: /* 訪問所有資源時,過濾器都會執行
攔截方式配置:資源被訪問的方式
1. .注解配置:
設定dispatcherTypes屬性:
- REQUEST:默認值,瀏覽器直接請求資源
- FORWORD:轉發訪問資源
- INCLUDE:包含訪問資源
- ERROR:錯誤跳轉資源
- ASYNC:異步訪問資源
2. web.xml配置:
設定<dispatcher>標簽即可
過濾器鏈(配置多個過濾器):
攔截順序:
如果有兩個過濾器:過濾器1和過濾器2
1執行---> 2執行 ---> 資源執行 ---> 2執行 ---> 1執行
過濾器先后順序:
- 注解配置:
按照類名的字串比較規則比較,值小的先執行
如 AFilter 和 Bfilter A先執行
- web.xml配置:
誰定義在上面,誰先執行
Listener:監聽器
概念:web的三大組件之一
事件監聽機制:
- 事件: 一件事情
- 事件源: 事件發生的地方
- 監聽器: 一個物件
- 注冊監聽: 將事件、事件源、監聽器系結在一起,當事件源上發生某個事件后,執行監聽器代碼
ServletContextListener:監聽ServletContext物件的創建和銷毀
方法:
- contextDestroyed(ServletContextEvent sce):ServletContext物件被銷毀前呼叫該方法
- contextInitialized(ServletContextEvent sce):ServletContext物件創建后會呼叫該方法
步驟:
- 定義一個類實作ServletContextListener介面
- 復寫方法
- 配置
web.xml中:
<listener>
<listener-class>類引數</listener-class>
</listener>
指定初始化引數:<context-param>
注解:
@WebListener 即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302057.html
標籤:其他
上一篇:【LFS 系列】從零開始 DIY Linux 系統:(五)構建臨時系統 - Linux-3.19
下一篇:upload-labs通關記錄
