sun 公司制訂的一種基於 Java 技術的 WEB 服務器功能的組件規範。1997 年六月,Servlet 1.0 版本發行,最新版本 Servlet 4.0 處於研發狀態。css
所謂的 Servlet 容器,有時候也稱做爲 Servlet 引擎,做爲 Web 服務器或應用服務器的一部分。經過請求和響應對話,提供 Web 客戶端與 Servlets 交互的能力。容器管理 Servlets 實例以及它們的生命週期。html
Servlet 容器的組件大體能夠分爲如下幾類:java
Servlet 組件 ├── 服務組件 | ├── javax.servlet.Servlet | └── javax.servlet.Filter(since Servlet 2.3) | ├── 上下文組件 | ├── javax.servlet.ServletContext | ├── javax.servlet.http.HttpSession | ├── javax.servlet.http.HttpServletRequest | ├── javax.servlet.http.HttpServletResponse | └── javax.servlet.http.Cookie(客戶端) | ├── 配置 | ├── javax.servlet.ServletConfig | └── javax.servlet.FilterConfig(since Servlet 2.3 ) | ├── 輸入輸出 | ├── javax.servlet.ServletInputStream | └── javax.servlet.ServletOutputStream | ├── 異常 | └── javax.servlet.ServletException | ├── 事件(since Servlet 2.3 ) | ├── 生命週期類型 | | ├── javax.servlet.ServletContextEvent | | ├── javax.servlet.http.HttpSessionEvent | | └── java.servlet.ServletRequestEvent | ├── 屬性上下文類型 | | ├── javax.servlet.ServletContextAttributeEvent | | ├── javax.servlet.http.HttpSessionBindingEvent | | └── javax.servlet.ServletRequestAttributeEvent | | ├── 監聽器(since Servlet 2.3) | ├── 生命週期類型 | | ├── javax.servlet.ServletContextListener | | ├── javax.servlet.http.HttpSessionListener | | ├── javax.servlet.http.HttpSessionActivationListener | | └── javax.servlet.ServletRequestListener | | └────└── 屬性上下文類型 ├── javax.servlet.ServletContextAttributeListener ├── javax.servlet.http.HttpSessionAttributeListener ├── javax.servlet.http.HttpSessionBindingListener └── javax.servlet.ServletRequestAttributeListener
Servlet 接口
:init(ServletConfig config)、service(ServletRequest req, ServletResponse res)、destroy()GenericServlet 抽象類
:實現了 Servlet 接口中的 init, destroy 方法HttpServlet 抽象類
:繼承了 GenericServlet 抽象類,實現了 service()ServletConfig 接口
:String getInitParameter(String paraName)ServletRequest 接口
:HttpServletRequest 的父接口ServletResponse 接口
:HttpServletResponse 的父接口Servlet 的生命週期指 Servlet 容器如何去建立 Servlet 對象、如何調用 Servlet 對象的方法來處理請求、以及如何銷燬 Servlet 對象的整個過程。web
Servlet 生命週期的三個階段:瀏覽器
(1) 初始化服務器
當容器啓動或者第一次執行時,Servlet#init(ServletConfig) 方法被執行,初始化當前 Servlet 。併發
(2) 處理請求app
當 HTTP 請求到達容器時,Servlet#service(ServletRequest, ServletResponse) 方法被執行,來處理請求。編碼
(3) 銷燬url
當容器關閉時,容器將會調用 Servlet#destroy() 方法被執行,銷燬當前 Servlet。
Servlet 容器會先假設訪問的是一個 Servlet ,會依據應用名(appname)找到應用所在的文件夾,而後找到 web.xml 文件。
匹配
若是都不匹配,則容器認爲訪問的是一個靜態資源文件(html/css/js),若是找到則返回,不然返回404。
public class HelloWorldServlet extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { //1. 讀請求參數值 String qtyStr = req.getParameter("qty"); int qty = Integer.parseInt(qtyStr); //2. 處理請求 String rs = ""; for (int i = 0; i < qty; i++) { rs += "<h1>Hello World</h1>"; } //3. 設置一個消息頭 content-type,告訴瀏覽器返回的數據類型是一個 html 文檔及編碼格式 //告訴服務器使用 out 輸出時使用指定的編碼格式進行編碼 res.setContentType("text/html;charset=utf-8"); //四、得到一個輸出流 PrintWriter out = res.getWriter(); //五、調用流的方法進行輸出,其實質是將處理結果寫到了 res 對象上 out.println(rs); out.close(); } }
配置 WEB-INF/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-name>helloWord</servlet-name> <!--類名要完整(包名,類名都要全)--> <servlet-class>com.herolei.HelloWorldServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloWord</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
啓動程序,訪問 http://localhost:8080/hello?qty=30
補充:web 打包後的目錄以下
appname(應用名) └──WEB-INF ├──classes .class文件 ├──lib .jar文件,lib文件夾可選 └──web.xml 部署描述文件
Servlet 規範當中定義的一種特殊的組件,用來監聽容器產生的事件並進行處理。
容器會產生兩大類事件:
public interface ServletContextListener extends EventListener { // 容器初始化 void contextInitialized(ServletContextEvent ctx); // 容器銷燬 void contextDestroyed(ServletContextEvent ctx); } public interface ServletContextAttributeListener extends EventListener { void attributeAdded(ServletContextAttributeEvent event); void attributeRemoved(ServletContextAttributeEvent event); void attributeReplaced(ServletContextAttributeEvent event); }
public interface Filter { // 初始化 Filter void init(FilterConfig filterConfig) throws ServletException; // 調用,若是要繼續調用下一個 Filter,須要調用 chain.doFilter(request, response) void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; // 銷燬 public void destroy(); } public interface FilterChain { void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException; }
Filter 生命週期以下:
(1) 初始化
當容器啓動時,Filter#init(FilterConfig) 方法被執行,初始化當前 Filter。
(2) 處理請求
當 HTTP 請求到達容器時,Filter#doFilter(ServletRequest,ServletResponse,FilterChain) 方法被執行,來攔截請求,在 Servlet#service(ServletRequest,ServletResponse) 方法調用前執行。
(3) 銷燬
當容器關閉時,容器將會調用 Filter#destroy() 方法被執行,銷燬當前 Filter。
參考:
天天用心記錄一點點。內容也許不重要,但習慣很重要!