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