HTTP+Tomcat+Servlet+響應
HTTP
HTTP 超文字傳輸協議(Hyper Text Transfer Protocol ),一種網路協議。
-
協議的組成和過程
- HTTP協議由http請求和http響應組成。在瀏覽器輸入一個請求,瀏覽器將你的請求封裝成一個http請求傳送給伺服器,伺服器收到請求組響應資料封裝成一個http響應,返回給客戶端。
-
抓包分析
使用chrome自帶的工具,可以看到資料相互傳送的具體過程。
-
-
http請求
-
get請求
請求行:請求的方法為get請求
本地的地址:host:localhost:8080
connection:keep-alive 連線方式:長連線
瀏覽器通知伺服器,當前請求來自何處。如果是直接訪問,則不會有這個頭。
常用於:防盜鏈
Referer: http://localhost:8080/BigData/a.html
post請求
-
Http響應
常用響應狀態碼
200 請求成功
302 重定向
304 讀取本地快取檔案
404 請求的頁面不存在
500 服務端程式錯誤
Tomcat
-
伺服器
- 伺服器是一個管理資源併為使用者要提供服務的計算機軟體,伺服器的本質就是普通的電腦中安裝了相關的服務軟體。tomcat就是一個web應用伺服器
-
web2資源
- 在web應用伺服器內部,能夠讓外界進行訪問的資源都叫web資源。圖片,js,css,視訊等。
-
web應用伺服器
- tomcat:是apache開源組織下的開源免費的中小型web伺服器,支援Javaee中的servlet和jsp規範
- tomcat 的實際作用就是通過HTTP協議規範讓使用者訪問存在與伺服器內部的資源。
-
Tomcat目錄結構
-
bin中放的都是可執行的指令碼程式 啟動指令碼 startup.bat 停止指令碼 shutdown.bat
-
conf存放的是配置資訊檔案 server.xml核心配置檔案:可以設定Tomcat埠,編碼格式,web應用的釋出資訊
-
tomcatusers.xml使用者許可權配置檔案:用於設定使用者的分組和使用者的密碼
-
web.xml web專案預設配置檔案,可以配置預設路徑,配置tomcat預設servlet
-
lib 依賴庫,tomcat和web專案中需要使用的jar包,如jsp-api.jar 和 servlet-api.jar
-
logs日誌資料夾,如 catalina.2017-07-11.log 檢視tomcat日誌
-
temp:臨時檔案目錄,其中內容可以任意刪除
-
webapps:存放釋出的web應用的目錄
-
work:tomcat解析jsp檔案的工作目錄,會將jsp解析成的servlet就存在於這個目錄
-
-
Tomcat啟動
-
需要jdk的支援,並且需要配置環境變數JAVA_HOME
-
本機地址127.0.0.1或者localhost
-
埠配置,預設tomcat是8080埠
-
80埠:http協議預設的埠,我們可以通過修改
-
servler.xml設定埠
-
配置使用者名稱管理tomcat下所有的web應用,修改 tomcat-users.xml
-
-
常見問題
- 啟動閃退
- 系統沒有配置環境,JAVA_HOME
-
java.net.BindException: Address already inuse: JVM_Bind <null>:8080
- 8080埠被佔。開源通過server.xml修改埠,也可以通過程式殺死佔用程式。
- 1.命令列輸入 netstat -ano 查詢8080埠被那個程式佔用
- 2.開啟工作管理員根據pid找到對應程式關閉。
- 8080埠被佔。開源通過server.xml修改埠,也可以通過程式殺死佔用程式。
- 啟動閃退
Servlet
servlet執行在服務端的Java小程式。由sun公司提供的一套規範介面,用來處理客戶端的請求,響應給瀏覽器的動態資源。但是servlet的實質就是Java程式碼,通過Java的API動態向客戶端輸出內容。
-
Servlet的內部實現原理
- servlet規範:包含三個技術點。servlet技術,filter(過濾器)技術,listener(監聽器)技術。
- 當客戶端傳送請求時,tomcat會先解析請求的路徑,在web.xml的配置檔案中去找到對應匹配的路徑,如果找到,就會通過配置檔案中servlet-name找到對應的類,然後去建立對應類的物件,此時因為介面規範中規定了,init方法,所以tomcat會去呼叫相應物件的init方法,然後再去呼叫service方法,由我們service方法去處理響應的請求
-
Servlet生命週期
- init方法:servlet建立的時候執行
- servlet方法:每次傳送請求的時候執行
- servletRequest 代表請求 servletRequest內部封裝的是http請求的資訊。
- servletResponse代表響應 要封裝的是響應的資訊。
-
destory方法:伺服器關閉的時候執行
-
Servlet的配置
-
-
<servlet> 中的 <servlet-name> 中的名字可以任意起,但是需要和 <servlet-mapping> 中的 <servlet-name> 相同
-
<servlet> 中的 <servlet-class> 指定是對應servlet的類的全名
-
<servlet-mapping> 中 <url-pattern> 指的是當瀏覽器中輸入什麼路徑的時候去匹配我們對應的servlet
-
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.web.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
-
urlpattern的配置方式
-
完全匹配如 /myServlet
-
目錄匹配如 /a/b/c/*
-
副檔名匹配 *.do
-
預設配置如 / 當你訪問資源地址所有的servlet都不匹配時,預設的servlet負責處理其實,web應用中所有的資源的響應都是servlet負責,包括靜態資源,對於靜態資源其實是由tomcat的預設servlet進行處理的
-
/和/*區別/不會處理字尾名是.jsp的資源
-
/*會處理字尾名是.jsp的資源
-
啟動伺服器的時候建立servlet配置 <load-on-startup>1</load-on-startup> 只要不是負數都會隨著伺服器的啟動而建立,值越小優先順序越高
-
HttpServlet
在實際的開發過程中,我們不會去建立一個類實現Servlet介面,我們會直接建立一個類去繼承HttpServlet,這個是Tomcat提供的一個類,並且實現了Servlet介面。
ServletContext物件
ServletContext代表是一個web應用的環境物件,ServletContext物件 內部封裝是該web應用的資訊一個web應用只有一個ServletContext物件。
-
ServletContext的生命週期
- 建立:當前的web應用建立的時候,一般web應用會隨著伺服器的啟動而建立的(或者釋出的時候)
- 銷燬:web應用被解除安裝(伺服器關閉,刪除當前的web應用)
-
如何得到ServletContext物件
-
在doGet或者doPost方法中呼叫 this.getServletContext();
-
注意在當前web應用中所有的servlet中呼叫此方法獲取的servletContext物件是全域性唯一的
-
-
ServletContext作用
-
ServletContext物件隨著伺服器的啟動而啟動,所以可以通過ServletContext獲得web應用全域性的初始化引數,在日後學習的spring中,就是將Spring檔案的路徑配置在初始化引數中.
-
ServletContext是一個域物件,因為它隨著伺服器的啟動而建立,伺服器的關閉而銷燬,所以存放在ServletContext中的資料是整個web應用所共享的.
-
向ServletContext域中放入資料 setAtrribute(String name,Object obj);
-
從ServletContext域中獲取資料 getAttribute(String name);
-
從ServletContext域中刪除資料 removeAttribute(String name);
-
-
HttpServletResponse
service方法中的response的型別是ServletResponse,而doGet/doPost方法的response的型別是HttpServletResponse,HttpServletResponse是ServletResponse的子介面
-
response執行流程
-
tomcat核心傳送一個空內容的response物件,供我們去將需要的內容放入
-
-
response設定響應行
-
使用response設定了狀態碼,那麼tomcat就不會再去設定狀態碼了
-
response.setStatus(302);
-
-
response設定響應頭
-
設定不同的頭,客戶端收到訊息後會做響應的操作
-
response.setHeader("Location", "/WebTest/index.html");
-
response重定向
重定向相當於客戶端傳送第二次請求
response.sendRedirect("/WebTest/index.html");
response定時重定向
response.setHeader("refresh", "2;url=/Day18/index.html");
-
重定向特點
-
重定向過程是客戶端收到訊息後,再做的請求,所以瀏覽器的地址會發生改變
-
伺服器收到的請求是兩次請求
-
-
response設定響應體
-
通過response可以將客戶端需要的資料放入響應體中,其過程是先將返回的資訊放在response的緩衝區中,然後由tomcat讀取緩衝區的內容,封裝成http的響應內容傳送給客戶端。
-
解決亂碼問題
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type","text/html;charset=UTF-8");
(使用httpservlet時寫上就對了,標準。)