013-Servlet初步

目錄

概述

快速入門

Servlet生命週期

Servlet3.0

IDEA與tomcat的相關配置

Servlet的體系結構          

Servlet相關配置


概述

Servlet:  Servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立於平臺和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解爲後者。Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。

簡單理解:運行在服務器端的小程序;
Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則;
將來我們自定義一個類,實現Servlet接口,複寫方法來實現接口邏輯。


快速入門

1. 創建JavaEE項目,在idea中創建一個Java EE 項目

2. 任意定義一個類,實現Servlet接口

package cn.itcast.web.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * Servlet快速入門
 */
public class ServletDemo1 implements Servlet {


     /**
     * 初始化方法
     * 在Servlet被創建時,執行。只會執行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }
    /**
     * 獲取ServletConfig對象
     * ServletConfig:Servlet的配置對象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服務方法
     * 每一次Servlet被訪問時,執行。執行多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet");
    }
    /**
     * 獲取Servlet的一些信息,版本,作者等等。。
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 銷燬方法
     * 在服務器正常關閉時,執行,執行一次。
     */
    @Override
    public void destroy() {

    }
}

3. 實現接口中的抽象方法

4. 配置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_3_1.xsd"
         version="3.1">

    <!--配置Servlet -->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

    <!--配置Servlet -->
    <servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class>
        <!--指定Servlet的創建時機
            1.第一次被訪問時,創建
                * <load-on-startup>的值爲負數
            2.在服務器啓動時,創建
                * <load-on-startup>的值爲0或正整數
        -->

        <load-on-startup>-5</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo2</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>    
</web-app>

執行原理:

  1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
  2. 查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
  3. 如果有,則在找到對應的<servlet-class>全類名
  4. tomcat會將字節碼文件加載進內存,並且創建其對象
  5. 調用其方法


Servlet生命週期

Servlet中的生命週期方法:

1. 被創建:執行init方法,只執行一次
Servlet什麼時候被創建?
默認情況下,第一次被訪問時,Servlet被創建 , 但是也可以配置執行Servlet的創建時機。
在<servlet>標籤下配置<load-on-startup>標籤:
    1. 第一次被訪問時創建,    只要配置值小於0即可,<load-on-startup>-1</load-on-startup>                   
    2. 在服務器啓動時創建,配置值>=0 即可 ,   <load-on-startup>5</load-on-startup>

Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
多個用戶同時訪問時,可能存在線程安全問題。
解決:儘量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對修改值

2. 提供服務:執行service方法,執行多次

每次訪問這個Servlet服務時,Service方法都會被調用一次。

3. 被銷燬:執行destroy方法,只執行一次
Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
只有服務器正常關閉時,纔會執行destroy方法。
destroy方法在Servlet被銷燬之前執行,一般用於釋放資源


Servlet3.0

好處:支持註解配置,可以不需要web.xml了。

步驟:
1. 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml
2. 定義一個類,實現Servlet接口
3. 複寫方法
4. 在類上使用@WebServlet註解,進行配置 ,簡單寫法 @WebServlet("/demo1")

@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
}

下面是註解源碼,可以看到,value() default {};//代表urlPatterns()屬性配置   ,既然有且僅有一個value屬性,註解裏可以省略寫參數名,直接寫上值就表示 urlPatterns() ,  注意, 註解要省略寫屬性名,需要當且僅當註解參數列表有且僅有一個value屬性,那麼只寫一個參數值時這個值就會給value屬性。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
    String name() default "";//相當於<Servlet-name>
    String[] value() default {};//代表urlPatterns()屬性配置
    String[] urlPatterns() default {};//相當於<url-pattern>
    int loadOnStartup() default -1;//相當於<load-on-startup>
    WebInitParam[] initParams() default {};
    boolean asyncSupported() default false;
    String smallIcon() default "";
    String largeIcon() default "";
    String description() default "";
    String displayName() default "";
}

IDEA與tomcat的相關配置

1. IDEA會爲每一個tomcat部署的項目單獨建立一份配置文件
        查看控制檯的log:Using CATALINA_BASE:   "C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\_itcast"

2. 工作空間項目   和     tomcat部署的web項目

tomcat真正訪問的是“tomcat部署的web項目”,"tomcat部署的web項目"對應着"工作空間項目" 的web目錄下的所有資源。
WEB-INF目錄下的資源不能被瀏覽器直接訪問。

3. 斷點調試:使用"小蟲子"啓動 dubug 啓動,而不是通過綠色箭頭運行。


Servlet的體系結構          

Servlet -- 是一個接口
            |
        GenericServlet -- 抽象類
            |
        HttpServlet  -- 抽象類

GenericServlet:將Servlet接口中其他的方法做了默認空實現,只將service()方法作爲抽象 ,將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可,當然其他的方法如果有必要也是可以重寫的。

HttpServlet:對http協議的一種封裝,用於簡化Http請求的操作。如果不用HttpServlet ,通常我們自己實現Servlet時也要用如圖寫法,對request的請求類型進行區分,然後實現邏輯。所以HttpServlet幫我們做了這件事,簡化操作。

用法:

1. 定義類繼承HttpServlet
2. 複寫doGet/doPost方法


Servlet相關配置

urlpartten :  Servlet訪問路徑
            1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})      (不常用)
            2. 路徑定義規則:(1和2比較常用)
                1. /xxx:路徑匹配      eg:    @WebServlet({"/d4"})
                2. /xxx/xxx:多層路徑,目錄結構      eg:    @WebServlet({"/d4/m4/t"})
                3. *.do:擴展名匹配,

                              注意前面不要加 "/"  ,拓展名可以任意自定義    eg:    @WebServlet({"test.do"})      ,

                              在瀏覽器中訪問 http://localhost:80/test.do

 

              

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