您好,登錄后才能下訂單哦!
servlet基礎(chǔ)是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
Servlet是在服務(wù)器上運(yùn)行的一個(gè)小程序,一個(gè)servlet就是一個(gè)java類,并且可以通過“請(qǐng)求-響應(yīng)”編程模型來訪問的這個(gè)駐留在服務(wù)器內(nèi)存里的servlet程序。如下圖所示:
比如說瀏覽器去訪問部署在tomcat中的項(xiàng)目,既然是訪問,總得有一個(gè)訪問地址,而且訪問后要處理的事情處理完了也需要將該返回的東西給到瀏覽器,那么這個(gè)地址是怎么樣的呢?或者說這個(gè)請(qǐng)求是誰處理的呢?這里就需要使用到servlet的了,也就是servlet是用來接收瀏覽器的請(qǐng)求并且最后將結(jié)果返回的那一道處理程序。
servlet是javaWeb的三大組件之一,另外兩個(gè)是Filter(攔截器),Listener(監(jiān)聽器)
tomcat的容器分為四個(gè)等級(jí),分別是container容器->engine容器->host(也就是主機(jī)容器)->servlet容器,等級(jí)是從大到小,也就是前面的容器時(shí)包含后面的容器,servlet容器管理context容器,一個(gè)context(上下文)對(duì)應(yīng)一個(gè)web工程
自定義的類,該類有三種實(shí)現(xiàn)方式
方式一就是編寫一個(gè)類之后去實(shí)現(xiàn)Servlet接口(必須重寫該接口里面所有的抽象方法)
方式二就是編寫一個(gè)類繼承GenericServlet抽象類(重寫生命周期的service方法),GenericServlet抽象類實(shí)現(xiàn)了Servlet接口,還實(shí)現(xiàn)了GenericConfig接口,GenericServlet其實(shí)是定義的一個(gè)一般的、與協(xié)議無關(guān)的servlet。
方式三就是編寫一個(gè)類去繼承HttpServlet抽象類(沒有抽象方法,根據(jù)頁面的提交方式重寫doGet或者doPost方法),HttpServlet這是基于http協(xié)議的,也是使用的最多的。
如果是繼承HttpServlet抽象類就需要重寫doGet()或者doPost()方法,這里取決于使用哪種方式提交,get請(qǐng)求就重寫doGet,post請(qǐng)求就重寫doPost(但是需要注意的是并不是只有這兩種提交方式,還有put,delele請(qǐng)求)。
這里只是重寫doGet或者doPost方法是因?yàn)榧词怪貙憇ervice方法,但是service方法里面也是調(diào)用的doGet或者doPost方法,所以不需要重寫service方法
至于為什么不重寫doPut或doDelete等方法,是因?yàn)樽畛S玫氖莇oPost和doGet,而且使用doPost方法也能實(shí)現(xiàn)doDelet和doPut請(qǐng)求的功能,所以也是沒有必要。
在web.xml中注冊(cè)servlet,主要配置的是servlet和servlet-mapping標(biāo)簽
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--servlet與servlet-mapping一定是成對(duì)出現(xiàn)的,servlet標(biāo)簽是配置servlet處理的類,但是訪問規(guī)則并沒有配置,所以就需要使用servlet-mapping標(biāo)簽來配置--> <servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具體的servlet的類--> <servlet-class>servletPackage.ServletDemo</servlet-class> </servlet> <servlet-mapping> <!--指定與映射的servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--servlet的具體映射路徑--> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
后面的url-pattern其實(shí)是我們配置的訪問路徑,比如這里配置的是/hello,那么在訪問的時(shí)候就需要是http://ip:端口/項(xiàng)目名/hello, 這樣就可以對(duì)應(yīng)到這里的url-pattern,然后通過servlet-mapping里面的servlet-name找到與之匹配的servlet標(biāo)簽里面的servlet-name,這樣就可以找到servlet標(biāo)簽里面的servlet-class(也就是請(qǐng)求的處理類)。
第一種方式就是直接new一個(gè)servlet(這里建立的方式其實(shí)是實(shí)現(xiàn)HttpServlet抽象類)
第二種則是在創(chuàng)建類的時(shí)候?qū)崿F(xiàn)Servlet接口
如果使用第一種方式建立的servlet顯示沒有導(dǎo)包或者第二種方式時(shí)搜索servlet沒有結(jié)果則說明是沒有添加Servlet-api.jar包。 添加方式有兩步:
在eclipse中配置tomcat 在window->perference中添加
第二步就是添加將tomcat添加到運(yùn)行環(huán)境 添加方式是選中項(xiàng)目右鍵打開Properties->java Bulid path->Libraries->Add Libraries->Server Runtime,選擇tomcat服務(wù)器即可。
參考文章
主要是三個(gè)方法 init->service->destory
當(dāng)servlet被第一次訪問的時(shí)候init會(huì)被調(diào)用,說明servlt的實(shí)例默認(rèn)情況下是第一次訪問的時(shí)候被創(chuàng)建的。(但是可以自己修改),該實(shí)例只會(huì)被創(chuàng)建一次。說明servlet的實(shí)例是單例的。
service方法是只要有請(qǐng)求就會(huì)被調(diào)用
當(dāng)服務(wù)器關(guān)閉時(shí)destory方法會(huì)被調(diào)用
上面已經(jīng)說過在默認(rèn)情況下,servlet實(shí)例是在第一次訪問的時(shí)候被創(chuàng)建的,也就是說即使tomcat服務(wù)器已經(jīng)啟動(dòng)了,但是只要沒有請(qǐng)求過來那么servlet實(shí)例還是不會(huì)被創(chuàng)建,不過這一點(diǎn)是可以自己修改的,可以在web.xml中修改:
<servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具體的servlet的類--> <servlet-class>servletPackage.ServletDemo</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
需要注意的是load-on-startup這個(gè)標(biāo)簽的值必須是大于等于0的整數(shù),所有添加了該標(biāo)簽的servlet,都會(huì)在tomcat啟動(dòng)時(shí)創(chuàng)建,該元素的值是一個(gè)序號(hào),tomcat會(huì)使用這個(gè)序號(hào)給多個(gè)servlet排序,然后在tomcat啟動(dòng)時(shí)會(huì)按照這個(gè)順序來創(chuàng)建servlet的實(shí)例對(duì)象。
load-on-startup元素標(biāo)記容器是否在啟動(dòng)的時(shí)候就加載這個(gè)servlet(實(shí)例化并調(diào)用其init()方法)。
它的值必須是一個(gè)整數(shù),表示servlet應(yīng)該被載入的順序
當(dāng)值為0或者大于0時(shí),表示容器在應(yīng)用啟動(dòng)時(shí)就加載并初始化這個(gè)servlet;
當(dāng)值小于0或者沒有指定時(shí),則表示容器在該servlet被選擇時(shí)才會(huì)去加載。
正數(shù)的值越小,該servlet的優(yōu)先級(jí)越高,應(yīng)用啟動(dòng)時(shí)就越先加載。
當(dāng)值相同時(shí),容器就會(huì)自己選擇順序來加載。
在使用HttpServlet時(shí)會(huì)有兩個(gè)init方法,其中一個(gè)含有ServletConfig參數(shù),ServletConfig主要有四個(gè)方法,其中有兩個(gè)方法是獲取初始化參數(shù)的:分別是getInitParameter和getInitParameterNames
String getServletName(); ServletContext getServletContext(); String getInitParameter(String var1); Enumeration<String> getInitParameterNames();
上面講到ServletConfig中有兩個(gè)方法是獲取初始化參數(shù)的,那么什么是初始化參數(shù)呢?其實(shí)就是在servlet標(biāo)簽中的init-param標(biāo)簽里面配置的值:
<servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具體的servlet的類--> <servlet-class>servletPackage.ServletDemo</servlet-class> <init-param> <param-name>username</param-name> <param-value>1341234</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>helloworldnas</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
上面的配置文件中在servlet標(biāo)簽里面配置了兩個(gè)init-param,里面配置的就是初始化參數(shù)。(這里只是示例,初始化參數(shù)一般在框架中使用的比較多)
@Override public void init(ServletConfig config) throws ServletException { String username = config.getInitParameter("username"); String password = config.getInitParameter("password"); System.out.println(username + "," + password); super.init(config); }
上面的代碼就是在init方法里面通過servletConfig對(duì)象獲取配置的參數(shù)。
關(guān)于url-pattern路徑匹配有三種方式:
完全路徑匹配 以/開頭 比如 /aaa /aaa/bbb
目錄匹配 以/開頭 比如 /aaa/* /*
擴(kuò)展名匹配 不能以 /開頭 例如 *.do, *.action
優(yōu)先級(jí):完全路徑匹配>目錄匹配>擴(kuò)展名匹配
web容器在啟動(dòng)時(shí),它會(huì)為每一個(gè) web容器應(yīng)用程序創(chuàng)建一個(gè)對(duì)應(yīng)的servletContext對(duì)象,它代表當(dāng)前web應(yīng)用
由于一個(gè)web應(yīng)用中所有的servlet公用一個(gè)servletContext對(duì)象,因此servlet對(duì)象之間可以通過servletContext對(duì)象來實(shí)現(xiàn)通訊,servletContext對(duì)象通常被稱為context域?qū)ο蟆?/p>
既然servletContext是全局的一個(gè)對(duì)象,那么就可以配置全局的參數(shù),之前在servlet標(biāo)簽里面配置過init-param,但是那里面的參數(shù)只是針對(duì)那一個(gè)servlet有用,如果想要所有的servlet都可以用,那么就需要配置在servletContext中:
<context-param> <param-name>username</param-name> <param-value>13412432</param-value> </context-param> <!--servlet與servlet-mapping一定是成對(duì)出現(xiàn)的,servlet標(biāo)簽是配置servlet處理的類,但是訪問規(guī)則并沒有配置,所以就需要使用servlet-mapping標(biāo)簽來配置--> <servlet> <!--servlet的名字--> <servlet-name>ServletDemo</servlet-name> <!--具體的servlet的類--> <servlet-class>servletPackage.ServletDemo</servlet-class> <init-param> <param-name>username</param-name> <param-value>1341234</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>helloworldnas</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
從上面的配置文件中可以看到在context-param中配置的就是全局的servletContext中的值,然后在ServletContext對(duì)象中獲取,該對(duì)象可以從ServletConfig中得到,當(dāng)然也可以從父類的getServletContext方法中直接獲?。?/p>
public void init(ServletConfig config) throws ServletException { ServletContext servletContext = config.getServletContext(); String username = servletContext.getInitParameter("username"); System.out.println(username); super.init(config); }
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。