Session是存儲在服務(wù)器端,Cookie是存儲在客戶端的:
Session的安全性要比Cookie高;
Session內(nèi)容不斷增加會造成服務(wù)器負(fù)擔(dān);
重要的信息存儲在Session中,次要東西存儲在Cookie里。
Session創(chuàng)建時(shí)機(jī):調(diào)用getSession()方式時(shí)創(chuàng)建。
Session獲?。和ㄟ^存放在會話Cookie里的Sessionid獲取的。
Session銷毀時(shí)機(jī):
瀏覽器關(guān)閉;
Session過期(默認(rèn)時(shí)間30分鐘);
調(diào)用invalidate()方法銷毀。
Cookie分為兩大類,分別為會話Cookie和持久化Cookie。
會話Cookie:存放在客戶端瀏覽器內(nèi)存中,生命周期和瀏覽器是一致的;
持久化Cookie存放在客戶端磁盤中,持久化Cookie的生命周期在設(shè)置Cookie時(shí)候設(shè)置。
Cookie容量限制:單個Cookie保存數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點(diǎn)最多保存20個Cookie。
存儲內(nèi)容:Session可以存儲任意類型的數(shù)據(jù),而Cookie只能存儲字符串。
Servlet生命周期可以分成四個階段:加載和實(shí)例化、初始化、服務(wù)、銷毀。
當(dāng)客戶第一次請求時(shí),判斷是否存在Servlet對象,若不存在,Web容器創(chuàng)建對象;
調(diào)用init()方法對其初始化,初始化方法在整個Servlet生命周期中只調(diào)用一次;
Web容器調(diào)用Servlet對象的service()方法來處理請求。
Web容器關(guān)閉或者Servlet對象從容器中被刪除時(shí),自動調(diào)用destroy()方法。
Web Service是一個能通過Web進(jìn)行調(diào)用的API,調(diào)用Web Service的應(yīng)用程序叫做客戶端,而Web Service應(yīng)用程序叫做服務(wù)端。
深層次看,Web Service是建立可互操作的分布式應(yīng)用程序的新平臺,是遠(yuǎn)程服務(wù)調(diào)用的一套標(biāo)準(zhǔn);定義了應(yīng)用程序如何在Web上實(shí)現(xiàn)互操作,可以用任何語言、在任何平臺上編寫Web Service,只要可以通過Web Service標(biāo)準(zhǔn)對這些服務(wù)進(jìn)行查詢和訪問即可。
JSP是Servlet技術(shù)的擴(kuò)展,本質(zhì)上就是Servlet的簡易方式,JSP編譯后的類是Servlet。
Servlet和JSP的不同點(diǎn):
Servlet是僅包含Java代碼;
JSP是包括Java代碼和HTML代碼的擴(kuò)展名為“.jsp”的文件;
JSP側(cè)重于視圖,Servlet主要用于控制邏輯;
在MVC設(shè)計(jì)模式中,JSP位于的視圖層,而Servlet位于控制層。
forward即是請求轉(zhuǎn)發(fā):
地址欄顯示不變;
發(fā)生在服務(wù)器端,是服務(wù)器內(nèi)部的操作;
客戶端向服務(wù)器端發(fā)出一次request;
轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù);
可以跳轉(zhuǎn)到Web應(yīng)用程序內(nèi)的任何地方,如:WEB-INF目錄;
運(yùn)行效率比較高;
使用方法:request.getRequestDispatcher().forward()。
Redirect即是重定向:
地址欄顯示變化;
發(fā)生在客戶端,是服務(wù)器通知客戶端,讓客戶端重新發(fā)起請求;
客戶端向服務(wù)器端發(fā)出兩次request;
不能共享request里面的數(shù)據(jù);
不可以跳轉(zhuǎn)到WEB-INF安全目錄下,但是可以跳轉(zhuǎn)到Web應(yīng)用程序外部網(wǎng)站;
運(yùn)行效率比較低;
使用方法:response.sendRedirect()。
getParameter()方法是用來接收表單提交過來的參數(shù);
setAttribute()與getAttribute()僅在Web容器內(nèi)部流轉(zhuǎn),僅僅是請求處理階段;
getAttribute()方法返回的是對象,getParameter()方法返回的是字符串;
getAttribute()與setAttribute()一般一起使用,必須setAttribute()設(shè)置之后,才能夠通過getAttribute()來獲取值,傳遞的是Object類型的數(shù)據(jù),必須在同一個request對象中使用才有效。
格式不同:
靜態(tài)包含:<%@ include file="文件" %>;
動態(tài)包含:<jsp : include page = "文件" />。
處理時(shí)機(jī)不同:
靜態(tài)包含是先將幾個文件合并,然后再被編譯,缺點(diǎn)就是如果含有相同的標(biāo)簽,會出錯;
動態(tài)包含是頁面被請求時(shí)編譯,將結(jié)果放在一個頁面。
生成的文件不同:
靜態(tài)包含會生成一個包含頁面名字的servlet的class文件;
動態(tài)包含會各自生成對應(yīng)的servlet的class文件。
傳遞參數(shù)不同:
動態(tài)包含能夠傳遞參數(shù);
而靜態(tài)包含不能。
MVC是Model-View-Controller的簡寫;
Model代表的是應(yīng)用程序的業(yè)務(wù)邏輯(通過 JavaBean,Mybatis等框架實(shí)現(xiàn));
View代表的是應(yīng)用程序的表示層,即:Jsp頁面;
Controller代表的是應(yīng)用程序的處理過程控制(一般是Servlet);
這種設(shè)計(jì)模型把應(yīng)用邏輯,處理過程、顯示邏輯分成不同的組件實(shí)現(xiàn),這些組件可以進(jìn)行交互和重用。
JSP有9個內(nèi)置對象:
request:封裝客戶端的請求,其中包含來自GET或POST請求的參數(shù);
response:封裝服務(wù)器對客戶端的響應(yīng);
pageContext:通過該對象可以獲取其他對象;
session:封裝用戶會話的對象;
servletContext:封裝服務(wù)器運(yùn)行環(huán)境的對象;
out:輸出服務(wù)器響應(yīng)的輸出流對象;
config:Web應(yīng)用的配置對象;
page:JSP頁面本身(相當(dāng)于Java程序中的this);
exception:封裝頁面拋出異常的對象。
Get是向服務(wù)器索取數(shù)據(jù)的一種請求,而Post是向服務(wù)器提交數(shù)據(jù)的一種請求;
Get 請求的參數(shù)會跟在URL后進(jìn)行傳遞,Post請求將數(shù)據(jù)放置在HTML Header內(nèi)提交;
GET請求數(shù)據(jù)傳遞方式:請求的數(shù)據(jù)會附在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,%XX中的XX為該符號以16進(jìn)制表示的ASCII,如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密;
Post請求數(shù)據(jù)傳遞方式:以http消息的實(shí)際內(nèi)容發(fā)送給web服務(wù)器。
Get請求傳輸?shù)臄?shù)據(jù)有大小限制,因?yàn)镚ET是通過URL提交數(shù)據(jù),那么GET可提交的數(shù)據(jù)量就跟URL的長度有直接關(guān)系了,不同的瀏覽器對URL的長度的限制是不同的;Post請求沒有限制提交的數(shù)據(jù)。
GET請求的數(shù)據(jù)會被瀏覽器緩存起來,數(shù)據(jù)將明文出現(xiàn)在URL上,不安全;Post數(shù)據(jù)不會出現(xiàn)在URL上,比Get安全,當(dāng)數(shù)據(jù)是不敏感的數(shù)據(jù),則用Get,對于敏感數(shù)據(jù)的數(shù)據(jù),則用Post。
啟動的順序?yàn)椋篖istener -> Filter -> Servlet;
執(zhí)行的順序不會因?yàn)槿齻€標(biāo)簽在配置文件中的先后順序而改變。
監(jiān)聽器類型:
Servlet2.4規(guī)范定義,按監(jiān)聽的對象劃分:
用于監(jiān)聽?wèi)?yīng)用程序環(huán)境對象(ServletContext)的事件監(jiān)聽器
用于監(jiān)聽用戶會話對象(HttpSession)的事件監(jiān)聽器
用于監(jiān)聽請求消息對象(ServletRequest)的事件監(jiān)聽器
按監(jiān)聽的事件類型劃分:
用于監(jiān)聽域?qū)ο笞陨淼膭?chuàng)建和銷毀的事件監(jiān)聽器;
用于監(jiān)聽域?qū)ο笾械膶傩缘脑黾雍蛣h除的事件監(jiān)聽器;
用于監(jiān)聽綁定到HttpSession域中的某個對象的狀態(tài)的事件監(jiān)聽器;
在一個Web應(yīng)用程序的整個運(yùn)行周期內(nèi), Web容器會創(chuàng)建和銷毀三個重要的對象,ServletContext,HttpSession,ServletRequest。
在一個Web應(yīng)用中,可以開發(fā)編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。
Web服務(wù)器根據(jù)Filter在web.xml文件中的注冊順序,決定先調(diào)用哪個Filter,當(dāng)?shù)谝粋€Filter的doFilter()方法被調(diào)用時(shí),Web服務(wù)器會創(chuàng)建一個代表Filter鏈的FilterChain對象傳遞給該方法。
在doFilter()方法中,開發(fā)人員如果調(diào)用FilterChain對象的doFilter ()方法,web服務(wù)器會檢查FilterChain對象中是否還有filter,如果有,則調(diào)用下一個filter,如果沒有,則調(diào)用目標(biāo)資源。
Filter接口中有一個doFilter()方法,Web服務(wù)器每次在調(diào)用Web資源的service()方法之前,都會先調(diào)用filter的doFilter()方法,因此,在該方法內(nèi)編寫代碼可達(dá)到如下目的:
調(diào)用目標(biāo)資源之前,執(zhí)行一段代碼;
判斷是否調(diào)用目標(biāo)資源;
調(diào)用目標(biāo)資源之后,執(zhí)行一段代碼;
Web服務(wù)器在調(diào)用doFilter()方法時(shí),會傳遞一個filterChain對象,filterChain對象是filter接口中最重要的一個對象,它也提供了一個doFilter()方法,開發(fā)人員可以根據(jù)需求決定是否調(diào)用此方法,調(diào)用該方法,則服務(wù)器就會調(diào)用目標(biāo)的service()方法,即Web資源就會被訪問,否則Web資源不會被訪問。
Session與Session域中的對象一起從內(nèi)存中被序列化到硬盤上的過程我們稱為鈍化,服務(wù)器關(guān)閉時(shí)會發(fā)生鈍化。
Session與Session域中的對象一起從硬盤上反序列化到內(nèi)存中的過程我們稱為活化,服務(wù)器再次開啟時(shí)會發(fā)生活化。
保證Session域中的對象能和Session一起被鈍化和活化,必須保證對象對應(yīng)的類實(shí)現(xiàn)Serializable接口。
在服務(wù)器端創(chuàng)建Session對象,該對象有一個全球唯一的ID。
在創(chuàng)建Session對象的同時(shí)創(chuàng)建一個特殊的Cookie對象,該Cookie對象的名字是JSESSIONID,該Cookie 對象的value值是Session對象的那個全球唯一的ID,并且會將這個特殊的Cookie對象攜帶發(fā)送給瀏覽器,以后瀏覽器再發(fā)送請求就會攜帶這個特殊的Cookie對象,服務(wù)器根據(jù)這個特殊的Cookie對象的value 值在服務(wù)器中尋找對應(yīng)的Session對象,以此來區(qū)分不同的用戶。
Cookie是明文的,不安全;
Cookie對象的數(shù)量和大小有限制(不同的瀏覽器不同);
Cookie對象攜帶過多費(fèi)流量;
Cookie對象中的Value值只能是字符串,不能放對象。
原因:服務(wù)器端默認(rèn)使用ISO-8859-1字符集,而中文瀏覽器默認(rèn)使用GBK字符集。
解決方案:方法1,設(shè)置響應(yīng)頭,對應(yīng)代碼:response.setHeader("Content-Type","text/html;charset=utf-8");
方法2,設(shè)置響應(yīng)的內(nèi)容類型,對應(yīng)代碼:response.setContentType("text/html;charset=utf-8");
通過以上兩種方式可以在響應(yīng)頭中告訴瀏覽器響應(yīng)體的字符集是UTF-8;但需要注意的是,兩種方法一定要在response.getWriter()方法之前設(shè)置。
原因:因?yàn)榉?wù)器收到數(shù)據(jù)后,默認(rèn)以ISO-8859-1字符集進(jìn)行轉(zhuǎn)換,與請求傳遞數(shù)據(jù)的字符集不一致。
解決方案:在獲取請求參數(shù)之前調(diào)用request.setCharacterEncoding("utf-8"); 通知服務(wù)器端使用UTF8字符集進(jìn)行轉(zhuǎn)換。
原因:請求攜帶的數(shù)據(jù)字符集與服務(wù)器端的默認(rèn)字符集ISO-8859-1不一致。
解決方案:
第一種方式:
使用URLEncoder和URLDecoder兩個類來實(shí)現(xiàn)編解碼,實(shí)現(xiàn)iso-8895-1轉(zhuǎn)換到UTF-8字符集;
第二種方式,使用String類的方法實(shí)現(xiàn)字符集轉(zhuǎn)換:
String str = new String (target.getBytes(“iso-8859-1”), ”utf-8” );
第三種方式,更改Tomcat的server.xml 配置文件實(shí)現(xiàn)字符集轉(zhuǎn)換:
GET請求是URL地址欄中傳遞請求參數(shù)的,它會被Tomcat服務(wù)器自動轉(zhuǎn)換字符集,而Tomcat服務(wù)器默認(rèn)的字符集是ISO-8859-1,所以我們需要修改Tomcat服務(wù)器的字符集為UTF-8。
容器啟動時(shí),讀取在/webapps/WEB-INF/目錄下的web.xml文件,對其進(jìn)行解析,并讀取Servlet注冊信息。
然后,將每個應(yīng)用中注冊的Servlet類都進(jìn)行加載,并通過反射的方式實(shí)例化。
Servlet注冊時(shí)配置<load-on-startup></load-on-startup>,如果為正數(shù),則在啟動容器時(shí)實(shí)例化,如果不寫或?yàn)樨?fù)數(shù),則第一次請求實(shí)例化。
Servlet是使用Java Servlet應(yīng)用程序接口(API)及相關(guān)類和方法的Java程序。所有的Servlet都必須要實(shí)現(xiàn)的核心接口是javax.servlet.servlet。每一個Servlet都必須要直接或者間接實(shí)現(xiàn)這個接口,或者繼承javax.servlet.GenericServlet或 javax.servlet.HTTPServlet。
Servlet主要用于處理客戶端傳來的HTTP請求,并返回一個響應(yīng)。
獲取請求參數(shù),對應(yīng)方法:getParameter();
獲取當(dāng)前Web應(yīng)用的虛擬路徑,對應(yīng)方法: getContextPath();
獲取當(dāng)前Web應(yīng)用的上下文對象ServletContext,對應(yīng)方法:getServletContext();
請求轉(zhuǎn)發(fā),對應(yīng)方法:getRequestDispatcher(路徑).forward(request,response);
儲存數(shù)據(jù),request還是一個域?qū)ο蟆?/p>
針對于重復(fù)提交的整體解決方案:
用redirect(重定向)來解決重復(fù)提交的問題;
點(diǎn)擊一次按鈕之后,按鈕失效;
Loading原理:在點(diǎn)擊提交時(shí),生成Loading樣式,在提交完成之后隱藏該樣式;
自定義重復(fù)提交過濾器。
Jsp中的四種作用域包括page、request、session和application,具體來說:
page代表與一個頁面相關(guān)的對象和屬性,對應(yīng)的對象是:pageContext。
request代表Web客戶機(jī)發(fā)出的一個請求相關(guān)的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件;需要在頁面顯示的臨時(shí)數(shù)據(jù)可以置于此作用域,對應(yīng)的對象是:request。
session代表某個用戶與服務(wù)器建立的一次會話相關(guān)的對象和屬性。跟某個用戶相關(guān)的數(shù)據(jù)應(yīng)該放在用戶自己的session中,對應(yīng)的對象是:session。
application代表與整個Web應(yīng)用程序相關(guān)的對象和屬性,它實(shí)質(zhì)上是跨越整個Web應(yīng)用程序,包括多個頁面、請求和會話的一個全局作用域,對應(yīng)的對象是:servletContext。
第一步,在JSP頁面添加標(biāo)簽庫:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
第二步,進(jìn)行格式化:<fmt:formatDate pattern="yyyy-MM-dd" value="${t.time }"/>
Ajax是異步JavaScript和xml,用于在web頁面中實(shí)現(xiàn)異步數(shù)據(jù)交互。
優(yōu)點(diǎn):可以在頁面不重復(fù)加載的情況下加載局部內(nèi)容,降低數(shù)據(jù)傳輸量。
Json是一種輕量級的數(shù)據(jù)交互格式。
優(yōu)點(diǎn):輕量級,易于閱讀和編寫,便于解析。
同步:提交請求->等待服務(wù)器處理->處理完畢返回,這個期間客戶端瀏覽器不能干任何事。
異步:請求通過事件觸發(fā)->服務(wù)器處理(這時(shí)瀏覽器仍然可以作其他事情)->處理完畢。
工作原理:
客戶端通過Javascript提交Ajax請求。
Ajax引擎(XMLHttpRequest對象,包含在瀏覽器中)服務(wù)器發(fā)送Http請求。
服務(wù)器端處理請求后返回相應(yīng)(XML/JSON/HTML)格式數(shù)據(jù)。
Ajax引擎解析數(shù)據(jù)后,通過DOM+CSS修改頁面元素、改變樣式,實(shí)現(xiàn)局部刷新。
實(shí)現(xiàn)步驟:
創(chuàng)建XMLHttpRequest對象。
創(chuàng)建請求,并發(fā)送請求。
處理請求回調(diào)。
示例代碼:
function doAjax() {
var provinceName=document.getElementById("provinceName").value;
var xhr;
try {
// Firefox, Opera 8.0+, Safari
xhr = new XMLHttpRequest();
} catch (e) {
try {
// Internet Explorer
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
//使用post方式異步請求
xhr.open("post", "Test/IsExistsByProvinceName?t="+new Date().getTime(), true);
//設(shè)置回調(diào)函數(shù)
xhr.onreadystatechange = function(){
//如果XMLHttpRequest對象讀取響應(yīng)結(jié)束
if (xhr.readyState == 4&&xhr.status == 200) {
if(xhr.responseText=="true")
document.getElementById("provinceName_info").innerHTML="該省份已經(jīng)存在";
else
document.getElementById("provinceName_info").innerHTML="";
}
};
//如果以post方式請求,必須要添加
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//發(fā)送請求
xhr.send("provinceName="+provinceName);
}
創(chuàng)建Http連接。
初始化方法請求。
設(shè)置HTTP請求頭。
發(fā)送請求。
讀取請求。
調(diào)用方法。
初始化方法響應(yīng)。
設(shè)置HTTP響應(yīng)頭。
發(fā)送響應(yīng)。
關(guān)閉連接。
硬件環(huán)境不同:
C/S一般建立在專用的網(wǎng)絡(luò)上,小范圍里的網(wǎng)絡(luò)環(huán)境,局域網(wǎng)之間再通過專門服務(wù)器提供連接和數(shù)據(jù)交換服務(wù)。
B/S建立在廣域網(wǎng)之上的,不必是專門的網(wǎng)絡(luò)硬件環(huán)境,信息自己管理。比 C/S 更強(qiáng)的適應(yīng)范圍,一般只要有操作系統(tǒng)和瀏覽器就行。
安全要求不同:
C/S一般面向相對固定的用戶群,對信息安全的控制能力很強(qiáng),一般高度機(jī)密的信息系統(tǒng)采用C/S結(jié)構(gòu)適宜。
B/S建立在廣域網(wǎng)之上,對安全的控制能力相對弱,可能面向不可知的用戶。
程序架構(gòu)不同:
C/S程序可以更加注重流程,可以對權(quán)限多層次校驗(yàn),對系統(tǒng)運(yùn)行速度可以較少考慮。
B/S對安全以及訪問速度的多重的考慮,建立在需要更加優(yōu)化的基礎(chǔ)之上。比C/S有更高的要求,B/S結(jié)構(gòu)的程序架構(gòu)是發(fā)展的趨勢。
軟件重用不同:
C/S程序的重用性不如B/S的重用性好。
B/S程序構(gòu)建相對獨(dú)立的功能,能夠相對較好的重用。
系統(tǒng)維護(hù)不同:
C/S程序必須整體考察,處理出現(xiàn)的問題以及系統(tǒng)升級都比較難,有可能是再做一個全新的系統(tǒng);
B/S程序方便個別組件的更換,實(shí)現(xiàn)系統(tǒng)的無縫升級、系統(tǒng)維護(hù)開銷減比較小,客戶端無需升級,只針對服務(wù)器端維護(hù)即可。
處理問題不同:
C/S程序主要處理用戶面相對固定、并且在相同區(qū)域、安全要求高、與操作系統(tǒng)相關(guān)的情況。
B/S建立在廣域網(wǎng)上、面向不同的用戶群、分散地域,與操作系統(tǒng)平臺關(guān)系最小。
用戶接口不同:
C/S多是建立的Window平臺上,開發(fā)難度比較大,對程序員普遍要求較高;
B/S建立在瀏覽器上,開發(fā)難度相對較低,開發(fā)成本相對較低。
信息流不同:
C/S程序一般是典型的中央集權(quán)的機(jī)械式處理,交互性相對低;
B/S程序信息流向可變化,更像交易中心。