重定向地址_JavaWeb - Servlet:重定向和转发,状态管理
Servlet + JDBC 應(yīng)用
在 Servlet 中可以使用 JDBC 技術(shù)訪問數(shù)據(jù)庫,常見功能如下:
- 查詢 DB 數(shù)據(jù),然后生成顯示頁面,例如:列表顯示功能。
- 接收請求參數(shù),然后對 DB 操作,例如:注冊、登錄、修改密碼等功能。
為了方便重用和便于維護(hù)等目的,經(jīng)常會采用 DAO(Data Access Object)模式對數(shù)據(jù)庫操作進(jìn)行獨(dú)立封裝。
DAO 工廠(工廠模式):工廠類封裝了對象的創(chuàng)建細(xì)節(jié),為調(diào)用者提供符合要求的對象。
重定向和轉(zhuǎn)發(fā)
重定向的概述
概念
首先客戶瀏覽器發(fā)送 http 請求,當(dāng) web 服務(wù)器接受后發(fā)送 302 狀態(tài)碼響應(yīng)及對應(yīng)新的 location 給客戶瀏覽器,客戶瀏覽器發(fā)現(xiàn)是 302 響應(yīng),則自動再發(fā)送一個(gè)新的 http 請求,請求 url 是新的 location 地址,服務(wù)器根據(jù)此請求尋找資源并發(fā)送給客戶。
實(shí)現(xiàn)
實(shí)現(xiàn)重定向需要借助 javax.servlet.http.HttpServletResponse 接口中的方法:
void sendRedirect(String location) 使用指定的重定向位置 URL 向客戶端發(fā)送臨時(shí)重定向響應(yīng)
原理
當(dāng)執(zhí)行添加頁面功能時(shí),瀏覽器發(fā)送 add.do 請求給 Tomcat 服務(wù)器;
Tomcat 服務(wù)器的 AddServlet 收到 add.do 請求后,先訪問數(shù)據(jù)庫 DB 執(zhí)行插入新數(shù)據(jù)的操作,然后發(fā)送 302 狀態(tài)碼及重定向的新地址 Location: list.do 信息到瀏覽器;
瀏覽器根據(jù)新地址發(fā)送 list.do 請求給 Tomcat 服務(wù)器;
Tomcat 服務(wù)器的 ListServlet 收到 list.do 請求后,先訪問數(shù)據(jù)庫 DB 獲取 list 數(shù)據(jù),然后發(fā)送 200 狀態(tài)碼及 list 數(shù)據(jù)到瀏覽器;
瀏覽器根據(jù) list 數(shù)據(jù)展示頁面。
特點(diǎn)
重定向之后,瀏覽器地址欄的 URL 會發(fā)生改變。
重定向過程中會將前面 Request 對象銷毀,然后創(chuàng)建一個(gè)新的 Request 對象。
重定向的 URL 可以是其它項(xiàng)目工程。
轉(zhuǎn)發(fā)的概述
轉(zhuǎn)發(fā)的概念
一個(gè) Web 組件(Servlet/JSP)將未完成的處理通過容器轉(zhuǎn)交給另外一個(gè) Web 組件繼續(xù)處理,轉(zhuǎn)發(fā)的各個(gè)組件會共享 Request 和 Response 對象。
轉(zhuǎn)發(fā)的實(shí)現(xiàn)
- 綁定數(shù)據(jù)到 Request 對象
Object getAttribute(String name) 將指定屬性值作為對象返回,若給定名稱屬性不存在,則返回空值
void setAttribute(String name,Object o) 在此請求中存儲屬性值
- 獲取轉(zhuǎn)發(fā)器對象
RequestDispatcher getRequestDispatcher(String path) 返回一個(gè) RequestDispatcher 對象,該對象充當(dāng)位于給定路徑上的資源的包裝器
- 轉(zhuǎn)發(fā)操作
void forward(ServletRequest request, ServletResponse response) 將請求從一個(gè) servlet 轉(zhuǎn)發(fā)到服務(wù)器上的另一個(gè)資源(Servlet、JSP文件或HTML文件)
轉(zhuǎn)發(fā)的特點(diǎn)
轉(zhuǎn)發(fā)之后瀏覽器地址欄的 URL 不會發(fā)生改變。
轉(zhuǎn)發(fā)過程中共享 Request 對象。
轉(zhuǎn)發(fā)的 URL 不可以是其它項(xiàng)目工程。
重定向和轉(zhuǎn)發(fā)的比較
Servlet 線程安全
服務(wù)器在收到請求之后,會啟動一個(gè)線程來進(jìn)行相應(yīng)的請求處理。
默認(rèn)情況下,服務(wù)器為每個(gè) Servlet 只創(chuàng)建一個(gè)對象實(shí)例。當(dāng)多個(gè)請求訪問同一個(gè) Servlet 時(shí),會有多個(gè)線程訪問同一個(gè) Servlet 對象,此時(shí)就可能發(fā)生線程安全問題。
多線程并發(fā)邏輯,需要使用 synchronized 對代碼加鎖處理,但盡量避免使用。
狀態(tài)管理
Web 程序基于 HTTP 協(xié)議通信,而 HTTP 協(xié)議是”無狀態(tài)”的協(xié)議,一旦服務(wù)器響應(yīng)完客戶的請求之后,就斷開連接,而同一個(gè)客戶的下一次請求又會重新建立網(wǎng)絡(luò)連接。
服務(wù)器程序有時(shí)是需要判斷是否為同一個(gè)客戶發(fā)出的請求,比如客戶的多次選購商品。因此,有必要跟蹤同一個(gè)客戶發(fā)出的一系列請求。
把瀏覽器與服務(wù)器之間多次交互作為一個(gè)整體,將多次交互所涉及的數(shù)據(jù)保存下來,即狀態(tài)管理。
多次交互的數(shù)據(jù)狀態(tài)可以在客戶端保存,也可以在服務(wù)器端保存。
狀態(tài)管理主要分為兩類:
- 客戶端管理 - 將狀態(tài)保存在客戶端。基于 Cookie 技術(shù)實(shí)現(xiàn)。
- 服務(wù)器管理 - 將狀態(tài)保存在服務(wù)器端?;?Session 技術(shù)實(shí)現(xiàn)。
Cookie 技術(shù)
基本概念
Cookie 表示客戶端以“名-值”形式進(jìn)行保存的一種技術(shù)。
瀏覽器向服務(wù)器發(fā)送請求時(shí),服務(wù)器將數(shù)據(jù)以 Set-Cookie 消息頭的方式響應(yīng)給瀏覽器,然后瀏覽器會將這些數(shù)據(jù)以文本文件的方式保存起來。
當(dāng)瀏覽器再次訪問服務(wù)器時(shí),會將這些數(shù)據(jù)以 Cookie 消息頭的方式發(fā)送給服務(wù)器。
相關(guān)的方法
- 使用 javax.servlet.http.Cookie 類的構(gòu)造方法實(shí)現(xiàn) Cookie 的創(chuàng)建。
Cookie(String name, String value) 根據(jù)參數(shù)指定數(shù)值構(gòu)造對象
- 使用 javax.servlet.http.HttpServletResponse 接口的成員方法實(shí)現(xiàn) Cookie 的添加。
void addCookie(Cookie cookie) 添加參數(shù)指定的對象到響應(yīng)
- 使用 javax.servlet.http.HttpServletRequest 接口的成員方法實(shí)現(xiàn) Cookie 對象的獲取。
Cookie[] getCookies() 返回此請求中包含的所有 Cookie 對象
- 使用 javax.servlet.http.Cookie 類的構(gòu)造方法實(shí)現(xiàn) Cookie 對象中屬性的獲取和修改。
String getName() 返回此 Cookie 對象中的名字
String getValue() 返回此 Cookie 對象的數(shù)值
void setValue(String newValue) 設(shè)置 Cookie 的數(shù)值
Cookie 的生命周期
- 默認(rèn)情況下,瀏覽器會將 Cookie 信息保存在內(nèi)存中,只要瀏覽器關(guān)閉,Cookie 信息就會消失。
- 如果希望關(guān)閉瀏覽器后 Cookie 信息仍有效,可以通過 Cookie 類的成員方法實(shí)現(xiàn)。
int getMaxAge() 返回cookie的最長使用期限(以秒為單位)
void setMaxAge(int expiry) 設(shè)置cookie的最長保留時(shí)間(秒)
Cookie 的路徑問題
- 瀏覽器在訪問服務(wù)器時(shí),會比較 Cookie 的路徑與請求路徑是否匹配,只有匹配的 Cookie 才會發(fā)送給服務(wù)器。
- Cookie 的默認(rèn)路徑等于添加這個(gè) Cookie 信息時(shí)的組件路徑,例如:/項(xiàng)目名/目錄/add.do 請求添加了一個(gè) Cookie 信息,則該 Cookie 的路徑是 /項(xiàng)目名/目錄。
- 訪問的請求地址必須符合 Cookie 的路徑或者其子路徑時(shí),瀏覽器才會發(fā)送 Cookie 信息。如果訪問請求地址為 項(xiàng)目名/test.html,則路徑為 項(xiàng)目名 的 Cookie 信息會被發(fā)送到服務(wù)器;如果訪問請求地址為 項(xiàng)目名/目錄/test.html,則路徑為 項(xiàng)目名 和 項(xiàng)目名/目錄 的 Cookie 信息會被發(fā)送到服務(wù)器。
void setPath(String uri) 設(shè)置 Cookie 的路徑信息
Cookie 的特點(diǎn)
Cookie 技術(shù)不適合存儲所有數(shù)據(jù),程序員只用于存儲少量、非敏感信息,原因如下:
- 將狀態(tài)數(shù)據(jù)保存在瀏覽器端,不安全
- 保存數(shù)據(jù)量有限制,大約 4 KB 左右
- 只能保存字符串信息
- 可以通過瀏覽器設(shè)置為禁止使用
Session 技術(shù)
基本概念
Session 是用來維護(hù)一個(gè)客戶端和服務(wù)器關(guān)聯(lián)的一種技術(shù)。
瀏覽器訪問服務(wù)器時(shí),服務(wù)器會為每一個(gè)瀏覽器都在服務(wù)器端的內(nèi)存中分配一個(gè)空間,用于創(chuàng)建一個(gè) Session 對象,該對象有一個(gè) id 屬性且該值唯一,我們稱為 SessionId,并且服務(wù)器會將這個(gè) SessionId 以 Cookie 方式發(fā)送給瀏覽器存儲。
瀏覽器再次訪問服務(wù)器時(shí)會將 SessionId 發(fā)送給服務(wù)器,服務(wù)器可以依據(jù) SessionId 查找相對應(yīng)的 Session 對象。
相關(guān)的方法
- 使用 javax.servlet.http.HttpServletRequest 接口的成員方法實(shí)現(xiàn) Session 的獲取。
HttpSession getSession() 返回此請求關(guān)聯(lián)的當(dāng)前 Session,若此請求沒有則創(chuàng)建一個(gè)
- 使用 javax.servlet.http.HttpSession 接口的成員方法實(shí)現(xiàn)判斷和獲取。
boolean isNew() 判斷是否為新創(chuàng)建的 Session
String getId() 獲取 Session 的編號
- 使用 javax.servlet.http.HttpSession 接口的成員方法實(shí)現(xiàn)屬性的管理。
Object getAttribute(String name) 返回在此會話中用指定名稱綁定的對象,如果沒有對象在該名稱下綁定,則返回空值
void setAttribute(String name, Object value) 使用指定的名稱將對象綁定到此會話
void removeAttribute(String name) 從此會話中刪除與指定名稱綁定的對象
Session 的生命周期
- 為了節(jié)省服務(wù)器內(nèi)存空間資源,服務(wù)器會將空閑時(shí)間過長的 Session 對象自動清除掉,服務(wù)器默認(rèn)的超時(shí)限制一般是 30 分鐘。
- 使用 javax.servlet.http.HttpSession 接口的成員方法實(shí)現(xiàn)失效實(shí)現(xiàn)的獲取和設(shè)置。
int getMaxInactiveInterval() 獲取失效時(shí)間
void setMaxInactiveInterval(int interval) 設(shè)置失效時(shí)間
- 可以配置 web.xml 文件修改失效時(shí)間。
Session 的特點(diǎn)
數(shù)據(jù)比較安全。
能夠保存的數(shù)據(jù)類型豐富,而 Cookie 只能保存字符串。
能夠保存更多的數(shù)據(jù),而 Cookie 大約保存 4 KB。
數(shù)據(jù)保存在服務(wù)器端會占用服務(wù)器的內(nèi)存空間,如果存儲信息過多、用戶量過大,會嚴(yán)重影響服務(wù)器的性能。
想了解更多,歡迎關(guān)注我的微信公眾號:Renda_Zhang
總結(jié)
以上是生活随笔為你收集整理的重定向地址_JavaWeb - Servlet:重定向和转发,状态管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone清理喇叭灰尘_iphone正
- 下一篇: java volatile lock_J