JavaWeb三大元件
1 Servlet
1.1 生命週期方法
1.1.1 void init(ServletConfig):
載入和例項化:當客戶端傳送一個請求時,Servlet容器(Tomcat)會查詢記憶體中是否存在Servlet例項,如果不存在,就建立一個Servlet例項。如果存在Servlet例項,就直接從記憶體中取出該例項來響應請求
初始化:初始化Servlet時,可以設定資料庫連線引數,建立JDBC連線,或是建立對其他資源的引用。初始化階段,init()方法被呼叫
1.1.2 void service(ServletRequest request, ServletResponse response):Servlet初始化後,就處於響應請求的就緒狀態
1.1.3 void destory():銷燬由容器完成,銷燬呼叫Servlet的destroy()方法
1.2 特性
1.2.1 單例,只建立一個物件,執行緒不安全,效率是高的
1.2.2 Servlet類我們來寫,物件由伺服器建立,並且由伺服器呼叫其中的方法
1.3 動態資源,處理請求
1.4 配置
1.4.1 正常是第一次訪問伺服器時建立servlet,啟動時就完成建立
<servlet><load-on-startup>
</load-on-startup></servlet> 非負整數
1.4.2 <url-pattern>
訪問路徑中使用萬用字元
<url-pattern>/*<url-pattern>匹配所有
<url-pattern>*.do<url-pattern>匹配副檔名是.do的所有路徑
<url-pattern>/servlet/*</url-pattern>匹配/servlet路徑候的所有的路徑
1.5 建立servlet
1.5.1 實現javax.servlet.servlet介面
1.5.2 繼承javax.servlet.genriticservlet類
1.5.3 繼承javax.servlet.http.httpservlet型別
httpServletRequest
String getParamater(String paramaterName): 獲取請求引數 String geMethod():獲取請求方法
String getHeader(String headerName):獲取請求頭
void setCharacterEncoding(Encoding):設定請求字元編碼
httpServletResponse
PrintWriter getWriter():獲取字元響應流
ServletOutputStream getOutputStream():獲取位元組響應流
void setCharacterEncoding(String encoding):獲取響應編碼
void setHeader(String name,String value): 設定響應頭
void getContextType(String contextType): 獲取響應頭型別
void sendError(int code, String errorMesg): 向客戶傳送錯誤響應碼和錯誤資訊
1.6 Session
1.6.1 Cookie
cookie是由伺服器建立的,瀏覽器第一次訪問,服務會建立一個cookie給瀏覽器帶回去。當瀏覽器第二次訪問時,把cookie帶給伺服器,伺服器用來跟蹤瀏覽器的狀態
cookie是鍵值對組成
cookie的頭設定
瀏覽器傳送給伺服器的頭:Cookie
伺服器傳送給瀏覽器的頭 : Set-Cookie
Cookie的傳送和接收
Servlet傳送
Cookie cookie = new Cookie("aaa", "AAA") response.addCookie("aaa") Servlet接收
Cookie[] cookies = request.getCookies() if(cookies != null){ for( Cookie cookie : cookies){ cookie.getName(); cookie.getValue(); } } Cookie的細節
Cookie的maxAge
cookie.setMaxAge(-1) : 只在記憶體中存活,關閉瀏覽器cookie就會消失 cookie.setMaxAge(60*60): cookie能夠在硬碟中存活1個消失
cookie.setMaxAge(0): 表示這個cookie作廢,最終這個cookie在記憶體和硬碟上不存在
Cookie的path
Cookie的Domain:二級域名
Cookie的儲存中文,需要對中文編碼解碼
1.6.2 Session
HttpSession的作用
會話跟蹤
域功能
登入資訊回現
原理
Session依賴Cookie
瀏覽器第一次訪問伺服器時,伺服器會建立一個session物件,同時建立一個cookie,把sessionid放在cookie中給瀏覽器帶回去,只要session還存活,瀏覽器還存在,下次瀏覽器再次訪問時,瀏覽器就會通過cookie把sessionID返回給伺服器,只要瀏覽器不關閉,下次就可以共享session中的資料了
由於伺服器端建立的cookie只能在瀏覽器中存活,如果客戶關閉瀏覽器,請求中就沒有sessionId,再次訪問需要重新建立sessionid放在cookie中給瀏覽器帶回
如果Session超過了最大活動時間,失效,此時即使沒有關閉瀏覽器。瀏覽器的提供的SessionID也沒有用了
設定Session有效活動時間
<Session-
config><Session-timeout>30</Session-timeout></Session-config> Session相關API
String # getId() : 獲取SessionId
void setMaxInactiveInterval(time) : 設定session最大不活動時間,預設是30分鐘
int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),預設為30分鐘。當session在30分鐘內沒有使用,那麼Tomcat會在session池中移除這個session
long getCreationTime():返回session的建立時間,返回值為當前時間的毫秒值
long getLastAccessedTime():返回session的最後活動時間,返回值為當前時間的毫秒值
void invalidate():讓session失效!呼叫這個方法會被session失效,當session失效後,客戶端再次請求,伺服器會給客戶端建立一個新的session,並在響應中給客戶端新session的sessionId
boolean isNew():檢視session是否為新。當客戶端第一次請求時,伺服器為客戶端建立session,但這時伺服器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時session的狀態為新 URL重寫
session依賴Cookie,這是因為伺服器需要把sessionId儲存到客戶端。如果使用者的瀏覽器關閉了Cookie功能,那麼session不能使用了!還可以在瀏覽器關閉了Cookie後使用URL重寫的方法儲存sessionId,這需要在每個URL後面都加上sessionId!這樣使用者的請求中就包含了sessionId,伺服器就可以通過sessionId找到對應的session物件了
1.7 ServletContext
1.7.1 獲取
ServletConfig getServletContext()
伺服器啟動時會建立一個servletcontext物件,它負責在應用程式間傳遞資料
GenericSevlet getServletContext()
HttpSession getServletContext()
ServletContextEvent getServletContext()
1.7.2 域物件功能:所有域物件都有存取資料的功能 void setAttribute(String name , Object value)
Object getAttribute(String name)
void removeAttribute(String name)
Enumernation getAttributeNames()
1.7.3 方法
獲取初始化引數的方法
String getInitParameter(String name)
獲取資源相關方法
獲取絕對路徑
this.getServletContext.getRealPath("/a.txt")
this.getServletContext.getRealPath("/WEB-INF/b.txt")
獲取資源流
InputStream # this.getServletContext.getResourceAsStream("/a.txt") InputStream
this.getServletContext.getResourceAsStream("/WEB-INF/b.txt") #
獲取指定資源下所有資源路徑
Set # this.getServletContext.getResourcePaths("/WEB-INF")
InputStream # this.getClassLoader().getResourceAsStream("a.txt")======相對於classes檔案目錄
InputStream # this.getClass().getReasourceAsStream("a.txt")=======相對於.class檔案目錄
InputStream # this.getClsss().getReasourceAsStream("/a.txt")========相對於classes檔案目錄
1.8 Request
1.8.1 處理字元編碼問題
request.getParameter("username") String name bytes = = byte[]
name.getBytes("ISO-8859-1") name = new String(bytes, "utf-8")
1.8.2 request域方法
1.8.3 request獲取請求引數
1.8.4 request獲取請求表頭的方法
1.8.5 request其他方法
String # getMethod() : 獲取請求方法
void # setCharacterEncoding("utf-8") : 設定請求編碼 String # getContextPath() : 獲取上下文路徑, /專案名 String # getRemoteAdrr() : 獲取請求的IP地址
1.8.6 請求轉發; 一次請求,一次響應,留頭不留體
request.getRequestDispatcher("/BServlet").forword(request, response)
1.8.7 請求包含: 一次請求,一次響應,留頭留體
requet.getRequestDispatcher("/BServlet").include(request, response)
1.8.8 路徑
客戶端路徑
伺服器路徑
1.9 Response
1.9.1 處理字元編碼問題response.setContextType("text/html",charset="utf-8")
1.9.2 字元流: PrintWriter # response.getWriter()
1.9.3 位元組流: ServletOutputStream response.getOutStream()
1.9.4 response.fulshBuffer(): 重新整理緩衝流
1.9.5 響應碼
302:重定向
response.sendRedirect("www.baidu.com")
200:響應成功
304: 找不到資源
1.10 Servlet三個域物件
1.10.1 request
1.10.2 session
1.10.3 application
1.11 Javaweb四大域 : #
1.11.1 pageContext
這個物件代表頁面上下文,該物件主要用於訪問JSP之間的共享資料
1.11.2 session
一個會話只建立一個sessionContext物件
void session.setAttribute(String name, Object value)
Object session.getAttribute(String name)
void session.removeAttribute(String name)
1.11.3 request
一次請求只建立一個requestContext物件
1.11.4 servletContext
一個應用程式只建立一個servletContext物件
2 Filter
2.1 基本知識
2.1.1 建立一個過濾器
自定一個過濾器需要實現Filter介面,實現介面中的方法
web.xml中配置
<filter><filter-name>AFilter</filter-name><filter-class>過濾器的全限定名</filter-class></filter><filter-mapping><filter-name>AFilter</filter-name> <url-partten>攔截的資源</url-partten></filter-mapping<
2.1.2 過濾器的生命週期
void # init(FilterConfig) :
在伺服器啟動時會建立Filter例項,並且每個型別的Filter只建立一個例項,從此不再建立
在建立完Filter例項後,會馬上呼叫init()方法完成初始化工作,這個方法只會被執行一次
void # doFilter( ServletRequest request, ServletResponse response, FilterChain chain)
引數FilterChain中有一個方法doFilter(ServletRequest,ServletResponse): 表示放行
這個方法會在使用者每次訪問“目標資源(<url->pattern>index.jsp</url-pattern>)”時執行
如果需要“放行”,那麼需要呼叫FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不呼叫FilterChain的doFilter()方法,那麼目標資源將無法執行
void # destroy():
伺服器會在建立Filter物件之後,把Filter放到快取中一直使用,通常不會銷燬它
一般會在伺服器關閉時銷燬Filter物件,在銷燬Filter物件之前,伺服器會呼叫Filter物件的destory()方法
2.1.3 引數型別
FilterChain
引數FilterChain中有一個方法doFilter(ServletRequest,ServletResponse): 表示放行
這個方法會在使用者每次訪問“目標資源(<url->pattern>index.jsp</url-pattern>)”時執行
FilterConfig
ServletContext getServletContext():獲取ServletContext的方法
String getFilterName():獲取Filter的配置名稱;與<filter-name>元素對應
String getInitParameter(String name):獲取Filter的初始化配置,與<init-param>元素對應
Enumeration getInitParameterNames():獲取所有初始化引數的名稱
2.1.4 多個過濾器執行順序
filter1 start... filter2 start... index.jsp filter2 end... filter1 end...
2.1.5 四種攔截方式
REQUEST
FORWARD
INCLUDE
ERROR
2.2 案例
3 Listener
3.1 基本瞭解
3.1.1 監聽器是個介面,內容由我們實現
第16 / 20頁
3.1.2 必須要註冊事件源上
3.1.3 監聽器中的方法會在特殊事件發生時被呼叫
3.2 事件源
3.2.1 javaweb域
ServletContext
生命週期監聽
ServletContextListener
void # contextInitialized(ServletContextEevent sce): 建立servletContext時呼叫 void contextDestroyed(ServletContextEvent sce): 銷燬servletcontext時呼叫 屬性監聽
ServletContextAttributeListener
void # attributeAdded(ServletContextAtrributeEvent evc): 新增屬性時呼叫 void # atrributeReplaced(ServletContextAttributeEvent evc): 替換屬性時呼叫 void # attributeRemoved(ServletContextAttributeEvent evc): 移除屬性時呼叫 HttpSession
生命週期監聽
HttpSessionListener
void # sessionCreated(HttpSessionEvent se)
第17 / 20頁
void # sessionDestroyed(HttpSessionEvent se)
屬性監聽
HttpSessionAttributeListener
void # attributeAdded(HttpSessionBindingEvent event)
void # attributeReplaced(HttpSessionBindingEvent event)
void # attributeRemoved(HttpSessionBindingEvent event)
ServletRequest
生命週期監聽
ServletRequestListener
void # requestInittialized(ServletRequestEvent sre)
void # requestDestroyed(ServletRequestEvent sre)
屬性監聽
SevletRequestAttributeListener
void # attributeAdded(ServletRequestAttribteEvent srae)
void # attributeReplaced(ServletRequestAttributeEvent srae)
void # atrributeRemoved(ServletRequestAtributeEvent srac)
3.2.2 javabean
HttpSessionBindingListener
第18 / 20頁
void # valueBound(HttpSessionBindingEvent hsbe):把java物件加入到session中會呼叫此方法
void # valueUnbound(HttpSessionBindingEvent hsbe): 當把監聽物件從session中移除會呼叫此物件
HttpSessionActivationListener
先不管HttpSessionActivationListener監聽器介面,先來配置Tomcat鈍化session的引數,把下面配置檔案放到tomcat\conf\catalina\localhost目錄下!檔名稱為專案名稱。
第19 / 20頁
void # sessionWillPassivate(HttpSessionEvent se): 當物件感知要被持久化到硬碟中時呼叫此方法
void # sessionDidActiver(HttpSessionEvent se): 當物件感知要被從硬碟中載入到記憶體中(活化)時呼叫
3.3 事件
3.3.1 獲取域物件
3.3.2 獲取屬性名
3.3.3 獲取屬性值