Servlet的三種創建方式


什么是Servlet

Servlet是JavaWeb的三大組件之一,它屬於動態資源。Servlet的作用是處理請求,服務器會把接收到的請求交給Servlet來處理,在Servlet中通常需要:

  • 接收請求數據;
  • 處理請求;
  • 完成響應。

  例如客戶端發出登錄請求,或者輸出注冊請求,這些請求都應該由Servlet來完成處理!Servlet需要我們自己來編寫,每個Servlet必須實現javax.servlet.Servlet接口。

Servlet的生命周期

所謂xxx的生命周期,就是說xxx的出生、服務,以及死亡。Servlet生命周期也是如此!與Servlet的生命周期相關的方法有:

  • void init(ServletConfig);
  • void service(ServletRequest,ServletResponse);
  • void destroy();

Servlet在第一次請求的時候,由Tomcat來創建, 馬上調用init()方法, 用戶每請求一次,都會調用一次service(),

當服務器關閉之前, 先銷毀Servlet, 在銷毀Servlet之前,調用destroy()方法.

實現Servlet有三種方式:

  1. 實現javax.servlet.Servlet接口;
  2. 繼承javax.servlet.GenericServlet類;
  3. 繼承javax.servlet.http.HttpServlet類;(推薦

第一種方式: 實現javax.servlet.Servlet接口

  1) 編寫一個類實現Servlet接口

  2) 在web.xml文件中,對Servlet進行配置, 綁定url

  3)  訪問:http://服務器ip:服務器端口/項目名/servlet的url

訪問這個servlet的url:http://localhost:8888/les02/hello

 

Servlet是一個線程不安全, Tomcat會為每一次請求創建一個線程, 我們web項目是一個多線程的項目

默認情況:  Servlet的創建是在第一次請求這個Servlet的時候,創建, 為了Tomcat啟動快, 從用戶角度來看: 第一個訪問的用戶耗時多一點, 耗費創建Servlet的時間,  第一次懲罰

    Tomcat:第一步判斷這個Servlet類有沒有創建對象如果對象。
    直接通過這個類的對象調用service0方法處理用戶請求
    如果沒有: Tomcat先創建這個類的對象,然后通過對象調用service()

第二種方式: 繼承GenericServlet類

   GenericServlet這個類是Servlet的一個實現類, 它是一個抽象類, service()沒有重寫

第三種方式: 繼承HttpServlet類 (推薦)

  HttpServlet是GenericServlet的子類, 也是一個抽象類

1) 編寫一個類繼承HttpServlet, 重寫doGet()以及doPost()

    doGet() 處理Get請求

       doPost() 處理Post請求

2) 在web.xml中配置Servlet

Servlet接口相關類型

在Servlet接口中還存在三個我們不熟悉的類型:

  • ServletRequest:service() 方法的參數,它表示請求對象,它封裝了所有與請求相關的數據,它是由服務器創建的;
  • ServletResponse:service()方法的參數,它表示響應對象,在service()方法中完成對客戶端的響應需要使用這個對象;
  • ServletConfig:init()方法的參數,它表示Servlet配置對象,它對應Servlet的配置信息,那對應web.xml文件中的<servlet>元素

ServletRequest對象常用的方法: getParamenter(String name)    獲取請求參數, 通過請求參數名獲取請求參數的值

ServletResponse對象常用的方法: getWriter()  /  getOutputStream() 響應對象方法: 后台把數據響應給前端, 使用輸出流 (兩個流只能選一個)

ServletConfig對象常用的方法: 獲取指定的Servlet的配置信息,每一個Servlet都有自己的配置信息,

@Override
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException {
        //獲取請求參數
        String name = req.getParameter("name");
        System.out.println("前端傳遞的參數name的值:"+name);
        //給客戶端響應:  響應到客戶端瀏覽器上   類似於js,  document.write()
        //得到響應輸出流
        res.getWriter().write("<h1>hello client</h1>");

        //獲取Servlet初始化參數
                String servletName = config.getServletName();
        String encoding = config.getInitParameter("encoding");
        String age = config.getInitParameter("age");        
        res.getWriter().print("<h1>"+servletName+","+encoding+","+age+"</h1>");
    }        
View Code

 

  • getServletContext() :獲取ServletContext對象  
  • getServletName() : 獲取Servlet的name
  • getInitParament(String name) : 獲取Servlet的初始化參數(在<servlet>中配置的參數)
  • getInitParaments() : 獲取Servlet請求參數所有的name的值,返回的是一個集合, 

HttpServlet調用源碼分析

 三種創建方式的關系可用下圖表示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM