JavaWeb之Servlet02

王振國老師整理

 

 

Servlet 技術

什麼是 Servlet?

  1. Servlet 是 JavaEE 規範之一。規範就是接口
  2. Servlet 就 JavaWeb 三大組件之一。三大組件分別是:Servlet 程序、Filter 過濾器、Listener 監聽器。
  3. Servlet 是運行在服務器上的一個 java 小程序,它可以接收客戶端發送過來的請求,並響應數據給客戶端。

手動實現 Servlet 程序

  1. 編寫一個類去實現 Servlet 接口
  2. 實現 service 方法,處理請求,並響應數據
  3. 到 web.xml 中去配置 servlet 程序的訪問地址

Servlet 程序的示例代碼:

public class HelloServlet implements Servlet {
    /**
     * service 方法是專門用來處理請求和響應的
     *
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service( ServletRequest servletRequest, ServletResponse servletResponse ) throws
            ServletException, IOException {
        System.out.println("Hello Servlet 被訪問了");
    }
}

web.xml 中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- servlet 標籤給 Tomcat 配置 Servlet 程序 -->
    <servlet>
        <!--servlet-name 標籤 Servlet 程序起一個別名(一般是類名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是 Servlet 程序的全類名-->
        <servlet-class>com.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 標籤給 servlet 程序配置訪問地址-->
    <servlet-mapping>
        <!--servlet-name 標籤的作用是告訴服務器,我當前配置的地址給哪個 Servlet 程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 標籤配置訪問地址 <br/>
        / 斜槓在服務器解析的時候,表示地址爲:http://ip:port/工程路徑 <br/>
        /hello 表示地址爲:http://ip:port/工程路徑/hello <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

url 地址到 Servlet 程序的訪問

Servlet 的生命週期

  1. 執行 Servlet 構造器方法
  2. 執行 init 初始化方法
  3. 執行 service 方法
  4. 執行 destroy 銷燬方法

注意:

  • 第一、二步,是在第一次訪問,的時候創建 Servlet 程序會調用。
  • 第三步,每次訪問都會調用。
  • 第四步,在 web 工程停止的時候調用。

GET 和 POST 請求的分發處理

public class HelloServlet implements Servlet {
    /**
     * service 方法是專門用來處理請求和響應的
     *
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service( ServletRequest servletRequest, ServletResponse servletResponse ) throws
            ServletException, IOException {
        System.out.println("3 service === Hello Servlet 被訪問了");
// 類型轉換(因爲它有 getMethod()方法)
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 獲取請求的方式
        String method = httpServletRequest.getMethod();
        if ("GET".equals(method)) {
            doGet();
        } else if ("POST".equals(method)) {
            doPost();
        }
    }

    /**
     * 做 get 請求的操作
     */
    public void doGet() {
        System.out.println("get 請求");
        System.out.println("get 請求");
    }

    /**
     * 做 post 請求的操作
     */
    public void doPost() {
        System.out.println("post 請求");
        System.out.println("post 請求");
    }
}

通過繼承 HttpServlet 實現 Servlet 程序

一般在實際項目開發中,都是使用繼承 HttpServlet 類的方式去實現 Servlet 程序。

  1. 編寫一個類去繼承 HttpServlet 類
  2. 根據業務需要重寫 doGet 或 doPost 方法
  3. 到 web.xml 中的配置 Servlet 程序的訪問地址

Servlet 類的代碼:

