Java三十四篇: 回顧Servlet
什么是Servlet?
Servlet 是 JavaWeb 的三大組件之一,它屬于動態(tài)資源,Servlet 的作用是處理請求,服務器會把接收到的請求給 Servlet 處理,在 Servlet 中需要
接收請求數(shù)據(jù)
處理請求
完成響應
每個 Servlet 是唯一的,它們處理的請求時不同的。
二、Servlet接口介紹
概念:javaweb程序開發(fā),項目就是一個java應用程序,用sun公司提供的接口Servlet,只要實現(xiàn)里面的一些接口,并按照規(guī)則把接口中的代碼寫完,就是一個javaweb項目。
如果要完成一個javaweb項目的開發(fā)
編寫一個Java類,讓這個java類實現(xiàn)Servlet接口。
將編寫好的javaweb項目放置到web服務器中
實現(xiàn)Servlet的方式
實現(xiàn) Servlet 有三種方式:
實現(xiàn) java.servlet.Servlet 接口
繼承 javax.servlet.GenericServlet 類
繼承 javax.servletHttpServlet 類
查看源碼

spring家族底層都是封裝了大量的servlet
package com.zhsj;
import javax.servlet.*;
import java.io.IOException;
/**
* @program: test
* @description: Servlet 中的方法大多由 Tomcat 調(diào)用,Servlet 的對象也是有 Tomcat 生成
* ?導入了依賴:tomcat-embed-core:9.0.56
* @author: liulq
*
*/
publicclass Test2 implements Servlet {
? ? ? ?/**
? ? ? ? * 它是生命周期方法
? ? ? ? * 它會在 Servlet 對象創(chuàng)建之后馬上執(zhí)行,并執(zhí)行一次(出生之后)
? ? ? ? * */
? ? ? ?@Override
? ? ? ?public void init(ServletConfig servletConfig) throws ServletException {
? ? ? ? ? ?System.out.println("init");
? ? ? ?}
? ? ? ?/**
? ? ? ? * 可以獲取 Servlet 的配置信息
? ? ? ? * */
? ? ? ?@Override
? ? ? ?public ServletConfig getServletConfig() {
? ? ? ? ? ?System.out.println("getServletConfig");
? ? ? ? ? ?returnnull;
? ? ? ?}
? ? ? ?/**
? ? ? ? * 它是聲明周期方法
? ? ? ? * 它會被調(diào)用多次,每次請求都是調(diào)用這個方法
? ? ? ? * */
? ? ? ?@Override
? ? ? ?public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
? ? ? ? ? ?System.out.println("service");
? ? ? ?}
? ? ? ?/**
? ? ? ? * 獲取 Servlet 的信息
? ? ? ? * */
? ? ? ?@Override
? ? ? ?public String getServletInfo() {
? ? ? ? ? ?System.out.println("getServletInfo");
? ? ? ? ? ?return"Hello ?World";
? ? ? ?}
? ? ? ?/**
? ? ? ? * 它是聲明周期方法
? ? ? ? * 它會在 Servlet 被銷毀之前調(diào)用,并且只會調(diào)用一次
? ? ? ? * */
? ? ? ?@Override
? ? ? ?public void destroy() {
? ? ? ? ? ?System.out.println("destroy");
? ? ? ?}
}
說明:
編寫一個Servlet實現(xiàn)類必須去實現(xiàn)Servlet的實現(xiàn)
Servlet接口,根據(jù)Servlet的API知道,Servlet存在3個生命周期的方法
init():用于初始化的方法,沒有特殊代碼處理的時候,發(fā)送請求的時候執(zhí)行該方法
service():用于處理請求和響應的方法,程序員編寫代碼的部分。
destroy():銷毀的方法,如果沒有特殊代碼處理,關(guān)閉服務器的時候銷毀。
Servlet接口中,也提供了獲取Servlet初始化信息的方法
getServletConfig();重點,該方法主要能夠得到一個ServletConfig對象。
getServletInfo():只能獲取Servlet版本號等信息。一般不用。
Servlet的API中,提到了在程序員編寫Servlet的時候,實際上不需要實現(xiàn)Servlet接口,可以選擇繼承g(shù)enericServlet或者HttpServlet
說明:雖然這兩個類都是可以實現(xiàn)一個Servlet程序開發(fā)的,但是從API上可以看到,實際HttpServlet是GenericServlet的子類,因此,推薦使用HttpServlet
例子:
1、創(chuàng)建一個javaweb 的項目
目錄結(jié)構(gòu):


