導航:首頁 > 編程語言 > java請求servlet

java請求servlet

發布時間:2023-08-08 15:11:37

A. 在javaweb當中,servlet在運行階段,針對每個客戶端的請求,都會創建一個線程,該線程調用servlet的實例

具體servlet的請求處理,這個是分配給線程池線程處理的,servlet容器都這樣實現,這個沒什麼問題。我主要來說說其它的。

線程池的作用

從其他人的回答看,都是太高看線程池本身的作用了。

線程池作為一種資源池(這里的資源就是線襪叢程了)模型,最大的優點是重復利用已經創建的線程,避免線程的反復創建和銷毀帶來的處理器和內存的消耗。而除此之外,它叢蠢需要配合其它機制才能發揮更大的作用。

請求到達伺服器後,如果線程池沒有可用線程,請求會進入隊列排隊,如果超過隊列最大閾值會被丟棄。重點來了,如果你的請求處理服務會有如資料庫調用/遠程服務調用的IO處理,而你用的阻塞模型,則這個線程在請求處理完成之前並不能返還到線程池供其它請求服務。這種長期佔用線程的行為,會嚴重限制請求的並發。線程的有效利用率太低,大部分時間都在阻塞中,這個和你有沒有線程池沒有關系。所以要在高並發的情況下保證性能,重點是你的服務內部的使用異告鄭櫻步IO避免阻塞。這樣在你某個請求處於IO等待期間,當前線程可以返還給線程池繼續提供服務。

(補充)

下面有朋友提到了請求隊列,這里簡單說下。

請求隊列是所有伺服器程序都會考慮和設計的一個機制,這樣的機制實際上起緩沖層作用,避免伺服器在請求過多時崩潰。以Tomcat為例,Connector中有下面幾個關鍵配置。

acceptCount就是允許未處理請求隊列的長度(backlog),默認是100,可以根據實際情況做調整。

更多的配置參見官方文檔。如果有時間,會寫一個Tomcat具體如何實現請求隊列及它的處理文章。

請求響應

更友好的體驗還要從客戶端出發來考慮,如果你能縮短請求的處理時間,客戶端體驗是極好的,比如成都訪問杭州阿里雲伺服器,空載來回大概40ms的時間,如果你的服務處理控制在10ms以內,請求在50ms就可以返回,是不是很舒服?當然如果是靜態資源做CDN幾ms就可以完成。

要縮短請求響應時間,可以從兩方面入手:

1、將服務分解成多個可以並行處理的任務,這里的任務一般都會包含一個非同步IO調用,然後並行執行。

2、將不影響響應結果的子任務非同步處理,提前返回響應。比如推送消息,日誌記錄等。考慮一些極端的情況:在雙11和秒殺場景,只有商品的庫存處理是最核心的,這個環節處理完就可以結束本次處理,像支付這種繁瑣的處理就可以延後,還有部分操作都可以放入非同步隊列繼續處理。

將請求分解非同步並行化後,實際上又會多出很多線程切換,這個時候線程池的作用就被放大了。

總結

僅僅有線程池而沒有非同步並行框架的支撐,線程池其實只能發揮很小的作用,在高並發情況下它必不可少,但非最核心的那個東西。我們一般的Web應用都是IO密集型的,只要保證服務內的IO都非同步化,線程池只需非常少量的線程就可以應對大量並發。

B. java 怎麼配置servlet

Servlet是組件,必須放在容器中,使用容器訪問。訪問Servlet之前,必須在web.xml中配置Servlet。

部署Servlet環境(大體分2個步驟):

第一步:在Tomcat根目錄下的webapps目錄下創建如下目錄,並且放相應的文件:

• /FirstWebApp

• /FirstWebApp/WEB-INF/classes:存放servlet類編譯後的.class文件

• /FirstWebApp/WEB-INF/web.xml:存放servlet的配置文件

第二步:配置web.xml文件,如下圖:


C. Java中的Servlet的定義,Servlet的具體用途

Servlet是一個實現了Servlet介面的類,一個與訪問協議和平台無關的、運行在Servlet容器中的Java程序。

針對Servlet實現技術,SUN公司提供了一套標準的Java Servlet API以便於更快速、規范地開發Servlet程序。這套Servlet API中,最重要的兩個軟體包是:javax.servlet、javax.servlet.http。

javax.servlet是一個與通信協議無關的通用軟體包;javax.servlet.http是一個支持HTTP訪問協議的軟體包,這兩個軟體包的同時存在,使得Servlet API能支持任何協議的請求/響應。

在javax.servle中,包含著一套常用介面,負責承擔指定的任務。下表中列出了常用的類和介面:


javax.servlet軟體包:

javax.servlet包中定義了與通信協議無關的介面和類。

常用介面:

RequestDispatcher、Servlet、ServletConfig、ServletContext、ServletRequest、ServletResponse。

常用類:

GenericServlet、ServletInputStream、ServletOutputStream。

1、RequestDispatcher介面

