Servlet
Servlet(Server Applet)是Java Servlet的簡稱某残,稱為小服務(wù)程序或服務(wù)連接器给涕,用于交互式地瀏覽和生成數(shù)據(jù)怖糊,生成動(dòng)態(tài)Web內(nèi)容纱扭。
進(jìn)化史
實(shí)現(xiàn)Servlet接口必須實(shí)現(xiàn)所有方法
GenericServlet抽象類:只需重寫需要的方法
HttpServlet繼承自GenericServlet類衡怀,將ServletRequst和ServletResponse對象分別轉(zhuǎn)換程HttpServletRequest和HttpServletResponse
-
JSP 不需要編譯的Servlet
- EL表達(dá)式輕松訪問應(yīng)用程序?qū)ο?/li>
- JSTL標(biāo)簽庫在EL的基礎(chǔ)上進(jìn)一步解決了遍歷Map棍矛,集合,條件測試抛杨,XML處理够委,數(shù)據(jù)庫操作訪問等操作的問題
- Filter攔截Request請求
-
Spring MVC
Servlet動(dòng)態(tài)加載可以在不重啟web應(yīng)用前提下添加新的web對象
實(shí)現(xiàn)依賴注入方法? Module模型:JavaBeans
? View視圖:JSP頁面
? Controller控制器:Servlet
請求響應(yīng)流程
- Web服務(wù)器將Http請求傳給Servlet容器
- Servlet容器
- 根據(jù)請求鏈接創(chuàng)建Servlet(init()))
- 創(chuàng)建ServletRequest封裝請求,同時(shí)創(chuàng)建ServletResponse封裝響應(yīng)
- 調(diào)用Web應(yīng)用定 義的過濾器鏈(遞歸調(diào)用),鏈尾會(huì)調(diào)用Servlet
- 調(diào)用Servlet處理請求(service(ServletRequest,ServletResponse))
- Servlet處理請求蝶桶,結(jié)束Web過濾器鏈的遞歸調(diào)用
- Servlet容器根據(jù)ServletResponse中生成HTTP響應(yīng),并傳給Web服務(wù)器
web服務(wù)器
即HTTP服務(wù)器,僅能響應(yīng)靜態(tài)html頁面請求,單向連接于Servlet容器以響應(yīng)動(dòng)態(tài)資源
Apache
- 當(dāng)今(2019.6.20)世界上最流行的Web服務(wù)器慨绳,可以處理瀏覽器的HTTP請求,默認(rèn)端口為80
- Apache只支持HTML等靜態(tài)普通網(wǎng)頁真竖,可以單向連通Tomcat(Apache可以訪問Tomcat的資源脐雪,反之不然)
Servlet容器
Servlet容器是Web服務(wù)器的一部分
為Servlet提供運(yùn)行環(huán)境,通過XML文件配置Servlet恢共,加載战秋、實(shí)例化、調(diào)用和回收Servlet
單個(gè)Web項(xiàng)目會(huì)被Servlet容器封裝成ServletContext
Web應(yīng)用ServletContext
獲取
getServletContext提供全局域
get/set/removeAttribute 全局屬性鍵值對獲取全局配置
getInitParameter 讀取全局參數(shù)(需在web.xml中配置<context-param>)獲取工程目錄下的資源文件
getRealPath 目錄絕對路徑
getResourceAsStream 獲取資源的輸入流-
監(jiān)聽Web啟動(dòng)和終止
? Servlet容器啟動(dòng)或終止Web應(yīng)用(Context)時(shí)讨韭,觸發(fā)事件ServletContextEvent,調(diào)用ServletContextListener接口
contextInitialized 此方法在Filter初始化前調(diào)用
contextDestoryed 此方法在所有Servlet和Filter銷毀后調(diào)用- 重寫ServletContextListener接口
- 在web.xml配置 <listener><listener-class>重寫類/>/>
Servlet過濾器Filter
? Web服務(wù)器不會(huì)直接調(diào)用指定web資源(Servlet)的service方法前后脂信,而是通過調(diào)用FilterChain的doFilter方法調(diào)用對應(yīng)Servlet的service方法
FilterChain.doFilter(ServletRequest req,ServletResponse resp,FilterChain chain):
- 如果鏈中有下一個(gè)Filter,調(diào)用其doFilter(req,resp,chain)方法
- 否則透硝,調(diào)用指定Servlet的service(req,resp)方法
自定義Filter.doFilter(ServletRequest req,ServletResponse resp,FilterChain chain):
- 通過調(diào)用chain.doFilter(req,resp,chain)實(shí)現(xiàn)遞歸調(diào)用整個(gè)鏈中所有Filter的過濾方法并最終調(diào)用Servlet的service(req,resp)方法
常用過濾器
詳情參考博客園文章《Tomcat常用的過濾器》
作用 | 過濾器 |
---|---|
控制跨域請求的訪問權(quán)限 | CorsFilter |
防止跨站請求偽造(Cross-site request forgery) | CsrfPreventionFilter |
防止參數(shù)丟失 | FailedRequestFilter |
獲取客戶端IP | RemoteAddrFilter |
獲取客戶端主機(jī) | RemoteHostFilter |
獲取原始客戶端IP | RemoteIpFilter |
設(shè)置字符編碼 | SetCharacterEncodingFilter |