含義
由java編寫的,線程安全(一個對象的屬性,只提供給其他的線程get方法不提供set方法)的web組件;在MVC模式中起到控制層的作用;主要功能在於交互式地瀏覽和修改數據,生成動態Web內容;
功能
1、CGI:通用網關接口;
通用網關接口:以注入的方式從web容器中拿到和傳遞內置對象
注入:調用方法就傳遞數據,提高效率;config、request、response
依賴查找:依賴對象給數據;out、session、application
2、拿到請求參數,對請求參數的格式做驗證,創建表單bean,收集表單數據;
3、對請求進行分析,通過分析,把請求分發給業務層;
4、根據業務層的轉向信息轉到視圖層;
Servlet架構
流程
啓動tomcat, servlet就 創建了
1 tomcat啓動以後,用戶發請求[例如,查找姓名爲Tom的學生的信息,這個請求通過瀏覽器,通過表單發出去],這個請求發送到http協議上,首先給tomcat服務器,
2 tomcat服 務器接收這個請求,爲這個請求創建request, response內 置對象; request內置 對象存放請求字符串,請求參數,IP地址和cookie;
3 tomcat通 過配置[必須配置]把請求轉給控制層servlet組件,同時把request內置對象,response內置對象注入給servlet;
4 servlet調 用相應的方法後,創建表單bean,從request中 拿到請求參數封裝到表單bean; servlet拿到請求參數, 對請求參數進行分析,把請求分發給業務層[給業務層request, response, 表單bean] ;
5 業務組件如果需要到數據庫裏查找信息,業務層又把請求交給了持久層,調用持久層對象的方法[業務層已經把表單bean傳給了持久層,持久層拿到了表單bean,就拿到了用戶的請求參數]
6 持久層通過sql語句訪問數據庫,最後會拿到結果[Tom的姓名,年齡等一些信息],持久層拿到了用戶Tom的一些信息,持久層創建結果bean,然後把結果信息封裝到結果bean裏面,緊接着持久層把結果bean返回給業務層;
7 業務層會把這個結果bean設到request內置對象,然後業務層又向控制層返回一個轉向信息;
8 控制層對轉向信息進行分析,轉向了相應的視圖組件jsp[視圖組件不一定是jsp];
8 視圖組件從request內置對象當中拿到了結果信息,用el表達式或者標籤進行處理「這個過程叫渲染];
9 最後渲染的結果通過response放到HTTP協議返回給瀏覽器
語法
包聲明:字節碼文件要放到 WEB-INF/classes/以包對應的目錄結構下;
包導入:
import java.io.* ;
// HttpServlet屬於javax.servlet.http包下
// ServletException屬於javax.servlet包下
import javax.servlet.* ;
// HttpServletRequest、HttpServletResponse存放在javax.servlet.http包下
import javax.servlet.http.* ;
要繼承HttpServlet;
至少複寫四個方法:
doGet方法:
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
接收和處理get請求,當地址欄或超鏈接向服務器發送get請求時,通過配置tomcat會調用servlet的doGet方法,同時把request和response對象(對象的地址)注入進來,方法的形參用子接口類型的變量來接收,還要拋出IOException和ServletException;
doPost方法:
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
處理post請求;
init方法:
public void init(ServletConfig config) throws ServletException
一創建servlet對象就會立馬調用該方法,並把config對象注入進來,獲取初始化信息;
destory方法:
tomcat關閉就會調用該方法銷燬servlet,做善後工作,最後servlet的“屍體”被GC掉;
部署和配置
方法一:servlet的jar包(tomcat/common/lib下)要放在jdk/jre/lib/ext下;
方法二:通過classpath指定,在classpath中加入此開發包的路徑;
tomcat一啓動就會讀取web.xml文件的<servlet>標籤,看到配置了<load-on-startup>標籤,就按<servlet-class>的指示到 WEB-INF/classes下找包對應的類----SimpleServlet,並調用無參的構造方法創建出SimpleServlet對象,
只有配置了<load-on-startup>纔會在tomcat一啓動就創建servlet對象,如果沒有配置該標籤,只有用戶第一次訪問servlet組件的時候纔會創建servlet對象
推薦:配置<load-on-startup>,servlet創建越早越好;0-9代表創建servlet對象的優先級,數字越小優先級越高;
配置代碼:
<servlet>
<servlet-name>simple</servlet-name>
<servlet-class>cn.zte.pxb.servlet.SimpleServlet</servlet-class> //找到SimpleServlet對象
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>simple</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
Servlet的訪問
先找真實項目名,讀取項目下的web-xml,找到相應的servlet對象(或創建servlet對象)
test虛項目名-->config下的servlet.xml-->真實項目名
組件demo映射名-->當前真實項目的web.xml-->找到對應的servlet
找到url=demo的<servlet-mapping>中的<servlet-name>,再找到對應的servlet對象(如果沒有配load,就此時才創建)
調用servlet對象對應的get或者post方法
通過response內置對象拿到out內置對象,不是創建。
servlet拿到out,servlet發送靜態代碼給瀏覽器,誰拿誰發
Servlet生命週期
1. Tomcat啓動,創建servlet對象,或在用戶第一次訪問servlet組件時創建servlet對象;
2. Servlet對象一創建調用init()方法,把config對象注入, 獲取初始化參數;
3.用戶通過get發送請求,tomcat通過配置調用servlet對象的doGet()方法,同時把request,response對象注入進來;
4.在doGet()方法中, 創建表單bean, 封裝表單bean數據, 對請求進行分析,分發給業務層;
5.業務層獲得持久層的結果bean後, 向servlet的doGet()方法發送轉向信息, servlet對轉向信息進行分析,把請求分發視圖組件
6.視圖組件從request中拿到結果信息,對結果數據進行渲染,把最後的結果信息通過response回傳給瀏覽器;