WEB学习
?
1.?1櫻花部署環(huán)境圖
?
1.?2櫻花開(kāi)發(fā)環(huán)境部署圖
?
2上下文初始化參數(shù)與Servlet初始化參數(shù)的對(duì)比
首先,這兩個(gè)都叫做初始化參數(shù),只不過(guò)servlet初始化參數(shù)才在DD配置中包含“init”一詞。
上下文初始化參數(shù):
? 在<web-app>元素中,但不在具體的<servlet>元素中。比如:
??? <web-app>
???????? <context-param>
??????????????<param-name>foo</param-name>
??????????????<param-value>bar</param-value>
???????? </context-param>
?????? <!-- other stuff including servletdeclarations-->
???? </web-app>
Servlet初始化參數(shù):
????? 在每個(gè)特定的Servlet的<servlet>元素中,比如:
?? <servlet>
?????????<servlet-name>BeerParamTests</servlet-name>
?????????<servlet-class>TestInitParams</servlet-class>
????????? <init-param>
???????????????<param-name>foo</param-name>
???????????????<param-value>bar</param-value>
???????? </init-param>
?? </servlet>
在Servlet代碼中調(diào)用初始化參數(shù):
上下文初始化參數(shù)調(diào)用: getServletContext().getInitParameter("foo");?? 對(duì)Web應(yīng)用的所有servlet和JSP都可用。
Servlet初始化參數(shù)調(diào)用:getServletConfig().getInitParameter("foo");?? 只對(duì)配置了<init-param>的相應(yīng)servlet可用。
注意:每個(gè)servlet有一個(gè)ServletConfig,每個(gè)Web應(yīng)用有一個(gè)ServletContext。要把初始化參數(shù)認(rèn)為是部署時(shí)常量,可用在運(yùn)行時(shí)得到這些初始化參數(shù),但不能設(shè)置初始化參數(shù),根本沒(méi)有setInitParameter()。如果修改XML來(lái)改變一個(gè)初始化參數(shù)的值,只有當(dāng)Web應(yīng)用重新部署時(shí)Web應(yīng)用其他部分才會(huì)看到,因?yàn)閟ervlet只會(huì)初始化一次,在初始化時(shí)會(huì)為它提供ServletConfig和ServletContext。
?
3.屬性與參數(shù)對(duì)比?? ?
?
區(qū)別
????? 來(lái)源不同:
參數(shù)(parameter)是從客戶端(瀏覽器)中由用戶提供的,若是GET方法是從URL中 提供的,若是POST方法是從請(qǐng)求體(request body)中提供的;
屬性(attribute)是服務(wù)器端的組件(JSP或者Servlet)利用requst.setAttribute()設(shè)置的
????? 操作不同:
參數(shù)(parameter)的值只能讀取不能修改,讀取可以使用request.getParameter()讀取;
屬性(attribute)的值既可以讀取亦可以修改,讀取可以使用request.setAttribute(),設(shè)置可使用request.getAttribute()
????? 數(shù)據(jù)類型不同:??
參數(shù)(parameter)不管前臺(tái)傳來(lái)的值語(yǔ)義是什么,在服務(wù)器獲取時(shí)都以String類型看待,并且客戶端的參數(shù)值只能是簡(jiǎn)單類型的值,不能是復(fù)雜類型,比如一個(gè)對(duì)象。
?? 屬性(attribute)的值可以是任意一個(gè)Object類型
共同點(diǎn)
二者的值都被封裝在request對(duì)象中。
4.簡(jiǎn)述上下文、請(qǐng)求和會(huì)話三種屬性的作用域
context(上下文)? 不是線程安全的
??? 可訪問(wèn)性:web的所有部分,包括servlet,jsp,servletcontextlistener,servletcontextattributelistener。
??? 作用域:servletcontext的生命期,這意味著所部署的應(yīng)用的生命期。如果服務(wù)器或者應(yīng)用關(guān)閉,上下文則撤銷,其屬性也相應(yīng)撤銷。
??? 適用于:你希望整個(gè)應(yīng)用共享的資源,包括數(shù)據(jù)庫(kù)連接,jndi查找名。
HttpSession(會(huì)話)? 不是線程安全的
???? 可訪問(wèn)性:訪問(wèn)這個(gè)會(huì)話的所有servlet或者jsp。
???? 作用域:會(huì)話的生命期。會(huì)話可以通過(guò)編程撤銷,也可能是因?yàn)槌瑫r(shí)被撤銷。
???? 適用于:于客戶會(huì)話有關(guān)的資源和數(shù)據(jù),而不是只與一個(gè)請(qǐng)求相關(guān)的資源。他要與客戶完成一個(gè)持續(xù)的會(huì)話。購(gòu)物車就是一個(gè)典型的例子。
Request(請(qǐng)求)? 線程安全的
????? 可訪問(wèn)性:應(yīng)用能直接訪問(wèn)到請(qǐng)求的所有部分。接收所有請(qǐng)求的servlet和jsp,還有于請(qǐng)求相關(guān)的監(jiān)聽(tīng)者。
????? 作用域:持續(xù)到servlet的service方法結(jié)束。線程處理這個(gè)請(qǐng)求的生命期。
???? 適用于:將模型數(shù)據(jù)從控制器傳遞到視圖,或者傳遞特定用戶請(qǐng)求的任何數(shù)據(jù)。
5.tomcat會(huì)話機(jī)制
(1)SessionId解析過(guò)程:在請(qǐng)求過(guò)程中首先要解析請(qǐng)求中的sessionId信息,然后將sessionId存儲(chǔ)到request的參數(shù)列表中。然后再?gòu)?request獲取session的時(shí)候,如果存在sessionId,那么就根據(jù)Id從session池中獲取session,如果sessionId不 存在或者session失效,那么則新建session并且將session信息放入session池,供下次使用
(2) Servlet獲取session的流程:appServlet是自己定義的一個(gè)Servlet,在通過(guò)Reqest獲取session的時(shí)候,其實(shí)調(diào)用的這個(gè) HttpServletRequest(是一個(gè)接口)其實(shí)是RequestFacade(封裝了 org.apache.catalina.connector.Request的一個(gè)門面),然后RequestFacade會(huì)調(diào)用真實(shí)的Request 的getSession方法。Request具體的邏輯是調(diào)用Context容器的getManger方法獲取Session管理器,然后如果SessionId如果已經(jīng)被解析出來(lái)了,那么則會(huì)調(diào)用findSession方法從session對(duì)象池中獲取對(duì)應(yīng)的 session,反之如果sessionId不存在,則需要重新創(chuàng)建一個(gè)Session,并放入session對(duì)象池中。
(3) Session管理器定義:Session管理器組件負(fù)責(zé)管理Session對(duì)象,例如,創(chuàng)建和銷毀Session對(duì)象。
Session并不是在客戶端第一次訪問(wèn)就會(huì)在服務(wù)器端生成,而是在服務(wù)器端使用request調(diào)用getSession方法才生成的。
在默認(rèn)情況下,jsp頁(yè)面會(huì)調(diào)用request.getSession(),編譯成servlet后會(huì)默認(rèn)調(diào)用request.getSession()。所以只要訪問(wèn)jsp頁(yè)面,一般都會(huì)在服務(wù)器端創(chuàng)建好session。
6.比較include指令和<jsp:include>標(biāo)準(zhǔn)動(dòng)作有何不同?
?
(1)? include指令通過(guò)file屬性指定被包含的文件,放在頁(yè)面的頂部,file屬性不支持任何的表達(dá)式;<jsp:include>是通過(guò)page屬性來(lái)指定被包含的文件的,page屬性支持jsp表達(dá)式。
(2)? 使用include指令時(shí),被包含的文件內(nèi)容會(huì)原封不動(dòng)的插入到頁(yè)面中來(lái),然后jsp編譯器將合成后的文件最終編譯成一個(gè).java的文件;使用<jsp:include>指令則是程序請(qǐng)求轉(zhuǎn)發(fā)到被包含的文件中來(lái),并將執(zhí)行結(jié)果輸出到瀏覽器中,然后返回包含也繼續(xù)執(zhí)行后面的代碼,這里jsp編譯器執(zhí)行的是兩個(gè).java的文件。可以認(rèn)為使用<jsp:include>是動(dòng)態(tài)的插入到j(luò)sp文件之中。
(3)? 在使用include指令包含文件時(shí),因?yàn)樽詈蟛捎胘sp編譯器是編譯成的一個(gè).java的文件,因此在包含的文件中不能有何包含文件重名的變量,方法等等。而<jsp:include>則沒(méi)有要求,正常情況下使用<jsp:include>比較多點(diǎn)。
(4)? ?include指令和jsp:include動(dòng)作之間的根本性的不同在于它們被調(diào)用的時(shí)間。include指令在頁(yè)面轉(zhuǎn)換期間被激活,而jsp:include動(dòng)作在請(qǐng)求期間被激活。前者執(zhí)行時(shí)因?yàn)槭窍劝缶幾g,不會(huì)檢查所含文件的變化,適合包含靜態(tài)頁(yè)面。后者是先編譯后包含,適合包含動(dòng)態(tài)頁(yè)面,而且可以帶參數(shù)。
7.表達(dá)式語(yǔ)言(EL) 點(diǎn)號(hào)(.) 與 中括號(hào)([]) 操作符的異同點(diǎn)有哪些?
EL提供(.)和([])兩種運(yùn)算符來(lái)存取數(shù)據(jù),即使用點(diǎn)運(yùn)算符(.)和方括號(hào)運(yùn)算符([])。
點(diǎn)運(yùn)算符和方括號(hào)運(yùn)算符可以實(shí)現(xiàn)某種程度的互換,如${student.name}等價(jià)于${student [“name”]}。
當(dāng)要存取的屬性名稱中包含一些特殊字符,如.或?等并非字母或數(shù)字的符號(hào)時(shí),就一定要使用[]。例如${student.name }應(yīng)當(dāng)改為${student[“name”] }。
如果要?jiǎng)討B(tài)取值,就可以用[]來(lái)做,而.無(wú)法做到動(dòng)態(tài)取值。例如${sessionScope.student[data]}中data是一個(gè)變量。
在訪問(wèn)數(shù)組或List對(duì)象中的元素時(shí),只能使用方括號(hào)運(yùn)算符。例如,products是一個(gè)String[]類型的對(duì)象,則只能使用${products[0]}來(lái)訪問(wèn)該數(shù)組對(duì)象的第一個(gè)元素
8.get post
?
post參數(shù)在消息體內(nèi)
9. servlet生命周期
?
10.MVC交互
11.重定向與請(qǐng)求分派:
重定向
response.sendRedirect(java.lang.Stringlocation);
原理:
重定向與客戶端交互,服務(wù)器將傳遞進(jìn)來(lái)的location直接相應(yīng)到客戶端,會(huì)產(chǎn)生302碼,瀏覽器自動(dòng)訪問(wèn)新的location。
特點(diǎn):
兩次請(qǐng)求和相應(yīng)
URL地址發(fā)生了變化
數(shù)據(jù)會(huì)丟失,產(chǎn)生了兩個(gè)不同的HttpServletRequest對(duì)象
地址問(wèn)題:
重定向有絕對(duì)地址和相對(duì)地址之分
絕對(duì)地址不加“/”
response.sendRedirect("second.do");
相對(duì)地址加“/”
response.sendRedirect(request.getContextPath()+"/second.do);
請(qǐng)求分派
RequestDispatcherrd=request.getRequestDispatcher("second.do");
rd.forward(request,response);
原理:
發(fā)生在服務(wù)器端,一個(gè)servlet對(duì)象調(diào)用另外一個(gè)servlet對(duì)象,會(huì)將request和response傳遞過(guò)去;
特點(diǎn):
只有一次請(qǐng)求和響應(yīng)
URL地址不會(huì)改變
數(shù)據(jù)不會(huì)丟失
12.cookie和會(huì)話狀態(tài)的工作原理
工作流程:
1. servlet創(chuàng)建cookie,保存少量數(shù)據(jù),發(fā)送瀏覽器。
2. 瀏覽器獲得服務(wù)器發(fā)送的cookie數(shù)據(jù),將自動(dòng)的保存到瀏覽器端。
3. 下次訪問(wèn)時(shí),瀏覽器將自動(dòng)攜帶cookie數(shù)據(jù)發(fā)送給服務(wù)器。
cookie操作
1.創(chuàng)建cookie:new Cookie(name,value)
2.發(fā)送cookie到瀏覽器:HttpServletResponse.addCookie(Cookie)
3.servlet接收cookie:HttpServletRequest.getCookies()?瀏覽器發(fā)送的所有cookie
?
?
13.會(huì)話超時(shí),三大里程碑。
?
?
?
?
13.2會(huì)話監(jiān)聽(tīng)
?
14. JSP標(biāo)準(zhǔn)動(dòng)作
<jsp:useBean>:定義jsp頁(yè)面使用一個(gè)JavaBean實(shí)例;
<jsp:setProperty>:設(shè)置一個(gè)JavaBean中的屬性值;
<jsp:getProperty>:從JavaBean中獲取一個(gè)屬性值;
<jsp:include>:在JSP頁(yè)面包含一個(gè)外在文件;
<jsp:forward>:把到達(dá)的請(qǐng)求轉(zhuǎn)發(fā)另一個(gè)頁(yè)面進(jìn)行處理;
<jsp:param>:用于傳遞參數(shù)值;
<jsp:plugin>:用于指定在客戶瀏覽器中插入插件的屬性;
<jsp:params>:用于向HTML頁(yè)面的插件傳遞參數(shù)值;
<jsp:fallback>:指定如何處理客戶端不支持插件運(yùn)行的情況;
15. pageContext對(duì)象的用法詳述
?
16.EL隱式對(duì)象
?
17.JSP隱式對(duì)象
?
18.禁用腳本,EL
?
?
?
19.
?
20.部署
?
21.容器處理請(qǐng)求
1. 用戶點(diǎn)擊一個(gè)連接,其URL指向了一個(gè)servlet
2. 容器分析出這個(gè)請(qǐng)求指向一個(gè)servlet,所以容器創(chuàng)建兩個(gè)對(duì)象: ? HttpServletRequest ? HttpServletResponse
3. 容器根據(jù)請(qǐng)求中的URL查找到正確的servlet,為這個(gè) 請(qǐng)求創(chuàng)建或分配一個(gè)線程,并調(diào)用servlet的service方 法
4. service()方法視請(qǐng)求類型調(diào)用doGet()或doPost()方法。 假設(shè)客戶請(qǐng)求是HTTP GET請(qǐng)求,則service()方法會(huì)調(diào) 用servlet的doGet()方法,并傳遞請(qǐng)求和響應(yīng)對(duì)象作為 參數(shù)。
5. Servlet將響應(yīng)寫(xiě)至響應(yīng)對(duì)象。 § 此時(shí)容器還有這個(gè)響應(yīng)對(duì)象的一個(gè)引用。
6. 響應(yīng)通過(guò)容器傳回到客戶。 § service方法結(jié)束,線程被撤銷或返回給容器管理的 線程池。請(qǐng)求和響應(yīng)對(duì)象可被垃圾回收了
?
總結(jié)
- 上一篇: 刘奇:当今一切都要更实时、更弹性、更简单
- 下一篇: servlet到底是什么