網站首頁 編程語言 正文
1.Servlet規范
1.1 Servlet作用講解
Servlet是JavaEE規范中的一種,主要是為了擴展Java作為Web服務的功能,統一定義了對應的接口,比如Servlet接口,HttpRequest接口,HttpResponse接口,Filter接口。
然后由具體的服務廠商來實現這些接口功能,比如Tomcat,jetty等。
在規范里面并不會有具體的實現。
可以自行看下源碼,而在Servlet規范中規定了一個http請求到來的執行處理流程:
對應的服務器容器會接收到對應的Http請求,然后解析該請求,然后創建對應的Servlet實例,調用對應init方法來完成初始化,把請求的相關信息封裝為HttpServletRequest對象來調用Servlet的service方法來處理請求,然后通過HttpServletResponse封裝響應的信息交給容器,響應給客戶端。
1.2 Servlet核心API
我們再來回顧下Servlet中的核心API,這塊對我們更好的掌握Tomcat的內容還是非常有幫助的。
API | 描述 |
---|---|
ServletConfig | 獲取servlet初始化參數和servletContext對象。 |
ServletContext | 在整個Web應用的動態資源之間共享數據。 |
ServletRequest | 封裝Http請求信息,在請求時創建。 |
ServletResponse | 封裝Http響應信息,在請求時創建。 |
ServletConfig:
容器在初始化servlet時,為該servlet創建一個servletConfig對象,并將這個對象通過init()方法來傳遞并保存在此Servlet對象中。核心作用:
- 獲取初始化信息;
- 獲取ServletContext對象。
ServletContext
一個項目只有一個ServletContext對象,可以在多個Servlet中來獲取這個對象,使用它可以給多個Servlet傳遞數據,該對象在Tomcat啟動時就創建,在Tomcat關閉時才會銷毀!作用是在整個Web應用的動態資源之間共享數據。
在實際的Servlet開發中,我們會實現HttpServlet接口,在該接口中會實現GenericServlet,而在GenericServlet會實現ServiceConfig接口,從而可以獲取ServletContext容器對象
所以在Servlet中我們可以很容易的獲取到ServletContext對象,從而完成對應的操作。
public class ServletTwoImpl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 1、參數傳遞
ServletContext servletContext = this.getServletContext() ;
String value = String.valueOf(servletContext.getAttribute("name")) ;
System.out.println("value="+value);
// 2、獲取初始化參數
String userName= servletContext.getInitParameter("user-name") ;
System.out.println("userName="+userName);
// 3、獲取應用信息
String servletContextName = servletContext.getServletContextName() ;
System.out.println("servletContextName="+servletContextName);
// 4、獲取路徑
String pathOne = servletContext.getRealPath("/") ;
String pathTwo = servletContext.getRealPath("/WEB-INF/") ;
System.out.println("pathOne="+pathOne+";pathTwo="+pathTwo);
response.getWriter().print("執行:doGet; value:"+value);
}
}
1.3 ServletRequest
HttpServletRequest接口繼承ServletRequest接口,用于封裝請求信息,該對象在用戶每次請求servlet時創建并傳入servlet的service()方法,在該方法中,傳入的servletRequest將會被強制轉化為HttpservletRequest 對象來進行HTTP請求信息的處理。核心作用:
- 獲取請求報文信息;
- 獲取網絡連接信息;
- 獲取請求域屬性信息。
1.4 ServletResponse
HttpServletResponse繼承自ServletResponse,封裝了Http響應信息。客戶端每個請求,服務器都會創建一個response對象,并傳入給Servlet.service()方法。核心作用:
- 設置響應頭信息;
- 發送狀態碼;
- 設置響應正文;
- 重定向;
2.Tomcat的設計
通過上面Servlet規范的介紹,其實我們發下我們要實現Servlet規范的話,很重要的就得提供一個服務容器來獲取請求,解析封裝數據,并調用Servlet實例相關的方法。也就是如下圖中的部分
這塊的內容其實就是Tomcat,具體的我們來看看。
2.1 什么是Tomcat
Tomcat是一個容器,用于承載Servlet,那么我們說Tomcat就是一個實現了部分J2EE規范的服務器。J2 EE和Jakarta EE(Eclipse基金會)這兩是啥?用于Tomcat10以后都是Jakarta EE,而9之前就是J2EE.
2.2 Tomcat的架構結構
我們通過上面的分析,知道Tomcat是一個Servlet規范的實現,要接收請求和響應請求,那么具體是如何實現的呢?這塊我們可以通過conf下的server.xml得出對應的結論。
server.xml是Tomcat中最重要的配置文件,server.xml 的每一個元素都對應了Tomcat 中的一個組件 ;通過對xml文件中元素的配置,可以實現對Tomcat中各個組件的控制。因此,學習server.xml文件的配置,對于了解和使用Tomcat至關重要.
<?xml version="1.0" encoding="UTF-8"?> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <!-- This Realm uses the UserDatabase configured in the global JNDI resources under the key "UserDatabase". Any edits that are performed against this UserDatabase are immediately available for use by the Realm. --> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service> </Server>
極簡模式
<Server> <Service> <Connector /> <Connector /> <Engine> <Host> <Context /><!-- 現在常常使用自動部署,不推薦配置Context元素,Context小節有詳細說明 --> </Host> </Engine> </Service> </Server>
梳理出的結構
對應的每個組件的作用。
2.3 組件分類
官網其實對上面的組件也做了分類:
頂級元素:
- Server:是整個配置文件的根元素
- Service:代表一個Engine元素以及一組與之相連的Connector元素
連接器:
- 代表了外部客戶端發送請求到特定Service的接口;同時也是外部客戶端從特定Service接收響應的接口。
容器:
容器的作用是處理Connector接收進來的請求,并產生對應的響應,Engine,Host和Context都是容器,他們不是平行關系,而是父子關系。
每個組件的作用:
- Engine:可以處理所有請求
- Host:可以處理發向一個特定虛擬主機的所有請求
- Context:可以處理一個特定Web應用的所有請求
核心組件的串聯關系:
當客戶端請求發送過來后其實是通過這些組件相互之間配合完成了對應的操作。
- Server元素在最頂層,代表整個Tomcat容器;一個Server元素中可以有一個或多個Service元素
- Service在Connector和Engine外面包了一層,把它們組裝在一起,對外提供服務。一個Service可以包含多個Connector,但是只能包含一個Engine;Connector接收請求,Engine處理請求。
- Engine、Host和Context都是容器,且Engine包含Host,Host包含Context。每個Host組件代表Engine中的一個虛擬主機;每個Context組件代表在特定Host上運行的一個Web應用.
整體Tomcat的運行架構圖
原文鏈接:https://juejin.cn/post/7132397262948270093
相關推薦
- 2022-05-28 C語言?超詳細講解算法的時間復雜度和空間復雜度_C 語言
- 2022-08-10 Go語言pointer及switch?fallthrough實戰詳解_Golang
- 2022-04-02 python3?QT5?端口轉發工具兩種場景分析_python
- 2022-07-28 ?python中的元類metaclass詳情_python
- 2022-07-25 python數據清洗中的時間格式化實現_python
- 2022-04-09 Mybatis-Plus中dao層、service封裝的方法
- 2022-08-10 C#中通過Command模式實現Redo/Undo方案_C#教程
- 2023-07-06 css flex實現div固定在瀏覽器右下角
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支