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