<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Servlet是JavaEE規範中的一種,主要是為了擴充套件Java作為Web服務的功能,統一定義了對應的介面,比如Servlet介面,HttpRequest介面,HttpResponse介面,Filter介面。
然後由具體的服務廠商來實現這些介面功能,比如Tomcat,jetty等。
在規範裡面並不會有具體的實現。
可以自行看下原始碼,而在Servlet規範中規定了一個http請求到來的執行處理流程:
對應的伺服器容器會接收到對應的Http請求,然後解析該請求,然後建立對應的Servlet範例,呼叫對應init方法來完成初始化,把請求的相關資訊封裝為HttpServletRequest物件來呼叫Servlet的service方法來處理請求,然後通過HttpServletResponse封裝響應的資訊交給容器,響應給使用者端。
我們再來回顧下Servlet中的核心API,這塊對我們更好的掌握Tomcat的內容還是非常有幫助的。
API | 描述 |
---|---|
ServletConfig | 獲取servlet初始化引數和servletContext物件。 |
ServletContext | 在整個Web應用的動態資源之間共用資料。 |
ServletRequest | 封裝Http請求資訊,在請求時建立。 |
ServletResponse | 封裝Http響應資訊,在請求時建立。 |
ServletConfig:
容器在初始化servlet時,為該servlet建立一個servletConfig物件,並將這個物件通過init()方法來傳遞並儲存在此Servlet物件中。核心作用:
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); } }
HttpServletRequest介面繼承ServletRequest介面,用於封裝請求資訊,該物件在使用者每次請求servlet時建立並傳入servlet的service()方法,在該方法中,傳入的servletRequest將會被強制轉化為HttpservletRequest 物件來進行HTTP請求資訊的處理。核心作用:
HttpServletResponse繼承自ServletResponse,封裝了Http響應資訊。使用者端每個請求,伺服器都會建立一個response物件,並傳入給Servlet.service()方法。核心作用:
通過上面Servlet規範的介紹,其實我們發下我們要實現Servlet規範的話,很重要的就得提供一個服務容器來獲取請求,解析封裝資料,並呼叫Servlet範例相關的方法。也就是如下圖中的部分
這塊的內容其實就是Tomcat,具體的我們來看看。
Tomcat是一個容器,用於承載Servlet,那麼我們說Tomcat就是一個實現了部分J2EE規範的伺服器。J2 EE和Jakarta EE(Eclipse基金會)這兩是啥?用於Tomcat10以後都是Jakarta EE,而9之前就是J2EE.
我們通過上面的分析,知道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>
梳理出的結構
對應的每個元件的作用。
官網其實對上面的元件也做了分類:
頂級元素:
聯結器:
容器:
容器的作用是處理Connector接收進來的請求,併產生對應的響應,Engine,Host和Context都是容器,他們不是平行關係,而是父子關係。
每個元件的作用:
核心元件的串聯關係:
當用戶端請求傳送過來後其實是通過這些元件相互之間配合完成了對應的操作。
整體Tomcat的執行架構圖
以上就是Tomcat架構設計及Servlet作用規範講解的詳細內容,更多關於Tomcat架構設計Servlet規範的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45