資源描述:
《servlet-我們到底能走多遠系列(7)》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、Servlet的核心類圖如下:上面的servlet只是接口,相當于描述了servlet的標準,也就是說與協(xié)議無關。而HttpServlet的實現(xiàn)是根據(jù)Http協(xié)議來完成的??聪旅娴慕貓D: 打開源碼看后發(fā)現(xiàn)大多數(shù)接口和抽象類,那么真正的實現(xiàn)都在哪呢?在servlet容器源代碼里,即類似Tomcat這樣的servlet容器?! ∷晕矣X得可以這樣理解Servlet的作用:它提供了操控的按鈕,這些按鈕一旦被安裝到Servlet容器里面,http://gexing.qqq80.com我們就可以通過這些按鈕操控
2、servlet容器,從而管理我們自己的Servlet實例?! ∵@一點很重要。所以閱讀Servlet源碼其實就是了解他的基本結構和API,我們真正要讀的是Tomcat的源碼!?Servlet的運行結構和API:首先看下一次Http請求-響應的過程: A,首先客戶端通過瀏覽器向服務器發(fā)送Http請求; B,Tomcat監(jiān)聽服務器的8080端口,當有Http請求發(fā)過來之后,解析出項目名稱,然后到webapps目錄下搜索到該項目文件夾?! ,Tomcat作為servlet的容器,實例化第一次請求調(diào)用的的s
3、ervlet實例(以后再有相同的servlet的請求,使用第一次的實例)?! ,調(diào)用init()方法,初始化工作?! ,調(diào)用HttpServlet的service方法,中間會更加請求,調(diào)用doGet或doPost方法,執(zhí)行核心邏輯代碼?! ,執(zhí)行完servlet后,返回響應,客戶端瀏覽器根據(jù)響應呈現(xiàn)效果。然后我們看下基本的運行機制:從圖上可以看出,不同的用戶請求并發(fā)使用同一個Servlet實例,這是一個比較重要的基礎機制。Container解析Http請求后,實例化Servlet,因為是Http請
4、求,會執(zhí)行HttpServlet的代碼:首先會執(zhí)行HttpServlet中的service(ServletRequestreq,ServletResponseres)方法:publicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException{HttpServletRequestrequest;HttpServletResponseresponse;http://www.caise8.comtry
5、{request=(HttpServletRequest)req;//請求轉換成Http請求response=(HttpServletResponse)res;//響應轉換成Http響應}catch(ClassCastExceptione){thrownewServletException("non-HTTPrequestorresponse");}service(request,response);//調(diào)用處理Http的service方法}然后會調(diào)用service(HttpServletRequest
6、req,HttpServletResponseresp)方法:protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{Stringmethod=req.getMethod();//取得req中的方法類型if(method.equals(METHOD_GET)){//根據(jù)方法類型來決定執(zhí)行后續(xù)的方法,我們只關注doGet和doPostlonglastModif
7、ied=getLastModified(req);if(lastModified==-1){doGet(req,resp);}else{longifModifiedSince=req.getDateHeader(HEADER_IFMODSINCE);if(ifModifiedSince<(lastModified/1000*1000)){maybeSetLastModified(resp,lastModified);doGet(req,resp);//如此我們就能執(zhí)行到自己寫的doGet方法,從而執(zhí)行自
8、己的業(yè)務邏輯。}else{resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);}}}elseif(method.equals(METHOD_HEAD)){longlastModified=getLastModified(req);maybeSetLastModified(resp,lastModified);doHead(req,resp);}elseif(method.equals(ME