精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java網絡編程基本功之Servlet與Servlet容器

開發 后端
使用 Java 的 Socket 套接字進行編程,去處理客戶端來的 tcp 請求,經過編解碼處理讀取請求體,獲取請求行,然后找到請求行對應的處理邏輯步入服務器的處理中,處理完畢把對應的結果返回給當前的 Socket 鏈接,響應完畢,關閉 Socket。

Servlet與Servlet容器關系

Servlet

比較這兩個的區別, 就得先搞清楚Servlet 的含義, Servlet (/?s?rvlit/ ) 翻譯成中文就是小型應用程序或者小服務程序, 與之相類似的是Server (/?s??rv?r/), 翻譯過來是服務器的意思, 可見這二者承擔類似的功能,但是Servlet更輕量。

web開發的本質就一句話:客戶端和服務器交換數據。于是使用 Java 的 Socket 套接字進行編程,去處理客戶端來的 tcp 請求,經過編解碼處理讀取請求體,獲取請求行,然后找到請求行對應的處理邏輯步入服務器的處理中,處理完畢把對應的結果返回給當前的 Socket 鏈接,響應完畢,關閉 Socket。

上述過程中, 建立連接、傳輸數據、關閉連接等過程是tomcat容器幫你做了這些事情, 而拿到請求行之后去找對應的 url 路由,這一部分是誰做的呢?是Servlet ! 簡單來說Servlet就是一段處理 web 請求的邏輯。

具體來說Servlet具有以下幾個特點:

  1. Servlet是用Java編寫的Server端程序,它與協議和平臺無關。
  2. Servlet運行于Java-enabled Web Server中。
  3. Java Servlet可以動態地擴展Server的能力,并采用請求-響應模式提供Web服務。
  4. 最早支持Servlet技術的是JavaSoft的Java Web Server。
  5. 此后,一些其它的基于Java的Web Server開始支持標準的Servlet API。
  6. Servlet的主要功能在于交互式地瀏覽和修改數據,生成動態Web內容。

上面六點中,最需要被記住的是Servlet可以動態地擴展Server的能力,并采用請求-響應模式提供Web服務。

JDK中的Servlet是一個接口:

public interface Servlet { 
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}

可以看到Servlet 是一個接口, 規定了請求從容器到達 web 服務端的規范,詳細內容在后面的Servlet生命周期中詳細梳理,這兒簡單概括三個重要步驟是:

  1. init():初始化請求的時候要做什么。
  2. service():拿到請求的時候要做什么。
  3. destory():處理完請求銷毀的時候要做什么。

所有實現 Servlet 的實現方都是在這個規范的基礎上進行開發。那么 Servlet 中的數據是從哪里來的呢?答案就是 Servlet 容器。容器才是真正與客戶端打交道的那一方。一個容器中 Servlet 可以有多個, 常見的Servlet容器Tomcat,它監聽了客戶端的請求端口,根據請求行信息確定將請求交給哪個Servlet 處理,找到處理的Servlet之后,調用該Servlet的 service() 方法,處理完畢將對應的處理結果包裝成ServletResponse 對象返回給客戶端。

Servlet容器

現在講講Servlet容器, 前面說過看Servlet只是一個接口或者說是規范, 那么就勢必有具體實現, 而Servlet具體實現或者說包裝器是Wrapper, 直接管理Wrapper的容器就是Context, 一個 Context 對應一個 Web 工程, 也就是說Context 容器如何運行將直接影響 Servlet 的工作。

由圖可以知道, Tomcat底層是Context, Context負責管理Servlet包裝類Wrapper。

下面創建一個實例對象并調用 start 方法就可以很容易啟動 Tomcat,我們還可以通過這個對象來增加和修改 Tomcat 的配置參數,如可以動態增加 Context、Servlet 等。我們就選擇 Tomcat7 自帶的 examples Web 工程,并看看它是如何加到這個 Context 容器中的。

//給 Tomcat 增加一個 Web 工程:
Tomcat tomcat = getTomcatInstance();
File appDir = new File(getBuildDirectory(), "webapps/examples");
tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath());
tomcat.start();
ByteChunk res = getUrl("http://localhost:" + getPort() +
"/examples/servlets/servlet/HelloWorldExample");
assertTrue(res.toString().indexOf("<h1>Hello World!</h1>") > 0);

上述代碼是創建一個 Tomcat 實例并新增一個 Web 應用,然后啟動 Tomcat 并調用其中的一個 HelloWorldExample Servlet,看有沒有正確返回預期的數據。

