容器完成請(qǐng)求的流程
- 啟動(dòng)web容器
- 容器讀取web.xml爬橡,讀取init-Param柳弄,并搜索目錄下的servlet文件
- 加載、實(shí)例化servlet(也可能在客戶請(qǐng)求時(shí)加載)
- 調(diào)用GernericServlet中的init()方法涌萤,傳入ServletConfig和ServletContext對(duì)象
- 假設(shè)收到一個(gè)請(qǐng)求泵三,URL指向一個(gè)sevlet
- 容器創(chuàng)建HttpServletRequest和HttpServletResponse對(duì)象
- 容器從線程池為其分配一個(gè)線程
- 將request和response對(duì)象傳給sevlet對(duì)象
- 容器開始servlet的生命周期
- 調(diào)用GernericServlet中的service()方法,會(huì)根據(jù)請(qǐng)求類型調(diào)用對(duì)應(yīng)方法伴网,如doGet、doPost妆棒,
- 返回request/response對(duì)象
- 調(diào)用destroy()方法
- 容器將request/response對(duì)象發(fā)送到JSP文件
- 轉(zhuǎn)換為HTTP響應(yīng)澡腾,發(fā)回瀏覽器
- 銷毀request和response對(duì)象、線程
說明:
- 容器根據(jù)每一個(gè)請(qǐng)求分配一個(gè)線程(而不是每一個(gè)用戶糕珊,容器不識(shí)別用戶)
- servlet的構(gòu)造器中沒有內(nèi)容动分,通過init方法初始化
- init方法傳入一個(gè)ServletConfig對(duì)象,記錄了部署時(shí)的參數(shù)
請(qǐng)求和相應(yīng)
- ServletRequest和ServletResponse是接口红选, HttpServletRequest和HttpServletResponse也是接口澜公,實(shí)現(xiàn)了上述兩個(gè)父接口
- 容器實(shí)現(xiàn)了HttpServletRequest和HttpServletResponse接口
- get和post的區(qū)別
- 從本質(zhì)上講,get用于獲取內(nèi)容喇肋,對(duì)后臺(tái)數(shù)據(jù)不會(huì)做任何修改
- post更多用于增刪改
-- | get | post |
---|---|---|
請(qǐng)求行 | 有參數(shù)坟乾,對(duì)參數(shù)長(zhǎng)度、類型有限制 | 沒有參數(shù) |
請(qǐng)求首部 | 域名蝶防、用戶信息甚侣、編碼方式等 | 域名、用戶信息间学、編碼方式等 |
消息體 | 沒有消息體 | 有消息體殷费,或稱為負(fù)載印荔,用于記錄參數(shù),對(duì)參數(shù)類型详羡、大小沒有限制 |
可儲(chǔ)存為書簽 | 可以 | 不可以 |
如何制定 | 默認(rèn)操作 | 需要在action中指定為post |
-
HttpServletRequest常用方法
-例如仍律,請(qǐng)求地址為http://localhost/test/hello- getServletPath: /hello
- getContextPath: /test——就是tomcat配置中指定的Context path
- getRequestURI: /test/hello
- getRequestURL: http://localhost/test/hello
-
關(guān)于地址字符串的寫法
- 沒有斜杠:response.sendRedirect("redirect"),redirect替換的是ServletPath实柠,會(huì)在ContextPath(/test)后加上 /redirect
- 有斜杠水泉,response.sendRedirect("/test/redirect"),替換的是URI
- 如果寫成response.sendRedirect("/redirect")主到,地址中沒有/test茶行,404錯(cuò)誤
servletConfig和servletContext
- 在web.xml中如下配置
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servletTest.HelloServlet</servlet-class>
//init-param只屬于所在的servlet
<init-param>
<param-name>adminEmail</param-name>
<param-value>silly_child@163.com</param-value>
</init-param>
</servlet>
- 上面定義的init-param會(huì)通過init方法將參數(shù)包裝在ServletConfig中,可在servlet中取得param
String email = getServletConfig().getInitParameter("adminEmail");
- getServletConfig()方法是GenericServlet中的方法登钥,通過繼承直接得到
- getInitParameter()是servletConfig接口的方法畔师,容器實(shí)現(xiàn)了這個(gè)接口
- 如果需要在所有servlet中取得參數(shù),需要使用context-param
- 設(shè)置context-param:
//context-param是全局參數(shù)牧牢,必須放在<webapp>下看锉,與<servlet>并列
<context-param>
<param-name>username</param-name>
<param-value>黃雋佳</param-value>
</context-param>
- 在本應(yīng)用的任何servlet中都能取得該參數(shù)
String username = getServletContext().getInitParameter("username");
Listener
- 用途1:context-param只能是String,Listener可以提前獲取context-param塔鳍,轉(zhuǎn)換為attribute伯铣,供所有servlet使用
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext context = event.getServletContext();
String param = context.getInitParameter("key");//取得參數(shù)
……執(zhí)行處理操作……
context.setAttribute("XXX", param);//此處可設(shè)置任意類型的參數(shù)
}
@Override
public void contextDestroyed(ServletContextEvent event) {}
}
- 容器調(diào)用監(jiān)聽器的流程
- 容器讀配置文件
- 容器創(chuàng)建context的鍵String、值String轮纫,并在ServletContext對(duì)象中創(chuàng)建引用
- 容器創(chuàng)建listener實(shí)例腔寡,并創(chuàng)建event對(duì)象(其中有ServletContext的引用)
- 容器調(diào)用listener的contextInitialized方法
- listener的其他作用
- 監(jiān)聽context中attribute的增加、刪除掌唾、修改——ServletContextAttributeListener
- 監(jiān)聽session的新建和銷毀——HttpSessionListener
- 監(jiān)聽request——HttpRequestListener
- 監(jiān)聽requestAttribute——ServletRequestAttributeListener
- 會(huì)話attribute的綁定放前、會(huì)話屬性的變化
線程安全
只有request和局部變量是線程安全的
-
ServletContext和HttpSession都不是線程安全的
- 可以同時(shí)有多個(gè)servlet、多個(gè)線程訪問同一個(gè)屬性
- 可以在servlet中對(duì)ServletContext和HttpSession加鎖(Synchronized)
作用域
-- | 誰(shuí)能看到 | 作用域 | 適用于 |
---|---|---|---|
context | 本應(yīng)用的所有servlet糯彬、jsp凭语、contextListener | 整個(gè)部署應(yīng)用,應(yīng)用關(guān)閉則撤銷 | 整個(gè)應(yīng)用共享的資源撩扒,如數(shù)據(jù)庫(kù)連接等 |
session | 一個(gè)會(huì)話(用戶)的所有servlet似扔、jsp | 會(huì)話生命期,可編程撤銷搓谆、也可能超時(shí)撤銷 | 與會(huì)話有關(guān)的資源請(qǐng)求炒辉,如購(gòu)物車、訂單管理 |
request | 一次請(qǐng)求挽拔、或者dispatcher轉(zhuǎn)發(fā)后的servlet辆脸、jsp | 請(qǐng)求生命期,就是一個(gè)servlet的生命期 | 只用于單個(gè)請(qǐng)求的資源 |