1、什麼是Servlethtml
一、什麼是Servlet?java
維基百科上有寫:Java Servlet 是Java編寫的服務器端程序,其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。Servlet是是不可以獨立運行的,Servlet運行在Web容器裏面。(什麼是Web容器?Web容器是一個特殊的JVM,它負責維護Servlet的生命週期及爲每一個請求生成線程)web
二、Servlet有什麼用?服務器
Servlet承擔的功能能夠理解爲三點:1)接收客戶端的請求;2)本身處理或者調用邏輯層的API處理請求;3)處理結果返回應答給客戶端。app
三、請求/應答模式(最經常使用的是基於HTTP 協議傳輸)ide
注意幾點:
post
1)大多數的傳輸是基於HTTP協議的;url
2)一次HTTP調用是指一個請求和應答來回;spa
3)HTTP協議是面向鏈接的;(即,通過一次調用後會斷開(節省資源,但延長時間),如今也有長鏈接(能縮短響應時間))線程
4)HTTP協議是無狀態的。(即,服務器答應後再也不保留客戶端信息)
2、Servlet主要API
ServletAPI主要在javax.servlet包裏面:
關於Servlet的的主要API,這裏主要是思考一下它的設計思路,如下是三個問題:1)三個接口的來源;2)何時使用抽象類;3)爲何抽象類分爲了兩層?下面逐一分析:
一、三個接口的來源:Servlet接口,原理上只要實現了這一個接口就能夠創建一個Servlet類,可是這樣的話裏面有一些方法就要本身去實現了;ServletRequest接口,用來接受請求內容;ServletResponse接口,用來返回應答給客戶端。
二、何時使用抽象類:抽象類和接口的區別在於抽象類能夠定義實現一些方法的同時又能夠對其子類進行約束。也就是在上圖中的抽象方法能夠實現接口的部分方法,對於不能實現的又能夠以抽象方法的形式對其子類進行約束,讓其子類實現其尚未實現的方法。
三、爲何抽象類分開爲兩層:便於擴展,由於這裏的設計思路是先創建一個原型的抽象Servlet類,原型Serrvlet以後能夠依據不一樣的通信協議再創建一個基於某一個協議的Servlet抽象類,例如這裏的是Http協議的Servlet抽象類,若是之後有擴展能夠繼承原型抽象類創建另外一個協議的Servlet抽象類。
3、搭建ServletDemo
(一)、web應用的基本結構:
—WEB-INF
— —web.xml(部署描述文件,項目必備,web服務器對項目解析時首先讀取該文件)
— —classes(用來存放程序的字節碼文件)
— —lib(用於存放程序執行須要的jar包)
(二)、Servlet
一、DemoServlet.java
1 package com.kwan.web.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class DemoServlet extends HttpServlet { 12 13 private int initCounter = 0; 14 private int doCounter = 0; 15 private int serviceCounter = 0; 16 private int destroyCounter = 0; 17 private String str = ""; 18 19 @Override 20 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 21 doPost(req, resp); 22 } 23 24 @Override 25 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 26 System.out.println("-----doGet or doPost-----"); 27 doCounter++; 28 PrintWriter pw = resp.getWriter(); 29 str += "Thank you! " + doCounter + "\n"; 30 pw.write(str); 31 pw.close(); 32 } 33 34 @Override 35 protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { 36 System.out.println("-----service-----"); 37 serviceCounter++; 38 super.service(arg0, arg1); 39 } 40 41 @Override 42 public void destroy() { 43 System.out.println("-----destroy-----"); 44 destroyCounter++; 45 System.out.println("-----end-----"); 46 System.out.println("initCounter="+initCounter); 47 System.out.println("serviceCounter="+serviceCounter); 48 System.out.println("doCounter="+doCounter); 49 System.out.println("destroyCounter="+destroyCounter); 50 } 51 52 @Override 53 public void init() throws ServletException { 54 System.out.println("-----init-----"); 55 initCounter++; 56 } 57 58 }
二、web.xml
1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 3 <web-app xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 7 version="3.0" 8 metadata-complete="true"> 9 10 <servlet> 11 <servlet-name>DemoServlet</servlet-name> 12 <servlet-class>com.kwan.web.servlet.DemoServlet</servlet-class> 13 </servlet> 14 15 <servlet-mapping> 16 <servlet-name>DemoServlet</servlet-name> 17 <url-pattern>/demo</url-pattern> 18 </servlet-mapping> 19 20 </web-app>
三、index.html
1 <html> 2 <body> 3 <form method="post" action="/DemoServlet/demo"> 4 <input type="submit"></input> 5 </form> 6 <body> 7 </html>
4、Servlet的生命週期
上面的小例子運行後,點擊五次submit以後再退出會看到下面的顯示結果:
這裏只是說明Servlet生命週期中的三個回調方法:init、destroy、service,這三個方法是由web容器調用,而非servlet類調用,並且init和destroy方法只會調用一次。
Servlet的生命週期是這樣的:
1)web容器加載servlet類,在接收請求時檢查實例池是否存在servlet類,若不存在則實例化並調用init方法初始花servlet實例;
2)web容器接受請求時,調用service方法,在service方法裏面能夠調用各類方法來處理這些請求;
3)當servlet實例要銷燬前,web容器會調用destroy方法,這個方法能夠用來在實例銷燬前作一些保留信息的工做。
5、參考資料
二、Java私塾