- include指令include的行為的區(qū)別
- JSP九大內(nèi)置對(duì)象歇终,七大動(dòng)作踊东,三大指令
- 講解JSP中的四種作用域
- 如何實(shí)現(xiàn)JSP或Servlet的單線程模式
- 實(shí)現(xiàn)會(huì)話(huà)跟蹤的技術(shù)有哪些
- Cookie和Session的的區(qū)別
include指令include的行為的區(qū)別
include指令: JSP可以通過(guò)include指令來(lái)包含其他文件荔棉。被包含的文件可以是JSP文件濒募、HTML文件或文本文件坪郭。包含的文件就好像是該JSP文件的一部分吭产,會(huì)被同時(shí)編譯執(zhí)行侣监。 語(yǔ)法格式如下: <%@ include file="文件相對(duì) url 地址" %>
include動(dòng)作: jsp:include動(dòng)作元素用來(lái)包含靜態(tài)和動(dòng)態(tài)的文件。該動(dòng)作把指定文件插入正在生成的頁(yè)面臣淤。語(yǔ)法格式如下: <jsp:include page="相對(duì) URL 地址" flush="true" />
JSP九大內(nèi)置對(duì)象橄霉,七大動(dòng)作,三大指令
JSP九大內(nèi)置對(duì)象邑蒋,七大動(dòng)作酪劫,三大指令總結(jié)
講解JSP中的四種作用域
JSP中的四種作用域包括page、request寺董、session和application覆糟,具體來(lái)說(shuō):
- page代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。
- request代表與Web客戶(hù)機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性遮咖。一個(gè)請(qǐng)求可能跨越多個(gè)頁(yè)面滩字,涉及多個(gè)Web組件;需要在頁(yè)面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域御吞。
- session代表與某個(gè)用戶(hù)與服務(wù)器建立的一次會(huì)話(huà)相關(guān)的對(duì)象和屬性麦箍。跟某個(gè)用戶(hù)相關(guān)的數(shù)據(jù)應(yīng)該放在用戶(hù)自己的session中。
- application代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性陶珠,它實(shí)質(zhì)上是跨越整個(gè)Web應(yīng)用程序挟裂,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話(huà)的一個(gè)全局作用域揍诽。
如何實(shí)現(xiàn)JSP或Servlet的單線程模式
對(duì)于JSP頁(yè)面诀蓉,可以通過(guò)page指令進(jìn)行設(shè)置栗竖。 <%@page isThreadSafe=”false”%>
對(duì)于Servlet,可以讓自定義的Servlet實(shí)現(xiàn)SingleThreadModel標(biāo)識(shí)接口渠啤。
說(shuō)明:如果將JSP或Servlet設(shè)置成單線程工作模式狐肢,會(huì)導(dǎo)致每個(gè)請(qǐng)求創(chuàng)建一個(gè)Servlet實(shí)例,這種實(shí)踐將導(dǎo)致嚴(yán)重的性能問(wèn)題(服務(wù)器的內(nèi)存壓力很大沥曹,還會(huì)導(dǎo)致頻繁的垃圾回收)份名,所以通常情況下并不會(huì)這么做。
實(shí)現(xiàn)會(huì)話(huà)跟蹤的技術(shù)有哪些
- 使用Cookie
向客戶(hù)端發(fā)送Cookie
Cookie c =new Cookie("name","value"); //創(chuàng)建Cookie
c.setMaxAge(60*60*24); //設(shè)置最大時(shí)效妓美,此處設(shè)置的最大時(shí)效為一天
response.addCookie(c); //把Cookie放入到HTTP響應(yīng)中
從客戶(hù)端讀取Cookie
String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
for(int i= 0;i<cookies.length;i++){
Cookie cookie =cookies[i];
if(name.equals(cookis.getName()))
//something is here.
//you can get the value
cookie.getValue();
}
}
優(yōu)點(diǎn): 數(shù)據(jù)可以持久保存僵腺,不需要服務(wù)器資源,簡(jiǎn)單壶栋,基于文本的Key-Value
缺點(diǎn): 大小受到限制辰如,用戶(hù)可以禁用Cookie功能,由于保存在本地委刘,有一定的安全風(fēng)險(xiǎn)丧没。
- URL 重寫(xiě)
在URL中添加用戶(hù)會(huì)話(huà)的信息作為請(qǐng)求的參數(shù)鹰椒,或者將唯一的會(huì)話(huà)ID添加到URL結(jié)尾以標(biāo)識(shí)一個(gè)會(huì)話(huà)锡移。
優(yōu)點(diǎn): 在Cookie被禁用的時(shí)候依然可以使用
缺點(diǎn): 必須對(duì)網(wǎng)站的URL進(jìn)行編碼,所有頁(yè)面必須動(dòng)態(tài)生成漆际,不能用預(yù)先記錄下來(lái)的URL進(jìn)行訪問(wèn)淆珊。
3.隱藏的表單域
<input type="hidden" name ="session" value="..."/>
優(yōu)點(diǎn): Cookie被禁時(shí)可以使用
缺點(diǎn): 所有頁(yè)面必須是表單提交之后的結(jié)果。
- HttpSession
在所有會(huì)話(huà)跟蹤技術(shù)中奸汇,HttpSession對(duì)象是最強(qiáng)大也是功能最多的施符。當(dāng)一個(gè)用戶(hù)第一次訪問(wèn)某個(gè)網(wǎng)站時(shí)會(huì)自動(dòng)創(chuàng)建 HttpSession,每個(gè)用戶(hù)可以訪問(wèn)他自己的HttpSession擂找〈亮撸可以通過(guò)HttpServletRequest對(duì)象的getSession方 法獲得HttpSession,通過(guò)HttpSession的setAttribute方法可以將一個(gè)值放在HttpSession中贯涎,通過(guò)調(diào)用 HttpSession對(duì)象的getAttribute方法听哭,同時(shí)傳入屬性名就可以獲取保存在HttpSession中的對(duì)象。與上面三種方式不同的 是塘雳,HttpSession放在服務(wù)器的內(nèi)存中陆盘,因此不要將過(guò)大的對(duì)象放在里面,即使目前的Servlet容器可以在內(nèi)存將滿(mǎn)時(shí)將HttpSession 中的對(duì)象移到其他存儲(chǔ)設(shè)備中败明,但是這樣勢(shì)必影響性能隘马。添加到HttpSession中的值可以是任意Java對(duì)象,這個(gè)對(duì)象最好實(shí)現(xiàn)了 Serializable接口妻顶,這樣Servlet容器在必要的時(shí)候可以將其序列化到文件中酸员,否則在序列化時(shí)就會(huì)出現(xiàn)異常蜒车。
Cookie和Session的的區(qū)別
- 由于HTTP協(xié)議是無(wú)狀態(tài)的協(xié)議,所以服務(wù)端需要記錄用戶(hù)的狀態(tài)時(shí)沸呐,就需要用某種機(jī)制來(lái)識(shí)具體的用戶(hù)醇王,這個(gè)機(jī)制就是Session.典型的場(chǎng)景比如購(gòu)物車(chē),當(dāng)你點(diǎn)擊下單按鈕時(shí)崭添,由于HTTP協(xié)議無(wú)狀態(tài)寓娩,所以并不知道是哪個(gè)用戶(hù)操作的,所以服務(wù)端要為特定的用戶(hù)創(chuàng)建了特定的Session呼渣,用用于標(biāo)識(shí)這個(gè)用戶(hù)棘伴,并且跟蹤用戶(hù),這樣才知道購(gòu)物車(chē)?yán)锩嬗袔妆緯?shū)屁置。這個(gè)Session是保存在服務(wù)端的焊夸,有一個(gè)唯一標(biāo)識(shí)。在服務(wù)端保存Session的方法很多蓝角,內(nèi)存阱穗、數(shù)據(jù)庫(kù)、文件都有使鹅。集群的時(shí)候也要考慮Session的轉(zhuǎn)移揪阶,在大型的網(wǎng)站,一般會(huì)有專(zhuān)門(mén)的Session服務(wù)器集群患朱,用來(lái)保存用戶(hù)會(huì)話(huà)鲁僚,這個(gè)時(shí)候 Session 信息都是放在內(nèi)存的,使用一些緩存服務(wù)比如Memcached之類(lèi)的來(lái)放 Session裁厅。
- 思考一下服務(wù)端如何識(shí)別特定的客戶(hù)冰沙?這個(gè)時(shí)候Cookie就登場(chǎng)了。每次HTTP請(qǐng)求的時(shí)候执虹,客戶(hù)端都會(huì)發(fā)送相應(yīng)的Cookie信息到服務(wù)端拓挥。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來(lái)實(shí)現(xiàn)Session跟蹤的,第一次創(chuàng)建Session的時(shí)候袋励,服務(wù)端會(huì)在HTTP協(xié)議中告訴客戶(hù)端侥啤,需要在 Cookie 里面記錄一個(gè)Session ID,以后每次請(qǐng)求把這個(gè)會(huì)話(huà)ID發(fā)送到服務(wù)器插龄,我就知道你是誰(shuí)了愿棋。有人問(wèn),如果客戶(hù)端的瀏覽器禁用了 Cookie 怎么辦均牢?一般這種情況下糠雨,會(huì)使用一種叫做URL重寫(xiě)的技術(shù)來(lái)進(jìn)行會(huì)話(huà)跟蹤,即每次HTTP交互徘跪,URL后面都會(huì)被附加上一個(gè)諸如 sid=xxxxx 這樣的參數(shù)甘邀,服務(wù)端據(jù)此來(lái)識(shí)別用戶(hù)琅攘。
- Cookie其實(shí)還可以用在一些方便用戶(hù)的場(chǎng)景下,設(shè)想你某次登陸過(guò)一個(gè)網(wǎng)站松邪,下次登錄的時(shí)候不想再次輸入賬號(hào)了坞琴,怎么辦?這個(gè)信息可以寫(xiě)到Cookie里面逗抑,訪問(wèn)網(wǎng)站的時(shí)候剧辐,網(wǎng)站頁(yè)面的腳本可以讀取這個(gè)信息,就自動(dòng)幫你把用戶(hù)名給填了邮府,能夠方便一下用戶(hù)荧关。這也是Cookie名稱(chēng)的由來(lái),給用戶(hù)的一點(diǎn)甜頭褂傀。所以忍啤,總結(jié)一下:Session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來(lái)跟蹤用戶(hù)的狀態(tài)仙辟,這個(gè)數(shù)據(jù)可以保存在集群同波、數(shù)據(jù)庫(kù)、文件中叠国;Cookie是客戶(hù)端保存用戶(hù)信息的一種機(jī)制未檩,用來(lái)記錄用戶(hù)的一些信息,也是實(shí)現(xiàn)Session的一種方式煎饼。
參考:
https://www.zhihu.com/question/19786827/answer/28752144
《javaweb整合開(kāi)發(fā)王者歸來(lái)》P158 Cookie和Session的比較