JavaWeb基礎(day15)( http + tomcat + servlet + 響應)
阿新 • • 發佈:2020-07-17
HTTP+Tomcat+Servlet+響應
HTTP
HTTP 超文字傳輸協議(Hyper Text Transfer Protocol ),一種網路協議。
協議的組成和過程
- HTTP協議由http請求和http響應組成。在瀏覽器輸入一個請求,瀏覽器將你的請求封裝成一個http請求傳送給伺服器,伺服器收到請求組響應資料封裝成一個http響應,返回給客戶端。
抓包分析
使用chrome自帶的工具,可以看到資料相互傳送的具體過程。
http請求
get請求
請求行:請求的方法為get請求
本地的地址:host:localhost:8080
connection:keep-alive 連線方式:長連線
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時寫上就對了,標準。)