摘要:使用技術(shù)開發(fā)應(yīng)用程序深入了解的機(jī)制對應(yīng)用的開發(fā)將有重要的推動作用而想深入了解的機(jī)制就不得不了解包包中包含了個(gè)接口個(gè)類和個(gè)異常類它們分別是接口和類和異常類和的生命周期在的接口中定義了一個(gè)的生命周期方法分別是和演示了生命周期方法的簡單在中如何獲
使用 Java 技術(shù)開發(fā) WEB 應(yīng)用程序 , 深入了解 Servlet 的機(jī)制對應(yīng)用的開發(fā)將有重要的推動作用 . 而想深入了解 Servlet 的機(jī)制就不得不了解 javax.servlet 包 .
javax.servlet 包中包含了 7 個(gè)接口 ,3 個(gè)類和 2 個(gè)異常類 , 它們分別是 :
接口 :RequestDispatcher,Servlet,ServletConfig,ServletContext,ServletRequest,ServletResponse 和 SingleThreadModel
類 :GenericServlet,ServletInputStream 和 ServletOutputStream
異常類 :ServletException 和 UnavailableException
Servlet 的生命周期
在 Servlet 的接口中定義了一個(gè) Servlet 的生命周期方法 , 分別是 Init,Service 和 Destroy
演示了 Servlet 生命周期方法的簡單 Servlet:
import javax.servlet.*; import java.io.IOException; public class PrimitiveServlet implements Servlet { public void init(ServletConfig config) throws ServletException { System.out.println("init"); } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("service"); } public void destroy() { System.out.println("destroy"); } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
在 Servlet 中如何獲取 ServletConfig 對象 ?
在 Servlet 的 Init 方法中 ,Servlet Container 將會傳入一個(gè) ServletConfig 對象 , 開發(fā)人員可以通過這個(gè)對象獲取在 web.xml 文件中定義的 Servlet 初始化參數(shù) .
下面是一個(gè)獲取 Servlet 初始參數(shù)的示例 :
import javax.servlet.*; import java.util.Enumeration; import java.io.IOException; public class ConfigDemoServlet implements Servlet { public void init(ServletConfig config) throws ServletException { Enumeration parameters = config.getInitParameterNames(); while (parameters.hasMoreElements()) { String parameter = (String) parameters.nextElement(); System.out.println("Parameter name : " + parameter); System.out.println("Parameter value : " + config.getInitParameter(parameter)); } } public void destroy() { } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
如何獲取 ServletContext 對象 ?
可以通過 ServletConfig 對象的 getServletContext 方法獲取 ServletContext 對象
import javax.servlet.*; import java.util.Enumeration; import java.io.IOException; public class ContextDemoServlet implements Servlet { ServletConfig servletConfig; public void init(ServletConfig config) throws ServletException { servletConfig = config; } public void destroy() { } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { ServletContext servletContext = servletConfig.getServletContext(); Enumeration attributes = servletContext.getAttributeNames(); while (attributes.hasMoreElements()) { String attribute = (String) attributes.nextElement(); System.out.println("Attribute name : " + attribute); System.out.println("Attribute value : " + servletContext.getAttribute(attribute)); } System.out.println("Major version : " + servletContext.getMajorVersion()); System.out.println("Minor version : " + servletContext.getMinorVersion()); System.out.println("Server info : " + servletContext.getServerInfo()); } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }
如何在 Servlet 之間共享信息 ?
我們可以通過 ServletContext 來維護(hù)在不同 Servlet 之間共享的信息 .
如何解決 Servlet 的多 Thread 問題 ?
如果 Servlet 需要讀寫外部資源 , 我們需要考慮 Thread 的問題 , 我們可以使用聲明性接口 SingleThreadModel 來避免多 Thread 之間的資源沖突問題 . 但是需要注意的是 , 如果 Servlet 僅僅只是讀外部資源的話 , 我們通常不應(yīng)該實(shí)現(xiàn)這個(gè)接口 . 如果實(shí)現(xiàn)這個(gè)接口 ,Servlet 在同一時(shí)刻只能服務(wù)一個(gè)用戶請求 , 后至的用戶請求必須在隊(duì)列中等待
HttpServlet容器響應(yīng)Web客戶請求流程如下:
1)Web客戶向Servlet容器發(fā)出Http請求;
2)Servlet容器解析Web客戶的Http請求;
3)Servlet容器創(chuàng)建一個(gè)HttpRequest對象,在這個(gè)對象中封裝Http請求信息;
4)Servlet容器創(chuàng)建一個(gè)HttpResponse對象;
5)Servlet容器調(diào)用HttpServlet的service方法,這個(gè)方法中會根據(jù)request的Method來判斷具體是執(zhí)行doGet還是doPost,把HttpRequest和HttpResponse對象作為service方法的參數(shù)傳給HttpServlet對象;
6)HttpServlet調(diào)用HttpRequest的有關(guān)方法,獲取HTTP請求信息;
7)HttpServlet調(diào)用HttpResponse的有關(guān)方法,生成響應(yīng)數(shù)據(jù);
8)Servlet容器把HttpServlet的響應(yīng)結(jié)果傳給Web客戶。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/68691.html
摘要:系列文章請查看超詳細(xì)的面試題總結(jié)一之基礎(chǔ)知識篇超詳細(xì)的面試題總結(jié)二之基礎(chǔ)知識篇超詳細(xì)的面試題總結(jié)三之集合篇常見問題下面的都是自己之前在學(xué)習(xí)的時(shí)候總結(jié)的,對于鞏固的基礎(chǔ)知識應(yīng)該有很大幫助。注意多線程的并發(fā)的讀寫類屬性會導(dǎo)致數(shù)據(jù)不同步。 系列文章請查看: 超詳細(xì)的Java面試題總結(jié)(一)之Java基礎(chǔ)知識篇 超詳細(xì)的Java面試題總結(jié)(二)之Java基礎(chǔ)知識篇 超詳細(xì)的Java面試題總結(jié)(...
摘要:當(dāng)后繼請求相同的頁面時(shí),容器加載之前生成的類,并且通知去執(zhí)行已經(jīng)存在的字節(jié)碼,從而省去了轉(zhuǎn)換的過程,這也是第一次執(zhí)行頁面時(shí)間較長的原因。 以往學(xué)習(xí)的時(shí)候大多是看完書或者看完視頻,動手實(shí)踐一下就OK了。然而過了一段時(shí)間我發(fā)現(xiàn)東西都忘差不多了,需要復(fù)習(xí)才能重新掌握。現(xiàn)在開始學(xué)習(xí)JavaWeb了,我將在這里記錄自己的學(xué)習(xí)的一點(diǎn)一滴,不僅便于自己以后回顧知識點(diǎn),也希望能對JavaWeb初學(xué)者有...
摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號:Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡單 注解就這么簡單 Druid數(shù)據(jù)庫連接池...
摘要:編程思想第版這本書要常讀,初學(xué)者可以快速概覽,中等程序員可以深入看看,老鳥還可以用之回顧的體系。以下視頻整理自慕課網(wǎng)工程師路徑相關(guān)免費(fèi)課程。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識點(diǎn)以及面試問題,目前已經(jīng)開源,會一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java-Guide 筆者建議初學(xué)者學(xué)習(xí)Java的方式:看書+視頻+實(shí)踐(初...
摘要:幸好,給我們提供了過濾器解決這個(gè)問題。可以將一個(gè)或多個(gè)過濾器附加到一個(gè)或一組。同樣的,過濾器是可用于編程的類,也需要在中聲明的。用戶訪問后續(xù)過濾器。過濾器和攔截器是兩個(gè)完全不同的概念。 聽說你改bug很厲害,幫我改一個(gè)吧????showImg(https://segmentfault.com/img/bVMsm7?w=402&h=223); 上一章我們講到了Servlet請求,可以通過...
閱讀 3571·2021-11-18 10:02
閱讀 1668·2021-10-12 10:12
閱讀 3077·2021-10-09 09:53
閱讀 5154·2021-09-09 09:34
閱讀 1033·2021-09-06 15:02
閱讀 2839·2021-08-05 10:02
閱讀 3250·2019-08-30 15:44
閱讀 3180·2019-08-28 18:04