一.Servlet作用: 1.接受請求數據 2.處理請求 3.完成響應(轉發或者重定向)
二.Serlvet生命周期: 1.默認情況下,Servlet會在第一次被訪問時,由服務器創建.如果需要一啟動服務器就創建Serlvet,需要在web.xml中配置(在中配置,其中給出一個非負整數!) 2.一個Servlet,服務器只創建一個對象,因為Servlet是單例 3.在Servlet被創建后,會立刻調用Servlet的初始化方法void init(SerlvetConfig),并且一生只會調用一次這個方法.所以可以把Serlvet初始化的準備放在init方法中. 4.當服務器接受到請求時,會調用Servlet的service方法來處理請求.服務器接收到一個請求,就會調用一次,所以這個方法會被調用多次. 5.當服務器被關閉時,Servlet會調用destroy()方法,只執行一次,所以可以把釋放資源的代碼放到destroy中.
三.HttpServletRequest方法: String getParameter(String paramName):獲取指定請求參數的值; String getMethod():獲取請求方法,例如GET或POST; String getHeader(String name):獲取指定請求頭的值; void setCharacterEncoding(String encoding):設置請求體的編碼!因為GET請求沒有請求體,所以這個方法只只對POST請求有效。當調用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.itcast.cn”),表示3秒后自動刷新到http://www.itcast.cn;
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文件中的元素,ServletConfig對象是由服務器創建的,然后傳遞給Servlet的init()方法,你可以在init()方法中使用它
String getServletName():獲取Servlet在web.xml文件中的配置名稱,即指定的名稱; ServletContext getServletContext():用來獲取ServletContext對象 String getInitParameter(String name):用來獲取在web.xml中配置的初始化參數,通過參數名來獲取參數值; Enumeration getInitParameterNames():用來獲取在web.xml中配置的所有初始化參數名稱;
五.Servlet細節 不要在Servlet中創建成員!創建局部變量即可! 可以創建無狀態成員! 可以創建有狀態的成員,但狀態必須為只讀的!
六.ServletContext: 1.一個項目只有一個ServletContext對象! 2.我們可以在N多個Servlet中來獲取這個唯一的對象,使用它可以給多個Servlet傳遞數據! 3.與天地同壽!!!這個對象在Tomcat啟動時就創建,在Tomcat關閉時才會死去! 4.ServletContext對象的作用:是在整個Web應用的動態資源之間共享數據!例如在AServlet中向ServletContext對象中保存一個值,然后在BServlet中就可以獲取這個值,這就是共享數據了。 5.獲取ServletContext: 在Servlet中獲取ServletContext對象: 在void init(ServletConfig config)中:ServletContext context = config.getServletContext();,ServletConfig類的getServletContext()方法可以用來獲取ServletContext對象; 在GenericeServlet或HttpServlet中獲取ServletContext對象: GenericServlet類有getServletContext()方法,所以可以直接使用this.getServletContext()來獲取;
七. 域對象的功能 ServletContext是JavaWeb四大域對象之一: PageContext; ServletRequest; Httpsession; ServletContext; 所有域對象都有存取數據的功能,因為域對象內部有一個Map,用來存儲數據,下面是ServletContext對象用來操作數據的方法: void setAttribute(String name, Object value):用來存儲一個對象,也可以稱之為存儲一個域屬性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一個域屬性,域屬性名稱為xxx,域屬性的值為XXX。請注意,如果多次調用該方法,并且使用相同的name,那么會覆蓋上一次的值,這一特性與Map相同; Object getAttribute(String name):用來獲取ServletContext中的數據,當前在獲取之前需要先去存儲才行,例如:String value = (String)servletContext.getAttribute(“xxx”);,獲取名為xxx的域屬性; void removeAttribute(String name):用來移除ServletContext中的域屬性,如果參數name指定的域屬性不存在,那么本方法什么都不做; Enumeration getAttributeNames():獲取所有域屬性的名稱;
八.獲取資源相關方法
獲取真實路徑(*) 還可以使用ServletContext對象來獲取Web應用下的資源,例如在hello應用的根目錄下創建a.txt文件,現在想在Servlet中獲取這個資源,就可以使用ServletContext來獲取。
?獲取a.txt的真實路徑:String realPath = servletContext.getRealPath(“/a.txt”),realPath的值為a.txt文件的絕對路徑:F:/tomcat6/webapps/hello/a.txt; ?獲取b.txt的真實路徑:String realPath = servletContext.getRealPath(“/WEB-INF/b.txt”);
九獲取類路徑下資源 獲取類路徑資源,類路徑對一個JavaWeb項目而言,就是/WEB-INF/classes和/WEB-INF/lib/每個jar包! Class ClassLoader: 這里要講的是獲取類路徑下的資源,對于JavaWeb應用而言,就是獲取classes目錄下的資源。
InputStream in = this.getClass().getResourceAsStream("/xxx.txt"); System.out.println(IOUtils.toString(in)); InputStream in = this.getClass().getClassLoader().getResourceAsStream("xxx.txt"); System.out.println(IOUtils.toString(in));Class類的getResourceAsStream(String path): 路徑以“/”開頭,相對classes路徑; 路徑不以“/”開頭,相對當前class文件所有路徑,例如在cn.itcast.servlet.MyServlet中執行,那么相對/classes/cn/itcast/servlet/路徑; ClassLoader類的getResourceAsStream(String path): 相對classes路徑;
新聞熱點
疑難解答