Servlet學習筆記
1)Servlet 概念
概念:運行在服務器端的小程序
- Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則;
- 將來我們自定義一個類,實現Servlet接口,複寫方法
2)Servlet 快速入門
- 創建JavaEE項目;
- 定義一個類,實現Servlet接口:public class ServletDemo1 implements Servlet
- 實現接口中的抽象方法;
package cn.itcast.web.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @ClassName ServletDemo1
* @Description //Servlet入門
* @Date: 2020/5/4
* @Version 1.0
*/
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
// 提供服務的方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 配置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>demo</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<!--2、添加ServletMapping-->
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
運行結果:
3)Servlet 執行原理
- 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑;
- 查找web.xml文件,是否有對應的標籤體內容;
- 如果有,則在找到對應的全類名;
- tomcat會將字節碼文件加載進內存,並且創建其對象;
- 調用其方法,步驟如下圖所示
4)Servlet 生命週期方法
Servlet中的生命週期方法
- 初始化方法
被創建:執行init方法,只執行一次
* Servlet什麼時候被創建?
* 默認情況下,第一次被訪問時,Servlet被創建
* 可以配置執行Servlet的創建時機。
* 在<servlet>標籤下配置
<!--配置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的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
* 多個用戶同時訪問時,可能存在線程安全問題。
* 解決:儘量不要在Servlet中定義成員變量。即使定義了成員變量,也不要修改其值
- 提供服務方法
提供服務:執行service方法,執行多次
* 每次訪問Servlet時,Service方法都會被調用一次。
- 被銷燬方法
被銷燬:執行destroy方法,只執行一次
* Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
* 只有服務器正常關閉時,纔會執行destroy方法。
* destroy方法在Servlet被銷燬之前執行,一般用於釋放資源
- 代碼測試
package cn.itcast.web.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @ClassName ServletDemo1
* @Description //Servlet入門
* @Date: 2020/5/4
* @Version 1.0
*/
public class ServletDemo2 implements Servlet {
/*
* @Description //初始化方法,在Servlet被創建時執行,只會執行一次
* @Date 14:50 2020/5/4
* @Param
* @return
**/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init 。。。。。。。。。。。。");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/*
* @Description //提供服務的方法,在每一次Servlet被訪問時執行,執行多次
* @Date 14:50 2020/5/4
* @Param
* @return
**/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service 。。。。。。。。。。。。");
}
@Override
public String getServletInfo() {
return null;
}
/*
* @Description //銷燬服務的方法,在服務器正常關閉時執行,執行一次
* @Date 14:50 2020/5/4
* @Param
* @return
**/
@Override
public void destroy() {
System.out.println("destroy 。。。。。。。。。。。。");
}
}
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>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>
<!--2、添加ServletMapping-->
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
</web-app>
輸出:【請求一次】—【init 和 service 方法均調用】
【請求兩次】—【service 方法調用】
【關閉服務】—【destroy 方法調用】
5)Servlet3.0 註解配置
- Servlet3.0優勢:支持註解配置;可以不再需要web.xml;
- 步驟:
2.1 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml;
2.2 定義一個類,實現Servlet接口;
2.3 複寫方法;
2.4 在類上使用@WebServlet註解,進行配置;【@WebServlet(“資源路徑”)】
代碼如下:
package cn.itcast.web.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @ClassName ServletDemo
* @Description //註解方式替代Web.xml
* @Date: 2020/5/4
* @Version 1.0
*/
//@WebServlet(urlPatterns = "/demo")
@WebServlet("/demo")
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Servlet 3.0 。。。。。。。。。。。。。。。。。。。。。");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
6)Servlet的體系結構
- 體系結構如下:
Servlet – 接口
|
GenericServlet – 抽象類
|
HttpServlet – 抽象類 - GenericServlet
GenericServlet:將Servlet接口中其他的方法做了默認空實現,只將service()方法作爲抽象
將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可 - GenericServlet 代碼實現【一般不使用】
package cn.itcast.web.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @ClassName ServletDemo
* @Description 不繼承Servlet,擴展GenericServlet
* @Date: 2020/5/4
* @Version 1.0
*/
@WebServlet("/demo2")
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("GenericServlet 。。。。。。。。。。。。。。。。。。。。。");
}
}
- HttpServlet 【使用多】
HttpServlet:對http協議的一種封裝,簡化操作
1. 定義類繼承HttpServlet
2. 複寫doGet/doPost方法
HttpServlet 將 下圖的步驟進行封裝:
- HttpServlet 代碼實現【使用多,推薦】
package cn.itcast.web.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @ClassName ServletDemo
* @Description 不繼承Servlet,HttpServlet
* @Date: 2020/5/4
* @Version 1.0
*/
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet 。。。。。。。。。。。。。。。。。。。。。");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost 。。。。。。。。。。。。。。。。。。。。。");
}
}
輸出:
7)Servlet的相關配置
-
一個Servlet可以定義多個訪問路徑
例如:@WebServlet({"/demo4","/demo04","/demo004"}) -
路徑定義規則:
2.1 /xxx:路徑匹配 — @WebServlet("/demo4")2.2 /xxx/xxx:多層路徑,目錄結構 — @WebServlet("/user/demo4") @WebServlet("/user/*")
2.3 .do:擴展名匹配 — @WebServlet(“* .do”)
————————————————————————————————————————————
內容來源:《學習傳智播客的課程《JavaWeb+黑馬旅遊網》》
關注公衆號,回覆 【算法】,獲取高清算法書!