servlet基础知识
Servlet Api,運行在客戶端的瀏覽器中。不是獨立的應用程序,沒有main()方法。生存在容器中,由容器管理。Servlet運行在Servlet容器中。
javax.servlet.Servle接口時核心接口,每個servlet類都必須直接或間接的實現(xiàn)該接口
?
Servlet接口:
public void init(ServletConfig config) throws ServletException;
在Servlet實例化后,Servlet容器會調(diào)用該方法來初始化該對象。每個Servlet實例,此方法只調(diào)用一次。ServletConfig,Servlet容器通過這個參數(shù)向Servlet傳毒配置信息;還可以獲取描述Servlet運行環(huán)境的ServletContext對象,使用該對象,Servlet可以和Servlet容器進行通信。
public void service(ServletRequest request, ServletResponse response)
容器通過這個方法處理客戶端的請求,在調(diào)用此方法之前,必須完成init方法。容器構(gòu)造出一個客戶端請求信息的請求對象(ServletRequest--得到客戶端的相關(guān)信息和請求信息)和對客戶端響應的響應對象(ServletResponse--設(shè)置響應頭)作為參數(shù)傳遞給service方法。
public void destroy();
當容器檢測到Servlet對象從服務(wù)器移除時,容器會調(diào)用此方法。客戶端再次請求,Servlet需要重新產(chǎn)生一個Servlet對象處理客戶端的請求。
public ServletConfig getServletConfig();
返回init的一個ServletConfig對象
public String getServletInfo();
返回一個String對象,包括關(guān)于Servlet的信息。
?
?
?
?
ServletRequest接口---定義一個Servlet引擎產(chǎn)生的對象,通過這個對象,Servlet可以獲得客戶端請求的數(shù)據(jù)。這個對象通過讀取請求體的數(shù)據(jù)提供包括參數(shù)的名稱、值和屬性以及輸入流的所有數(shù)據(jù)
ServletResponse接口-- 定義一個Servlet引擎產(chǎn)生的對象,通過這個對象,Servlet對客戶端的請求作出響應。這個響應應該是一個MIME實體,可能是一個HTML頁、圖象數(shù)據(jù)或其他MIME的格式。
?
getAttribute(String name):返回以name為名字的屬性的值,不存在返回nullgetAttributeNames():返回請求中所有可用的屬性名稱,沒有屬性,返回一個空的枚舉集合removeAttribute(String name):移除請求中名字為name的屬性setAttribute(String name, Object o): 請求保存名字為name的屬性,第二個參數(shù)為null,那么相當于removeAttribute。getCharacterEncoding():請求正文使用的字符編碼集。沒有指定則返回nullgetContextType():請求正文的MIME類型。不知道返回nullgetInputStream():返回一個輸入流getParameter(String name):返回請求中name參數(shù)的值,如果有多個值,則返回第一個值。getParameterNames():請求包含的所有的參數(shù)的名字。沒有請求參數(shù),返回空的枚舉集合。getParameterValues(String name):返回name參數(shù)所有的值。?
?
?
GenericServlet類--實現(xiàn)了Servlet接口和SservletConfig接口。
?
GenericServlet類中有兩種init方法: public void init(ServletConfig config) throws SercletException--首先將ServletConfig對象保存在transient實例變量中,然后再調(diào)用不帶參數(shù)的init方法。 public void init() throws SercletException?
?
?
HttpServlet類--這是一個抽象類,用來簡化HTTP Servlet寫作的過程。它是GenericServlet類的擴充,提供了一個處理HTTP協(xié)議的框架。在這個類中的service方法支持例如GET、POST這樣的標準的HTTP方法。
?
在javax.servlet.http包中提供一個抽象的類HttpServlet,繼承GenericServlet類,創(chuàng)建HTTPServlet。這個類沒有抽象方法,所有的方法都已經(jīng)實現(xiàn)。?
?
?
HttpServletRequest接口--用來處理一個對Servlet的HTTP格式的請求信息。
?
HttpServletResponse接口--描述一個返回到客戶端的HTTP回應。這個接口允許Servlet程序員利用HTTP協(xié)議規(guī)定的頭信息。
?
ServletConfig接口--這個接口定義了一個對象,通過這個對象,Servlet引擎配置一個Servlet并且允許Servlet獲得一個有關(guān)它的ServletContext接口的說明。每一個ServletConfig對象對應著一個唯一的Servlet。
?
?
Servlet異常:ServletException和UnavailableException。
Servlet生命周期:
加載和實例化,----Servlet容器負責加載和實例化Servlet。
初始化,----實例化Servlet后,容器必須調(diào)用init()方法初始化這個對象。對于每一個Servlet實例,init方法只能被調(diào)用一次。在初始化期間,Servlet實例可以使用容器為他準備的ServletConfig對象從web應用程序的配置信息(web.xml)中獲取初始化的參數(shù)信息。
請求處理,----Servlet容器調(diào)用Servlet的service方法對請求進行處理。service方法調(diào)用之前,init必須成功執(zhí)行
服務(wù)停止。-----容器檢測到Servlet實例從服務(wù)器中移除的時候,容器就會調(diào)用destroy方法。
Servlet上下文:java servlet api提供了一個ServletContext接口用來表示上下文。ServletContext對象是web服務(wù)器中的一個已知路徑的根。
ServletContext接口:Servlet容器實例化Servlet,向其傳遞ServletConfig對象,通過ServletConfig對象的getServletContext方法得到ServletContext對象。
也可以通過GenericServlet類的getServletContext方法得到ServletContext對象。
?
getAttribute(String name) getAttributeNames() removeAttribute(String name) setAttribute(String name, Object obj) getCcontext(String path):參數(shù)必須以反斜杠開頭,被解釋為相對于服務(wù)器文檔根的路徑。 getInitParameter(String name) getInitParameterNames():可以在web.xml中使用<context-param>元素定義上下文的初始化參數(shù)。?
?
?
請求轉(zhuǎn)發(fā):
RequestDispatcher接口-----RequestDispatcher對象由Servlet容器創(chuàng)建,用于封裝一個路徑所標識的服務(wù)器資源。利用RequestDispatcher對象,可以將請求轉(zhuǎn)發(fā)給其他Servlet或jsp頁面。
forword(ServletRequest request, ServletRsponse response):必須在響應被提交給客戶端之前被調(diào)用,否則會拋出IllegalStateException異常。-----請求轉(zhuǎn)發(fā)
include(ServletRequest request,?ServletRsponse response):-----請求轉(zhuǎn)發(fā)
得到RequestDispatcher對象:一是利用ServletRequest接口中的getRequestDispatcher(相對于上下文路徑,或者相對于當前上下Servlet的路徑。如果有斜杠/,則被解釋為相對于當前上下文根路徑。沒有,則被解釋為相對于當前Servlet的路徑。)方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 二是利用ServletContext接口中的getRequestDispatcher(方法參數(shù)必須以斜杠/開始,被解釋為相對于當前上下文路徑。)和getNameDispatcher
都可以實現(xiàn)獲取相應URL資源。
forward瀏覽器url地址不變,sendRedirect瀏覽器url地址變?yōu)槟康膗rl地址。
HttpServletResponse接口的sendRedirect方法:sendRedirect實現(xiàn)請求重定向。客戶機發(fā)送了兩次請求,接受了兩次。1請求2,2告訴1去請求3,3再把資源響應給1
RequestDispatcher接口的forward方法:forward實現(xiàn)的是請求轉(zhuǎn)發(fā)。客戶機發(fā)送了一次請求,接受一次響應數(shù)據(jù)。1請求2,2去請求3,3再把資源響應給1。
?
重定向--1請求2,2告訴1去請求3,3再把資源響應給1
請求轉(zhuǎn)發(fā)--1請求2,2去請求3,3再把資源響應給1。
?
?
?
與生命周期相關(guān)的方法:在生命的某個特定時刻一定會執(zhí)行某一件事情。
?
資源下載,實現(xiàn)斷點下載:
public class Demo extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //代表下載資源URL url = new URL("http://localhost:8088/day5/a.txt");//打開資源鏈接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//發(fā)送一個帶range的頭conn.setRequestProperty("Range", "bytes=5-");//讀取資源數(shù)據(jù)InputStream in = conn.getInputStream();int len = 0;byte buffer [] = new byte[1024];//寫入到的文件,FileOutputStream out = new FileOutputStream("c:\\a.txt", true);//讀到buffer里面去while((len = in.read(buffer)) > 0){out.write(buffer, 0, len);}in.close();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}?
?
?
在創(chuàng)建servlet的時候,要繼承javax.servlet.GenericServlet,要導入源碼
Servlet接口的實現(xiàn)類:GenericServlet,HttpServlet
HttpServlet--指能夠處理Http請求的servlet,在原有的Servlet接口上添加了一些與HTTP協(xié)議處理的方法,它比Servlet接口的功能更為強大。在編寫servlet時,通常繼承這個類,避免直接實現(xiàn)servlet接口
GenericServlet--在實現(xiàn)servlet接口時,覆寫了service方法。通常只覆寫了doGet和doPost方法。
修改servlet模板:找到myeclipse里面的servlet.xml文件。
?
?
把一個程序映射到多個網(wǎng)頁 <servlet-mapping><servlet-name>Demo</servlet-name><url-pattern>/servlet/Demo</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>Demo</servlet-name><url-pattern>aa.html</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>Demo</servlet-name><url-pattern>1.html</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>Demo</servlet-name><url-pattern>....../*</url-pattern> --無論在地址欄寫入什么都是訪問這個servlet </servlet-mapping> <servlet-mapping><servlet-name>Demo</servlet-name><url-pattern>.....*.html</url-pattern> --無論在地址欄寫入什么都是訪問這個servlet ,多個servlet的時候,誰長的最像,誰就匹配,*在前面的優(yōu)先級最低 </servlet-mapping>?
?
針對客戶端的多次Servlet請求,通常情況下,服務(wù)器只會創(chuàng)建一個Servlet實例對象,也就是Servlet實例對象一旦創(chuàng)建,它就會駐留在內(nèi)存中,為后續(xù)的其他請求服務(wù),知道web容器退出,servlet實例對象才會被銷毀
在servlet整個生命周期內(nèi),Servlet的init方法只被調(diào)用一次。而對一個Servlet的每次訪問請求都導致Servlet
引擎調(diào)用一次servlet的service方法。對于每次訪問請求,servlet引擎都會創(chuàng)建一個HttpServletResponse響應對象,
然后將這兩個對象作為參數(shù)傳遞給它的調(diào)用的Servlet的service方法,service方法再根據(jù)請求方式分別調(diào)用的doxxx方法。
?
如果在<servlet>元素中配置了一個<load-on-startup>元素,那么web應用程序在啟動時,就會裝載并創(chuàng)建servlet的實例方法,以及調(diào)用servlet實例對象的init方法,而不是第一次調(diào)用servlet時創(chuàng)建。
<load-on-startup>數(shù)值-數(shù)值越小,越優(yōu)先創(chuàng)建<load-on-startup>
若果某個servlet的映射路徑僅僅為一個證斜杠(/),那么這個servlet就成為當前web應用程序的缺省servlet。
凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,他們的訪問請求都會將交給缺省servlet處理,也就是說,缺省servlet用于處理所有的其他servlet都不處理的訪問請求
當訪問服務(wù)器中的某個靜態(tài)的html文件和圖片,實際上是在訪問這個缺省servlet
線程安全問題:當很多客戶并發(fā)訪問同一個servlet時,web服務(wù)器會為每一個客戶端的訪問創(chuàng)建一個線程,并且在這個線程上調(diào)用servlet的service方法,因此service方法內(nèi)如果訪問了同一個資源的話,就有可能引發(fā)線程安全問題。
(共享資源)
子類在覆蓋父類方法時,不能拋出比父類更多的異常
?
?
?
<servlet>元素的各個子元素:
?
<description>: 為Servlet指定一個文本描述。 <display-name>: 為Servlet指定一個簡短的名字,這個名字可以被某些工具所顯示。 <icon>: 為Servlet指定一個圖標 <servlet-name>: 指定Servlet的名字,這個名字在同一個Web應用程序中必須是唯一的。 <servlet-class>: 指定Servlet類的完整限定名 <jsp-file>: 指定在Web應用程序中的JSP文件的完整路徑,該路徑以斜杠(/)開始。如果要對一個JSP文件做URL映射,就會用到這個元素。 <init-param>: 定義Servlet的初始化參數(shù)。如果使用了<init-param>元素,則必須包含<param-name>和<param-value>元素,可以包含零個或多個<description>元素。 <description>: 為初始化參數(shù)提供一個文本描述。 <param-name>: 定義初始化參數(shù)的名字。 <param-value>: 定義初始化參數(shù)的值 <load-on-startup>:指定當Web應用程序啟動時,Servlet被加載的次序。元素的內(nèi)容必須是一個整數(shù),如果這個值是一個負數(shù),或者沒有設(shè)定這個元素,Servlet容器將在客戶端首次請求這個Servlet時加載它;如果這個值是正數(shù)或0,容器將在Web應用程序部署時加載和初始化這個Servlet,并且先加載數(shù)值小的Servlet,后加載數(shù)值大的Servlet。如果某個Servlet需要在其他Servlet被加載之前加載,可以在部署描述符中使用這個元素。如果<servlet>元素包含了<jsp-file>元素和<load-on-startup>元素,則JSP文件將被預編譯并加載。 <run-as>: 指定用于執(zhí)行組件的角色。如果使用了<run-as>元素,可以包含零個或多個<description>元素,必須包含<role-name>元素<description>:指定一個文本描述。<role-name>:指定用于執(zhí)行組件的角色名。 <security-role-ref>:聲明在組件或部署的組件的代碼中的安全角色引用。如果使用了<security-role-ref>元素,則必須包含<role-name>元素,可以包含零個或多個<description>元素,零個或一個<role-link>元素。 <description>:為安全角色引用提供一個文本描述。 <role-name>:指定在代碼中使用的安全角色的名字。 <role-link>:指定到一個安全角色的引用。?
?
<servlet-mapping>元素及其子元素:
?
轉(zhuǎn)載于:https://www.cnblogs.com/lcpholdon/p/4340479.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的servlet基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己写一个图片按钮(XAML)
- 下一篇: 通向高可扩展性之路(谷歌篇)