1. 程式人生 > >JavaWeb三大元件

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 獲取屬性值