//Tomcat 的 addWebapp 方法的代碼如下:
public Context addWebapp(Host host, String url, String path) {
silence(url);
Context ctx = new StandardContext();
ctx.setPath( url );
ctx.setDocBase(path);
if (defaultRealm == null) {
initSimpleAuth();
}
ctx.setRealm(defaultRealm);
ctx.addLifecycleListener(new DefaultWebXmlListener());
ContextConfig ctxCfg = new ContextConfig();
ctx.addLifecycleListener(ctxCfg);
ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");
if (host == null) {
getHost().addChild(ctx);
} else {
host.addChild(ctx);
}
return ctx;
}

添加一個 Web 應用時將會創建一個 StandardContext 容器,并且給這個 Context 容器設置必要的參數(url 代表這個應用在 Tomcat 中的訪問路徑; path 代表這個應用實際的物理路徑) 其中最重要的一個配置是 ContextConfig,【ContextConfig監聽器】繼承了 【LifecycleListener 監聽器接口】,它是在調用清單 2 時被加入到 StandardContext 容器中。 當 Context 容器初始化狀態設為 init 時,添加在 Context 容器的 Listener 將會被調用。【ContextConfig監聽器】將會負責整個 Web 應用配置文件的解析工作。最后將這個 Context 容器加到父容器 Host 中。

Servlet生命周期

Servlet生命周期分為四個部分: 實例化==>初始化==>執行處理==>銷毀。

實例化

new , 服務器第一次被訪問時,加載一個Servlet容器,只會被加載一次。

初始化

init:創建完Servlet容器后,會調用僅執行一次的init()初始化方法,用于初始化Servlet對象,無論多少臺客戶端在服務器運行期間訪問都不會再執行init()方法。

可以在繼承的GenericServlet這個抽象類中看到初始化方法:

public void init() throws ServletException {
}

而在我們的Servlet類中應繼承調用該方法:

public void init() throws ServletException {
super.init();
}

創建Servlet對象的時機:

  1. Servlet容器啟動時:讀取web.xml配置文件中的信息,構造指定的Servlet對象,創建ServletConfig對象,同時將ServletConfig對象作為參數來調用Servlet對象的init方法。
  2. 在Servlet容器啟動后:客戶首次向Servlet發出請求,Servlet容器會判斷內存中是否存在指定的Servlet對象,如果沒有則創建它,然后根據客戶的請求創建HttpRequest、HttpResponse對象,從而調用Servlet 對象的service方法。
  3. Servlet:Servlet容器在啟動時自動創建Servlet,這是由在web.xml文件中為Servlet設置的屬性決定的。從中我們也能看到同一個類型的Servlet對象在Servlet容器中以單例的形式存在。

執行處理

執行處理——service()方法

它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作為參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。

HttpServlet的抽象類提供了doGet()、doPost()……等方法。對應了request請求的發送方法,與之相匹配:

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}

上面是操作性最高的部分。

銷毀

銷毀——destroy:在服務器關閉或重啟時,Servlet會調用destroy方法來銷毀,將Servlet容器標記為垃圾文件,讓GC做回收處理。我們編寫的Servlet是調用了GenericServlet抽象類的destroy方法:

@Override
public void destroy() {
super.destroy();
}

Servlet工作原理

1、首先簡單解釋一下Servlet接收和響應客戶請求的過程:

客戶發送一個請求,Servlet是調用service()方法對請求進行響應,service()方法中對請求的方式進行了匹配。選擇調用doGet,doPost等這些方法,然后再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個Servlet的時候,都必須實現doGet或doPost等這些方法。

2、每一個自定義的Servlet都必須實現Servlet的接口,Servlet接口中定義了五個方法,其中比較重要的三個方法涉及到Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個通用的,不特定于任何協議的Servlet,它實現了Servlet接口。而HttpServlet繼承于GenericServlet,因此HttpServlet也實現了Servlet接口。所以我們定義Servlet的時候只需要繼承HttpServlet即可。

3、Servlet接口和GenericServlet是不特定于任何協議的,而HttpServlet是特定于HTTP協議的類,所以HttpServlet中實現了service()方法,并將請求ServletRequest、ServletResponse 強轉為HttpRequest 和 HttpResponse。

4、另外,Servlet是單例模式,線程是不安全的,因此在service()方法中盡量不要操作全局變量。但實際上,可以通過使用session和application來代替全局變量,只是會加大服務器負載。

