精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品99一区二区| 亚洲欧美精品午睡沙发| 欧美做受高潮1| 欧美人妻一区二区三区| 成人午夜888| 午夜精品久久久久久不卡8050| 久久精品丝袜高跟鞋| 中文字幕第一页在线播放| 欧美视频不卡| 中文字幕视频一区二区在线有码| 337p日本欧洲亚洲大胆张筱雨| 亚洲人体影院| 综合在线观看色| 精品国产电影| 国产乱淫片视频| 久热re这里精品视频在线6| 九九热精品在线| 亚洲做受高潮无遮挡| 视频国产精品| 欧美色区777第一页| 人妻少妇精品无码专区二区| 免费黄色网页在线观看| 972aa.com艺术欧美| 亚洲最大成人免费视频| 波多野结衣一本一道| 亚洲激情影院| 欧美成人在线影院| 欧美另类69xxxx| 午夜a一级毛片亚洲欧洲| 日韩视频免费直播| www.日本一区| 91精品影视| 欧美午夜激情小视频| 久久www视频| 精品51国产黑色丝袜高跟鞋| 国产亚洲一本大道中文在线| 激情久久av| 可以免费观看的毛片| 国产精品一卡二卡| 91网站免费观看| 中文亚洲av片在线观看| 玖玖玖国产精品| 热久久这里只有| 日韩一区二区视频在线| 在线成人国产| 性欧美办公室18xxxxhd| 麻豆亚洲av熟女国产一区二| 一区二区蜜桃| 美女精品视频一区| 欧美在线视频第一页| 99久久www免费| 日韩有码视频在线| 免费观看特级毛片| 99国产精品免费视频观看| 国产亚洲精品久久久久久| 好吊日免费视频| 日韩美脚连裤袜丝袜在线| 亚洲成人av片| 搡老熟女老女人一区二区| 乱亲女h秽乱长久久久| 亚洲成年人影院在线| 日韩少妇一区二区| 日韩精品免费一区二区夜夜嗨| 日韩精品极品视频| 粉嫩av蜜桃av蜜臀av| 精品国产中文字幕第一页| 亚洲视频在线免费观看| 免费一级黄色录像| 欧美好骚综合网| 久久影视电视剧免费网站| 中文字幕在线有码| 亚洲性感美女99在线| 992tv在线成人免费观看| 少妇太紧太爽又黄又硬又爽| 日本成人在线视频网站| 成人午夜一级二级三级| 99久久婷婷国产一区二区三区| 东方aⅴ免费观看久久av| 精品蜜桃一区二区三区| 国产区在线视频| 亚洲人成在线观看一区二区| 精品一区二区三区无码视频| 亚洲精品永久免费视频| 欧美日韩一级片在线观看| 日韩欧美中文视频| 国产精品久久久久久久久久白浆| 日韩国产欧美精品在线 | 国产经典欧美精品| 国产精品免费一区二区三区四区 | 日韩色性视频| 精品国产自在久精品国产| 欧美多人猛交狂配| 亚洲欧美日韩高清在线| 欧美一二三视频| 国产精品系列视频| 久久综合狠狠综合| 中文字幕日韩精品一区二区| 国产极品在线观看| 欧美日韩国产一区二区三区地区| zjzjzjzjzj亚洲女人| 欧美理论电影大全| 午夜精品久久17c| 亚洲无码精品在线播放| 99久久国产综合精品色伊| 亚洲三区在线观看| 热色播在线视频| 91精品国产色综合久久不卡蜜臀| 日本japanese极品少妇| 中文字幕人成人乱码| 国产不卡视频在线| 蜜桃视频在线观看www| 国产精品久久久久久久久快鸭| av免费观看国产| 电影91久久久| 一本色道久久88综合日韩精品| 国产大学生自拍| 免费看精品久久片| 麻豆传媒一区二区| 丁香花电影在线观看完整版| 欧美精品亚洲一区二区在线播放| 国产熟妇搡bbbb搡bbbb| 亚洲视频碰碰| 亚洲在线免费观看| 久久久久久国产精品免费无遮挡| 色域天天综合网| 女同性恋一区二区三区| 一区二区蜜桃| 成人免费看吃奶视频网站| 国产一区二区三区福利| 狠狠做深爱婷婷久久综合一区| 乱码一区二区三区| 中文字幕一区二区精品区| 国产精品影片在线观看 | 最近2019中文字幕在线高清 | 欧美视频精品在线观看| 久久精品老司机| 亚洲综合日韩| 久久手机视频| 日韩激情电影免费看| 欧美成人女星排行榜| 国模无码国产精品视频| 国产福利一区在线| 青青视频免费在线观看| 久久国产精品美女| 久久成人在线视频| 99在线观看免费| 亚洲欧美色图小说| 成人免费黄色av| 国产中文一区| 韩国成人一区| 成人直播视频| 一夜七次郎国产精品亚洲| 波多野结衣高清在线| 国产视频一区二区在线| 国产成人精品无码播放| 精品理论电影在线| 国产精品免费视频久久久| 在线观看免费版| 91麻豆精品国产自产在线观看一区| 任我爽在线视频| 国产精品一品二品| 可以在线看的av网站| 日本一区福利在线| 日韩免费在线播放| 日本视频在线| 4438亚洲最大| 欧美成人aaaaⅴ片在线看| 99精品久久只有精品| 大肉大捧一进一出好爽视频| 国产欧美一区二区精品久久久| 国产精品久久久久久av下载红粉| 午夜在线观看视频| 日韩三区在线观看| 国产精品suv一区二区三区| 93久久精品日日躁夜夜躁欧美| 欧美日韩一区二区在线免费观看| 超碰成人久久| 99视频在线免费观看| 丝袜老师在线| 最近2019中文免费高清视频观看www99 | 精品免费一区二区三区| 亚洲国产成人无码av在线| 国产精品色哟哟网站| 亚洲精品久久久久久| 亚洲视频大全| 伊人情人网综合| 极品一区美女高清| 国产精品丝袜白浆摸在线| 香蕉久久aⅴ一区二区三区| 日韩精品视频在线播放| 亚洲天堂网视频| 五月婷婷综合在线| 女同久久另类69精品国产| av不卡免费电影| 午夜视频在线网站| 中文久久精品| av动漫免费观看| 亚洲欧洲色图| 69174成人网| 成人国产激情| 97视频在线观看免费高清完整版在线观看 | 在线精品播放av| 人妻中文字幕一区| 欧美精品1区2区| 欧美超碰在线观看| 亚洲午夜激情av| 国产稀缺精品盗摄盗拍| 久久久五月婷婷| 国产精品一区二区无码对白| 久久精品国产一区二区三| 91成人在线观看喷潮教学| 91精品秘密在线观看| 日韩av一级大片| 狼人天天伊人久久| 99re在线| 成人国产精品久久| 国产精品久久精品| 欧美片第1页| 7777精品视频| 成人三级小说| 欧美黑人极品猛少妇色xxxxx | 国产精品丝袜久久久久久app| 亚洲熟女一区二区三区| 国精产品一区一区三区mba视频| 国产xxxxx视频| 亚洲一区二区免费看| 国产精品视频网站在线观看| 日韩在线综合| 色女孩综合网| 俺要去色综合狠狠| 麻豆亚洲一区| 日韩av影院| 久久波多野结衣| 欧美日韩一本| 精品在线视频一区二区三区| 精品国产一区二区三区成人影院 | 下面一进一出好爽视频| 乱一区二区av| www.久久av.com| 精品一区二区三区久久| 久热精品在线播放| 麻豆精品久久精品色综合| 日韩精品你懂的| 免费在线看成人av| 久久撸在线视频| 久久精品国产一区二区| 亚洲一二三av| 国产高清精品网站| 性猛交╳xxx乱大交| 粉嫩av亚洲一区二区图片| 性高潮久久久久久| 成人免费的视频| 亚洲av成人无码一二三在线观看| 成人国产精品免费| 免费a在线观看播放| 91麻豆免费看片| 美女脱光内衣内裤| 国产精品视频线看| 午夜精品一区二区三级视频| 亚洲乱码国产乱码精品精98午夜 | 日韩欧美色电影| 丰满熟女一区二区三区| 亚洲高清久久久久久| 麻豆影视在线| 久久久精品国产| 久草在线资源站资源站| 1769国内精品视频在线播放| 性欧美1819sex性高清| 国产热re99久久6国产精品| 97久久中文字幕| 国产精品免费一区二区| 久久91麻豆精品一区| 亚洲欧美日韩综合一区| 欧美激情亚洲| 亚欧无线一线二线三线区别| 日本视频一区二区三区| 日本在线观看免费视频| 国产中文字幕精品| 制服丝袜第一页在线观看| 欧美激情中文不卡| 黑人巨大精品一区二区在线| 亚洲国产精品久久久久婷婷884 | 狂野欧美性猛交xxxx巴西| 国产三级三级看三级| 大尺度一区二区| 日本人亚洲人jjzzjjz| 亚洲一区在线免费观看| 亚洲综合图片网| 日韩一区二区三区四区| 美国成人毛片| 色综合久久悠悠| 精品欧美日韩精品| 成人影片在线播放| 欧美在线色图| 免费国产黄色网址| 久久99九九99精品| 波多野结衣影院| 综合久久给合久久狠狠狠97色| 久久露脸国语精品国产91| 欧美三级韩国三级日本一级| 日本免费不卡视频| 久久精品亚洲国产| 三级成人黄色影院| 国产精品v欧美精品∨日韩| 精品国产一区二区三区av片| 青草青青在线视频| 国精产品一区一区三区mba桃花| 91久久免费视频| 亚洲午夜电影在线观看| 91在线你懂的| 亚洲天堂成人在线| 黑森林国产精品av| 亚洲jizzjizz日本少妇| 欧美日中文字幕| 日本a级片免费观看| 国产91丝袜在线播放0| 亚洲精品电影院| 欧美亚洲动漫精品| 久青草国产在线| 91精品成人久久| 丁香一区二区| 国产91porn| 国产一区二区三区不卡在线观看| 亚洲v国产v欧美v久久久久久| 午夜亚洲福利老司机| www.爱爱.com| 欧美成人精品xxx| 国语精品视频| 97超碰人人爱| 国产在线看一区| 亚洲欧美另类日本| 欧美色倩网站大全免费| 国产在线中文字幕| 日本欧美精品在线| 偷拍一区二区| 欧美成人黑人猛交| 久久综合五月天婷婷伊人| 日韩人妻无码一区二区三区99 | 欧美天天视频| 最好看的中文字幕| 一区二区三区 在线观看视频| 国产高清免费观看| 九九热r在线视频精品| 视频一区日韩精品| 青青草视频在线视频| 国产91精品露脸国语对白| 久久久久久久久久久97| 精品久久久久久久久久久久久久久| 亚洲第一图区| 国产一区免费在线| 国产欧美三级| 一色道久久88加勒比一| 日本丰满少妇一区二区三区| 国产理论电影在线观看| 国产精品日韩欧美| 婷婷中文字幕一区| 潘金莲一级淫片aaaaaaa| 亚洲一区二区三区三| 婷婷丁香一区二区三区| 欧美在线视频一区| 成人黄色小视频| www.日本久久| 五月天网站亚洲| 九一国产在线| 亚洲a成v人在线观看| 国产综合网站| 国产又爽又黄无码无遮挡在线观看| 欧美性色欧美a在线播放| 成人午夜在线影视| 国产精品一级久久久| 美女日韩在线中文字幕| 熟女少妇a性色生活片毛片| 精品国产免费久久| 精品国产第一福利网站| 亚洲午夜精品一区二区| 国产精品18久久久久久vr| 日韩伦理在线视频| 在线精品国产欧美| 日韩久久99| 免费看黄在线看| 国产精品毛片无遮挡高清| a级片免费观看| 欧美制服第一页| 羞羞色午夜精品一区二区三区| 无码人妻精品一区二区三| 色噜噜狠狠一区二区三区果冻| 久热国产在线| 欧美另类视频在线| 国产精品综合网| 日本黄色一级视频| 色综合老司机第九色激情| 欧美人与拘性视交免费看| www.51色.com| 一本色道**综合亚洲精品蜜桃冫| 国产在线高清视频| 免费av在线一区二区| 国产黄色精品视频| 波多野结衣黄色网址| 久久久久一本一区二区青青蜜月| 日本激情一区|