@WebServlet("/helloServlet2")
public class HelloServlet2 extends HttpServlet {
    /**
     * doGet()在 get 請求的時候調用
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException,
            IOException {
        System.out.println("HelloServlet2 的 doGet 方法");
    }

    /**
     * doPost()在 post 請求的時候調用
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException,
            IOException {
        System.out.println("HelloServlet2 的 doPost 方法");
    }
}

Servlet 類的繼承體系

 

ServletConfig 類

  • ServletConfig 類從類名上來看,就知道是 Servlet 程序的配置信息類。
  • Servlet 程序和 ServletConfig 對象都是由 Tomcat 負責創建,我們負責使用。
  • Servlet 程序默認是第一次訪問的時候創建,ServletConfig 是每個 Servlet 程序創建時,就創建一個對應的 ServletConfig 對 象。

ServletConfig 類的三大作用

  1. 可以獲取 Servlet 程序的別名 servlet-name 的值
  2. 獲取初始化參數 init-param
  3. 獲取 ServletContext 對象

Servlet 中的代碼:

@Override
public void init(ServletConfig servletConfig)throws ServletException{
        System.out.println("2 init 初始化方法");
// 1、可以獲取 Servlet 程序的別名 servlet-name 的值
        System.out.println("HelloServlet 程序的別名是:"+servletConfig.getServletName());
// 2、獲取初始化參數 init-param
        System.out.println("初始化參數 username 的值是;"+servletConfig.getInitParameter("username"));
        System.out.println("初始化參數 url 的值是;"+servletConfig.getInitParameter("url"));
// 3、獲取 ServletContext 對象
        System.out.println(servletConfig.getServletContext());
}

web.xml 中的配置:

<!--servlet-class 是 Servlet 程序的全類名-->
<servlet-class>com.servlet.HelloServlet</servlet-class>
        <!--init-param 是初始化參數-->
<init-param>
<!--是參數名-->
<param-name>username</param-name>
<!--是參數值-->
<param-value>root</param-value>
</init-param>
        <!--init-param 是初始化參數-->
<init-param>
<!--是參數名-->
<param-name>url</param-name>
<!--是參數值-->
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
        </servlet>
        <!--servlet-mapping 標籤給 servlet 程序配置訪問地址-->
<servlet-mapping>
<!--servlet-name 標籤的作用是告訴服務器,我當前配置的地址給哪個 Servlet 程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern 標籤配置訪問地址 <br/>
/ 斜槓在服務器解析的時候,表示地址爲:http://ip:port/工程路徑 <br/>
/hello 表示地址爲:http://ip:port/工程路徑/hello <br/>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>

注意:

  • 重寫init方法裏面一定要調用父類的init(ServletConfig)操作

 

ServletContext 類

什麼是 ServletContext?

  1. ServletContext 是一個接口,它表示 Servlet 上下文對象
  2. 一個 web 工程,只有一個 ServletContext 對象實例。
  3. ServletContext 對象是一個域對象。
  4. ServletContext 是在 web 工程部署啓動的時候創建。在 web 工程停止的時候銷燬。

什麼是域對象?

域對象,是可以像 Map 一樣存取數據的對象,叫域對象。 這裏的域指的是存取數據的操作範圍,整個 web 工程。

        存數據            取數據             刪除數據
Map     put()             get()             remove()
域對象  setAttribute()    getAttribute()     removeAttribute();

ServletContext 類的四個作用

  1. 獲取 web.xml 中配置的上下文參數 context-param
  2. 獲取當前的工程路徑,格式: /工程路徑
  3. 獲取工程部署後在服務器硬盤上的絕對路徑
  4. 像 Map 一樣存取數據

ServletContext 演示代碼:

protected void doGet(HttpServletRequest request,HttpServletResponse response)throws
        ServletException,IOException{
// 1、獲取 web.xml 中配置的上下文參數 context-param
        ServletContext context=getServletConfig().getServletContext();
        String username=context.getInitParameter("username");
        System.out.println("context-param 參數 username 的值是:"+username);
        System.out.println("context-param 參數 password 的值是:"+
        context.getInitParameter("password"));
// 2、獲取當前的工程路徑,格式: /工程路徑
        System.out.println("當前工程路徑:"+context.getContextPath());
// 3、獲取工程部署後在服務器硬盤上的絕對路徑
/**
 * / 斜槓被服務器解析地址爲:http://ip:port/工程名/ 映射到 IDEA 代碼的 web 目錄<br/>
 */
        System.out.println("工程部署的路徑是:"+context.getRealPath("/"));
        System.out.println("工程下 css 目錄的絕對路徑是:"+context.getRealPath("/css"));
        System.out.println("工程下 imgs 目錄 1.jpg 的絕對路徑是:"+context.getRealPath("/imgs/1.jpg"));
}

 

HTTP 協議

什麼是 HTTP協議?

  • 協議是指雙方,或多方,相互約定好,大家都需要遵守的規則,叫協議。
  • 所謂 HTTP 協議,就是指,客戶端和服務器之間通信時,發送的數據,需要遵守的規則,叫 HTTP 協議。
  • HTTP 協議中的數據又叫報文。

請求的 HTTP 協議格式

  • 客戶端給服務器發送數據叫請求。
  • 服務器給客戶端回傳數據叫響應。
  • 請求又分爲 GET 請求,和 POST 請求兩種

GET 請求

請求行

  • 請求的方式 GET
  • 請求的資源路徑[+?+請求參數]
  • 請求的協議的版本號 HTTP/1.1

請求頭 key : value 組成 不同的鍵值對,表示不同的含義。

POST 請求

請求行

  • 請求的方式 POST
  • 請求的資源路徑[+?+請求參數]
  • 請求的協議的版本號 HTTP/1.1

請求頭

  • key : value 不同的請求頭,有不同的含義

空行

請求體 ===>>> 就是發送給服務器的數據

常用請求頭的說明

  • Accept: 表示客戶端可以接收的數據類型
  • Accpet-Languege: 表示客戶端可以接收的語言類型
  • User-Agent: 表示客戶端瀏覽器的信息
  • Host: 表示請求時的服務器 ip 和端口號

如何區分是GET和POST請求

GET 請求有哪些:

  • form 標籤 method=get
  • a 標籤
  • link 標籤引入 css
  • Script 標籤引入 js 文件
  • img 標籤引入圖片
  • iframe 引入 html 頁面
  • 在瀏覽器地址欄中輸入地址後敲回車

POST 請求有哪些:

  • form 標籤 method=post

響應的 HTTP 協議格式

響應行 

  • 響應的協議和版本號
  • 響應狀態碼
  • 響應狀態描述符

響應頭

  • key : value 不同的響應頭,有其不同含義

空行

響應體 ---->>> 就是回傳給客戶端的數據

常用的響應碼說明

  • 200 表示請求成功
  • 302 表示請求重定向
  • 404 表示請求服務器已經收到了,但是你要的數據不存在(請求地址錯誤)
  • 500 表示服務器已經收到請求,但是服務器內部錯誤(代碼錯誤)

MIME 類型說明

  • MIME 是 HTTP 協議中數據類型。
  • MIME 的英文全稱是"Multipurpose Internet Mail Extensions" 多功能 Internet 郵件擴充服務。
  • MIME 類型的格式是“大類型/小 類型”,並與某一種文件的擴展名相對應。

常見的 MIME 類型:

谷歌瀏覽器如何查看 HTTP 協議:

火狐瀏覽器如何查看 HTTP 協議:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章