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