Servlet處理請求的過程

  1. 客戶端發送請求給服務器。
  2. 容器根據請求及web.xml判斷對應的Servlet是否存在,如果不存在則返回404。
  3. 容器根據請求及web.xml判斷對應的Servlet是否已經被實例化,若是相應的Servlet沒有被實例化,則容器將會加載相應的Servlet到Java虛擬機并實例化。
  4. 調用實例對象的service()方法,并開啟一個新的線程去執行相關處理。調用servce方法,判斷是調用doGet方法還是doPost方法。
  5. 業務完成后響應相關的頁面發送給客戶端。
責任編輯:姜華 來源: 今日頭條
相關推薦

2014-11-20 14:39:12

網絡傳輸

2009-07-08 11:17:10

Servlet容器Servlet Con

2009-07-09 11:27:59

Servlet容器

2009-07-06 14:05:50

Servlet編程Servlet顯示圖片

2015-01-15 09:21:24

TCP窗口

2009-07-03 16:53:11

Servlet容器

2009-07-09 13:45:06

Servlet基本結構

2017-04-12 10:40:34

公有云

2009-07-06 18:24:56

Servlet實例

2011-07-22 16:43:37

java

2009-07-09 15:30:53

Servlet容器會話跟蹤

2009-07-08 14:01:47

Servlet容器

2009-07-07 16:23:05

Servlet容器

2009-07-08 14:22:36

Servlet容器匹配過程

2024-11-01 08:34:18

Spring配置@Bean

2010-09-26 08:56:10

Oracle

2009-07-07 17:23:08

Java Servle

2010-05-27 15:05:23

ServletJava

2009-07-08 09:35:53

Java ServleServlet 3.0

2009-07-06 16:16:33

Servlet容器工作
點贊
收藏

51CTO技術棧公眾號

