第一部分:jsp入門和el表達(dá)式入門
1鳞溉、jsp的入門
1.1 什么是jsp:
(1)sun公司用于動(dòng)態(tài)網(wǎng)站開發(fā)技術(shù) servlet ,因?yàn)槭褂胹ervlet如果向頁面輸出內(nèi)容很麻煩鼠哥,
有了jsp熟菲,使用jsp向頁面輸出內(nèi)容很方便,jsp就是servlet朴恳,最終會(huì)被編譯成servlet抄罕,放到tomcat的work目錄。
(2)jsp:java server pages于颖,java服務(wù)器端頁面呆贿,jsp會(huì)編譯成servlet,通過tomcat服務(wù)器進(jìn)行運(yùn)行森渐。
1.2 jsp在什么時(shí)候編譯成servlet:在訪問jsp時(shí)候會(huì)編譯成servlet
1.3 jsp的組成:html+java代碼+jsp自身的一些東西
1.4 jsp里面如何嵌入java代碼做入,有三種方式
第一種方式:<%! %> : 在里面定義變量,這個(gè)變量是成員變量
第二種方式:<%= %> :表示向頁面輸出內(nèi)容(固定值章母、變量)
= 生成的servlet代碼會(huì)在service里面母蛛,out.print("hello" );
= 后面不要加分號(hào);
第三種方式:<% %> :編譯成servlet之后,代碼生成在service方法里面
1.5 在jsp中html代碼和java代碼混合使用
(1)在jsp中生成五行五列的表格
(2)基本實(shí)現(xiàn)的步驟
= 五行:循環(huán)五次乳怎,生成tr
= 五列:在每行里面循環(huán)五次,生成td
(3)代碼
<table border="1" cellpadding="10">
<%
for(int i=1;i<=5;i++) {
%>
<tr>
<%
for(int j=1;j<=5;j++) {
%>
<td>aaa</td>
<%
}
%>
</tr>
<%
}
%>
</table>
2、el表達(dá)式的入門
2.1 作用:獲取域?qū)ο罄锩娴闹凋阶海荒苁褂迷趆tml中秫逝,使用在jsp中
2.2 寫法:${設(shè)置的名稱}
2.3 通過例子演示el表達(dá)式
(1)創(chuàng)建jsp頁面,在jsp中向兩個(gè)域?qū)ο罄锩嬖O(shè)置值(servletContext询枚、request)
(2)在jsp中首先使用傳統(tǒng)方式獲取域?qū)ο罄锩娴闹?(3)在jsp再使用el表達(dá)式獲取域?qū)ο罄锩娴闹?(4)代碼
<!-- 向域?qū)ο罄锩嬖O(shè)置值 servletContext和request-->
<%
//向servletContext域里面設(shè)置值
getServletContext().setAttribute("context", "contextvalue");
//向request域里面設(shè)置值
request.setAttribute("request", "requsetvalue");
%>
<!-- 使用傳統(tǒng)方式獲取域?qū)ο罄锩娴闹?-->
<%=getServletContext().getAttribute("context") %>
<%=request.getAttribute("request") %>
<!-- 使用el表達(dá)式獲取域?qū)ο罄锩娴闹?-->
<hr/>
${context }
<br/>
${request }
2.4 其他的問題
(1)使用el表達(dá)式獲取的域?qū)ο竺Q不存在
= 如果使用傳統(tǒng)方式獲取域?qū)ο蟮闹挡淮嬖谖シ祷豱ull,容易造成空指針異常
= 使用el表達(dá)式獲取的域?qū)ο竺Q不存在金蜀,返回空字符串 ""刷后,不會(huì)造成空指針異常
(2)如果分別向多個(gè)域?qū)ο罄锩嬖O(shè)置值,名稱都相同
= 使用el表達(dá)式獲取的值是域范圍小的里面的值
= 分別獲取不同的域?qū)ο罄锩娴闹? ${requestScope.msg }
${applicationScope.msg }
(3) 域?qū)ο蠓秶判颍ㄓ纱蟮叫渊抄。? servletContext > session > request >page
第二部分:會(huì)話管理 cookie技術(shù)
1尝胆、會(huì)話管理的簡(jiǎn)介
1.1 什么是會(huì)話:打開瀏覽器,進(jìn)行網(wǎng)頁的瀏覽护桦,到關(guān)閉瀏覽器的過程含衔,稱為一次會(huì)話
1.2 會(huì)話技術(shù)用兩種技術(shù)
(1)cookie技術(shù):客戶端的技術(shù)
(2)session技術(shù):服務(wù)器端的技術(shù)
1.3 使用域?qū)ο笫欠癖4尜徫镄畔?(1)使用request域是否保存購物信息
= 因?yàn)閞equest域范圍是一次請(qǐng)求,所以最終結(jié)算時(shí)候在request域里面沒有任何購物信息
(2)使用servletContext域是否保存購物信息
= 因?yàn)槊總€(gè)項(xiàng)目有一個(gè)servletContext域?qū)ο蠖郑煌娜速徫锏纳唐范家娴竭@個(gè)域里面
1.4 使用cookie和session技術(shù)保存購物信息
(1)使用cookie保存購物信息
= 第一次購買鼠標(biāo)贪染,在服務(wù)器端得到鼠標(biāo),把鼠標(biāo)放到cookie里面催享,把cookie返回到瀏覽器中
= 第二次購物鍵盤杭隙,攜帶瀏覽器里面鼠標(biāo)發(fā)送請(qǐng)求,在服務(wù)器端分別得到購物的商品和攜帶商品因妙,把這兩個(gè)商品放到cookie里面寺渗,把cookie返回到瀏覽器中
=最終結(jié)算:攜帶瀏覽器中的商品發(fā)送請(qǐng)求,完成結(jié)算
(2)使用session保存購物信息
= 第一次購買百度兰迫,在服務(wù)器端得到百度信殊,開辟一個(gè)空間,把百度放到空間里面汁果,返回一把可以打開空間
的鑰匙涡拘,把這把鑰匙返回到瀏覽器中
= 第二次購買IBM,攜帶瀏覽器中的鑰匙發(fā)送請(qǐng)求据德,在服務(wù)器端得到購買的商品和攜帶鑰匙鳄乏,使用鑰匙打開空間,把購買的商品放到空間中棘利,返回一把新的鑰匙到瀏覽器中
= 最終結(jié)算:攜帶著瀏覽器中的鑰匙發(fā)送請(qǐng)求橱野,在服務(wù)器端獲取鑰匙,使用鑰匙打開空間善玫,把空間中的商品取出來水援,最終完成結(jié)算
2、練習(xí)一:使用cookie實(shí)現(xiàn)記錄用戶的上次訪問時(shí)間
2.1 需求的描述
(1)創(chuàng)建servlet,當(dāng)?shù)谝淮卧L問這個(gè)servlet時(shí)候蜗元,產(chǎn)生訪問時(shí)間或渤,向頁面輸出內(nèi)容
(2)當(dāng)?shù)诙卧L問這個(gè)servlet時(shí)候,有第一次時(shí)間奕扣,把第一次產(chǎn)生的時(shí)候顯示到頁面上薪鹦;
第二次訪問產(chǎn)生新的時(shí)間
(3)當(dāng)?shù)谌卧L問這個(gè)servlet時(shí)候,有第二次時(shí)間惯豆,把第二次時(shí)候顯示到頁面上池磁,
第三次訪問產(chǎn)生新的時(shí)間
.......
2.2 cookie的api
(1)Cookie[] getCookies() :得到所有的cookie
(2)addCookie(Cookie cookie) :把cookie返回到瀏覽器中(回寫)
(3)new Cookie(java.lang.String name, java.lang.String value)
兩個(gè)參數(shù):第一個(gè)參數(shù)是cookie名稱,第二個(gè)參數(shù)是值
(4)getName() :得到cookie的名稱
(5)getValue() :得到cookie的值
2.3 實(shí)現(xiàn)步驟的分析
* 1楷兽、判斷是否是第一次訪問
* 獲取所有的cookie地熄,判斷cookie里面是否有名稱 lastVisit的cookie
* 2、如果沒有有相同名稱的cookie拄养,是第一次訪問离斩,直接向頁面輸出內(nèi)容
* 獲取第一次訪問的時(shí)間,把時(shí)間放到cookie里面瘪匿,把cookie回寫到瀏覽器
* 3跛梗、如果不是第一次,獲取攜帶過來的時(shí)間棋弥,把這個(gè)時(shí)間顯示到頁面上
* 獲取這次訪問產(chǎn)生的時(shí)間核偿,把時(shí)間放到cookie里面,把cookie回寫到瀏覽器
2.4 代碼實(shí)現(xiàn)練習(xí)
(1)代碼
//獲取所用的cookie
Cookie[] cookies = request.getCookies();
//判斷是否有名稱是 lastVisit的cookie
Cookie cookie = findCookie(cookies,"lastVisit");
//如果是第一次
if(cookie == null) {
//向頁面輸出內(nèi)容
response.getWriter().write("welcome");
} else {//不是第一次
//獲取攜帶過來的時(shí)間顽染,把這個(gè)時(shí)間顯示到頁面上
String times = cookie.getValue();
response.getWriter().write(times);
}
//得到產(chǎn)生的時(shí)間
Date date = new Date();
String times = date.toLocaleString();
//把時(shí)間放到cookie里面
Cookie c1 = new Cookie("lastVisit",times);
//把cookie回寫到瀏覽器中
response.addCookie(c1);
3漾岳、cookie的api使用
3.1 cookie的分類
(1)cookie分成兩類
第一類:會(huì)話級(jí)別的cookie,在關(guān)閉瀏覽器之后粉寞,cookie銷毀了尼荆,在默認(rèn)的情況下是會(huì)話級(jí)別的cookie
第二類:持久化的cookie,在一定的時(shí)間范圍內(nèi)唧垦,cookie一致有效捅儒。
= 設(shè)置成持久化的cookie,使用setMaxAge(int expiry) :參數(shù)是秒
3.2 常用的方法
(1)Cookie[] getCookies() :得到所有的cookie
(2)addCookie(Cookie cookie) :把cookie返回到瀏覽器中(回寫)
(3)new Cookie(java.lang.String name, java.lang.String value)
兩個(gè)參數(shù):第一個(gè)參數(shù)是cookie名稱巧还,第二個(gè)參數(shù)是值
(4)getName() :得到cookie的名稱
(5)getValue() :得到cookie的值
(6)setMaxAge(int expiry) :設(shè)置cookie的有效時(shí)長
(7)setPath(java.lang.String uri) :設(shè)置cookie的有效路徑
= 比如通過setPath方法設(shè)置了一個(gè)路徑,在瀏覽器的地址欄輸入一個(gè)地址坊秸,如果這個(gè)地址包含設(shè)置的路徑麸祷,
才會(huì)攜帶cookie信息過來
= 舉例
setPath("/aaa")
訪問路徑: http://127.0.0.1/aaa/demo1 ,會(huì)攜帶cookie信息
訪問路徑: http://127.0.0.1/aaa/demo2 , 不會(huì)攜帶cookie信息
setPath("/")
3.3 使用注意事項(xiàng)
= cookie大小有限制
= 創(chuàng)建cookie時(shí)候至少兩部分內(nèi)容褒搔,一個(gè)name阶牍,一個(gè)value
= 在默認(rèn)的情況下喷面,cookie是一個(gè)會(huì)話級(jí)別cookie
3.4 銷毀持久化的cookie
第一步:創(chuàng)建一個(gè)和要銷毀cookie項(xiàng)目名稱的cookie new Cookie("name","");
第二步:設(shè)置cookie有效時(shí)長 setMaxAge(0)
第三步:設(shè)置有效路徑 ,要和銷毀的cookie的路徑一致 setPath("/")
第四步:把cookie回寫到瀏覽器中
4荸恕、練習(xí)二:使用cookie記錄用戶瀏覽的商品
4.1 準(zhǔn)備工作
(1)創(chuàng)建商品列表頁面
4.2 基本步驟
(1)使用超鏈接提交不同的商品乖酬,每個(gè)商品是id值區(qū)分
(2)在servlet中得到點(diǎn)擊商品的id值死相,把id值放到cookie里面融求,再把cookie回寫瀏覽器中
(3)如果第一次訪問商品id=1.把1放到cookie里面,返回到瀏覽器中
第二次訪問攜帶id=1的值進(jìn)行訪問算撮,在服務(wù)器端得到當(dāng)前瀏覽商品id和攜帶的id值生宛,把這兩個(gè)id值放到cookie里面,
返回到瀏覽器中肮柜。
4.3 代碼實(shí)現(xiàn)
(1)實(shí)現(xiàn)的步驟
* 1陷舅、判斷是否是第一次瀏覽
* * 得到所有的cookie,判斷cookie里面是否有名稱是his的cookie审洞,如果有不是第一次
* 2莱睁、如果是第一次,得到id值芒澜,把值放到cookie里面仰剿,把cookie返回到瀏覽器
* 3、如果不是第一次痴晦,得到當(dāng)前商品的id南吮,得到前一次回寫到瀏覽器的id值,在前一次的基礎(chǔ)之上追加新的id值
* * 比如值 1,2誊酌,追加值 1,2,3
* * 判斷當(dāng)前瀏覽的商品部凑,在cookie里面是否存在相同的商品的id,如果存在碧浊,不進(jìn)行追加的操作
* * 把值放到cookie里面涂邀,把cookie返回到瀏覽器
4.4 在servlet中完成把瀏覽記錄存到cookie
(1)代碼
if(cookie == null) {
//放到cookie
Cookie c1 = new Cookie("his",id);
//持久化的cookie
c1.setMaxAge(3600);
c1.setPath("/");
//回寫到瀏覽器
response.addCookie(c1);
} else {//不是第一次
//得到cookie的值 1,2,3
String values = cookie.getValue();
//分割字符串
String[] ids = values.split(",");
//比較當(dāng)前瀏覽商品的id,和數(shù)組里面的id值
boolean flag = checkIds(ids,id);
//如果沒有相同的id箱锐,才進(jìn)行操作
if(!flag) {
//在前一次的基礎(chǔ)之上追加新的id值
String newValue = values+","+id;
Cookie c2 = new Cookie("his",newValue);
//持久化的cookie
c2.setMaxAge(3600);
c2.setPath("/");
//回寫到瀏覽器
response.addCookie(c2);
}
}
4.6 在jsp中顯示瀏覽商品的圖片和名稱
(1)代碼
<%
Cookie[] cookies = request.getCookies();
Cookie cookie = MyCookieUtils.findByCookie(cookies, "his");
if(cookie == null) {
%>
<h2>沒有任何的瀏覽記錄</h2>
<%
} else {
//獲取商品的id值 1,2,3
String values = cookie.getValue();
//顯示商品的圖片和商品的名稱
String[] names = {"手電筒","手機(jī)","電視","冰箱"};
//得到id對(duì)應(yīng)的商品的名稱
String[] ids = values.split(",");
for(String id1:ids) {
String name = names[Integer.parseInt(id1)-1];
%>
<img src="/aaa/img/<%=id1 %>.jpg"/> <%=name %>
<%
}
}
%>
4.7 實(shí)現(xiàn)清空瀏覽記錄
(1)銷毀持久化的cookie操作
(2)步驟
* 1比勉、創(chuàng)建一個(gè)和要銷毀cookie相同名稱的cookie
* 2、設(shè)置cookie的有效時(shí)長是 0
* 3瑞躺、設(shè)置路徑一致的
* 4敷搪、把cookie回寫到瀏覽器
(3)代碼
//創(chuàng)建一個(gè)和要銷毀cookie相同名稱的cookie 名稱 his
Cookie cookie = new Cookie("his","");
//設(shè)置有效時(shí)長 0
cookie.setMaxAge(0);
//設(shè)置路徑一致的
cookie.setPath("/");
//把cookie回寫到瀏覽器
response.addCookie(cookie);
第三部分:會(huì)話管理 session技術(shù)
1、session的簡(jiǎn)介
1.1 session是服務(wù)器端的技術(shù)
1.2 創(chuàng)建session:使用request里面getSession()創(chuàng)建session對(duì)象幢哨,名稱:HttpSession
1.3 在WEB開發(fā)中赡勘,服務(wù)器可以為每個(gè)用戶瀏覽器創(chuàng)建一個(gè)會(huì)話對(duì)象(session對(duì)象),
注意:一個(gè)瀏覽器獨(dú)占一個(gè)session對(duì)象(默認(rèn)情況下)
(1)演示一個(gè)瀏覽器獨(dú)占一個(gè)session對(duì)象
= 創(chuàng)建servlet1捞镰,創(chuàng)建session對(duì)象闸与,輸出session的id值毙替,向頁面輸出超鏈接,到servlet2里面
= 創(chuàng)建servlet2践樱,創(chuàng)建session對(duì)象厂画,輸出session的id值
1.4 session域?qū)ο?(1)servletContext域?qū)ο蠛蛂equest域?qū)ο?(2)域?qū)ο螅涸谝欢ǖ姆秶鷥?nèi),存值和取值
(3)session域?qū)ο罂叫希秶且淮螘?huì)話袱院,存值和取值
(4)存值的方法:setAttribute(java.lang.String name, java.lang.Object value)
取值的方法:getAttribute(java.lang.String name)
1.5 session中的key稱為jsessionid
2、練習(xí):使用session實(shí)現(xiàn)簡(jiǎn)單的購物車
2.1 功能描述
(1)創(chuàng)建商品列表頁面瞭稼,點(diǎn)擊一個(gè)商品時(shí)候忽洛,把這個(gè)商品加入到購物車?yán)锩妫?(2)如果重復(fù)點(diǎn)擊一個(gè)商品,做數(shù)量上的增加
(3)在結(jié)算頁面中顯示商品名稱和數(shù)量
2.2 實(shí)現(xiàn)的步驟
第一步:判斷是否是第一次加入到購物車
= 判斷session里面是否有名稱是 cart的值
第二步:如果是第一次加入到購物車环肘,
= 得到商品id欲虚,根據(jù)id得到名稱,把名稱和數(shù)量1加入到購物車
第三步:如果不是第一次加入到購物車悔雹,
= 判斷當(dāng)前要加入到購物車的商品在購物車?yán)锩媸欠翊嬖诟炊撸绻呀?jīng)存在,
獲取出商品數(shù)量腌零,+1梯找,放回購物車?yán)锩? 如果不存在,直接把商品名稱和數(shù)量1加入到購物車
第四步:把購物車放到session里面
2.3 代碼實(shí)現(xiàn)
(1)實(shí)現(xiàn)把商品放到購物車
//得到商品的id
String id = request.getParameter("id");
//根據(jù)id得到商品的名稱
String[] names = {"手電筒","手機(jī)","電視","冰箱"};
String name = names[Integer.parseInt(id)-1];
//判斷是否是第一次加入到購物車
Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
//如果是第一次
if(map == null) {
//創(chuàng)建購物車
map = new HashMap<String,Integer>();
//把商品名稱和數(shù)量1 放到購物車
map.put(name, 1);
} else {//不是第一次
//判斷當(dāng)前加入到購物車的商品莱没,在購物車?yán)锩媸欠翊嬖? if(map.containsKey(name)) {//有相同名稱的商品
//獲取商品的數(shù)量
int num = map.get(name);
//把數(shù)量+1初肉,放回map里面
map.put(name, num+1);
} else { //沒有相同名稱的商品
//直接把名稱和數(shù)量1放到購物車
map.put(name, 1);
}
}
//把購物車放到session里面
request.getSession().setAttribute("cart", map);
(2)在購物車頁面里面顯示商品的信息
<%
//判斷session里面是否有信息
Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");
if(map == null) {
%>
<h2>沒有任何的購物信息</h2>
<%
} else {
//從map里面獲取商品的信息
//遍歷map集合
Set<String> set = map.keySet();
//遍歷set,得到每個(gè)商品的名稱饰躲,根據(jù)名稱得到數(shù)量
for(String name : set) {
int num = map.get(name);
%>
名稱:<%=name %>牙咏,數(shù)量: <%=num %> <br/>
<%
}
}
%>
3、session的創(chuàng)建和銷毀(清空購物車)
3.1 session的創(chuàng)建
(1)使用request里面方法 getSession()可以創(chuàng)建session對(duì)象嘹裂,名稱是HttpSession
3.2 session的銷毀
有三種方式
(1)非正常關(guān)閉服務(wù)器
(2)session默認(rèn)的過期時(shí)間
<session-config>
<session-timeout>30</session-timeout>
</session-config>
(3)調(diào)用session里面方法 invalidate()
3.3 代碼
//創(chuàng)建session
HttpSession session = request.getSession();
//調(diào)用銷毀
session.invalidate();
//回到頁面
response.sendRedirect("/aaa/cart.jsp");
4妄壶、練習(xí):使用session實(shí)現(xiàn)驗(yàn)證碼的校驗(yàn)
4.1 實(shí)現(xiàn)的步驟
(1)獲取輸入的驗(yàn)證碼值
(2)把圖片上面的值放到session里面
(3)把輸入的值和session里面的值進(jìn)行比較,如果相同校驗(yàn)成功寄狼,否則校驗(yàn)失敗
4.2 代碼
//獲取輸入的驗(yàn)證碼的值
request.setCharacterEncoding("utf-8");
String codeInput = request.getParameter("code");
//獲取session里面的驗(yàn)證碼的值
String codeSession = (String) request.getSession().getAttribute("code");
//進(jìn)行比較
if(codeInput.equals(codeSession)) {//相同
response.getWriter().write("success");
} else {
//失敗丁寄,回到登錄頁面,同時(shí)攜帶錯(cuò)誤信息
request.setAttribute("msg", "驗(yàn)證碼校驗(yàn)失敗");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
5泊愧、禁用cookie之后session追蹤
5.1 session執(zhí)行的過程
(1)在服務(wù)器端開辟空間伊磺,把值放到空間里面,返回一把可以打開空間的鑰匙到瀏覽器中
(2)把鑰匙返回到瀏覽器過程:使用cookie實(shí)現(xiàn)
5.2 如果關(guān)閉瀏覽器之后删咱,session是否可以銷毀
(1)關(guān)閉瀏覽器之后屑埋,不會(huì)銷毀session
(2)session基于cookie實(shí)現(xiàn),向?yàn)g覽器回寫鑰匙通過cookie實(shí)現(xiàn)痰滋,在默認(rèn)情況下cookie會(huì)話級(jí)別的cookie摘能,
當(dāng)關(guān)閉瀏覽器之后续崖,cookie就銷毀了,相當(dāng)于鑰匙找不到了团搞,得不到session里面的值
5.3 禁用cookie之后session使用
(1)創(chuàng)建servlet1严望,在servlet1里面創(chuàng)建session對(duì)象,輸出session的id值逻恐,向頁面輸出超鏈接到servlet2
(2)創(chuàng)建servlet2像吻,在servlet2里面創(chuàng)建session對(duì)象,輸出session的id值
(3)返回到瀏覽器的鑰匙:JSESSIONID=79D6C94EE9A1E9DC3C0F947873624592
在請(qǐng)求的路徑后面添加 ;jsessionid=id值
http://127.0.0.1:8080/aaa/servlet2;jsessionid=EF6A428F1D282BFAADA7FF482EDD5E60
5.4 兩個(gè)方法實(shí)現(xiàn)禁用cookie之后session使用
response.encodeRedirectUrl(url);
response.encodeURL(url);
5.5 禁用cookie之后使用session梢莽,網(wǎng)站中所有的路徑都需要拼接地址