JavaWeb| 深入servlet技術(一)

  • 2019 年 10 月 4 日
  • 筆記

1.寫在前面的話

今天起正式開始寫JavaWeb的專欄,前面的一篇關於HTTP協議的那些東西,也是為這個專欄打基礎的,廢話不多說,我們今天來認識認識servlet這個傢伙!

2.servlet這傢伙到底是什麼?

Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立於平台和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容

狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解為後者。Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。

最早支持Servlet標準的是JavaSoft的Java Web Server,此後,一些其它的基於Java的Web服務器開始支持標準的Servlet。

那麼servlet到底有什麼作用?

1. 接收客戶端發送過來的請求數據

2. 處理請求

3. 將處理的結果通過響應發送到客戶端

3.咱們來創建一個servlet看看

我是用intellij idea來開發的,所以創建servlet比較方便,idea可以用servlet3.0來創建servlet,具體看下圖↓

就這樣簡單的兩步就創建了我們的servlet,我們來看看servlet裏面有些啥吧

package com.kuls.servlet;    import javax.servlet.ServletException;  import javax.servlet.annotation.WebServlet;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import java.io.IOException;    @WebServlet(name = "JAPServlet")  public class JAPServlet extends HttpServlet {      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        }        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        }  }

直接扔給大家一堆代碼,這是我們最原始的一個servlet,在3.0版本中,我們還需要在注釋裏面添加一個參數(上面的第十行) :

@WebServlet(name = "JAPServlet",urlPatterns = "/demo")

這樣我們就成功的創建了我們的第一個servlet,接下來咱們來操作操作!

4.HttpServletRequest簡介-獲取請求行和請求頭

在servlet的API中,定義了一個叫HttpServletRequest的接口,它是繼承自ServletRequest接口,專門用於封裝HTTP的請求,因為HTTP請求裏面包括請求體,請求行,請求頭,所以在HttpServletRequest中分別定義了接收請求體,請求行,請求頭的相關方法。

特意在網上找了張圖,裏面都是獲取請求行相關信息的方法:

光看沒用,咱們去代碼中實現一下:

@WebServlet(name = "JAPServlet",urlPatterns = "/demo")  public class JAPServlet extends HttpServlet {      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        }        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          System.out.println("獲取請求方法:"+request.getMethod());          System.out.println("返回url:"+request.getRequestURI());          System.out.println("獲取URL中屬於web應用程序的路徑"+request.getContextPath());      }  }

我在doGet()方法中寫了幾個方法,寫完之後我們進行部署,然後去訪問http://localhost:8080/demo1_war_exploded/demo(注意:這個是Tomacat給我們項目分配的網址,這個是可以修改的,後面的demo就是我們urlPatterns中所定義的參數),訪問之後可以看到控制台給我們返回的信息:

獲取請求方法:GET  返回url:/demo1_war_exploded/demo  獲取URL中屬於web應用程序的路徑/demo1_war_exploded

上面主要講解了獲取請求行的方法,接下來我們來講解一下獲取請求頭的相關方法:

同樣是找了張圖,由於篇幅關係,這次我就不給大家代碼演示了。

5.HttpServletResponse獲取請求參數

獲取請求參數:

上面我們說過我們把需要傳遞的參數放在請求行的url中或者是放在請求體中,當我們需要獲取這些參數時,都是可以通過上面的方法來獲取的。

這裡我給大家舉個小栗子吧:

1.我們首先簡單的寫一個jsp,在jsp中寫一個表單,如果這個地方不會,大家可以去相關的教程網站學習。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>  <html>    <head>      <title>$Title$</title>    </head>    <body>    <form action="demo" method="get">    用戶名:<input name="username" type="text">        <input type="submit" name="tijiao">    </form>    </body>  </html>

2.我們來編寫servlet:

@WebServlet(name = "JAPServlet",urlPatterns = "/demo")  public class JAPServlet extends HttpServlet {      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        }        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          String username = request.getParameter("username");          System.out.println(username);      }  }

同樣的步驟部署我們的網站,然後可以看到

咱們隨便輸入一個「JAVAandPython君」,點擊提交,咱們回到控制台↓

可以看到我們已經獲取到數據並且打印出來了,其他方法也是類似的使用!

6.response對象發送響應行和響應頭

在servlet的API中,定義了一個叫HttpServletResponse的接口,它是繼承自HttpServletResponse接口,專門用於封裝HTTP的請求,因為HTTP請求裏面包括請求體,請求行,請求頭,所以在HttpServletResponse中分別定義了接收請求體,請求行,請求頭的相關方法。

發送響應行:

可以看到這兩個方法都是設置狀態碼,但是sendError()只能發送錯誤狀態的狀態碼,setStatus()只能發送成功的狀態碼。如果是一個404界面,我們則需要用sendError()傳送一個狀態碼。

發送響應頭:

這些方法大家需要了解一下就行了,我們需要使用某些數據的時候可以來查看這些方法。

7.HttpServletResponse發送請求體

由於在HTTP響應消息中,大量的數據都是通過響應體來進行傳遞的,因此servletResponse遵循以IO流傳遞大數據的設計理念,所以定義了兩個與輸出流相關的方法:

像我們的文字、視頻、音頻之類的都可以通過二進制來進行輸出,咱們接着上次的代碼去實現一下:

@WebServlet(name = "JAPServlet",urlPatterns = "/demo")  public class JAPServlet extends HttpServlet {      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        }        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {          String username = request.getParameter("username");          System.out.println(username);          String result = "恭喜你!成功啦!";          ServletOutputStream stream = response.getOutputStream();          stream.write(result.getBytes());      }  }

部署一下網站;

可以看到我們成功的傳送到客戶端瀏覽器!

END 總結

其實這部分內容大部分都是需要死記硬背的,也就是純粹的知識點,不過沒記住也沒關係,可以收藏一下這篇文章,忘記了的話可以反過來看一看,servlet是整個javaweb裏面的基礎核心,很多的框架都是基於servlet來實現的,所以這部分的知識一定要掌握紮實,接下來我會帶着大家一起學Javaweb並且帶着大家去寫一個基於MVC的項目!希望大家持續關注,Java的開發框架的視頻也會慢慢出來的。

Exit mobile version