2、編程servlet代碼
package com.woniuxy.demo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
/**
* @program: test
* @description:
* @author: liulq
* @create:
*/
publicclass ServletDemo2 extends HttpServlet {
? ?@Override
? ?protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
? ? ? ?doPost(request,response);
? ?}
? ?/*
? ? *
? ? * <p>Title: doPost</p>
? ? * <p>Description: </p>
? ? * @param request 請求對象 獲取瀏覽器向服務器發(fā)送的數(shù)據(jù)
? ? * @param response 響應對象 將服務器的數(shù)據(jù)發(fā)送給瀏覽器
? ? * @throws ServletException
? ? * @throws IOException
? ? * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
? ? */
? ?@Override
? ?protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
? ? ? ?System.out.println("請求成功");
? ? ? ?//由服務器給瀏覽器寫出數(shù)據(jù)
? ? ? ?OutputStream out = response.getOutputStream();
? ? ? ?out.write("abc".getBytes());
? ? ? ?//關(guān)閉資源
? ? ? ?out.close();
? ?}
}
3、編寫web.xml映射的代碼
?<!-- 配置ServletDemo2的映射 -->
?<servlet>
? ?<servlet-name>ServletDemo2</servlet-name>
? ?<servlet-class>com.woniuxy.demo.ServletDemo2</servlet-class>
?</servlet>
?<!-- 映射配置 -->
?<servlet-mapping>
? ?<servlet-name>ServletDemo2</servlet-name>
? ?<url-pattern>/demo2</url-pattern>
?</servlet-mapping>
4、啟動tomcat,測試請求demo

Servlet流程及原理
瀏覽器請求之后解析的步驟:
瀏覽器發(fā)出請求,鏈接服務器
發(fā)送http請求:http://localhost:8080/WebDemo2/demo2;
解析出來IP地址
解析出來端口號
解析出來web應用程序
解析出來請求訪問的資源文件
創(chuàng)建Servlet對象,并用init初始化Servlet對象
調(diào)用Service方法或者別拆分出來的doxxx()方法。
關(guān)閉服務器的時候,銷毀Servlet對象,調(diào)用destroy方法
Servlet對象的生命周期
實現(xiàn)Servlet接口或者繼承HttpServlet,該類所在的工程為一個web應用程序,該程序需要放到服務器里面,當服務器一旦開啟,那么服務器會自動的在容器中創(chuàng)建一個Servlet對象。
當發(fā)送第一條請求的時候,會調(diào)用init方法進行初始化Servlet對象。后續(xù)請求將不再初始化
每一次調(diào)用service方法或者doGet方法或者doPost方法之前,都需要使用Servlet對象創(chuàng)建獨立的HttpServletRequest對象和HttpServletResponse對象。
調(diào)用service方法或者對應的doXXX()方法處理請求響應。
當服務器關(guān)閉的時候,銷毀Servlet對象。
web中的其他重要的對象
ServletConfig對象
作用:獲取配置文件(web.xml)中的參數(shù),一些數(shù)據(jù)可以先配置在web.xml文件中,由ServletConfig對象進行獲取,在servlet接口中提供了有參的init方法,參數(shù)為ServletConfig對象,在初始化Servlet對象的時候,會調(diào)用init方法,在這個時候,web服務器會自動將web.xml里面的參數(shù)加載到ServletConfig對象。并且同時將ServletConfig對象交給Servlet對象。
ServletContext對象
一個web容器里面,只有一個ServletContext對象,獲取ServletContext對象有兩種方式
方式1:通過ServletConfig對象中的getServeltContext()方法來獲取ServletContext對象
ServletContext context = this.getServletConfig().getServletContext();
方式2:可以直接通過Servlet對象中的getServletContext()方法來獲取ServletConext對象,推薦方式。
ServletContext context = this.getServletContext();
Servlet的第一個作用:實現(xiàn)各個Servlet類中的數(shù)據(jù)共享
獲取全局的配置文件值
讀取配置文件
Response對象(相應)
當服務器接收到了請求之后,會執(zhí)行doPost或者doGet方法,執(zhí)行完之后會給瀏覽器反饋數(shù)據(jù),完成反饋數(shù)據(jù)的對象就是response,該對象不需要程序員自己創(chuàng)建。
Request對象 (請求)
當瀏覽器向服務器發(fā)送請求之后,服務器會接受到來自瀏覽器的數(shù)據(jù)(用戶填寫的數(shù)據(jù)、請求頭數(shù)據(jù)和請求的數(shù)據(jù)),request是完成前端數(shù)據(jù)交給服務器的對象
總結(jié):
1.servlet是Javaweb 的三大組件之一,是很多框架的底層,如果需要知道底層怎么實現(xiàn)的那必須知道servlet
2.實現(xiàn) Servlet 有三種方式:
實現(xiàn) java.servlet.Servlet 接口
繼承 javax.servlet.GenericServlet 類
繼承 javax.servletHttpServlet 類
3.servletContext對象、ServletCofig對象、Reponse對象、Request對象還是很重要的,要有一定的認識
? ? ? ? ? ? ? ? ? ?? ? ? ??
