1. ??? HTML 是靜態(tài)的, JSP 是動(dòng)態(tài)的,交互式的,而且可由用戶定制。
?
2. ??? 服務(wù)器: 可能是物理主機(jī)(硬件),也可能是 Web 服務(wù)器應(yīng)用(軟件)。
客戶: 指人類(lèi)用戶,或?yàn)g覽器應(yīng)用。
Web 客戶允許用戶請(qǐng)求服務(wù)器上的某個(gè)資源,并且向用戶顯示請(qǐng)求結(jié)果。
?
3. ??? 服務(wù)器和客戶的通信
服務(wù)器和客戶之間對(duì)話的共同的語(yǔ)言是 HTTP 。
服務(wù)器使用 HTTP 向客戶發(fā)送信息。
4. ??? HTTP
請(qǐng)求: HTTP 方法( Get 、 Post ),要訪問(wèn)的頁(yè)面,表單參數(shù)。
響應(yīng):狀態(tài)碼,內(nèi)容類(lèi)型(文本、圖片、 HTML 等),內(nèi)容(具體的 HTML 、圖片等)。
?
5. ??? HTTP 請(qǐng)求: Get 請(qǐng)求和 Post 請(qǐng)求
Get 請(qǐng)求: 資源的路徑 URL 以及所有參數(shù)都會(huì)包括在 ” 請(qǐng)求行 ” 中。
??? 請(qǐng)求行: ? GET /select/selectBeer.jsp?color=dark&taste=malty HTTP/1.1
??? 請(qǐng)求首部: Host: www.wickedlysmart.com
?????????? ? User-Agent: Mozilla/5.0 ……
?????????? ? Accept: text/html , application/xml , application./xhtml+xml ,
text/html;q=0.9
?????????? ? Accept-Language: en-us , en;q=0.5
?????????? ? Accept-Encoding: gizp , deflate
??????? ? ? ?? Accept-Charset: ISO-8859-1 , utf;q=0.7 , *;q=0.7
? ????????? ? Keep-Alive:300
?????????? ? Connection: keep-alive
??? GET 請(qǐng)求,沒(méi)有體,參數(shù)只能放在請(qǐng)求行中,并且會(huì)顯示在瀏覽器的輸入地址中,不夠安全。
POST 請(qǐng)求: 又稱(chēng)為“消息體”或“有效負(fù)載”,放在消息體中,長(zhǎng)度不受限制。
??? 請(qǐng)求行: POST /advisor/selectBeer.do HTTP/1.1
? ?? 請(qǐng)求首部:同上
? ?? 消息體:(空行) color=dark & taste=malty
??? 簡(jiǎn)單的超鏈接默認(rèn)是 GET 方法,如: <a href=”http://www.baidu.com”>link</a>
??? Form 表單默認(rèn)也是 GET 方法。
??? GET 、 HEAD 、 PUT 是冪等的 ( 注: GET 和 doGet() 不同, GET 方法是 HTTP 的, doGet() 是 Servlet 的 ) ; POST 不是冪等的。
?
6. ??? HTTP 響應(yīng)
包括響應(yīng)首部和體
首部告訴瀏覽器使用的協(xié)議,請(qǐng)求是否成功,以及體中放入內(nèi)容是什么類(lèi)型
??? HTTP/1.1 200 OK
??? Set-Cookie: jsessionID=adfiifeeni23499v99wernnwerr; Pat=/testEL
??? Content-Type: text/html (內(nèi)容類(lèi)型響應(yīng)首部的值稱(chēng)為 MIME 類(lèi)型, MIME 類(lèi)型告訴瀏覽器要接受的數(shù)據(jù)是什么類(lèi)型,其值與 HTTP 請(qǐng)求首部中的 Accept 所列的值相關(guān))
??? Content-Length:397
??? Date: Wed , 19 Nov 2003 03:25:40 GMT
??? Server: Apache-Coyote/1.1
??? Connection: close
體中包含了讓瀏覽器顯示的具體內(nèi)容:
??? (空行)
??? ? <html> …… </html>
?
7. ??? URL(Uniform Resource Locators)
http://www.smart.com:80/beeradvice/select/beer1.html
協(xié)議 ? ????? 服務(wù)器 ???? 端口 ?? ?????? 路徑 ?? ?????? 資源
FTP 的端口是 31 , Telnet : 23 , SMTP : 25 , Time : 37 , POP3 : 110 , HTTPS : 443
?
8. ??? Web 服務(wù)器不做的兩件事情
a) ????? 動(dòng)態(tài)內(nèi)容。 Web 服務(wù)器應(yīng)用只提供靜態(tài)頁(yè)面,動(dòng)態(tài)內(nèi)容由 Web 服務(wù)器輔助應(yīng)用( CGI )來(lái)完成。
b) ????? 在服務(wù)器上保存數(shù)據(jù)。 Web 服務(wù)器把這些功能轉(zhuǎn)給輔助應(yīng)用進(jìn)行處理。
?
9. ??? Web 容器
?
Web 服務(wù)器 (Apache) 得到一個(gè)指向 servlet 的請(qǐng)求,服務(wù)器不是把這個(gè)請(qǐng)求直接交給 servlet 本身,而是交給 Web 容器 (Tomcat) ,由 Web 容器調(diào)用 servlet 。
Web 容器管理和運(yùn)行 servlet ,容器知道自己與 Web 服務(wù)器之間的協(xié)議, Web 容器控制者 servlet 的生命周期,容器會(huì)自動(dòng)地為它接收每個(gè) servlet 請(qǐng)求并創(chuàng)建一個(gè)新的線程, Web 容器負(fù)責(zé)把 JSP 代發(fā)翻譯成真正的 Java 代碼。
利用配置文件( web.xml )將 servlet 部署到容器
一個(gè)完全兼容的 J2EE 應(yīng)用服務(wù)器必須有一個(gè) Web 容器和一個(gè) EJB 容器
?
Tomcat 是一個(gè) Web 容器,而不是一個(gè)完整的 j2ee 應(yīng)用服務(wù)器,因?yàn)? Tomcat 沒(méi)有 EJB 容器。
?
?
?
10. ??? JSP-Servlet 執(zhí)行流程
??? 1) 瀏覽器把請(qǐng)求數(shù)據(jù)發(fā)送給容器
??? 2) 容器根據(jù) URL 找到正確的 Servlet ,并把請(qǐng)求傳遞給這個(gè) Servlet
??? 3) Servlet 調(diào)用輔助應(yīng)用尋求幫助
??? 4) 這個(gè)輔助應(yīng)用返回一個(gè)回答, Servlet 把這個(gè)回答增加到請(qǐng)求對(duì)象
??? 5) Servlet 把請(qǐng)求轉(zhuǎn)發(fā)給 JSP
??? 6) JSP 從請(qǐng)求對(duì)象得到回答
??? 7) JSP 為容器生成一個(gè)頁(yè)面
??? 8) 容器把這個(gè)頁(yè)面返回給客戶
?
?
?
?
11. ??? Servlet 的生命周期
?
12. ??? Servlet 的屬性和參數(shù)
a) ????? 屬性
有三種類(lèi)型的屬性,應(yīng)用上下文 (ServletContext) 、請(qǐng)求 (HttpRequest) 和會(huì)話 (HttpSession) 。
設(shè)置方法: setAttribute(String name,Object value)
獲取方法: getAttribute(String name), 返回類(lèi)型是 Object
上下文 (ServletContext) 屬性 不是線程安全的,因?yàn)槊總€(gè) Servlet 都可以訪問(wèn)。讓上下文屬性線程安全的做法:
同步服務(wù)器方法 ( 即對(duì) doGet() 或 doPost() 方法添加 synchronized)
同步服務(wù)器方法意味著 servlet 中一次只能運(yùn)行一個(gè)線程,但是并不能阻止其它 servlet 或 JSP 訪問(wèn)這個(gè)屬性。
同步上下文 ( 即 synchronized(getServletContext()))
synchronized (getServletContext()){
?????????? ??? getServletContext().setAttribute( "foo" , "22" );
?????????? ??? getServletContext().setAttribute( "bar" , "42" );
}
會(huì)話屬性: 通常,一個(gè)客戶同時(shí)只有一個(gè)請(qǐng)求,就算多個(gè) servlet 能在單獨(dú)的線程中訪問(wèn)會(huì)話屬性,每個(gè)線程都是單獨(dú)的請(qǐng)求,所以,這時(shí)會(huì)話屬性是線程安全的。但是一個(gè)用戶同時(shí)有多個(gè)請(qǐng)求時(shí) ( 用戶同時(shí)打開(kāi)多個(gè)瀏覽器去訪問(wèn) ) ,會(huì)話屬性是非線程安全的,通過(guò)同步 HttpSession 來(lái)達(dá)到線程安全。代碼如下:
?????? ??? HttpSession session=request.getSession();
?????? ??? synchronized (session){
?????????? ??? session.setAttribute( "foo" , "22" );
?????????? ??? session.setAttribute( "bar" , "42" );
??? }
b) ????? 參數(shù)
應(yīng)用上下文初始化參數(shù)、請(qǐng)求參數(shù)、 servlet 初始化參數(shù)
設(shè)置方法: servlet 初始化參數(shù)只能在 DD 中設(shè)置
獲取方法: getInitParameter(String name)
?
13. ??? Servlet 接受提交的參數(shù)
a) ????? 接受單個(gè)參數(shù)
String username=request.getParameter(“username”);
b) ????? 接受多個(gè)參數(shù)
String [] parameters=request.getParameterValues(“sizes”);//sizes 可以看做是表單中的復(fù)選框,如:
??? ?? ???? < form action = ”**.do” >
< intput type = checkbox name = sizes value = ”1” > 1
< intput type = checkbox name = sizes value = ”2” > 2
< intput type = checkbox name = sizes value = ”3” > 3
< input type = ”submit” >
</ from >
?
14. ??? ServletConfig 和 ServletContext
a) ????? ServletConfig 對(duì)象
每個(gè) servlet 都有一個(gè) ServletConfig 對(duì)象,用于向 servlet 傳遞部署信息。
在 servlet 初始化之前不能使用 servlet 初始化參數(shù)。
ServletConfig 構(gòu)建過(guò)程如下:
1) ????? 容器讀取當(dāng)前 servlet 的 DD(web.xml) ,包括 servlet 初始化參數(shù) (<init-param>)
2) ????? 容器為這個(gè) servlet 創(chuàng)建 (new) 一個(gè)新的 ServletConfig 實(shí)例
3) ????? 容器為這個(gè) servlet 初始化參數(shù)創(chuàng)建一個(gè) String 名 / 值對(duì)
4) ????? 容器向 ServletConfig 提供名 / 值初始化參數(shù)的引用
5) ????? 容器創(chuàng)建 (new)serlvet 類(lèi)的實(shí)例
6) ????? 容器調(diào)用 servlet 的 init() 方法,傳入 ServletConfig 的引用
容器初始化一個(gè) servlet 時(shí),會(huì)為這個(gè) servlet 創(chuàng)建一個(gè)唯一的 ServletConfig ,容器從 DD 中讀出 servlet 初始化參數(shù),并把這些參數(shù)交給 ServletConfig ,然后把 ServletConfig 傳遞給 servlet 的 init() 方法。
初始化參數(shù):在 web.xml 配置文件中的 <servlet> 標(biāo)簽中
??? ? ???????????? < init-param >
??? ????????????????? < param-name > adminEmail </ param-name >
??? ????????????????? < param-value > zzq_rj@163.com </ param-value >
??? ??? </ init-param >
?????? 在 servlet 中調(diào)用: getServletConfig().getInitParameter(“adminEmail”);
b) ????? ServletContext 對(duì)象
每個(gè) Web 應(yīng)用才有一個(gè) ServletContext ,用于訪問(wèn) Web 應(yīng)用參數(shù)。 Web 應(yīng)用中的各個(gè) servlet 和 JSP 都能訪問(wèn) ServletContext 。
初始化參數(shù):在 web.xml 配置文件中的 <web-app> 標(biāo)簽中 <servlet> 標(biāo)簽外
????????????????? < context-param >
? ??????????????????? < param-name > contextname1 </ param-name >
? ??????????????????? < param-value > contextvalue1 </ param-value >
? ????????? </ context-param >
在 servlet 中調(diào)用: getServletContext().getInitParameter(“adminEmail”);
?????????? 或者 ? ServletContext context=getServletContext();
????????????? ? context.getInitParameter(“adminEmail”);
在 JSP 中調(diào)用:
?
15. ??? 使用響應(yīng)
通常,使用響應(yīng)只是向客戶發(fā)回?cái)?shù)據(jù),會(huì)調(diào)用兩個(gè)方法: setContentType() 和 getWriter() 。當(dāng)然,還可以使用響應(yīng)設(shè)置其它首部、發(fā)送錯(cuò)誤以及增加 cookie 。
response.setContentType(“application/jar”);
完成 I/O
ServletContext ctx=getServletContext();
InputStream is=ctx.getResourceAsStream(“/book.jar”);// 必須以“ / ”開(kāi)頭,表示 Web 應(yīng)用的根。
兩種輸出方式
字符形式: PrintWriter writer=response.getWriter();
?????? ? writer.println(“some text and HTML”);
字節(jié)流形式: ServletOutputStream out=response.getOutputStream();
?????????? ? out.write(aByteArray);
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
