JavaWeb三大组件之Servlet
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
###Servlet的生命周期###
與Servlet的生命周期相關(guān)的方法有:
- void init(ServletConfig) 服務(wù)器會(huì)在Servlet第一次被訪問(wèn)時(shí)創(chuàng)建Servlet,或者是在服務(wù)器啟動(dòng)時(shí)創(chuàng)建Servlet。如果服務(wù)器啟動(dòng)時(shí)就創(chuàng)建Servlet,那么還需要在web.xml文件中配置。也就是說(shuō)默認(rèn)情況下,Servlet是在第一次被訪問(wèn)時(shí)由服務(wù)器創(chuàng)建的。 而且一個(gè)Servlet類型,服務(wù)器只創(chuàng)建一個(gè)實(shí)例對(duì)象,當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求時(shí),Servlet容器(Tomcat)會(huì)查找內(nèi)存中是否存在Servlet實(shí)例,如果不存在,就創(chuàng)建一個(gè)Servlet實(shí)例。如果存在Servlet實(shí)例,就直接從內(nèi)存中取出該實(shí)例來(lái)響應(yīng)請(qǐng)求是直接使用上次創(chuàng)建的實(shí)例。 在Servlet被創(chuàng)建后,服務(wù)器會(huì)馬上調(diào)用Servlet的void init(ServletConfig)方法。請(qǐng)記住, Servlet出生后馬上就會(huì)調(diào)用init()方法,而且一個(gè)Servlet的一生。這個(gè)方法只會(huì)被調(diào)用一次。我們可以把一些對(duì)Servlet的初始化工作放到init方法中!
- void service(ServletRequest,ServletResponse); 當(dāng)服務(wù)器每次接收到請(qǐng)求時(shí),都會(huì)去調(diào)用Servlet的service()方法來(lái)處理請(qǐng)求。服務(wù)器接收到一次請(qǐng)求,就會(huì)調(diào)用service() 方法一次,所以service()方法是會(huì)被調(diào)用多次的。
- void destroy(); 在服務(wù)器被關(guān)閉時(shí),服務(wù)器會(huì)去銷毀Servlet,在銷毀Servlet之前服務(wù)器會(huì)先去調(diào)用Servlet的destroy()方法,我們可以把Servlet的臨終遺言放到destroy()方法中,例如對(duì)某些資源的釋放等代碼放到destroy()方法中。
###特性###
- 單例,只創(chuàng)建一個(gè)對(duì)象,
- 線程不安全,效率是高的
- Servlet類我們來(lái)寫,對(duì)象由服務(wù)器創(chuàng)建,并且由服務(wù)器調(diào)用其中的方法
- 動(dòng)態(tài)資源,處理請(qǐng)求
###Servlet接口###
####Servlet接口相關(guān)類型####
- ServletRequest:service() 方法的參數(shù),它表示請(qǐng)求對(duì)象,它封裝了所有與請(qǐng)求相關(guān)的數(shù)據(jù),它是由服務(wù)器創(chuàng)建的;
- ServletResponse:service()方法的參數(shù),它表示響應(yīng)對(duì)象,在service()方法中完成對(duì)客戶端的響應(yīng)需要使用這個(gè)對(duì)象;
- ServletConfig:init()方法的參數(shù),它表示Servlet配置對(duì)象,它對(duì)應(yīng)Servlet的配置信息,那對(duì)應(yīng)web.xml文件中的<servlet>元素。
####ServletRequest和ServletResponse#### ServletRequest和ServletResponse的實(shí)例由服務(wù)器創(chuàng)建,然后傳遞給service()方法。如果在service() 方法中希望使用HTTP相關(guān)的功能,那么可以把ServletRequest和ServletResponse強(qiáng)轉(zhuǎn)成HttpServletRequest和HttpServletResponse。這也說(shuō)明我們經(jīng)常需要在service()方法中對(duì)ServletRequest和ServletResponse進(jìn)行強(qiáng)轉(zhuǎn),這是很繁瑣的事情。不過(guò)后面會(huì)有一個(gè)類來(lái)幫我們解決這一問(wèn)題的。
#####HttpServletRequest方法:#####
- String getParameter(String paramName):獲取指定請(qǐng)求參數(shù)的值;
- String getMethod():獲取請(qǐng)求方法,例如GET或POST;
- String getHeader(String name):獲取指定請(qǐng)求頭的值;
- void setCharacterEncoding(String encoding):設(shè)置請(qǐng)求體的編碼!當(dāng)調(diào)用request.setCharacterEncoding(“utf-8”)之后,再通過(guò)getParameter()方法獲取參數(shù)值時(shí),那么參數(shù)值都已經(jīng)通過(guò)了轉(zhuǎn)碼,即轉(zhuǎn)換成了UTF-8編碼。所以,這個(gè)方法必須在調(diào)用getParameter()方法之前調(diào)用!
#####HttpServletResponse方法:#####
- PrintWriter getWriter():獲取字符響應(yīng)流,使用該流可以向客戶端輸出響應(yīng)信息。例如 response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);
- ServletOutputStream getOutputStream():獲取字節(jié)響應(yīng)流,當(dāng)需要向客戶端響應(yīng)字節(jié)數(shù)據(jù)時(shí),需要使用這個(gè)流,例如要向客戶端響應(yīng)圖片;
- void setCharacterEncoding(String encoding):用來(lái)設(shè)置字符響應(yīng)流的編碼,例如在調(diào)用setCharacterEncoding(“utf-8”);之后,再response.getWriter()獲取字符響應(yīng)流對(duì)象,這時(shí)的響應(yīng)流的編碼為utf-8,使用response.getWriter()輸出的中文都會(huì)轉(zhuǎn)換成utf-8編碼后發(fā)送給客戶端;
- void setHeader(String name, String value):向客戶端添加響應(yīng)頭信息,例如 setHeader(“Refresh”, “3;url=http://www.baidu.com”),表示3秒后自動(dòng)刷新到百度;
- void setContentType(String contentType):該方法是setHeader(“content-type”, “xxx”)的簡(jiǎn)便方法,即用來(lái)添加名為content-type響應(yīng)頭的方法。content-type響應(yīng)頭用來(lái)設(shè)置響應(yīng)數(shù)據(jù)的MIME類型,例如要向客戶端響應(yīng)jpg的圖片,那么可以setContentType(“image/jepg”),如果響應(yīng)數(shù)據(jù)為文本類型,那么還要臺(tái)同時(shí)設(shè)置編碼,例如setContentType(“text/html;chartset=utf-8”)表示響應(yīng)數(shù)據(jù)類型為文本類型中的html類型,并且該方法會(huì)調(diào)用setCharacterEncoding(“utf-8”)方法;
- void sendError(int code, String errorMsg):向客戶端發(fā)送狀態(tài)碼,以及錯(cuò)誤消息。例如給客戶端發(fā)送404:response(404, “您要查找的資源不存在!”)。
#####ServletConfig##### ServletConfig對(duì)象對(duì)應(yīng)web.xml文件中的<servlet>元素。例如你想獲取當(dāng)前Servlet在web.xml文件中的配置名,那么可以使用servletConfig.getServletName()方法獲取! ServletConfig對(duì)象是由服務(wù)器創(chuàng)建的,然后傳遞給Servlet的init()方法,你可以在init()方法中使用它!
- String getServletName():獲取Servlet在web.xml文件中的配置名稱
- ServletContext getServletContext():用來(lái)獲取ServletContext對(duì)象
- String getInitParameter(String name):用來(lái)獲取在web.xml中配置的初始化參數(shù),通過(guò)參數(shù)名來(lái)獲取參數(shù)值;
- Enumeration getInitParameterNames():用來(lái)獲取在web.xml中配置的所有初始化參數(shù)名稱;
###配置###
正常是第一次訪問(wèn)服務(wù)器時(shí)創(chuàng)建servlet,啟動(dòng)時(shí)就完成創(chuàng)建
<servlet> <load-on-startup>非負(fù)整數(shù)</load-on-startup> </servlet><url-pattern>訪問(wèn)路徑中使用通配符
<url-pattern>/*<url-pattern>匹配所有<url-pattern>*.do<url-pattern>匹配擴(kuò)展名是.do的所有路徑<url-pattern>/servlet/*</url-pattern>匹配/servlet路徑候的所有的路徑###創(chuàng)建servlet###
###Servlet三個(gè)域?qū)ο?##
- request
- session
- application(ServletContext)
####Servlet request#### Response/Request的概述及用法
####Servlet Session跟蹤#### HTTP 是一種"無(wú)狀態(tài)"協(xié)議,這意味著每次客戶端檢索網(wǎng)頁(yè)時(shí),客戶端打開一個(gè)單獨(dú)的連接到 Web 服務(wù)器,服務(wù)器會(huì)自動(dòng)不保留之前客戶端請(qǐng)求的任何記錄。但是仍然有以下三種方式來(lái)維持 Web 客戶端和 Web 服務(wù)器之間的 session 會(huì)話:
#####Cookies##### 一個(gè) Web 服務(wù)器可以分配一個(gè)唯一的 session 會(huì)話 ID 作為每個(gè) Web 客戶端的 cookie,對(duì)于客戶端的后續(xù)請(qǐng)求可以使用接收到的 cookie 來(lái)識(shí)別。
這可能不是一個(gè)有效的方法,因?yàn)楹芏酁g覽器不支持 cookie,所以我們建議不要使用這種方式來(lái)維持 session 會(huì)話。
#####隱藏的表單字段##### 一個(gè) Web 服務(wù)器可以發(fā)送一個(gè)隱藏的 HTML 表單字段,以及一個(gè)唯一的 session 會(huì)話 ID,如下所示:
<input type="hidden" name="sessionid" value="12345">
該條目意味著,當(dāng)表單被提交時(shí),指定的名稱和值會(huì)被自動(dòng)包含在 GET 或 POST 數(shù)據(jù)中。每次當(dāng) Web 瀏覽器發(fā)送回請(qǐng)求時(shí),session_id 值可以用于保持不同的 Web 瀏覽器的跟蹤。
這可能是一種保持 session 會(huì)話跟蹤的有效方式,但是點(diǎn)擊常規(guī)的超文本鏈接(<A HREF...>)不會(huì)導(dǎo)致表單提交,因此隱藏的表單字段也不支持常規(guī)的 session 會(huì)話跟蹤。
#####URL 重寫##### 可以在每個(gè) URL 末尾追加一些額外的數(shù)據(jù)來(lái)標(biāo)識(shí) session 會(huì)話,服務(wù)器會(huì)把該 session 會(huì)話標(biāo)識(shí)符與已存儲(chǔ)的有關(guān) session 會(huì)話的數(shù)據(jù)相關(guān)聯(lián)。
例如,http://w3cschool.cc/file.htm;sessionid=12345,session 會(huì)話標(biāo)識(shí)符被附加為 sessionid=12345,標(biāo)識(shí)符可被 Web 服務(wù)器訪問(wèn)以識(shí)別客戶端。
URL 重寫是一種更好的維持 session 會(huì)話的方式,它在瀏覽器不支持 cookie 時(shí)能夠很好地工作,但是它的缺點(diǎn)是會(huì)動(dòng)態(tài)生成每個(gè) URL 來(lái)為頁(yè)面分配一個(gè) session 會(huì)話 ID,即使是在很簡(jiǎn)單的靜態(tài) HTML 頁(yè)面中也會(huì)如此。
#####HttpSession 對(duì)象##### 除了上述的三種方式,Servlet 還提供了 HttpSession 接口,該接口提供了一種跨多個(gè)頁(yè)面請(qǐng)求或訪問(wèn)網(wǎng)站時(shí)識(shí)別用戶以及存儲(chǔ)有關(guān)用戶信息的方式。
Servlet 容器使用這個(gè)接口來(lái)創(chuàng)建一個(gè) HTTP 客戶端和 HTTP 服務(wù)器之間的 session 會(huì)話。會(huì)話持續(xù)一個(gè)指定的時(shí)間段,跨多個(gè)連接或頁(yè)面請(qǐng)求。
通過(guò)調(diào)用 HttpServletRequest 的公共方法?getSession()?來(lái)獲取 HttpSession 對(duì)象,如下所示:
HttpSession session = request.getSession();
你需要在向客戶端發(fā)送任何文檔內(nèi)容之前調(diào)用?request.getSession()。下面總結(jié)了 HttpSession 對(duì)象中可用的幾個(gè)重要的方法:
- public Object getAttribute(String name)該方法返回在該 session 會(huì)話中具有指定名稱的對(duì)象,如果沒有指定名稱的對(duì)象,則返回 null。
- public Enumeration getAttributeNames()該方法返回 String 對(duì)象的枚舉,String 對(duì)象包含所有綁定到該 session 會(huì)話的對(duì)象的名稱。
- public long getCreationTime()該方法返回該 session 會(huì)話被創(chuàng)建的時(shí)間,自格林尼治標(biāo)準(zhǔn)時(shí)間 1970 年 1 月 1 日午夜算起,以毫秒為單位。
- public String getId()該方法返回一個(gè)包含分配給該 session 會(huì)話的唯一標(biāo)識(shí)符的字符串。
- public long getLastAccessedTime()該方法返回客戶端最后一次發(fā)送與該 session 會(huì)話相關(guān)的請(qǐng)求的時(shí)間自格林尼治標(biāo)準(zhǔn)時(shí)間 1970 年 1 月 1 日午夜算起,以毫秒為單位。
- public int getMaxInactiveInterval()該方法返回 Servlet 容器在客戶端訪問(wèn)時(shí)保持 session 會(huì)話打開的最大時(shí)間間隔,以秒為單位。
- public void invalidate()該方法指示該 session 會(huì)話無(wú)效,并解除綁定到它上面的任何對(duì)象。
- public boolean isNew()如果客戶端還不知道該 session 會(huì)話,或者如果客戶選擇不參入該 session 會(huì)話,則該方法返回 true。
- public void removeAttribute(String name)該方法將從該 session 會(huì)話移除指定名稱的對(duì)象。
- public void setAttribute(String name, Object value)?該方法使用指定的名稱綁定一個(gè)對(duì)象到該 session 會(huì)話。
- public void setMaxInactiveInterval(int interval)該方法在 Servlet 容器指示該 session 會(huì)話無(wú)效之前,指定客戶端請(qǐng)求之間的時(shí)間,以秒為單位。
#####刪除 Session 會(huì)話數(shù)據(jù)##### 當(dāng)您完成了一個(gè)用戶的 session 會(huì)話數(shù)據(jù),您有以下幾種選擇:
- 移除一個(gè)特定的屬性:您可以調(diào)用?public void removeAttribute(String name)?方法來(lái)刪除與特定的鍵相關(guān)聯(lián)的值。
- 刪除整個(gè) session 會(huì)話:您可以調(diào)用?public void invalidate()?方法來(lái)丟棄整個(gè) session 會(huì)話。
- 設(shè)置 session 會(huì)話過(guò)期時(shí)間:您可以調(diào)用?public void setMaxInactiveInterval(int interval)?方法來(lái)單獨(dú)設(shè)置 session 會(huì)話超時(shí)。
- 注銷用戶:如果使用的是支持 servlet 2.4 的服務(wù)器,您可以調(diào)用?logout?來(lái)注銷 Web 服務(wù)器的客戶端,并把屬于所有用戶的所有 session 會(huì)話設(shè)置為無(wú)效。
- web.xml 配置:如果您使用的是 Tomcat,除了上述方法,您還可以在 web.xml 文件中配置 session 會(huì)話超時(shí),如下所示:
上面實(shí)例中的超時(shí)時(shí)間是以分鐘為單位,將覆蓋 Tomcat 中默認(rèn)的 30 分鐘超時(shí)時(shí)間。
在一個(gè) Servlet 中的 getMaxInactiveInterval() 方法會(huì)返回 session 會(huì)話的超時(shí)時(shí)間,以秒為單位。所以,如果在 web.xml 中配置 session 會(huì)話超時(shí)時(shí)間為 15 分鐘,那么 getMaxInactiveInterval() 會(huì)返回 900。
####ServletContext#### 服務(wù)器會(huì)為每個(gè)應(yīng)用創(chuàng)建一個(gè)ServletContext對(duì)象:
- ServletContext對(duì)象的創(chuàng)建是在服務(wù)器啟動(dòng)時(shí)完成的;
- ServletContext對(duì)象的銷毀是在服務(wù)器關(guān)閉時(shí)完成的。
ServletContext對(duì)象的作用是在整個(gè)Web應(yīng)用的動(dòng)態(tài)資源之間共享數(shù)據(jù)!例如在AServlet中向ServletContext對(duì)象中保存一個(gè)值,然后在BServlet中就可以獲取這個(gè)值,這就是共享數(shù)據(jù)了。
#####獲取#####
- ServletConfig getServletContext()
- GenericSevlet getServletContext()
- HttpSession getServletContext()
- ServletContextEvent getServletContext()
#####域?qū)ο蠊δ?#### 所有域?qū)ο蠖加写嫒?shù)據(jù)的功能,因?yàn)橛驅(qū)ο髢?nèi)部有一個(gè)Map,用來(lái)存儲(chǔ)數(shù)據(jù),下面是ServletContext對(duì)象用來(lái)操作數(shù)據(jù)的方法:
- void setAttribute(String name, Object value):用來(lái)存儲(chǔ)一個(gè)對(duì)象,也可以稱之為存儲(chǔ)一個(gè)域?qū)傩?#xff0c;如果多次調(diào)用該方法,并且使用相同的name,那么會(huì)覆蓋上一次的值,這一特性與Map相同;
- Object getAttribute(String name):用來(lái)獲取ServletContext中的數(shù)據(jù),當(dāng)前在獲取之前需要先去存儲(chǔ)才行;
- void removeAttribute(String name):用來(lái)移除ServletContext中的域?qū)傩?#xff0c;如果參數(shù)name指定的域?qū)傩圆淮嬖?#xff0c;那么本方法什么都不做;
- Enumeration getAttributeNames():獲取所有域?qū)傩缘拿Q;
#####方法#####
######獲取初始化參數(shù)的方法###### String getInitParameter(String name)
######獲取資源相關(guān)方法###### 獲取絕對(duì)路徑
this.getServletContext.getRealPath("/a.txt")this.getServletContext.getRealPath("/WEB-INF/b.txt")獲取資源流
InputStream in = servletContext.getResourceAsStream(“/a.txt”);InputStream in = servletContext.getResourceAsStream(“/WEB-INF/b.txt”);獲取指定資源下所有資源路徑
Set set = this.getServletContext.getResourcePaths("/WEB-INF")InputStream in = this.getClassLoader().getResourceAsStream("a.txt")//相對(duì)于classes文件目錄InputStream in = this.getClass().getReasourceAsStream("a.txt")//相對(duì)于.class文件目錄InputStream in = this.getClsss().getReasourceAsStream("/a.txt")//相對(duì)于classes文件目錄轉(zhuǎn)載于:https://my.oschina.net/zion/blog/832099
總結(jié)
以上是生活随笔為你收集整理的JavaWeb三大组件之Servlet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怪物猎人世界伽马套装怎么解锁
- 下一篇: 身份证能贷款吗,不可以