Java Servlet詳解(體系結構+註解配置+生命週期)

Java Servlet詳解(註解配置+生命週期)

什麼是Servlet : (Server applet)?

顧名思義:服務端的小程序
Servlet只是一個接口,定義了Java被瀏覽器訪問到(Tomcat)的識別規則,咱們須要定義一個類來實現Servlet接口java

建立一個項目流程

1.建立一個JavaEE項目
2.定義一個類實習Servlet方法
3.實現接口中的抽象方法web

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class Servlet implements javax.servlet.Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("訪問");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("關閉");
    }
}

4.在WEB.XML中配置Servelt小程序

在這裏插入圖片描述

<?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-name>demo1</servlet-name>
        <servlet-class>Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>

結果瀏覽器

在這裏插入圖片描述
在這裏插入圖片描述

執行原理加圖解

1.當服務器接受到服務器請求的時候,會先解析瀏覽器的UPL地址,獲取訪問服務的路徑
2.而後查找WEB.xml文件,查看是否有對應的 標籤體的內容
3.若是有,則找到對應的 全類名
4.tomcat會將字節碼文件加載進內存,而且建立其對象
5.調用其方法
tomcat

在這裏插入圖片描述

Servlet的生命週期

1.被建立:執行init方法只執行一次
Servlet何時建立?
默認狀況:在第一次被訪問的時候建立
能夠在配置執行Servlet的建立時機
標籤下配置 安全

  1. 第一次被訪問時,建立
    的值爲負數
  2. 在服務器啓動時,建立
    的值爲0或正整數

注意服務器

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

2. 提供服務:執行service方法,執行屢次
* 每次訪問Servlet時,Service方法都會被調用一次。
3. 被銷燬:執行destroy方法,只執行一次
* Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
* 只有服務器正常關閉時,纔會執行destroy方法。
* destroy方法在Servlet被銷燬以前執行,通常用於釋放資源app

Servlet3.0

好處:支持註解配置,不須要使用web.xml了
步驟:
1. 建立JavaEE項目,選擇Servlet的版本3.0以上,能夠不建立web.xml
2. 定義一個類,實現Servlet接口
3. 複寫方法
4. 在類上使用@WebServlet註解,進行配置async

* @WebServlet("資源路徑")


				@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 "";
				}

代碼ide

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo1")
public class Servlet implements javax.servlet.Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("訪問");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("關閉");
    }
}

相比於以前更加簡潔,使用更加方便

在這裏插入圖片描述
在這裏插入圖片描述

IDEA中Tomcat的相關配置

1. IDEA會爲每個tomcat部署的項目單獨創建一份配置文件
* 查看控制檯的log:Using CATALINA_BASE: "C:\Users\86151.IntelliJIdea2017.3\system\tomcat\Tomcat_8_5_31_CSDNWeb"
地址來源
在這裏插入圖片描述

2. 工做空間項目和tomcat部署的web項目
* tomcat真正訪問的是「tomcat部署的web項目」,"tomcat部署的web項目"對應着"工做空間項目" 的web目錄下的全部資源
* WEB-INF目錄下的資源不能被瀏覽器直接訪問。
3. 斷點調試:使用"小蟲子"啓動 dubug 啓動

Servlet的體系結構

在這裏插入圖片描述GenericServlet
將Servlet接口中其餘的方法作了默認空實現,只將service()方法做爲抽象
未來定義Servlet類時,能夠繼承GenericServlet,實現service()方法便可

HttpServlet
對http協議的一種封裝,簡化操做
1. 定義類繼承HttpServlet
2. 複寫doGet/doPost方法

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }
    }

** Servlet相關配置**
1. urlpartten:Servlet訪問路徑
1. 一個Servlet能夠定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})
2. 路徑定義規則:
1. /xxx:路徑匹配
2. /xxx/xxx:多層路徑,目錄結構
3. *.do:擴展名匹配

以上就是Tomcat與Servlet的一些基礎知識,喜歡個人能夠關注收藏,我會常常更新文章

在這裏插入圖片描述

相關文章
相關標籤/搜索