1.? Request
和
Response
對(duì)象起到了服務(wù)器與客戶機(jī)之間的信息傳遞作用。
?
??Request
對(duì)象用于接收客戶端瀏覽器提交的數(shù)據(jù),而
Response
對(duì)象的功能則是將服務(wù)器端的數(shù)據(jù)發(fā)送到客戶端瀏覽器。
?
?Request
對(duì)象
l??????
????
從瀏覽器端取得數(shù)據(jù)的方法
l?????? ????Request.QueryString 集合讀取表單 GET 方法數(shù)據(jù) ?????
l??????
????Request.Form
集合讀取表單
POST
方法數(shù)據(jù)
?????
l?????? ????Request.ServerVariables 集合讀取服務(wù)器端環(huán)境變量
2.
為什么
servlet
和
jsp
中可以直接使用
req
和
res
對(duì)象?
自己的理解:(不一定正確,有待學(xué)習(xí)和理解)
servlet 容器類負(fù)責(zé)貞聽(tīng)請(qǐng)求,如果捕獲到請(qǐng)求,請(qǐng)創(chuàng)建 req 和 res 對(duì)象,然后激活 service ()方法,(或者,如果是 get 請(qǐng)求,激活 doGet ()方法;如果是 post ,則激活 doPost ()方法),并且同時(shí)也把 req 和 res 對(duì)象傳遞給了 service ()方法(或者是相應(yīng)的 doGet() 和 doPost() 方法);
也就是說(shuō) servlet 容器類貞聽(tīng)到請(qǐng)求后已經(jīng)自動(dòng)創(chuàng)建 req 和 res 對(duì)象,并傳遞給 service ()方法了,所以自己編碼實(shí)現(xiàn) servlet 的 service ()方法時(shí)候,直接使用 req 和 res 對(duì)象就可以,因?yàn)?/span> service ()方法(由 service 方法根據(jù)請(qǐng)求方式再調(diào)用相應(yīng)的 doGet ()和 doPost ()方法) 是容器負(fù)責(zé)自動(dòng)調(diào)用的,調(diào)用的同時(shí)也實(shí)現(xiàn)的 req 和 res 的傳參。 Ok ?。?/span>
問(wèn)題:迫切需要查看
tomcat
的
javax.servlet.Servlet
接口實(shí)現(xiàn)的類來(lái)驗(yàn)證自己的理解;
參考資料:
Servlet 容器工作原理(一)(二)(三)(四)
http://www.linuxmine.com/45398.html
注釋:這是一個(gè)通過(guò)給出簡(jiǎn)單實(shí)現(xiàn)
servlet
容器的源代碼的方式來(lái)闡述
servlet
容器(
tomcat
)工作原理的好資料。
關(guān)鍵內(nèi)容摘要:
編者注
:
本文和同系列的前面一文“基于
Java
的
Web
服務(wù)器工作原理”,都摘自“
Tomcat
運(yùn)行內(nèi)幕”一書(一本有關(guān)
Tomcat
的教程)。在閱讀本文前,最好先閱讀前文,以鞏固基礎(chǔ)信息。在此,將介紹如何建立兩個(gè)
servlet
容器。
隨附本書的應(yīng)用程序可以下載
,如果您有興趣,可以在近段時(shí)間內(nèi)到
作者網(wǎng)站
下載。
本文介紹一個(gè)簡(jiǎn)單
servlet
容器的基本原理。這個(gè)
servlet
容器都處理簡(jiǎn)單的
servlet
及
staticResource
。復(fù)雜一些的
servlet
會(huì)超出這些容器的容量,您可以從
TOMCAT?
運(yùn)行內(nèi)幕
一書學(xué)習(xí)創(chuàng)建復(fù)雜的
servlet
容器。
在理解應(yīng)用程序如何運(yùn)作之前,您必須熟悉
javax.servlet.Servlet
接口。首先就來(lái)介紹這個(gè)接口。隨后,就介紹
servlet
容器服務(wù)
servlet
的具體內(nèi)容。
javax.servlet.Servlet
接口
servlet
編程,需要引用以下兩個(gè)類和接口:
javax.servlet
和
javax.servlet.http
,在這些類和接口中,
javax.servlet.Servlet
接口尤為重要。所有的
servlet
必須實(shí)現(xiàn)這個(gè)接口或繼承已實(shí)現(xiàn)這個(gè)接口的類。
Servlet
接口有五個(gè)方法,如下:
l????????
public void init(ServletConfig config) throws ServletException
l????????
public void service(ServletRequest request, ServletResponse response)? throws ServletException, java.io.IOException
l????????
public void destroy()
l????????
public ServletConfig getServletConfig()
l????????
public java.lang.String getServletInfo()
init
、
service
和
destroy?
方法是
Servlet
生命周期的方法。當(dāng)
Servlet
類實(shí)例化后,容器加載
init
,以通知
servlet
它已進(jìn)入服務(wù)行列。
init
方法必須被加載,
Servelt
才能接收和請(qǐng)求。如果要載入數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序、初始化一些值等等,程序員可以重寫這個(gè)方法。在其他情況下,這個(gè)方法一般為空。
service
方法由
Servlet
容器調(diào)用,以允許
Servlet
響應(yīng)一個(gè)請(qǐng)求。
Servlet
容器傳遞
javax.servlet.ServletRequest
對(duì)象和
javax.servlet.ServletResponse
對(duì)象。
ServletRequest
對(duì)象包含客戶端
HTTP
請(qǐng)求信息,
ServletResponse
則封裝
servlet
響應(yīng)。
這兩個(gè)對(duì)象,您可以寫一些需要
servlet
怎樣服務(wù)和客戶怎樣請(qǐng)求的代碼。
一個(gè)功能健全的 servlet 容器對(duì)于每個(gè) servlet 的 HTTP 請(qǐng)求會(huì)完成以下事情:
l???????? 當(dāng) servlet 第一次被調(diào)用的時(shí)候,加載了 servlet 類并調(diào)用它的 init 方法(僅調(diào)用一次)
l???????? 響應(yīng)每次請(qǐng)求的時(shí)候 ,構(gòu)建一個(gè) javax.servlet.ServletRequest 和 javax.servlet.ServletResponse 實(shí)例。
l???????? 激活 servlet 的 service 方法,傳遞 ServletRequest 和 ServletResponse 對(duì)象。
l????????
當(dāng)
servlet
類關(guān)閉的時(shí)候,調(diào)用
servlet
的
destroy
方法,并卸載
servlet
類。
發(fā)生在 servlet 容器內(nèi)部的事就復(fù)雜多了。只是這個(gè)簡(jiǎn)單的 servlet 容器的功能不很健全,所以,這它只能運(yùn)行非常簡(jiǎn)單的 servelt ,并不能調(diào)用 servlet 的 init 和 destroy 方法。然而,它也執(zhí)行了以下動(dòng)作:
l???????? 等待 ? HTTP 請(qǐng)求。
l???????? 構(gòu)建 ServletRequest 和 ? ServletResponse 對(duì)象 ?
l???????? 如果請(qǐng)求的是一個(gè) staticResource ,就會(huì)激活 StaticResourceProcessor 實(shí)例的 process 方法,傳遞 ServletRequest 和 ServletResponse 對(duì)象。
l???????? 如果請(qǐng)求的是一個(gè) servlet , 載入該類,并激活它的 service 方法,傳遞 ServletRequest 和 ServletResponse 對(duì)象。注意:在這個(gè) servlet 容器,每當(dāng) servlet 被請(qǐng)求的時(shí)候該類就被載入。
Servlet
容器的關(guān)鍵工作流程
:
HttpServer1
類的
await
方法
在這個(gè)應(yīng)用程序中,
servlet
容器由六個(gè)類組成
。
• HttpServer1
• Request
• Response
• StaticResourceProcessor
• ServletProcessor1
• Constants
正如前文中的應(yīng)用程序一樣,這個(gè)程序的進(jìn)入口(靜態(tài)
main
方法)是
HttpServer
類。這個(gè)方法創(chuàng)建了
HttpServer
實(shí)例,并調(diào)用它的
await
方法。這個(gè)方法等待
HTTP
請(qǐng)示,然后創(chuàng)建一個(gè)
request
對(duì)象和
response
對(duì)象,根據(jù)請(qǐng)求是否是
staticResource
還是
servlet
來(lái)分派它們到
StaticResourceProcessor
實(shí)例或
ServletProcessor
實(shí)例。
代碼如下:
Listing 2.2. HttpServer1
類的
await
方法
public void await() {
ServerSocket serverSocket = null;
int
port
= 8080;
try {
serverSocket =
new ServerSocket(port, 1,
InetAddress.getByName("127.0.0.1"));
}
catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
//
循環(huán),等待一個(gè)請(qǐng)求
while (!shutdown) {
Socket socket
= null;
InputStream input
= null;
OutputStream output = null;
try {
socket = serverSocket.accept();//
貞聽(tīng)用戶請(qǐng)求;
input
= socket.getInputStream();
output = socket.getOutputStream();
//
如果捕獲用戶請(qǐng)求,則創(chuàng)建請(qǐng)求對(duì)象并解析
Request request = new Request(input);
request.parse();
//
創(chuàng)建回應(yīng)對(duì)象
Response response = new Response(output);
response.setRequest(request);
//
檢測(cè)是否是
servlet
或靜態(tài)資源的請(qǐng)求
//servlet
請(qǐng)求以
"/servlet/"
開始
if (request.getUri().startsWith("/servlet/")) {
ServletProcessor1 processor = new ServletProcessor1();
//
激活
process
(
req
,
res
)方法,并同時(shí)把
req
和
res
實(shí)例傳遞給
process
()方法;
//
在
tomcat
中,激活的是
service
(
req
,
res
)方法(或者相應(yīng)的
doGet
和
doPost
方法)
processor.process(request, response);
}
else {
StaticResourceProcessor processor =
new StaticResourceProcessor();
processor.process(request, response);
}
//
關(guān)閉
socket
socket.close();
//
檢測(cè)是否前面的
URI
是一個(gè)
shutdown
命令
shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
}
如果
URI
中包含
"/servlet/."
,請(qǐng)求推進(jìn)到后面,否則,請(qǐng)求傳遞到
StaticResourceProcessor
實(shí)例。
Ok
!
3.
如何理解內(nèi)置的含義?(不一定正確,有待學(xué)習(xí)和理解)
http://topic.csdn.net/t/20060211/20/4551196.html
問(wèn):
如何深入理解內(nèi)置對(duì)象
?
?
最好是在實(shí)現(xiàn)原理層次上
答:
tomcat
的體系中,有個(gè)
jsp ? parser
,它的作用是把
jsp
頁(yè)面
parse
成
java
程序(
servlet
),然后再運(yùn)行
parse
出來(lái)的
servlet
,由此可見(jiàn),
9
個(gè)內(nèi)置對(duì)象就是
jsp ? parser
在根據(jù)
jsp
頁(yè)面生成
servlet
的時(shí)候自動(dòng)創(chuàng)建的
java
對(duì)象或容器中已經(jīng)創(chuàng)建的對(duì)象。