public interface RequestDispatcher;

資源調度器介面,用於定義一個在伺服器內部直接實現資源轉發的對象。

RequestDispatcher對象由Servlet容器創建,用於封裝並調度由一個特定的URL定義的伺服器資源。

(1)請求傳遞方法

public void forward(ServletRequest request,

ServletReponse response) throws ServletException,IOException

從一個Servlet向伺服器上的另一個資源傳遞請求。

將請求轉發給其他資源時,將由被調用的資源負責對請求作出響應,而原先Servlet的執行則終止。

public void include(ServletRequest request,

ServletResponse response) throws ServletException,IOException

從一個Servlet向伺服器上的另一個資源傳遞請求。

將請求轉發給其他資源時,被調用的Servlet對該請求作出的響應將並入原先的響應對象中,原先的Servlet還可以繼續輸出響應消息。

2、Servlet介面

public interface Servlet;

開發一個Servlet需要實現的基礎介面。

介面中定義了5個方法:

init():Servlet初始化方法,通過init()方法可以獲得容器創建的ServletConfig對象

service():請求處理方法

destroy():Servlet實例銷毀方法

getServletConfig():獲取ServletConfig配置對象方法

getServletInfo():獲取Servlet相關信息方法

(1)初始化方法

public void init(ServletConfig config) throws ServletException

Servlet容器會在Servlet實例化之後,調用init方法對Servlet對象進行初始化,該方法由Servlet容器順序調用,無需Servlet自身考慮何時執行。

(2)服務方法

public void service(ServletRequest request,

ServletResponse response) throws ServletException,IOException

當Servlet容器接收到客戶請求時,調用service方法響應客戶請求,service方法在Servlet實例化、初始化之後被調用,並且可以被多次調用。

(3)銷毀方法

public void destroy()

當Servlet實例從伺服器中移除或服務停止時,Servlet容器調用destroy方法銷毀Servlet實例。

(4)獲取Servlet配置對象方法

public ServletConfig getServletConfig()

獲取一個由Servlet容器創建的ServletConfig配置對象,這個對象常常用在Servlet初始化方法中,將初始化參數封裝在ServletConfig對象中,然後傳遞給Servlet。

(5)獲取Servlet相關信息方法

public String getServletInfo()

獲取關於Servlet的一些相關信息,返回的字元串是純文本格式而不帶有任何標記(例如:HTML、XML等)。

3、ServletConfig介面

public interface ServletConfig;

Servlet配置信息介面,在Servlet初始化時,Servlet容器將Servlet初始化參數封裝在ServletConfig對象中,並傳遞給Servlet,一個Servlet實例只有一個ServletConfig對象。

介面中,只定義了4個方法:

getInitParameter():獲取Servlet指定初始化參數的值

getInitParameterNames():獲取Servlet所有初始化參數名稱

getServletContext():獲取Servlet容器為WEB應用創建的Servlet上下文環境對象ServletContext

getServletName():獲取Servlet名稱

(1)獲取初始化參數方法

public String getInitParameter(String name)

根據初始化參數名稱,獲取Servlet指定初始化參數的值,如果指定的參數不存在,返回空值null。

public Enumeration getInitParameterNames()

獲取Servlet所有初始化參數名稱,如果Servlet沒有初始化參數,返回一個空列表。

(2)獲取Servlet上下文環境方法

public ServletContext getServletContext()

獲取Servlet容器為WEB應用創建的Servlet上下文環境對象ServletContext,WEB伺服器啟動的時候,在載入WEB應用時,為每個載入的WEB應用創建一個代表WEB應用Servlet上下文環境對象。

(3)獲取Servlet名稱方法

public String getServletName()

獲取正在訪問的這個Servlet的名稱。

以上就是Servlet相關問題的解答,更多關於Java Web方面的問題可以看下這個詳細的視頻教程網頁鏈接,希望我的回答能幫到你。

閱讀全文

與java請求servlet相關的資料

熱點內容
程序員主動離職和被裁員哪個好 瀏覽:790
360命令行 瀏覽:726
程序員騙色 瀏覽:668
cisco2950重啟命令 瀏覽:459
加密貨幣區塊鏈可以增發嗎 瀏覽:290
黃龍公式源碼 瀏覽:773
linux系統ftp伺服器 瀏覽:321
山西配電伺服器機櫃雲主機 瀏覽:452
量化選股模型公式源碼 瀏覽:9
龍卡購車分期怎麼綁app 瀏覽:779
python讀取bios信息 瀏覽:113
程序員老爸初體驗 瀏覽:729
aes加密後長什麼樣子 瀏覽:978
語言有編譯器嗎 瀏覽:31
解壓聲控怎麼調大音量 瀏覽:216
纏論中的高精度畫筆源碼 瀏覽:824
通用計算型雲伺服器 瀏覽:620
程序員手機分享 瀏覽:296
pdfsmart 瀏覽:425
nginx部署php 瀏覽:666