全部章節 >>>>
本章目錄
5.1 Servlet 技術介紹
5.1.1 為什么需要Servlet
5.1.1 Servlet 簡介
5.1.2 Java Web 處理流程
5.1.3 Servlet 開發
5.1.4 Servlet 配置
5.1.5 實踐練習
5.2 Servlet 流程
5.2.1 Servlet 運行原理
5.2.2 Servlet 生命周期
5.2.3 Servlet 常用方法
5.2.4 實踐練習
5.3 HttpServletRequest 物件
5.3.1 Servlet 的層次結構
5.3.2 HttpServletRequest 介面
5.3.3 實踐練習
5.4 HttpServletResponse 物件
5.4.1 HttpServletResponse 物件
5.4.1 HttpServletResponse介面
5.4.2 實踐練習
總結
5.1 Servlet 技術介紹
5.1.1 為什么需要Servlet
JSP是JavaWeb應用中處理和顯示動態網頁的技術,而前面JSP頁面中出現了大量邏輯處理、甚至資料庫訪問的JDBC腳本代碼,這使得JSP頁面顯得混亂、不易維護,職責不清晰
JSP是建立在靜態Html基礎之上,使得資料顯示時具有動態特點,所以JSP的職責就是顯示資料,而不是邏輯處理
Servlet的出現很好的規避了這一點,將復雜的邏輯處理、請求回應交給Servlet處理,JSP則只負責渲染顯示頁面
5.1.1 Servlet 簡介
Java Servlet 又稱作 Java 服務器小程式,運行在服務端,主要用于Web應用中的請求回應,邏輯處理功能,讓JSP更專注于資料展示
JSP雖然看起來像網頁,但實際上當訪問JSP時,JSP 檔案首先會被轉換成一個 Java 檔案,而這個 Java 檔案就是 Servlet 類

Jsp頁面被轉換的Java類
5.1.2 Java Web 處理流程
Java Web 應用程式的處理程序,實際上是一個不斷請求與回應的程序,其流程如下:
客戶端發送請求至 Web 服務器
Web 服務器接收請求并進行處理
Web 服務器將回應結果回傳給客戶端,并展現用戶界面
5.1.3 Servlet 開發
創建Servlet的步驟1,創建Servlet類:
- 手動創建Java類繼承HttpServlet,在web.xml配置該Servlet的頁面請求路徑
- 使用Eclipse快速創建Servlet類,更為方便快捷,


創建Servlet的步驟2,處理GET、POST請求:
- 在Servlet中重寫并修改 doGet和 doPost兩個方法分別對應GET和POST請求
- 一般處理代碼只用完成一個如doPost,另外一個doGet中直接呼叫doPost即可
5.1.4 Servlet 配置
創建Servlet的步驟3,配置界面請求路徑映射:
- Servlet是一個Java類,無法直接被界面直接請求到,需要在專案web.xml配置請求路徑
配置servlet請求訪問路徑
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>//對應Servlet名稱
<url-pattern>/first</url-pattern>//請求路徑
</servlet-mapping>
啟動服務器,瀏覽器輸入:http://localhost:8080/專案名/first
5.1.5 實踐練習
5.2 Servlet 流程
5.2.1 Servlet 運行原理
當 Tomcat 服務器接收到一個 HTTP 請求時,服務器執行具體步驟如下:
- 用戶在瀏覽器地址欄中輸入請求URL地址:http://localhost:8080/java_web_0501/first
- Tomcat 服務器根據請求獲取 URL 中最后需要訪問的資源,即“/first”
- Tomcat 服務器根據獲取的“/first”與 web.xml 檔案中配置的請求映射匹配,找到對應的Servlet類
- 找到之后服務器實體化Servlet
- 執行Servlet對應的請求處理方法,如doPost,完成給用戶回應
注意:如果沒有匹配到對應路徑,則界面會出現404例外
5.2.2 Servlet 生命周期
Servlet 生命周期是由 Servlet 的容器來控制的,Servlet 生命周期分為 4 個階段
第一階段:加載并實體化
Servlet 容器負責加載和實體化
- Servelt,在服務器啟動或第一次請求時執行
- 如果需要服務器啟動時加載,則需在servlet配置時加入 <loadon-startup>1</loadon-startup>,數值越小優先級越高
- 加載后該Servlet實體將常駐記憶體
第二階段:初始化
- 在 Servlet 實體化之后,容器將呼叫 init() 方法,并傳遞實作 ServletConfig 介面的物件,在 Servlet 的整個生命周期內,init()方法只被呼叫一次
- 一般根據需要是否添加init方法,如果Servlet需要初始化一些資料,可以在該方法中完成代碼
第三階段:請求處理
- 當容器收到對這一 Servlet 的請求,就呼叫 Servlet 的service() 方法,并把請求和回應物件作為引數傳遞,service() 方法檢查 HTTP 請求型別(GET、POST等),并在適當的時候呼叫 doGet()、doPost() 等方法
- 每次請求都會呼叫對應的doGet或doPost方法
第四階段:銷毀
一旦 Web服務器停止服務,Servlet會自動執行其 destroy() 方法,以釋放資源
Servlet請求程序如圖所示

