主頁 > 軟體設計 > Java Web程式設計筆記 • 【第5章 Servlet技術】

Java Web程式設計筆記 • 【第5章 Servlet技術】

2021-03-08 10:36:49 軟體設計

全部章節 >>>>


本章目錄

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)

下一篇:位段 + 列舉 + 聯合體講解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more