答:會(huì)話作用域ServletsJSP頁面描述
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、潼南ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的潼南網(wǎng)站制作公司
page否是代表與一個(gè)頁面相關(guān)的對(duì)象和屬性。一個(gè)頁面由一個(gè)編譯好的Javaservlet類(可以帶有任何的include指令,但是沒有include動(dòng)作)表示。這既包括servlet又包括被編譯成servlet的JSP頁面
request是是代表與Web客戶機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多個(gè)頁面,涉及多個(gè)Web組件(由于forward指令和include動(dòng)作的關(guān)系)
session是是代表與用于某個(gè)Web客戶機(jī)的一個(gè)用戶體驗(yàn)相關(guān)的對(duì)象和屬性。一個(gè)Web會(huì)話可以也經(jīng)常會(huì)跨越多個(gè)客戶機(jī)請(qǐng)求
application是是代表與整個(gè)Web應(yīng)用程序相關(guān)的對(duì)象和屬性。這實(shí)質(zhì)上是跨越整個(gè)Web應(yīng)用程序,包括多個(gè)頁面、請(qǐng)求和會(huì)話的一個(gè)全局作用域
何謂會(huì)話跟蹤技術(shù)和ServletContext接口,我就簡單的說一下。 會(huì)話跟蹤技術(shù)就是服務(wù)器根據(jù)SessionId來判斷與之交互的是不是同一個(gè)客戶端。 ServletContext接口用于獲取配置在web.xml文件中的初始化參數(shù),可實(shí)現(xiàn)多個(gè)Servlet共享。 好吧,步入正題來說說你的問問。 ----------------------------------這是HTML中的代碼---------------------------------------- 請(qǐng)輸入姓名:input type="text" name="userName" ---------------------------------提交給Servlet--------------------------------------- String userName=request.getParameter("userName"); //取出HTML中姓名文本框中的值 request.getSession().setAttribute("userName",userName); //把姓名保存session中 this.getServletContext().setInitParameter("userName",userName); //把姓名保存到ServletContext中 說明: 放入Session中的數(shù)據(jù)在瀏覽器關(guān)閉之后就會(huì)消失。放入ServletContext中的數(shù)據(jù),所有的Servlet都可以訪問。 剛學(xué)完JSP,覺得Java有點(diǎn)小難。但是用心去領(lǐng)悟,必定會(huì)有所收獲的。
HTTP是一種無連接的協(xié)議,如果一個(gè)客戶端只是單純地請(qǐng)求一個(gè)文件(HTML或GIF),服務(wù)器端可以響應(yīng)給客戶端,并不需要知道一連串的請(qǐng)求是否來自于相同的客戶端,而且也不需要擔(dān)心客戶端是否處在連接狀態(tài)。但是這樣的通信協(xié)議使得服務(wù)器端難以判斷所連接的客戶端是否是同一個(gè)人。當(dāng)進(jìn)行Web程序開發(fā)時(shí),我們必須想辦法將相關(guān)的請(qǐng)求結(jié)合一起,并且努力維持用戶的狀態(tài)在服務(wù)器上,這就引出了會(huì)話追蹤(session tracking)。
1:會(huì)話與會(huì)話追蹤
session中文經(jīng)常翻譯為“會(huì)話”,其本來的含義是指有始有終的一系列動(dòng)作或消息,比如打電話時(shí)從拿起電話撥號(hào)到掛斷電話這中間的一系列過程可以稱之為一個(gè)session。有時(shí)候可以看到這樣的話“在一個(gè)瀏覽器會(huì)話期間……”,這里的會(huì)話一詞用的就是其本義,是指從一個(gè)瀏覽器窗口打開到關(guān)閉這個(gè)期間;如果說“用戶在一次會(huì)話期間……”這樣一句話,它指用戶的一系列動(dòng)作,比如從登錄到選購商品到結(jié)賬登出這樣一個(gè)網(wǎng)上購物的過程;然而有時(shí)候也可能僅僅是指一次連接。session的含義很多,其中的差別只能靠上下文來推斷。session tracking(會(huì)話追蹤)是指一類用來在客戶端與服務(wù)器之間保持狀態(tài)的解決方案,簡單地說,當(dāng)一個(gè)客戶在多個(gè)頁面間切換時(shí),服務(wù)器會(huì)保存該用戶的信息。
2:實(shí)現(xiàn)會(huì)話追蹤的4種方式會(huì)話追蹤的實(shí)現(xiàn)方式有下列4種方式:
(1)使用持續(xù)Cookies(Persistent Cookies)。
(2)重寫包含額外參數(shù)的URL(URL Rewriting)。
(3)建立含有數(shù)據(jù)的隱藏表單字段(Hidden Form Field)。
(4)使用內(nèi)建session對(duì)象。
前三種會(huì)話追蹤方式是傳統(tǒng)的做法,每種做法都有缺點(diǎn)。最后一種方法是目前最常用,也是最有效的解決方案,因此在這里將把討論重心放在第4種會(huì)話追蹤方式上,然而為求徹底了解會(huì)話追蹤的機(jī)制,還是先將傳統(tǒng)的會(huì)話追蹤方式先做一番介紹。(這里和我的理解不太一樣,記錄下我的理解,Session的機(jī)制是 Java Servlet 規(guī)范規(guī)定的,而tomcat container實(shí)現(xiàn)了這個(gè)規(guī)定,tomcat 是通過cookie 和 url rewriting的方式來實(shí)現(xiàn)的,也就是通過cookie 或url rewriting 保存一個(gè)seesionID, 這樣在內(nèi)部tomcat 把這個(gè)sesionID和一個(gè)Map聯(lián)系起來,達(dá)到將變量和session聯(lián)系起來的目的。所以第一和第二中方法是tomcat或其他servlet container實(shí)現(xiàn)session機(jī)制的手段,當(dāng)然我們也可以自己實(shí)現(xiàn)。而第三種方法只是在兩個(gè)頁面跳轉(zhuǎn)時(shí)傳遞變量的一種方式,要想用這種方式實(shí)現(xiàn)sesion機(jī)制還是不太現(xiàn)實(shí),要每個(gè)頁面都寫下hidden數(shù)據(jù),而且要寫下所有要傳的變量。)
2.1:使用Cookie
Cookie是一個(gè)小小的文本文件,它是將會(huì)話信息記錄在這個(gè)文本文件內(nèi),每個(gè)頁面都去Cookie中提取以前的會(huì)話信息。例如:
String sessionID = makeUniqueString();
HashMap sessionInfo = new HashMap();
HashMap globalTable = findTableStoringSessions();
globalTable.put(sessionID, sessionInfo);
Cookie sessionCookie =new Cookie("JSESSIONID", sessionID);
sessionCookie.setPath("/");
response.addCookie(sessionCookie);
上面這段代碼先將會(huì)話信息記錄在HashMap中,保存在服務(wù)器端,并用sessionID標(biāo)識(shí),然后把sessionID保存在名為“JSESSIONID”的Cookie中。
Cookie[] cookies = request.getCookies();
String sessionid = null;
HashMap sessionInfo = null;
HashMap globalTable = findTableStoringSessions();
if(cookies!=null){
for(int i=0;icookies.length;i++){
if(cookies[i].getName().equals("JSESSIONID")){
sessionid = cookies[i].getValue();
break;
}
}
if(sessionid!=null){
sessionInfo = globalTable.get(sessionid);
//We can use the sessionInfo to get value that we want
}
}
用戶請(qǐng)求到達(dá)服務(wù)器后,先從Cookie中取出sessionID,然后從HashMap中取出會(huì)話信息。這樣就實(shí)現(xiàn)了會(huì)話追蹤。
雖然Cookie強(qiáng)大且持續(xù)性高,但是由于有些用戶因?yàn)閾?dān)心Cookie對(duì)個(gè)人隱私的威脅,會(huì)關(guān)閉Cookie,一旦如此,便無法利用Cookie來達(dá)到會(huì)話追蹤的功能。
2.2:URL重寫
URL重寫是利用GET的方法,在URL的尾部添加一些額外的參數(shù)來達(dá)到會(huì)話追蹤(session tracking)的目的,服務(wù)器將這個(gè)標(biāo)識(shí)符與它所存儲(chǔ)的有關(guān)會(huì)話的數(shù)據(jù)關(guān)聯(lián)起來。URL看起來如下:
;jsessionid=1234,
使用URL重寫的優(yōu)點(diǎn)是Cookie被禁用或者根本不支持的情況下依舊能夠工作。但也有很多缺點(diǎn):
1. 必須對(duì)所有指向您的網(wǎng)站的URL進(jìn)行編碼。
2. 所有頁面必須動(dòng)態(tài)生成。
3. 不能使用預(yù)先記錄下來的URL進(jìn)行訪問,或者從其他網(wǎng)站鏈接進(jìn)行訪問。
2.3:隱藏表單字段
隱藏表單字段的方法,是利用HTML內(nèi)hidden的屬性,把客戶端的信息,在用戶不察覺的情形下,偷偷地隨著請(qǐng)求一起傳送給到服務(wù)器處理,這樣一來,就可以進(jìn)行會(huì)話跟蹤的任務(wù)了。可以下列的方法來做隱藏表單字段的會(huì)話追蹤。
input type="hidden" name="userID" value="15"
然后將重要的用戶信息,如ID之類獨(dú)一無二的數(shù)據(jù),以隱藏字段的方式傳送給服務(wù)器。隱藏字段的優(yōu)點(diǎn)在于session數(shù)據(jù)傳送到服務(wù)器端時(shí),并不象GET的方法,會(huì)將session數(shù)據(jù)保露在URL之上。不過這種做法還是有它的缺點(diǎn):一旦session數(shù)據(jù)儲(chǔ)存在隱藏字段中,就仍然有暴露數(shù)據(jù)的危機(jī),因?yàn)橹灰脩糁苯佑^看HTML的源文件,session數(shù)據(jù)將會(huì)暴露無疑。這將造成安全上的漏洞,特別當(dāng)用戶數(shù)據(jù)是依賴于用戶ID、密碼來取得的時(shí)候,將會(huì)有被盜用的危險(xiǎn)。另外這種方法只適用特定的一個(gè)流程,不適用于通常意義的會(huì)話跟蹤。
2.4:使用內(nèi)建session對(duì)象
傳統(tǒng)的會(huì)話追蹤方式使用比較麻煩,Servlet的會(huì)話機(jī)制基于Cookie或URL重寫技術(shù),融合了這兩種技術(shù)的優(yōu)點(diǎn)。當(dāng)客戶端允許使用Cookie時(shí),內(nèi)建session對(duì)象使用Cookie進(jìn)行會(huì)話追蹤;如果客戶端禁用Cookie,則選擇使用URL重寫。
(1)獲取session對(duì)象例如把購物車作為屬性存儲(chǔ)在session中,在其他JSP頁面中可以通過session再獲得購物車。
// 在JSP頁面中可以直接使用session
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
內(nèi)建的session對(duì)象是javax.servlet.http.HttpSession類的實(shí)例,如果在JavaBean或者Servlet中使用session就需要先從當(dāng)前的request對(duì)象中取得,例如:
// 得到用戶session和購物籃
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
(2)讀寫session中的數(shù)據(jù)向session中存入對(duì)象使用setAttribute方法,通過getAttribute方法讀取對(duì)象。從session返回的值注意要轉(zhuǎn)換成合適的類型,要注意檢查結(jié) 果是否為null。例如下面一段代碼:
HttpSession session = request.getSession();
SomeClass value = (SomeClass)session.getAttribute("someID");
if (value == null) {
value = new SomeClass(...);
session.setAttribute("someID", value);
}
doSomethingWith(value);
(3)廢棄session數(shù)據(jù)調(diào)用removeAttribute廢棄session中的值,即移除與名稱關(guān)聯(lián)的值。
調(diào)用invalidate廢棄整個(gè)session,即廢棄當(dāng)前的session。
如果用戶注銷離開站點(diǎn),注意廢棄與用戶相關(guān)聯(lián)的所有session。
(4)session的生命周期由于沒有辦法知道HTTP客戶端是否不再需要session,因此每個(gè)session都關(guān)聯(lián)一個(gè)時(shí)間期限使它的資源可以被回收。setMaxInactiveInterval(int secondsToLive)
(5)服務(wù)器使用session時(shí),默認(rèn)使用Cookie技術(shù)進(jìn)行會(huì)話追蹤,通常,會(huì)話管理是通過服務(wù)器將 Session ID 作為一個(gè) cookie 存儲(chǔ)在用戶的 Web 瀏覽器中,并用它來唯一標(biāo)識(shí)每個(gè)用戶會(huì)話。如果客戶端不接受Cookie的時(shí)候,服務(wù)器可以利用URL重寫的方式將sessionID作為參數(shù)附在URL后面,來實(shí)現(xiàn)會(huì)話管理。
當(dāng)我們?cè)谶M(jìn)行forward,redirect時(shí),一定要調(diào)用下邊兩個(gè)方法,以保持session一直有效(如果不調(diào)用的話,那么你到了新的頁面時(shí)session就失效了,因?yàn)閟ession ID沒有傳過來)
Servlet中Interface HttpServletResponse 規(guī)定了兩個(gè)方法,response.encodeURL()或response.encodeRedirectURL()方法,這兩個(gè)方法首先判斷Cookies是否被瀏覽器支持;如果支持,則參數(shù)URL被原樣返回,session ID將通過Cookies來維持;否則返回帶有sessionID的URL。Tomcat服務(wù)器實(shí)現(xiàn)了這兩個(gè)方法。
下面是使用encodeURL方法的示例,兩個(gè)文件hello1.jsp和hello2.jsp。
a: hello1.jsp的完整程序代碼如下:
%@ page contentType="text/html;charset=gb2312"%
%String url =response.encodeURL("hello2.jsp");%
a href='%=url%'進(jìn)入到hello2.jsp/a
b: 解釋:
hello1.jsp利用了response對(duì)象內(nèi)的encodeURL方法,將URL做了一個(gè)編碼動(dòng)作。編碼不是這里關(guān)心的重點(diǎn),重點(diǎn)是如果瀏覽器的cookie被禁用的話那么象;jsessionid=A09F3A5583825EE787580106CC62A1E8 這樣字符串就會(huì)被添加到 hello2.jsp 的后面,也就是告訴了下一個(gè)頁面session的信息。
b: 若要使用重定向,例如:
response.sendRedirect("hello2.jsp");也應(yīng)該改為:response.sendRedirect(response.encodeRedirectURL("hello2.jsp"));同時(shí)需要注意的是,將session的ID以URL的編碼方式進(jìn)行時(shí),需將每一頁都編碼,才能保留住session的ID。如果遇到?jīng)]有編碼的URL,則無法進(jìn)行會(huì)話跟蹤。
c: hello2.jsp的完整程序代碼如下:
%@ page contentType="text/html;charset=gb2312"%
% out.println("sessionID is "+session.getId());%
d: 可以看到如果服務(wù)器使用URL重寫,它將會(huì)話信息附加到URL上,如下所示:
;jsessionid=A09F3A5583825EE787580106CC62A1E8
e: 實(shí)質(zhì)上 URL 重寫是通過向 URL 連接添加參數(shù),并把 session ID 作為值包含在連接中,以便應(yīng)用服務(wù)器可以根據(jù)sessionID從cache中的取回session.
TOMCAT服務(wù)器
SESSION實(shí)現(xiàn)會(huì)話跟蹤通常是cookie和url重寫,如果瀏覽器不禁止cookie的話,tomcat優(yōu)先使用cookie實(shí)現(xiàn),否則它將使用URL重寫來支持SESSION.
URL重寫的額外數(shù)據(jù)是服務(wù)器自動(dòng)添加的,那么服務(wù)器是怎么添加的呢?Tomcat在返回Response的時(shí)候,檢查JSP頁面中所有的URL,包括所有的鏈接,和 Form的Action屬性,在這些URL后面加上“;jsessionid=xxxxxx”。添加url后綴的代碼片段如下:
org.apache.coyote.tomcat5.CoyoteResponse類的toEncoded()方法支持URL重寫。
1 StringBuffer sb = new StringBuffer(path);
2 if( sb.length() 0 ) { // jsessionid can't be first.
3 sb.append(";jsessionid=");
4 sb.append(sessionId);
5 }
6 sb.append(anchor);
7 sb.append(query);
8 return (sb.toString());
多敲?。?!多敲?。?!多敲!??!
基本上每一個(gè)初學(xué)者都會(huì)遇到這樣的問題,包括我之前也是一樣,導(dǎo)致的原因就是自己不喜歡動(dòng)手,就算自己有了思路,卻不知道從何下手;因?yàn)樵谀愕哪X海中一直對(duì)這些題目都是存在于數(shù)學(xué)上面的操作,真的要使用代碼去實(shí)現(xiàn)的時(shí)候你腦子就會(huì)一篇空白
一個(gè)代碼寫多了的人,不管你的需求再難,他也能寫出一個(gè)基本的框架出來,也不至于無從下手,因?yàn)榇a寫多了的人都會(huì)總結(jié)出一套規(guī)律,開發(fā)都是這一個(gè)套路
《2020最新Java基礎(chǔ)精講視頻教程和學(xué)習(xí)路線!》
就跟你建房子一樣,基本的框架搭建完畢之后,只需要慢慢砌磚就行了
所以,學(xué)習(xí)Java最注重的就是實(shí)操,大家都知道去一個(gè)公司之后都是動(dòng)手敲代碼,而不是在旁邊指揮,因?yàn)楣静粫?huì)給你這么大的權(quán)力,你也達(dá)不到這樣的級(jí)別,所以公司要的是能夠?qū)懘a的人,你的理論在這里沒有太大的作用
站在岸上學(xué)不會(huì)游泳的道理大家都應(yīng)該知道
Java學(xué)習(xí)路線
第一階段:
學(xué)習(xí)java首先是得安裝配置jdk
下面開始我們愉快且掉頭發(fā)的java之旅
1、入門的基本禮儀:HelloWord
2、Java基礎(chǔ)語法
3、Java條件結(jié)構(gòu)
4、Java循環(huán)結(jié)構(gòu)
第二階段:
數(shù)組:數(shù)組作為java里面的第一個(gè)可以存儲(chǔ)數(shù)據(jù)的容器,也是后面集合的基礎(chǔ)
第三階段:
面向?qū)ο螅喝f物皆可對(duì)象,這也是java的核心思想,編程的時(shí)候也要面向?qū)ο缶幊?,符合Java的編程規(guī)范
JVM:了解Java中的變量、常量、引用在JVM中國的存儲(chǔ)區(qū)域
第四階段:
Java常用類庫:String字符串的應(yīng)用、Math和Date、集合框架、異常處理、反射
第五階段:
IO流:字節(jié)流、字符流、其他流、文件讀寫及編輯、文件上傳下載
第六階段:
多線程與網(wǎng)絡(luò)編程
第七階段:數(shù)據(jù)庫
Mysql數(shù)據(jù)庫:
數(shù)據(jù)庫基礎(chǔ)
數(shù)據(jù)庫的安裝
使用語句建表
使用語句進(jìn)行增、刪、改、查
多表查詢
子查詢
復(fù)合查詢
分頁查詢
分組查詢
數(shù)據(jù)字典
訪問控制
存儲(chǔ)過程
可視化工具的使用
JDBC:
JDBC基礎(chǔ)
ORM
JDBC高級(jí)
第八階段:前端基礎(chǔ)
HTML:
HTML基礎(chǔ)
HTML常用標(biāo)簽
HTML表格
HTML表單
HTML多媒體
網(wǎng)頁整體結(jié)構(gòu)
CSS:
CSS選擇的樣式
CSS文本樣式
CSS背景和列表
CSS盒子模型
Float浮動(dòng)
CSS定位
CSS網(wǎng)頁布局
CSS網(wǎng)頁布局基礎(chǔ)
JS:
JavaScript基礎(chǔ)語法
JavaScript流程控制語句
JavaScript函數(shù)
JavaScript內(nèi)置對(duì)象
JavaScriptDOM基礎(chǔ)
JavaScriptDOM事件
JavaScript實(shí)現(xiàn)輪播效果
JQuery:
Ajax基礎(chǔ)
JQuery選擇器
JQuery屬性操作
JQuery常用函數(shù)
JQuery事件處理
JQuery異步請(qǐng)求
第九階段:Javaweb
JAVAWEB:
JAVAWEB核心基礎(chǔ)
JAVAWEB中jsp及java腳本指令
Jsp中隱式對(duì)象
Servlet核心處理器
Jsp與servlet實(shí)現(xiàn)登錄
JAVAWEB中的session
JAVAWEB的會(huì)話跟蹤
Jsp動(dòng)作應(yīng)用
Jsp的EL表達(dá)式
JSTL標(biāo)簽使用
JSTL循環(huán)迭代
JSTL EL綜合練習(xí)
AOP編程
Filter過濾器應(yīng)用實(shí)例
JAVAWEB文件上傳下載
MVC模型
第十階段:高級(jí)框架
springFramework構(gòu)建javaweb應(yīng)用:
springFramework框架概述
使用注解把類托管給spring
Lod4j
Spring整合JDBC
JDBC Template實(shí)現(xiàn)數(shù)據(jù)操作
SpringMVC應(yīng)用基礎(chǔ)核心
視圖解析器和RequestMapping注解
控制請(qǐng)求方法的參數(shù)設(shè)置
視圖轉(zhuǎn)發(fā)、重定向
Mybatis框架的應(yīng)用:
Mybatis黑心基礎(chǔ)概述
Mybatis全局配置
Mybatis基本查詢映射
Mybatis更新映射和緩存
Mybatis查詢結(jié)果的封裝和高級(jí)映射
Mybatis動(dòng)態(tài)SQL
SPring整合Mybatis
第十一階段:擴(kuò)展內(nèi)容
Junit
設(shè)計(jì)模式
GIT/SVN代碼管理器
Redis
Maven
Springboot
Springcloud
Linux
Shiro
springSecurity
Elasticsearch
Lucene
Vue
Oracle
Spring Data JPA
抄代碼雖然是程序員的日常,但是初學(xué)者非常不建議去抄代碼,抄的代碼只會(huì)讓你越抄越亂,從而使自己的思維就依賴在了百度上,自己一點(diǎn)思維都沒有,那有如何去提升自己呢
代碼一定要有自己的思路,然后再把自己的思路轉(zhuǎn)為代碼實(shí)現(xiàn),這才是學(xué)習(xí)Java的正確方式
原文鏈接:網(wǎng)頁鏈接