示例:創建Servlet,重寫service、doGet、doPost、init、destroy方法演示Servlet生命周期程序

5.2.3 Servlet 常用方法
- 任何一個 Servlet 物件都要直接或間接地實作 javax.servlet.Servlet 介面
- 創建 Servlet 時,都繼承 javax.servlet.HttpServlet 類,而它又繼承GenericServlet類, GenericServlet類實作了Servlet介面,所以擁有一系列父類定義的方法,如下
| 方法名 | 作用 |
| init | 在 Servlet 生命周期中的初始化方法,僅執行一次 init() 方法 |
| service | service() 方法主要功能是區分不同的請求型別,然后呼叫對應的方法 |
| doGet | 對應的get請求處理方法 |
| doPost | 對應的post請求處理方法 |
| destroy | 服務器停止時執行銷毀方法 |
5.2.4 實踐練習
5.3 HttpServletRequest 物件
5.3.1 Servlet 的層次結構
在Servlet處理請求時候,ServletAPI 提供了標準的介面與類,利用這些介面和類可以幫助我們撰寫請求邏輯處理,其結構如下

HttpServlet繼承了GenericServlet
5.3.2 HttpServletRequest 介面
HttpServletRequest 介面代表客戶端的請求,它包含了客戶端提交過來的請求資料,常用方法如下
| 名稱 | 作用 |
| String?getParameter(String name) | 獲取頁面提交指定名稱的引數值 |
| String[]?getParameterValues(String name) | 獲取頁面提交相同名稱引數的陣列值 |
| Enumeration?getParameterNames(?) | 獲取請求中所有引數名的Enumeration |
| Map?getParameterMap(?) | 回傳保存了請求的所有引數名和值的Map 物件 |
| void?setAttribute(String?name,Object?obj) | 向 request 范圍記憶體儲資料,鍵值對形式 |
| Object?getAttribute(String?name) | 從request范圍取出鍵對應的資料 |
| Cookie[]?getCookies(?) | 獲取request中所有的Cookie,回傳陣列 |
| String?getMethod(?) | 獲取請求型別,如GET、POST |
| String?getRequestURI(?) | 回傳主機名到請求引數之間的路徑 |
| StringBuffer?getRequestURL() | 獲取請求的StringBuffer型別 URL |
| String?getContextPath() | 獲取當前web專案根路徑 |
| String?getServletPath() | 獲取請求 URI 中的 Servlet 路徑的字串 |
| String?getRealPath(String?path) | 獲取當前 Web 專案的實際物理路徑 |
| String?getSchema() | 獲取當前請求所使用的協議 |
| String?getServerName() | 獲取當前請求的服務器名稱 |
| int?getServerPort() | 獲取當前請求的服務器埠 |
| HttpSession?getSession() | 獲取當前會話的HttpSession 物件 |
| getRequestDispatcher() | 獲取轉發物件,進而可以呼叫轉發物件的forward方法轉發到下一個界面 |
示例:使用 HttpServletRequest 介面的方法實作商品添加的功能
request.setCharacterEncoding("UTF-8");// 設定請求的編碼格式
response.setCharacterEncoding("UTF-8"); // 設定回應的編碼格式
String name = request.getParameter("name"); // 獲取商品名稱
String numberStr = request.getParameter("number"); // 獲取商品編號
boolean isAutoIncrement = request.getParameterValues("isAutoIncrement").length > 0;
// 是否自增增長
int number = isAutoIncrement ? ++Product.baseNumber : Integer.parseInt(numberStr);
String brand = request.getParameter("brand"); // 獲取商品品牌
String supplier = request.getParameter("supplier"); // 獲取供貨商資訊
String priceStr = request.getParameter("price");
// 獲取參考成本價
double price = (priceStr == null || "".equals(priceStr.trim())) ? 0 :
Double.parseDouble(priceStr);
String remark = request.getParameter("remark"); // 獲取輸入的備注
接收界面傳遞的一系列資料
示例:使用 HttpServletRequest 介面的方法實作商品添加的功能
// 判斷用戶輸入是否合法 如果資料不合法,轉發到增加界面,并且存入錯誤資訊界面顯示
if (name == null || "".equals(name.trim()) || brand == null || "".equals(brand)
|| priceStr == null || "".equals(priceStr.trim())) {
// 保存錯誤資訊到 request 作用域內
request.setAttribute("errorMessage", " 商品名稱、商品品牌和商品價格不能為空 ");
// 轉發到 productAdded.jsp 頁面
request.getRequestDispatcher("productAdded.jsp").forward(request, response);
} else {
// 保存商品資料到 Product 物件 如果輸入合法將資料存入全域資料串列中,轉發至下一個顯示界面
Product product = new Product(name, number, brand, supplier, price, remark);
// 添加商品資料到商品集合中
Product.productList.add(product);
// 跳轉到商品顯示頁面
request.getRequestDispatcher("productList.jsp").forward(request, response);}
示例:使用 HttpServletRequest 介面的方法實作商品串列展示
<!– 取出存盤的全域串列資料顯示產品串列 -->
<tbody id="TableData">
<%
//取出存盤的全域資料回圈
for (Product product : Product.productList) {
%>
<tr>
<td><%=product.getNumber()%></td>
<td><%=product.getName()%></td>
<td><%=product.getBrand()%></td>
<td><%=product.getSupplier()%></td>
<td><%=product.getPrice()%></td>
<td><%=product.getRemark()%></td>
</tr>
<%}%>
</tbody>
5.3.3 實踐練習
5.4 HttpServletResponse 物件
5.4.1 HttpServletResponse 物件
HttpServletResponse 介面代表向客戶端發送的回應,利用response可以向客戶 端回應資訊或跳轉界面
HttpServletResponse常用方法如下:
| 方法名 | 作用 |
| public?PrintWriter?getWriter()? | 獲取回應的列印輸出流物件 |
| public?void?addCookie() | 向回應中添加 cookie 物件 |
| public?void?setCharacterEncoding(String?enc) | 設定回應的編碼 |
| public?void?sendRedirect(String?path) | 將請求重定向到指定位置 |
5.4.1 HttpServletResponse介面
示例:使用 response 實作用戶登錄的功能
request.setCharacterEncoding("UTF-8"); // 設定請求的編碼格式
response.setCharacterEncoding("UTF-8"); // 設定相應的編碼格式
String username = request.getParameter("username"); // 獲取賬號 從request中獲取請求資料
String password = request.getParameter("password"); // 獲取密碼
// 判斷賬號和密碼是否正確
if ("admin".equals(username) && "abc".equals(password)) {
// 將登錄賬號保存到 session 作用域內
request.getSession().setAttribute("user", username); //將用戶資訊存入session,供后續功能取出使用
// 登錄成功,跳轉到主頁面
request.getRequestDispatcher("main.jsp").forward(request, response);
}
示例:使用 response 實作用戶退出的功能
1、主界面中創建退出超鏈接或按鈕
2、創建退出Servlet,核心代碼如下:
// 從 session 中洗掉登錄用戶
request.getSession().removeAttribute(“administratorre”);//session中移除用戶資訊
重定向跳轉界面
sponse.sendRedirect("login.jsp");// 重定向到頁面
3、在web.xml中配置Servlet映射請求路徑
5.4.2 實踐練習
總結
- Java Servlet 又稱作 Java 服務器小程式,運行在服務端,主要用于Web應用中的請求回應,邏輯處理功能,讓JSP更專注于資料展示
- Servlet的實作步驟為:創建Servlet并且完成請求處理、在web.xml中配置Servlet及請求路徑、頁面上請求Servlet
- Servlet生命周期包括:加載實體化、初始化、服務、銷毀幾個階段
- HttpServletRequest代表請求物件,可以呼叫其方法獲取請求相關的資訊,如請求的引數等
- HttpServletResonse代表回應物件,可以呼叫其方法實作回應功能,如重定向、設定回應編碼等
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267421.html
標籤:其他
上一篇:LeetCode刷題的一天(3)
下一篇:位段 + 列舉 + 聯合體講解