亚洲天堂男人天堂| 麻豆视频在线播放| 日韩欧美一区二区三区在线观看| 国产精品一国产精品| 国产精品剧情在线亚洲| 欧美寡妇偷汉性猛交| www黄色在线| 国产老头老太做爰视频| 在线成人av观看| 国产成人在线网站| 久久精品国产一区二区电影| 国产日产欧美视频| 天天操天天干天天舔| 欧美视频成人| 欧美一区二区三区四区高清| 亚洲毛片aa| 成人一二三四区| 国产成人精品999在线观看| 欧美精品第1页| 亚洲精品影院| 少妇人妻精品一区二区三区| 麻豆91在线观看| 一区二区三区久久精品| 成年人小视频网站| 日韩另类在线| 国产91色综合久久免费分享| 欧美—级a级欧美特级ar全黄| www.久久com| 黄色免费在线看| 国产一区二区在线观看免费| 久久精品国产亚洲精品2020| 91精品人妻一区二区三区| 午夜日韩成人影院| 中文字幕av在线一区二区三区| 国产精品久久久久999| 91l九色lporny| 日本h片久久| 中文字幕一区av| 114国产精品久久免费观看| 中国毛片直接看| 国产欧美一区| 亚洲精品一区二区三区不| 欧美一级黄色片视频| av小片在线| 国产一区二区不卡在线 | 亚洲a v网站| 欲香欲色天天天综合和网| 久久综合网色—综合色88| 日韩av日韩在线观看| 日本一二三不卡视频| 99国内精品久久久久| 一区二区三区日韩欧美精品 | www.四虎成人| av午夜在线| 欧美国产精品一区| 日韩av电影免费播放| 亚洲视频在线免费播放| 亚洲精品小说| 亚洲激情视频网站| 国产情侣av自拍| 日本欧美韩国| 在线精品视频免费播放| 国产在线无码精品| 日本ー区在线视频| 精品一区二区三区在线观看| 97国产在线观看| 日本人亚洲人jjzzjjz| 国产精品羞羞答答在线观看| 国产一区二区日韩精品欧美精品| 88久久精品无码一区二区毛片| 亚洲天堂日韩在线| 日韩欧美精品在线视频| 九九热在线免费| 国产羞羞视频在线播放| 欧美极品xxx| 国产精品播放| 亚洲天堂手机在线| 久久精品国产一区二区三| 国产精品夜间视频香蕉| 日本在线视频中文字幕| 希岛爱理一区二区三区| 大胆人体色综合| 久久久免费看片| 国产精品毛片久久| 一区二区三区www| 99久久久无码国产精品不卡| 亚洲精品aaaaa| 正在播放亚洲1区| 欧美 日本 国产| 97成人在线| 欧美精品18+| 日本wwww色| 久久九九精品视频| 欧美日韩国产另类一区| 日av中文字幕| 伊人亚洲精品| 日韩av影视综合网| 国产原创剧情av| 粉嫩一区二区三区在线观看| 欧美在线你懂的| 精品人妻一区二区乱码| 亚洲人成网站在线在线观看| 精品少妇一区二区三区在线播放| 肉色超薄丝袜脚交| 中文成人在线| 亚洲精品国产福利| 日本爱爱小视频| 欧美激情777| 中文字幕国产亚洲| 久久精品国产亚洲av麻豆色欲| 欧美91福利在线观看| 久久久精品视频成人| 久久久国产高清| 久久成人精品| 欧美亚洲视频在线看网址| 久久久久久少妇| 亚洲欧美日本国产专区一区| 欧美洲成人男女午夜视频| 免费看日批视频| 日产国产欧美视频一区精品| 国产精品久久久久久搜索| 中文字幕在线观看第二页| 久久成人久久鬼色| 蜜桃导航-精品导航| 色中色在线视频| 亚洲男人的天堂在线aⅴ视频| 国产一区一区三区| 18加网站在线| 午夜国产精品影院在线观看| 香港三级韩国三级日本三级| 亚洲欧洲自拍| 亚洲成人精品视频在线观看| 国产精品一级黄片| 九九在线精品| 深夜福利一区二区| 国产又黄又爽又无遮挡| 狠久久av成人天堂| 欧美一级片在线播放| 亚洲av无码一区二区乱子伦| 99精品久久只有精品| 欧美日韩亚洲综合一区二区三区激情在线| 青青操视频在线| 亚洲mv在线观看| 不卡的一区二区| 亚洲色图二区| 91av在线看| 国产精品露脸视频| 国产成人午夜99999| 色香蕉在线观看| 成人亚洲精品| 久久在线精品视频| 国产免费一区二区三区免费视频| 成人在线视频一区| 日产精品一线二线三线芒果| 巨茎人妖videos另类| 日韩av中文在线| 亚洲黄色三级视频| 国产一区二区调教| 四虎精品欧美一区二区免费| 日韩精品一区二区三区中文字幕| 亚洲国产日韩欧美综合久久| 日本三级视频在线| 91色|porny| 九九久久九九久久| 一区中文字幕电影| 亚洲午夜女主播在线直播| 亚洲欧美一区二区三区在线观看| 国产日韩欧美高清在线| 国产va亚洲va在线va| 欧美xxxx做受欧美护士| 在线丨暗呦小u女国产精品| 亚洲专区第一页| 亚洲激情自拍偷拍| 国产三级国产精品| 日韩福利电影在线观看| 国产视频一区二区不卡| 久草中文在线| 精品日产卡一卡二卡麻豆| wwwxxx亚洲| 国产精品天干天干在观线| 国产一级片中文字幕| 伊人成年综合电影网| 91久久久久久久久久久| 国产精品四虎| 精品国产乱码久久久久久婷婷 | 亚洲欧美日韩另类精品一区二区三区| 自拍偷拍欧美日韩| 欧美亚洲视频在线看网址| 99免在线观看免费视频高清| 日韩免费在线观看| 无码人妻av一区二区三区波多野| 成人精品免费看| 日本不卡一区二区三区四区| 91蜜桃臀久久一区二区| 国产精品91在线观看| 五月婷中文字幕| 一区二区日韩av| 在线播放黄色av| 99热这里只有成人精品国产| 国产成人免费电影| 欧美大片1688网站| 久久久久久久久久久国产| 国产在线黄色| 在线一区二区视频| 欧美又粗又大又长| 亚洲国产成人在线| 国产高清成人久久| 99xxxx成人网| 中文字幕一区二区三区有限公司 | 成人动漫在线视频| 日本片在线观看| 国产午夜精品一区二区三区| 国产综合视频在线| 亚洲第一av色| 久久一区二区电影| 国产一区视频导航| 日韩视频免费在线播放| 亚洲毛片网站| 久久精品久久精品国产大片| 在线天堂资源| 欧美激情a在线| 香蕉视频免费在线播放| 在线综合亚洲欧美在线视频| 国内偷拍精品视频| 中文字幕二三区不卡| aaaaaav| 粉嫩av一区二区三区粉嫩| 在线观看免费av网址| 午夜日韩福利| 宅男一区二区三区| 欧美日韩伦理| 亚洲一区中文字幕| a√中文在线观看| 亚洲娇小xxxx欧美娇小| 国产草草影院ccyycom| 亚洲成av人片在线| 中文字幕在线观看成人| 亚洲欧美偷拍卡通变态| 亚洲少妇18p| 高清shemale亚洲人妖| 欧美专区第二页| 国产一区二区美女诱惑| 亚洲一区精品视频在线观看| 人人狠狠综合久久亚洲| 免费一级特黄录像| 免费看欧美女人艹b| 激情五月六月婷婷| 亚洲调教一区| 久久久亚洲综合网站| 欧美日韩麻豆| 91精品视频免费| 亚洲伊人精品酒店| 成人黄色中文字幕| 亚洲综合电影| 欧美最猛性xxxxx(亚洲精品)| 日韩精品av| 日韩中文有码在线视频| 麻豆网站在线观看| 久久中文字幕国产| 日本不卡影院| 在线日韩日本国产亚洲| av在线免费播放网站| 精品国产1区2区3区| 中文字幕av免费观看| 欧美性三三影院| 国产污视频在线看| 高跟丝袜一区二区三区| 久热这里有精品| 亚洲国产日日夜夜| 在线观看黄网站| 一本久道中文字幕精品亚洲嫩| 日韩av手机在线免费观看| 亚洲色大成网站www久久九九| 国内偷拍精品视频| 欧美日韩国产综合视频在线观看中文| 亚洲欧美另类在线视频| 欧美日韩第一区日日骚| 亚洲第九十九页| 亚洲精品720p| 91精品国产91久久久久游泳池 | 日本五十熟hd丰满| 色综合久久66| 国产裸体永久免费无遮挡| 亚洲精品一区二区三区精华液| 视频在线不卡| 精品少妇一区二区三区免费观看| 香蕉国产在线视频| 中文字幕在线精品| www在线看| 国产精品激情自拍| 亚洲综合网狠久久| 欧美亚洲爱爱另类综合| 亚洲最新色图| 久草资源站在线观看| 久久99精品国产麻豆婷婷| 国产午夜在线一区二区三区| 亚洲国产精品激情在线观看| 久久免费视频99| 亚洲一线二线三线视频| 欧美人妻精品一区二区免费看| 日韩毛片精品高清免费| 久久一级免费视频| 午夜精品一区在线观看| 一二三四区在线| 亚洲精选在线观看| 蜜桃视频在线免费| 亚洲人午夜色婷婷| 久草视频在线看| 欧美丰满少妇xxxx| 最新日韩一区| 久久久久久九九| 国内精品久久久久久久97牛牛| 黄色三级视频在线| 91丨九色丨尤物| www欧美com| 一区二区三区欧美日韩| 99成人精品视频| 日韩精品福利在线| 免费看电影在线| 91日韩在线视频| 国产精品久久久久蜜臀| 三级a在线观看| www成人在线观看| 国产精选第一页| 日韩欧美高清一区| 国产在线1区| 国产剧情久久久久久| 青青草原综合久久大伊人精品 | 色老汉一区二区三区| 91视频在线视频| 亚洲激情在线观看| 1区2区3区在线| 国产三区二区一区久久| 亚洲国产高清一区| jjzz黄色片| 久久蜜桃av一区二区天堂| 国产精品6666| 精品国产91久久久久久久妲己| 女囚岛在线观看| av噜噜色噜噜久久| 欧美日韩精品| 亚洲av人人澡人人爽人人夜夜| 亚洲精品ww久久久久久p站| 国产视频第一页| 久久这里只有精品99| 麻豆一区在线| 97超碰在线视| 国产iv一区二区三区| 免费在线看黄网址| 精品国产凹凸成av人网站| av2020不卡| 美女被啪啪一区二区| 久久都是精品| 美女网站视频色| 欧美一区二区国产| 美女91在线| 狠狠色综合色区| 亚洲一区色图| 一区二区在线免费观看视频| 亚洲一区二区在线免费观看视频| 午夜美女福利视频| 色伦专区97中文字幕| 在线高清欧美| 免费拍拍拍网站| 91免费小视频| 日韩乱码一区二区三区| www亚洲欧美| 日韩一区二区三区在线免费观看 | 91视频在线观看| 亚洲精品女av网站| a91a精品视频在线观看| 久久久国产一级片| 精品久久久久久中文字幕| 色中色在线视频| 成人精品在线视频| 亚洲福利免费| 国产传媒在线看| 精品国产网站在线观看| 伊人久久视频| 中文精品视频一区二区在线观看| 国产成人在线视频网站| 天天综合天天干| 久久天天躁狠狠躁夜夜躁| 欧美午夜寂寞| 中文字幕66页| 天天综合色天天综合色h| av资源网站在线观看| 成人av资源| 蜜臀av一区二区| 日本a在线观看| 最近2019好看的中文字幕免费| 综合伊人久久| 国产又猛又黄的视频| 亚洲高清视频中文字幕| 在线免费看av| 久草精品电影| 国产一区二区影院| 日韩国产成人在线| 久久久亚洲精选| 国产亚洲成av人片在线观黄桃|