一肢扯、Servlet定義
Servlet是在服務(wù)器上運(yùn)行的小程序必孤。一個(gè)Servlet就是一個(gè)Java類椰苟,并且可以通過“請求-響應(yīng)”編程模型來訪問的這個(gè)駐留在服務(wù)器內(nèi)存里的Servlet程序
- Tomcat容器等級(jí):
Tomcat容器分為四個(gè)等級(jí)牢贸,- Container 容器句惯,集裝箱
2.Engine 引擎容器
3.Host 主機(jī)()
4.Servlet容器(tomcat最低級(jí)別的容器)里面包含了一個(gè)或多Context
—— Context (上下文,背景输拇,環(huán)境) 一個(gè)context對應(yīng)一個(gè)web項(xiàng)目
—— Wrapper 容器里的封裝部分。
- Container 容器句惯,集裝箱
二贤斜、Servlet層級(jí)關(guān)系:
Servlet(接口)-->GenericServlet(抽象類策吠,與協(xié)議無關(guān)的Servlet)-->HttpServlet(抽象類,實(shí)現(xiàn)了Http協(xié)議的Servlet)-->Custom Servlet(自定義的Servlet)瘩绒。
三猴抹、具體步驟
創(chuàng)建一個(gè)Servlet需要經(jīng)過以下步驟:
(1)新建一個(gè)Java類,繼承“javax.servlet.http.HttpServlet”锁荔;
(2)實(shí)現(xiàn)“doGet()”方法和“doPost()”方法蟀给;
(3)在應(yīng)用配置文件“web.xml”中注冊新建的Servlet;
WebXml配置:
<Servlet>
<Servlet-name>HelloServlet<Servlet-name>
<Servlet-class>所在包.HelloServlet</Servlet-class>
</Servlet>
<Servlet-mapping>
<Servlet-name>HelloServlet</Servlet-name>
<url-patern>/虛擬路徑</url-patern>
</Servlet-mapping>
-
虛擬路徑必須以/開頭阳堕,/表示項(xiàng)目的根目錄跋理。
Paste_Image.png eclipse EE 訪問servlet不用配置web.xml
1、新建servlet的時(shí)候恬总,輸完包名前普、類名,點(diǎn)next壹堰;
2拭卿、這是時(shí)可以看到URL Mappings 為/類名(這里的類名就是步驟1輸入的類名);
3贱纠、假如要通過超鏈接訪問該servlet峻厚,可以這樣寫:<a href="****"></a> ****就是servlet的類名 重啟服務(wù)器!
原理:新建servlet時(shí)生成的URL Mappings跟web.xml文檔中<url-pattern>/****</url-pattern> 的url-pattern作用一樣
四、Servlet生命周期:
- 1.客戶端發(fā)送請求給服務(wù)器谆焊。
- 2.服務(wù)器開始接受惠桃,先判斷該請求的servlet實(shí)例是否存在,如果不存在先裝載一個(gè)servlet類并創(chuàng)建實(shí)例。如果存在則直接調(diào)用該servlet的service方法刽射,之后進(jìn)行判斷是調(diào)用doGet方法還是doPost方法军拟。
- 3.servlet創(chuàng)建實(shí)例后,調(diào)用init方法進(jìn)行初始化誓禁。之后調(diào)用servce方法懈息,判斷是調(diào)用doGet方法還是doPost方法。
- 4.最后判斷服務(wù)是否需要關(guān)閉摹恰,如果需要?jiǎng)t調(diào)用destroy方法辫继。
五、Servlet的裝載三種情況:
- 1俗慈、自動(dòng)裝載:某些Servlet如果需要在Servlet容器啟動(dòng)時(shí)就加載姑宽,需要在web.xml下它的<Servlet>標(biāo)簽里中,添加優(yōu)先級(jí)代碼:
<Servlet>
<load-on-startup>1<load-on-startup>
</Servlet>
數(shù)字越小表示該servlet的優(yōu)先級(jí)越高闺阱,會(huì)先于其他自動(dòng)裝載的優(yōu)先級(jí)較低的先裝載 - 2炮车、Servlet容器啟動(dòng)后,客戶首次向某個(gè)Servlet發(fā)送請求時(shí)酣溃,Tomcat容器會(huì)加載它
- 3瘦穆、當(dāng)Servlet類文件被更新后,也會(huì)重新自動(dòng)加載
注意:
- 1赊豌、Servlet是長期駐留在內(nèi)存里的扛或。某個(gè)Servlet一旦被加載,就會(huì)長期存在于服務(wù)器的內(nèi)存里碘饼,直到服務(wù)器關(guān)閉
- 2熙兔、Servlet被裝載后,Servlet容器創(chuàng)建一個(gè)Servlet實(shí)例并且調(diào)用Servlet的init()方法進(jìn)行初始化艾恼。在Servlet的整個(gè)生命周期內(nèi)住涉,init()方法只被調(diào)用一次
Jsp內(nèi)置對象out與servlet中response.getWriter()獲得對象并不完全匹配,Jsp中是JspWriter類型蒂萎,而servlet中獲得是PrintWriter類型秆吵,其實(shí)一個(gè)是在Jsp中輸出,一個(gè)是在servlet中輸出五慈,類型肯定不一樣纳寂;
request、response內(nèi)置對象可以通過service()方法傳到doGet()泻拦、doPost()里的request毙芜、response來獲取争拐;
session可以通過request.getSession()來獲纫钢唷晦雨;
application可以通過getServletContext()來獲取隘冲;
exception可以通過Throwable 來獲得闹瞧;
page對應(yīng)this對象;
pageContext對象對應(yīng)PageContext對象展辞;
config可以通過getServletConfig()來獲取奥邮。
- 絕對路徑:放在任意位置都正確
- 相對路徑:相對于當(dāng)前資源的路徑
六、Jsp和Servlet跳轉(zhuǎn)問題
一罗珍、JSP跳轉(zhuǎn)到Servlet
- 1洽腺、相對路徑,如href="servlet/TestServlet"
注意:如果寫成"/servlet/TestServlet"會(huì)報(bào)錯(cuò),因?yàn)榈谝粋€(gè)'/'表示的是【服務(wù)器根目錄:http://localhost:8080/】 - 2、絕對路徑,通過內(nèi)置成員變量path實(shí)現(xiàn)蝙茶,如href="<%=path%>/servlet/TestServlet"。
注意:這里的path得到的是項(xiàng)目根目錄藕坯,如【http://localhost:8080/Servlet002_GetFormDemo】
二、Servlet跳轉(zhuǎn)JSP - 1画舌、請求重定向:response.sendRedirect(request.getContextPath()+"/xxx.jsp");這里通過request.getContextPath()方法獲得項(xiàng)目根目錄堕担,或者通過"../xxx.jsp"取得上層路徑得到
- 2、服務(wù)器內(nèi)部轉(zhuǎn)發(fā):request.getRequestDispatcher("../xxx.jsp").forward(req,resp);
小結(jié):都可以通過../xxx.jsp得到