Java路徑問題和狀態管理的概念
路徑問題:
什麼是路徑:
.連結地址<a href="URL"></a>
.表單提交<from action="url">
.重定向 response.sendRedirect("url")
.轉發 request.getRequestDispatcher("url")
url:路徑
ps:以上四種情況中的url可以為絕對路徑也可以為相對路徑.
什麼是相對路徑:
.從當前檔案出發到達目標檔案所經過的路徑叫做相對路徑.
.書寫格式不以"/"開頭
.退至上一級目錄"../"開頭
什麼叫絕對路徑:
.以"/"開頭的路徑都是絕對路徑,不以當前檔案的位置作為起始,而是以一個固定位置作為起始
到達目標檔案所經過的路徑
.這個固定位置可能是應用名,也可能是應用名之後.不可以使用從碟符開始的路徑
/appName/a/a2.jsp
經驗總結:
關於重定向和轉發的相對路徑和絕對路徑問題
轉發和重定向的url前加有"/"則為絕對路徑,反之則為相對路徑
1.通過form表單的action屬性向伺服器傳送請求
acition="LoginServlet"
則表單生成的請求地址
http://localhost:8080/appName/LoginServlet
2.重定向:
相對路徑:reponse.sendRedirect("index.jsp");
http://localhost:8080/appName/index.jsp
絕對路徑:response.sendRedirect("/Manager/index.jsp");
web容器本身地址+引數生成完整的url
http://localhost:8080/Manager/index.jsp
web應用地址
response.sendRedirect("http://www.baidu.com");
轉發:
相對路徑:
與重定向生成的url方法相同.
1.request.getRequestDispatcher("index.jsp")
http://localhost:8080/appName/index.jsp
2.絕對路徑:
轉發使用絕對路徑和重定向不同:比如:
request.getRequestDispatcher("/Manager/index.jsp")
http://localhost:8080/Manager/index.jsp
但是轉發用相對路徑和絕對路徑,最後產生的地址都一樣
狀態管理:
為什麼需要狀態管理:
web應用程式使用HTTP協議通訊,而HTTP協議是"無狀態協議",即伺服器一旦響應完客戶的請求
之後,就斷開連線,而同一個客戶的下一次請求將重新建立網路連線
.伺服器應用程式有時需要判斷是否為同一個客戶發出的請求,比如客戶的多次選購商品,
因此,有必須要跟蹤同一個客戶發出的一系列請求.
什麼是狀態管理
.將客戶端(瀏覽器)與伺服器之間的多次互動(一次請求,一次響應)當做一個整體來看待並且
將多次互動所涉及的資料即狀態儲存下來.
.狀態指的是資料
.管理指的是多次互動時對資料的修改.
狀態管理常見的兩種常見模式:
.伺服器狀態管理技術:將狀態(資料)儲存在伺服器端,代表性的是session技術.
.瀏覽器狀態管理技術:將狀態儲存在客戶端,代表性的技術Cookie
什麼是Cookie
.瀏覽器向web伺服器傳送請求時,伺服器會將少量的資料以set-Cookie訊息頭的方式傳送給
瀏覽器,瀏覽器將這些資料儲存下來.
.當瀏覽器再次訪問伺服器時,會將這些資料以Cookie訊息頭的方式傳送給伺服器
第一次訪問伺服器以如下形式返回給客戶端:
Set-Cookie:uname=Kitty
Set-Cookie:city=beijing
當瀏覽器再次訪問伺服器的時候會在request header中傳送如下資料,以便達到狀態管理
Cookie:uname=Kitty;city=beijing
ps:cookie的生命週期:
隨著瀏覽器的關閉,儲存在瀏覽器端的Cookie也跟著被刪除
Cookie原理:
客戶端:<----訪問---->伺服器:
1.http/1.1 200 ok
set-cookie:uname=XXX
2.GET /find Http/1.1
Cookie :uname = XXX
如何建立Cookie
.Servlet API為使用Cookie提供javax.servlet.http.Cookie
.建立:
Cookie cookie1 = new Cookie(String name,String value);
response.addCookie(cookie1);
.name:用於區分不同Cookie的名字
.value:Cookie的值
如何查詢Cookie
.獲取客戶端的所有Cookie物件
Cookie[] cookies = request.getCookies();
ps:該方法可能會返回null
.獲取一個Cookie物件的名稱和值
String name = c.getName();
String value = c.getValue();
response.setContentType("text/html;charset=utf-8");
// 接收瀏覽器傳送的Cookie
PrintWriter out = response.getWriter();
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie c : cookies) {
String name = c.getName();
String value = c.getValue();
out.println("Name:"+name+" Value:"+value+"<br>");
}
}else {
out.println("無cookie資訊");
}
如何修改Cookie
1.獲取客戶端傳送的所有Cookie
2.根據name找到要修改的Cookie
3.呼叫Cookie的setValue(String newValue)方法修改該Cookie的值
4.將修改後的Cookie加入到response返回到客戶端