<pre>
day09
昨天内容回顧
(1)response
*response裡面對應http協定裡面的對應的方法
*在response裡面做了四個案例(不包含驗證碼)代碼至少寫三遍
*驗證碼的案例,看懂就可以了。
*重點掌握看不清換一張實作
*Response向頁面輸出中文亂碼解決(****)
(2)request
*擷取客戶機資訊和頭資訊的方法
*擷取表單送出的資料
*擷取表單送出中文資料亂碼問題解決(****)
*request域
*重定向和轉發的差別
思維導圖
<a href="http://s3.51cto.com/wyfs02/M00/6F/4F/wKiom1WYkUqDsgafAAEHmc_NDsk207.jpg" target="_blank"></a>
1、JSP入門(代碼位置/day09/WebRoot/jsp)
*什麼是jsp:學過servlet,如果向頁面輸出内容,需要使用位元組流或者字元流輸出,這樣很麻煩。
針對這種很麻煩的情況,sun公司開發了一個新的技術jsp(友善向頁面進行輸出)
*java server pages:java伺服器端的頁面,jsp運作在伺服器裡面。
*jsp就是一個servlet,jsp最終會被編譯成servlet,會把編譯之後的servlet放到tomcat的work目錄下
*jsp在什麼時候編譯成servlet:在請求jsp時候會把jsp編譯成servlet
*jsp組成:html+java代碼+jsp自身的一些東西
*jsp裡面如何嵌入java代碼(*****)
**有三種方式
第一種:<%! %>:在定義的變量是成員的變量
=<%! int i = 10; %>
第二種:<%= %>:向頁面輸出的内容
=在servlet裡面生成的代碼 out.print("hello" );
第三種:<% %>
=在servelt裡面生成的代碼在service裡面
在實際開發中一般 jsp裡面經常 html代碼和java代碼混合使用
*練習:使用html和java代碼在jsp裡面生成五行五列的表格
<table border="1">
<%
for(inti=1;i<=5;i++) {
%>
<tr>
<%
for(intj=1;j<=5;j++) {
%>
<td>aaaaaaaaa</td>
}
%>
</tr>
<%
}
</table>
2、EL表達式入門(代碼位置/day09/WebRoot/el)
*什麼是el表達式:用于擷取域對象裡面的值
*el表達式用于jsp頁面中,不能在html中使用
*文法: ${域對象名稱}
* <!-- 使用el表達式擷取域對象裡面的值-->
<!-- 向域對象裡面設定值 -->
//向servletContext裡面設定值
getServletContext().setAttribute("msg1","itcast");
//向request域裡面設定值
request.setAttribute("msg2","itheima");
%>
<!-- 使用傳統方式擷取域對象裡面的值-->
<%=getServletContext().getAttribute("msg1") %>
<%=request.getAttribute("msg2")%>
<hr/>
<!-- 使用el表達式擷取域對象裡面的值-->
${msg1 }
${msg2 }
*如果向不同的域對象裡面設定值的名稱是相同的,使用el表達式擷取的是域對象範圍小的裡面的值
*如果使用傳統方式擷取域對象裡面的值,名稱不存在得到null
如果使用el表達式擷取域對象裡面的值,名稱不存在傳回空字元串 ""
3、會話管理
*什麼是會話:打開一個浏覽器進行網頁的浏覽,在一個浏覽器裡面浏覽很多的網頁,到關閉浏覽器的這個過程
稱為一次會話。
*會話管理的技術有兩種
第一種:cookie,用戶端的技術
第二種:session,伺服器端的技術
*使用域對象儲存購物資訊
**使用request域對象儲存購物資訊
=因為request域範圍是一次請求,是以request域不能儲存購物資訊
**使用servletContext域對象儲存購物資訊
=因為servletContext域範圍是整個web項目,每個web項目都有一個servletContext域
,進行結算時候,誰先結算把servletContext裡面的所有商品都結算
*可以使用會話技術儲存購物資訊
**使用cookie儲存購物資訊
=基本過程:
第一次買百度,到伺服器端得到百度,把百度放到cookie裡面,把cookie傳回到浏覽器記憶體中
第二次買ibm,從浏覽器記憶體中得到資訊,拿着這個百度發送請求,到伺服器端得到ibm和百度,
把這兩個值放到cookie裡面,把現在cookie傳回到浏覽器記憶體中。
最終進行結算,拿着記憶體中的百度和ibm發送請求,在伺服器端得到兩個值進行結算
**使用session儲存購物資訊
=基本的過程:
第一次買電腦,到伺服器端得到電腦,在伺服器端開辟一個空間,把得到放到空間裡面,傳回一把可以打開
這個空間唯一鑰匙,把這把鑰匙傳回浏覽器的記憶體中。
第二次買滑鼠,拿着第一次傳回的鑰匙進行購買,到伺服器端得到滑鼠,拿着鑰匙打開空間,
把滑鼠放到空間裡面,也會傳回一把新的鑰匙,傳回到浏覽器的記憶體中。
最終結算:拿着新的鑰匙進行結算,到伺服器端使用鑰匙把空間打開,從裡面取出值完成結算
4、案例一:使用cookie記錄使用者的上次通路時間(cn.itcast.cookie.CookieDemo1)
*需求描述:第一次通路某個servlet,産生一個通路時間,顯示歡迎
第二次再次通路這個servlet,有一個上次的時間,産生一個現在的時間
*案例的分析(畫圖分析)
*得到所有的cookie:Cookie[] getCookies()
*把cookie的值傳回到浏覽器記憶體中(回寫): response.addCookie(Cookie cookie)
*建立cookie:Cookie(String name, String value)
*代碼片段
//得到所有的cookie
Cookie[]cookies = request.getCookies();
//比如時候cookie的名稱 visit,判斷是否有和visit名稱相同的cookie
Cookiecookie = findCookie(cookies,"visit");
//得到目前的時間
Datedate = new Date();
Stringtimes = date.toLocaleString();
//把times儲存到cookie裡面
Cookiec = new Cookie("visit",times);
//把cookie值傳回浏覽器記憶體
response.addCookie(c);
5、cookie的API使用
*得到cookie的名稱:getName()
*得到cookie的值:getValue()
*setMaxAge(int expiry):設定cookie的有效時長
*setPath(String uri) :設定cookie的有效路徑
(1)cookie的分類有兩種
第一種:會話級别的cookie,關閉浏覽器cookie消失了(銷毀了)
第二種:持久性的cookie,cookie會在一定的時間内一直有效
*可以進行設定
*使用 setMaxAge(int expiry):參數是int類型,值是秒
*使用 setPath(String uri):一般參數傳遞成 setPath("/")
*代碼
//設定持久性cookie
//設定有效時長
c.setMaxAge(3600);
//設定有效路徑
c.setPath("/");
*cookie一些細節問題
**一個Cookie隻能辨別一種資訊,它至少含有一個辨別該資訊的名稱(NAME)和設定值(VALUE)。
**一個WEB站點可以給一個WEB浏覽器發送多個Cookie,一個WEB浏覽器也可以存儲多個WEB站點提供的Cookie。
**浏覽器一般隻允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
我的總結:
**如果你在浏覽器中設定了自動清除cookies的話,也達不到想要的效果。
**不同的sevlet是共享Cookie的,即使在不同的servletnew出了相同名稱的Cookie,
但是它們還是同一個Cookie。Cookie是存儲在用戶端浏覽器中的,伺服器與Cookie
存儲無關,隻與它的建立、修改、擷取有關。
**不同的浏覽器即使Cookie名稱相同,也不是同一個Cookie。
**如果建立了一個cookie,并将他發送到浏覽器,
預設情況下它是一個會話級别的cookie(即存儲在浏覽器的記憶體中),使用者退出浏覽器之後即被删除。
若希望浏覽器将該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為機關的時間。
6、案例二:使用cookie記錄使用者浏覽的商品
(頁面位置:/day09/WebRoot/cookie/product.jsp
servlet位置:/day09/src/cn/itcast/cookie/CookieDemo2.java)
(1)實作的步驟:
1、建立頁面,在頁面裡面有多個超連結表示不同的商品 ,使用id的值區分
* 1、判斷是否是第一次浏覽
* 2、如果是第一次浏覽,擷取id值,把id值存到cookie裡面,再把cookie寫到浏覽器的記憶體中
* 3、如果不是第一次浏覽,首先得到第二次購物的id值,到cookie裡面進行判斷,判斷是否有相同的id
* 如果有相同的id,不需要回寫cookie
* 4、如果沒有相同的id值的cookie,首先擷取之前id值,在之前的基礎之上追加一個id值,回寫到浏覽器的記憶體中
**代碼片段
*//判斷id是否相同 cookie裡面存結構 his 1,2,3
Stringvalues = cookie.getValue();
//切割values
String[]ids = values.split(",");
//寫方法實作周遊數組,和id值進行比較
booleanflag = checkIds(ids,id);
//沒有相同的id才進行下一步操作
if(!flag){
Stringvalue = values+","+id; //比如values 1,2 追加之後 1,2,3
//存到cookie
Cookiec = new Cookie("his",value);
//設定cookie是持久性的cookie
c.setMaxAge(3600);
c.setPath("/");
//把cookie寫到浏覽器的記憶體中
response.addCookie(c);
(2)清空浏覽記錄的功能(代碼位置:/day09/src/cn/itcast/cookie/Clear1.java)
*因為浏覽資訊存到cookie裡面,所有銷毀cookie就可以了
*如果是會話級别的cookie,關閉浏覽器就銷毀cookie
*如果是持久性的cookie如何銷毀呢?
*通路的路徑裡面包含setPath裡面的值,會攜帶cookie資訊發送請求
比如:c.setPath("/day01");
如果通過這個路徑進行通路http://127.0.0.1/day01/... 會攜帶cookie資訊
如果通過這個位址通路http://127.0.0.1/day02/..... 不會寫到cookie資訊
*一般都是設定成 /
*銷毀持久性cookie的步驟
1、建立一個和要銷毀cookie相同名稱的cookie
Cookiecookie = new Cookie("his","")
2、設定這個cookie的有效時長是0
cookie.setMaxAge(0)
3、設定有效路徑和要删除cookie的路徑一樣
cookie.setPath("/");
4、把這個cookie回寫到浏覽器的記憶體
7、session的簡介
*第一次買電腦,到伺服器端得到電腦,在伺服器端開辟一個空間,把得到放到空間裡面,傳回一把可以打開
這個空間唯一鑰匙,把這把鑰匙傳回浏覽器的記憶體中。
第二次買滑鼠,拿着第一次傳回的鑰匙進行購買,到伺服器端得到滑鼠,拿着鑰匙打開空間,
把滑鼠放到空間裡面,也會傳回一把新的鑰匙,傳回到浏覽器的記憶體中。
最終結算:拿着新的鑰匙進行結算,到伺服器端使用鑰匙把空間打開,從裡面取出值完成結算
(1)如何建立session?
*執行getSession() 方法之後建立session對象 名稱是 HttpSession
*一個浏覽器獨占一個session對象
*舉例看效果
**建立一個servlet1,在建立session,列印session的id值
**在servlet1寫一個超連結到servlet2,在servlet2也是建立session,列印id值
***看這兩個id值是否一樣
*session向浏覽器回寫鑰匙,也是使用cookie來實作的,jsessionid=值
**session也是要依賴于cookie實作的
8、案例三:使用session實作簡單的購物車(****)
(代碼的位置
頁面:/day09/WebRoot/session
servlet:/day09/src/cn/itcast/session/SessionDemo1.java
)
*首先建立商品的清單的頁面
(差別不同的商品id)
*點選某個商品加入到購物車
*會到一個頁面(結算還是繼續購物)
**點選繼續購物,回到清單頁面
*到結算頁面,在結算頁面上顯示商品名稱和數量
*session也是一個域對象,範圍:一次會話
**存值 setAttribute(name,value)
**取值 getAttribute(name)
* 1、判斷是否是第一次購物
* 2、如果是第一次購物,建立購物車,把商品名稱和數量1放到map裡面(得到id,根據id得到商品名稱)
* 3、根據商品名稱進行判斷,判斷購物車裡面是否有相同名稱的商品,如果有,把商品的數量取出來+1,放回map裡面
* 4、如果沒有相同名稱的商品,直接把商品名稱和數量1放到map裡面
* 5、最終把map放到session裡面
9、session的建立、銷毀和清空購物車
(代碼:/day09/src/cn/itcast/session/ClearSession.java)
*request.getSession()進行建立
*session的銷毀(****)
第一種:非正常關閉伺服器
第二種:session有一個預設的過期時間 這個時間是30分鐘
第三種:直接調用session裡面的方法實作invalidate() (重點掌握)
10、案例四:使用session進行驗證碼的校驗
(代碼位置:/day09/src/cn/itcast/session/CodeServlet.java
/day09/src/cn/itcast/session/LoginServlet.java)
*建立一個登陸頁面,在添加驗證碼,完成校驗
*debug調試web項目
* 1、擷取輸入的驗證碼
* 2、擷取session裡面的驗證碼
* 3、判斷這兩個驗證碼是否相同
11、禁用cookie後session的使用(了解)
** 建立一個servlet1,在建立session,列印session的id值
**在請求的位址後面添加一個參數 ;jsessionid=session的id值
**如果網站裡面有很多位址,這些位址都需要加jsessionid
**一般的購物網站,如果禁用了cookie,直接不讓你買東西
=======================================================================
完成的任務:
(1)昨天寫的request和response案例的代碼寫一遍
(2)cookie裡面的兩個案例代碼至少寫兩遍
(3)session裡面購物車的代碼至少寫一遍
*根據實作步驟把代碼寫出來
</pre>
本文轉自屠夫章哥 51CTO部落格,原文連結:http://blog.51cto.com/4259297/1671016,如需轉載請自行聯系原作者