JavaWeb基礎知識筆記
1.基本概念
前言
- web開發
- web,網頁如:www.baidu.com
- 靜態web:html,css
- 提供給所有人看的,資料始終不會變化
- 動態web:
- 千人千面,淘寶
- 技術棧:Servlet/JSP,ASP,PHP
- 在java中,動態web資源開發的技術統稱為javaweb
- 網路通訊三要素
- IP:電子裝置在計算機網路中唯一的識別符號
- 埠:應用程式在計算機中唯一的標識 0~65536
- 傳輸協議:規定了資料的傳輸規則
- tcp udp
web應用程式
- web應用程式:可以提供瀏覽器訪問的程式;
- a.html,b.html... ...多個web資源可以被外界訪問,對外界通過服務
- 任何一個資源或者頁面都存在於某一臺計算機上
- URL-統一資源定位符
- 統一的web資源會被放在同一個資料夾下,web應用程式--->通過Tomcat:伺服器,啟動
- 一個web應用又多個部分組成:(靜態web,動態web)
- html,css,js
- jsp,servlet
- java程式
- jar包
- 配置檔案(properties)
- web應用程式編寫完畢後,提供給外界訪問需要一個伺服器來統一管理;
靜態web
-
*.htm
,*.html
為網頁字尾,通過網路進行讀取客戶端---->伺服器---->.html
-
靜態web的缺點
- web頁面無法動態更新
- 無法和資料庫互動(資料無法持久化,使用者無法互動)
動態web
-
頁面動態展示:千人千面
客戶端---->webserver plugin---->webserver---->file system
| |
動態web資源jsp/servlet----->資料庫
-
缺點
- 動態web資源出現錯誤,需要重新編寫後臺程式,重新發布
-
優點
- 動態更新,與資料庫互動,資料持久化
2.web伺服器
-
web伺服器
-
伺服器:安裝了伺服器軟體的計算機
-
伺服器軟體:接受使用者請求,處理請求,作出響應
-
web伺服器:可以部署web專案,處理請求,做出響應
-
伺服器是一種被動操作,用來處理使用者的一些請求和給使用者一些響應;
-
-
技術流派:
- ASP 微軟:
- 最早流行的,在html中嵌入yeweudaima入了vb指令碼,ASP+COM
- 在ASP中,業務程式碼繁多,維護困難
- 使用C#語言
- iis伺服器
- PHP
- 開發速度快,功能強大,跨平臺,程式碼簡單
- 無法承載大訪問情況(侷限性)
- JSP/Servlet
- sun公司主推的B/S架構
- 基於java語言
- 可以承載三高問題帶來的影響
- ASP 微軟:
TOMcat
-
配置
-
部署專案的方式
-
直接將專案放到webapps目錄下即可
- /name:專案的訪問路徑---->虛擬目錄name
- 簡化部署:將專案打包成一個war包,將war包放置到webapps目錄下
- war包會自動解壓縮
-
配置conf/server.xml檔案
-
在
<Host>
標籤體中配置<Context docBase="專案路徑" path="虛擬目錄">
-
-
在conf\Catalina\localhost建立任意名稱的xml檔案,在檔案中編寫
<Context docBase="專案路徑">
- 建立的xml檔名稱就是虛擬目錄
-
-
靜態專案和動態專案
-
目錄結構
-
java動態專案的目錄結構
-
專案根目錄
-
WEB-INF目錄
- web.xml:web專案的或許配置檔案
- classes目錄:放置位元組碼檔案
- lib目錄:放置專案依賴的jar包
-
-
-
-
-
Servlet:server applet
- 概念:執行在伺服器端的小程式
- servlet就是一個介面,定義了java類被瀏覽器訪問到(tomcat識別的規則)
-
定義一個型別實現Servlet方法
-
快速入門:
-
定義一個類實現Servlet介面
-
實現介面中的方法
-
配置Servlet
-
web.xml檔案新增對映
<servlet> <servlet-name>demo01</servlet-name> <servlet-class>com.km.Servletstudy01.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo01</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
-
-
執行原理:
-
當伺服器接收到客戶端瀏覽器的請求之後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
-
查詢web.xml檔案,是否有對應的
<url-pattern>
標籤體內容 -
如果有,則找對應的
<servlet-class>
全類名 -
tomcat會將位元組碼檔案載入進記憶體,並建立其物件
-
呼叫其方法
-
-
-
Servlet中的方法
-
被建立:執行init方法,只會執行一次
-
預設情況時,第一次被訪問時,Servlet被建立
-
指定Servlet的建立時機
-
Servlet的init的方法只執行一次,說明其在記憶體中只有一個物件,是單例的,存線上程安全問題,對於定義在Servlet中的成員變數避免修改其值
<load-on-startup>num</load-on-startup> <!--第一次被訪問的時候建立num為負整數-->
-
-
提供服務:執行service
-
被銷燬:只有正常關閉才會執行destory方法
/** * 初始化方法 * 在Servlet建立時執行,只會執行一次,第一次訪問的時候執行 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { } /** * 獲取ServletConfig物件 * ServletConfig:Servlet的配置物件 * @return */ @Override public ServletConfig getServletConfig() { return null; } /** * 提供服務 * 每次servlet被訪問時,執行,執行多次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hello"); } /** * 獲取Servlet的一些資訊,版本,作者 * @return */ @Override public String getServletInfo() { return null; } /** * 伺服器被正常關閉的時候執行,只會執行一次 */ @Override public void destroy() { }
-
在Servlet3.0以上版本中,可以免去配置web.xml檔案通過
@WebServlet()
進行配置String name() default ""; String[] value() default {}; String[] urlPatterns() default {};//虛擬目錄 @WebServlet({"/test","/test2"})//一個註解配置的例項
-
在idea中為每一個專案配置了一份單獨的tomcat的配置檔案,在啟動記錄可以檢視,工作空間中的web專案使用第二種部署模式
<Context docBase="專案路徑">
-
在工作空間專案和tomcat部署的web專案中,tomcat真正訪問的是tomcat部署的web專案
-
WEB-INF目錄下的資源不能被瀏覽器直接訪問
-
-
Servlet的體系結構
-
Servlet----介面
|
-
GenericServlet----抽象類:將Servlet介面中除service()的其他方法做了預設空實現,定義Servlet時通過繼承GenericServlet | 秩序實現Servlet()方法即可
-
HttpServlet----抽象類:對http協議進行了封裝、簡化,通過繼承HttpServlet複寫doGET/doPOST方法
-
-
Servlet相關配置
- urlPartten:Servlet訪問路徑
- 一個Servlet可以定義多個訪問路徑:@webServlet({"/url1","/url2","/url3"})
- 路徑的定義規則
- /XXX
- /XXX/XXX:多層路徑,目錄結構
- *.do
- urlPartten:Servlet訪問路徑
HTTP
-
概念:Hyper Text Transfer Protocal、超文字傳輸協議
- 定義了客戶端和伺服器端通訊時,傳送資料的格式
-
特點:
- 基於TCP/IP的高階協議
- 預設埠號:80
- 基於請求/響應模型:一次請求對應於一次響應
- 無狀態的:每次請求之間相互獨立的,不能互動資料
-
歷史版本:
- 1.0版本:每一請求都會建立一個新的連線
- 1.1版本:複用連線
-
請求訊息的資料格式:
-
請求行
-
請求方式 請求url 請求協議/版本
GET /java_02_Servlet_war_exploded/ HTTP/1.1
-
請求方式:
- HTTP協議有七種,常見的有兩種
- GET:
- 請求引數在請求行中
- 請求的url長度有限制
- POST:
- 請求引數在請求體中
- 請求的url長度長度沒有限制
- 相對安全
- GET:
- HTTP協議有七種,常見的有兩種
-
-
請求頭:客戶端告訴瀏覽器的一些資訊
Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 DNT: 1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.51 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://localhost:8080/java_02_Servlet_war_exploded/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cookie: JSESSIONID=C07083980CC487F745690FAD6B70DA9F; Idea-501a323b=997da08b-cdc4-4b00-b142-bfaff8717b82
- 格式:請求頭名稱:請求頭值
- 常見的請求頭:
- User-Agent:告知伺服器使用的瀏覽器版本,伺服器可以獲取該頭訊息,解決瀏覽器相容性問題
- Accept-Encoding:可接受的壓縮包格式
- Accept-Language:可接受的語言
- Connection: keep-alive:可以複用連線
- Referer:告知伺服器連結的來源
- 防止盜鏈
- 統計工作
-
請求空行
- 空行,用於分隔POST請求的請求行於請求體
-
請求體(正文)
- 封裝POST請求訊息的請求引數
-
Request
-
Request和Response物件的原理
- Request和Response物件由伺服器來建立
- Request物件用於獲取請求訊息
- Respond物件用於設定響應訊息
-
Request:獲取請求訊息
-
Request物件的繼承體系結構
Servlet----介面
|
HttpServletRequest----介面
|
RequestFacade----由Tomct實現的類
-
-
Request功能
-
獲取請求訊息資料
-
獲取請求行資料
http://localhost:8080/java_study/user/demo1?name=Carl+Jones
- String getMethod():獲取請求資料---->GET/POST
- (*)String getContextPath:獲取虛擬目錄---->/java_study
- String getServletPath():獲取Servlet路徑---->/user/demo1
- String QueryString():獲取get方式的請求引數---->name=Carl+Jones
- (*)String getRequestURI():獲取請求URI---->/java_study/user/demo1
- String getRequestURI():獲取請求URL---->http://localhost:8080/java_study/user/demo1
- URL:統一資源定位符---->中華人民共和國
- URI:統一資源識別符號---->共和國(Uniform Resource Identifier)
- String getProtocal():獲取協議及版本
- String getRemoteAddr():獲取客戶端IP
-
獲取請求頭資料
- (*)String getHeader(String name):通過請求頭的名稱獲取請求頭的值
- Enumeration
getHeaderNames():獲取所有的請求頭名稱
-
獲取請求體資料
- 請求體只有POST請求方式才會有請求頭,請求體中封裝了POST請求的請求引數
- 步驟:
- 獲取流物件
- BufferedReader getReader():獲取字元輸入流,只能操作字元資料
- ServletInputStream getInputStream():獲取位元組輸入流,可以操作所有型別的資料
- 再從流中獲取資料
- 獲取流物件
-
其他功能:
-
獲取請求引數通用方式:POST,GET都可以使用
-
String getParameter(String name):根據引數獲取請求引數值
-
String[] getParameterValues(String name):根據引數獲取請求引數值的陣列---->用於複選框
-
Enumeration
getParameterNames():獲取所有請求引數的名稱 -
Map<String,String> getParameterMap():獲取所有引數的map集合
-
中文亂碼問題:
-
get方式:tomcat 8將get方式的亂碼問題解決了
-
post方式:會亂碼、解決方式設定request的編碼
request.setCharacterEncoding("utf-8")
-
-
-
請求轉發:一種在伺服器內部的資源跳轉方式
- 步驟
- 通過request物件獲取請求轉發器物件:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher物件來進行轉發:forward(ServletRequest request,ServletRespons respons)
- 特點
- 瀏覽器路徑欄路徑不會發生改變
- 只能轉發到伺服器內部的資源
- 多個資源間使用同一個請求
- 步驟
-
共享資料
- 域物件:一個有作用範圍的物件,可以在範圍內共享資料
- request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共享資料
- 方法:
- void setAttribute(String name,Object obj):儲存資料
- Object getAttribute(String name):通過鍵獲取值
- void removeAttribute(String name):移除資料
- 方法:
-
獲取ServletContext
- ServletContext getServletContext()
-
BeanUtils工具類,簡化資料封裝
-
JavaBean:標準的Java類
- 類必須被public修飾
- 必須提供空參的構造器
- 成員變數必須使用private修飾
- 提供公共的getter和setter方法
- 功能:封裝資料
-
概念:
- 屬性:getter和setter方法擷取之後的產物
- 例如:getUsername()---->Username---->username
- 屬性:getter和setter方法擷取之後的產物
-
方法:
- setProperty():操作屬性
- getProperty():操作屬性
- populate(Object obj,Map map):將map集合中的鍵值對資訊,封裝到對應的JavaBean物件中,鍵當作屬性的名稱,值當作屬性對應的值
-
-
-
-
Response
-
響應訊息的資料格式
-
響應行
- 組成:協議/版本 響應狀態碼 狀態碼描述
- 響應狀態碼:伺服器告知的客戶端瀏覽器本次請求和響應的一次狀態
- 狀態碼為三位數字
- 分類:
- 1xx,伺服器接收客戶端訊息但沒有接收完全,等待一段時間後傳送1xx狀態碼確認客戶端
- 2xx,成功
- 3xx,重定向 302重定向 304訪問快取
- 4xx,客戶端錯誤,404客戶端請求的資源錯誤沒有對應的資源,405請求方式沒有對應的方法... ...
- 5xx,伺服器端錯誤 500伺服器內部出現異常
-
響應頭
- 格式:頭名稱:值
- Content-Type:告知客戶端本次響應體的格式
- content-disposition:告知客戶端開啟響應體資料的格式
- inline,預設值,在當前頁面開啟
- attachment,filename=xxx,以附件形式開啟響應體,檔案下載
-
響應空行
-
響應體
HTTP/1.1 200 Content-Type: text/html;charset=utf-8 Content-Length: 15 Date: Wed, 28 Oct 2020 02:25:31 GMT Keep-Alive: timeout=20 Connection: keep-alive <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陸介面</title> <style> div{ margin: auto; } </style> </head> <body> <div> <form action="/java_study/login" method="post"> <label for="username">使用者名稱</label><input type="text" name="username" id="username" placeholder="請輸入使用者名稱"><br> <label for="password">密碼:</label><input type="password" name="password" placeholder="請輸入密碼" id="password"><br> <input type="submit" value="登入"> </form> </div> </body> </html>
-
-
功能:設定響應訊息
- 設定響應行
- 格式:HTTP/1.1 200 OK
- 設定狀態碼:setStatus(int sc)
- 設定響應頭:
- setHeader(String name,String value)
- 設定響應體
- 1.獲取輸出流
- 字元流:PrintWriter getWriter()
- 位元組輸出流:ServletOutputStream getOutputStream()
- 2.使用輸出流,將資料輸出到客戶端
- 1.獲取輸出流
- 設定響應行
-
重定向:資源轉發的一種方式
方法一:
resp.setStatus(302); //設定響應狀態 resp.setHeader("location","/java_study/response01"); //設定響應頭,重定向訪問路徑
方法二:
resp.sendRedirect("/java_study/response01"); //簡單的重定向方法
-
與轉發的比較:
- 轉發:
- 轉發位址列路徑不變
- 轉發只能訪問當前伺服器下的資源
- 轉發是一次請求
- 可以使用request域共享資料
- 重定向:
- 轉發位址列路徑變化
- 可以訪問其他伺服器資源
- 轉發是兩次請求
- 不能共享資料
- 轉發:
-
路徑的寫法:
- 路徑的分類:
- 相對路徑:通過相對路徑不可以確定唯一資源
- 如./index.html,以.開頭./父目錄 ../爺目錄
- 絕對路徑:通過絕對路徑可以確定唯一的資源
- 如/java_study/response01,以/開頭
- 客戶端發出:需要加虛擬目錄,重定向也是客戶端路徑
- 伺服器端發出:不需要加虛擬目錄(如:轉發)
- 相對路徑:通過相對路徑不可以確定唯一資源
- 路徑的分類:
-
設定響應體
-
獲取流物件之前,設定流的預設編碼:IOS-8859-1(無法顯示中文),設定為其他編碼如"utf-8"
-
通知客戶端,伺服器傳送的響應體資料的編碼
resp.setContentType("text/html;charset=utf-8");
-