JavaWeb組件Servlet使用實(shí)例解析
在JavaWeb中有三大組件,分別是Servlet、Filter和Listener。其中Servlet的作用是處理請(qǐng)求,服務(wù)器會(huì)把接收到的請(qǐng)求交給Servlet來(lái)處理,即接收請(qǐng)求數(shù)據(jù)、處理請(qǐng)求和完成響應(yīng)。
1. 實(shí)現(xiàn)Servlet的方式
主要有三種實(shí)現(xiàn)方式:1)實(shí)現(xiàn)javax.servlet.Servlet接口;2)繼承javax.servlet.GenericServlet類;3)繼承javax.servlet.http.HttpServlet類;其中最常用的繼承HttpServlet類來(lái)實(shí)現(xiàn)。
2. 關(guān)于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接口的源碼,內(nèi)部主要有五個(gè)方法,其中與Servlet生命周期有關(guān)的方法有 init方法、service方法和destroy方法。
1) void init(ServletConfig);它會(huì)在Servlet對(duì)象創(chuàng)建之后馬上執(zhí)行,并且只執(zhí)行一次。
2) void service(ServletRequest,ServletResponse);它會(huì)被調(diào)用多次,每次處理請(qǐng)求都被調(diào)用。
3) void destroy();它會(huì)在Servlet被銷毀之前被Tomcat調(diào)用,并且只執(zhí)行一次。
3. Servlet的創(chuàng)建
服務(wù)器會(huì)在Servlet第一次被訪問(wèn)時(shí)創(chuàng)建Servlet,或者是在服務(wù)器啟動(dòng)時(shí)創(chuàng)建Servlet。如果服務(wù)器啟動(dòng)時(shí)就創(chuàng)建Servlet,那么還需要在web.xml文件中配置。如果 Servlet 的 load-on-startup 配置項(xiàng)大于 0,那么在 Context 容器啟動(dòng)的時(shí)候就會(huì)被實(shí)例化,也就是說(shuō)默認(rèn)情況下,Servlet是在第一次被訪問(wèn)時(shí)由服務(wù)器創(chuàng)建的。而且一個(gè)Servlet類型,服務(wù)器只創(chuàng)建一個(gè)實(shí)例對(duì)象。
4. Servlet與線程安全
因?yàn)橐粋€(gè)類型的Servlet只有一個(gè)實(shí)例對(duì)象,那么就有可能會(huì)現(xiàn)時(shí)出一個(gè)Servlet同時(shí)處理多個(gè)請(qǐng)求,那么Servlet是否為線程安全的呢?答案是:“不是線程安全的”。這說(shuō)明Servlet的工作效率很高,但也存在線程安全問(wèn)題!
所以我們不應(yīng)該在Servlet中隨便創(chuàng)建成員變量,因?yàn)榭赡軙?huì)存在一個(gè)線程對(duì)這個(gè)成員變量進(jìn)行寫操作,另一個(gè)線程對(duì)這個(gè)成員變量進(jìn)行讀操作。
5. Servlet的使用
如果想要瀏覽器可以訪問(wèn)Servlet,需要給Servlet綁定一個(gè)路徑,這個(gè)需要在web.xml中進(jìn)行配置。其中<servlet> 指定HelloServlet這個(gè)Servlet的名稱為hello;<servlet-mapping>:指定/helloworld訪問(wèn)路徑所以訪問(wèn)的Servlet名為hello。<servlet>和<servlet-mapping>通過(guò)<servlet-name>這個(gè)元素關(guān)聯(lián)在一起。
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.Demrystv.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping>
6. 關(guān)于HttpServlet
HttpServlet類是GenericServlet的子類,它提供了對(duì)HTTP請(qǐng)求的特殊支持,所以通常我們都會(huì)通過(guò)繼承HttpServlet來(lái)完成自定義的Servlet。
HttpServlet類是一個(gè)抽象類,但是沒(méi)有抽象方法,必須繼承,實(shí)現(xiàn)doGet或者doPost,但是doGet()或doPost()方法不是抽象方法,默認(rèn)的實(shí)現(xiàn)是給客戶一個(gè)405。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaWeb servlet實(shí)現(xiàn)下載與上傳功能的方法詳解
- javaWeb使用servlet搭建服務(wù)器入門
- javaweb中ajax請(qǐng)求后臺(tái)servlet(實(shí)例)
- javaweb servlet中使用請(qǐng)求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)
- JavaWeb實(shí)現(xiàn)用戶登錄注冊(cè)功能實(shí)例代碼(基于Servlet+JSP+JavaBean模式)
- javaweb Servlet開發(fā)總結(jié)(一)
- javaweb Servlet開發(fā)總結(jié)(二)
- JavaWeb編程 Servlet的基本配置
- Servlet開發(fā)JavaWeb工程示例詳解
相關(guān)文章
Java Spring詳解如何配置數(shù)據(jù)源注解開發(fā)以及整合Junit
Spring 是目前主流的 Java Web 開發(fā)框架,是 Java 世界最為成功的框架。該框架是一個(gè)輕量級(jí)的開源框架,具有很高的凝聚力和吸引力,本篇文章帶你了解如何配置數(shù)據(jù)源、注解開發(fā)以及整合Junit2021-10-10教你Spring如何使用三級(jí)緩存解決循環(huán)依賴
這篇文章主要介紹了Spring使用三級(jí)緩存解決循環(huán)依賴的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決
這篇文章主要介紹了SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java 實(shí)戰(zhàn)范例之線上婚紗攝影預(yù)定系統(tǒng)的實(shí)現(xiàn)
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+javaweb+SSM+springboot+mysql實(shí)現(xiàn)一個(gè)線上婚紗攝影預(yù)定系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11Springboot 如何關(guān)閉自動(dòng)配置
這篇文章主要介紹了Springboot 如何關(guān)閉自動(dòng)配置的操作,具有很好的開車價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java 線程池ThreadPoolExecutor源碼解析
這篇文章主要介紹了Java 線程池ThreadPoolExecutor源碼解析2022-03-03Java?ObjectMapper的使用和使用過(guò)程中遇到的問(wèn)題
在Java開發(fā)中,ObjectMapper是Jackson庫(kù)的核心類,用于將Java對(duì)象序列化為JSON字符串,或者將JSON字符串反序列化為Java對(duì)象,這篇文章主要介紹了Java?ObjectMapper的使用和使用過(guò)程中遇到的問(wèn)題,需要的朋友可以參考下2024-07-07mybatis Interceptor對(duì)UpdateTime自動(dòng)處理的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于使用mybatis Interceptor對(duì)UpdateTime自動(dòng)處理的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-12-12JAVA之讀取properties時(shí)路徑的注意問(wèn)題
這篇文章主要介紹了JAVA之讀取properties時(shí)路徑的注意問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08