Servlet: Server applet
概念:運(yùn)行在服務(wù)器上的一個(gè)小程序(動(dòng)態(tài)資源)
? Servlet是一個(gè)接口,定義了java類(lèi)被瀏覽器訪(fǎng)問(wèn)到的一套規(guī)則(接口)(有了這套規(guī)則如叼,tomcat便可以識(shí)別和創(chuàng)建Servlet)
? 我們只需定義一個(gè)類(lèi)并實(shí)現(xiàn)Servlet接口著角,復(fù)寫(xiě)方法即可癞尚。
快速入門(mén):
? ? ? ? 1.創(chuàng)建javaEE項(xiàng)目
? ? ? ? 2.定義一個(gè)類(lèi)并實(shí)現(xiàn)Servlet接口
? ? ? ? 3.實(shí)現(xiàn)Servlet接口中的抽象方法
? ? ? ? 4.配置Servlet
Servlet執(zhí)行原理: 見(jiàn)圖
Servlet的生命周期:
? 1.被創(chuàng)建:執(zhí)行init()方法只執(zhí)行一次毡惜。
? Servlet對(duì)象什么時(shí)候被創(chuàng)建渊胸?
? 默認(rèn)狀態(tài)下該Servlet第一次被訪(fǎng)問(wèn)時(shí)創(chuàng)建該對(duì)象橱健。
? 如何更改Servlet被創(chuàng)建的時(shí)機(jī)而钞?
? 在<Servlet>標(biāo)簽中設(shè)置<load-on-startup>
? 負(fù)數(shù):第一次被訪(fǎng)問(wèn)時(shí)創(chuàng)建。
? 0或正數(shù):在服務(wù)器啟動(dòng)時(shí)創(chuàng)建拘荡。
? 2.提供服務(wù): 執(zhí)行service()方法臼节,執(zhí)行多次。
? ? 每次訪(fǎng)問(wèn)Servlet時(shí)珊皿,service()方法都會(huì)被調(diào)用一次网缝。
? 3.被銷(xiāo)毀:執(zhí)行destroy()方法,只執(zhí)行一次蟋定。
? 注意:
? ? ?? 1.服務(wù)器關(guān)閉時(shí)Servlet被銷(xiāo)毀粉臊。
? ? ?? 2.只有服務(wù)器正常關(guān)閉時(shí)才會(huì)執(zhí)行destroy()方法。
? ? ?? 3.一般用于關(guān)閉資源驶兜。
Servlet3.0
好處:支持注解配置扼仲。可以不需要web.xml
1.在Servlet實(shí)現(xiàn)類(lèi)上定義注解
@WebServlet("資源路徑")
2.無(wú)需配置web.xml即可訪(fǎng)問(wèn)抄淑。
了解:
? ? String name() default ""; //相當(dāng)于<Servlet-name>
? ? String[] value() default {};//代表urlPatterns()屬性配置
? ? String[] urlPatterns() default {};//相當(dāng)于<url-pattern>
? ? int loadOnStartup() default -1;//相當(dāng)于<load-on-startup>
動(dòng)態(tài)web項(xiàng)目的目錄結(jié)構(gòu):
-- 根目錄
--WEB-INFO目錄
--web.xml:web項(xiàng)目的核心配置文件
--classes目錄:放置字節(jié)碼文件的目錄
--lib目錄:放置依賴(lài)的jar包
Servlet的體系結(jié)構(gòu):
Servlet(接口)
|實(shí)現(xiàn)
GenericServlet(抽象類(lèi))
|繼承
HttpServlet(抽象類(lèi))
GenericServlet: 將Servlet中其它的方法做了空實(shí)現(xiàn)屠凶,繼承自GenericServlet,
只需要重寫(xiě)service()方法即可肆资。
HttpServlet:對(duì)Http協(xié)議進(jìn)行了封裝矗愧,簡(jiǎn)化了操作。
步驟:
? ?? 1.定義一個(gè)類(lèi)并繼承自HttpServlet
? ?? 2.重寫(xiě)doGet()或doPost()方法迅耘。
Servlet的相關(guān)配置:
urlpattern:servlet的訪(fǎng)問(wèn)路徑贱枣。
1.一個(gè)Servlet可以配置多個(gè)訪(fǎng)問(wèn)路徑监署。
?? @webServlet({"/a","/b"});
2.路徑規(guī)則
? ? 1)
/xxx? 路徑匹配 ? ? ? ?
? ?? 2)
? ?? /xxx/xxx 多重路徑
3)
? ? *.do
另:?
/* 所有url都可訪(fǎng)問(wèn)該servlet
注意:具有最低優(yōu)先級(jí)
Request對(duì)象
1.Request和Response對(duì)象的基本原理颤专。
1)Request對(duì)象和Response對(duì)象都是服務(wù)器創(chuàng)建的栖榨。我們只是來(lái)使用他們炬转。
2)Request對(duì)象用來(lái)獲取請(qǐng)求消息矛市。Response對(duì)象用來(lái)設(shè)置響應(yīng)消息啃憎。
2.Request對(duì)象的繼承體系徘公。
ServletRequest(接口)
| 繼承
HttpServletRequest(接口)
| 實(shí)現(xiàn)
? ? ? ? org.apache.catalina.connector.RequestFacade(實(shí)現(xiàn)類(lèi):由Tomcat實(shí)現(xiàn))
3.Request的具體功能
1)獲取請(qǐng)求消息數(shù)據(jù)
1.請(qǐng)求行
GET /day12_http/myhttpservlet1?username=zhangsan HTTP/1.1
相關(guān)方法:
? ? ? ? a.獲取請(qǐng)求方式
? ? ? ? String getMethod();
? ? ? ? b.獲取虛擬目錄
? ? ? ? String getContextPath();
? ? ? ? c.獲取Servlet路徑
? ? ? ? String? getServletPath();
? ? ? ? d.獲取GET請(qǐng)求參數(shù)
? ? ? ? String? getQueryString();
? ? ? ? e.獲取URI: 虛擬路徑+資源路徑?
? ? ? ? 如: day12_http/myhttpservlet1
? ? ? ? String?? getRequestURI():?? day12_http/myhttpservlet1? ? (范圍更大)? ? ? ? 共和國(guó)
? ? ? ? StringBuffer?? getRequestURL():?? http://localhost:8080/day12_http/myhttpservlet1(范圍相對(duì)較小)?? 朝鮮人民民主主義共和國(guó)
? ? ? ? f.獲取協(xié)議版本:? HTTP/1.1
? ? ? ? String? getProtocol();
? ? ? ? g.獲取客戶(hù)機(jī)的ip地址。
? ? ? ? String? ? getRemoteAddr();
2.請(qǐng)求頭
a.獲取所有請(qǐng)求頭名稱(chēng)
Enumeration<String>?? getHeaderNames()
b.通過(guò)請(qǐng)求頭的名稱(chēng)獲取請(qǐng)求頭的值;獭6拍!
String? getHeader(String name)
3.請(qǐng)求體:只有Post方法才有請(qǐng)求體暑塑,在請(qǐng)求體中封裝了請(qǐng)求參數(shù)吼句。
步驟:
? ?? 1.獲取流對(duì)象
? ?? BufferedReader? ? getReader(): 獲取字符輸入流
? ?? ServletInputStream? ? getInputStream():獲取字節(jié)輸入流。
? ?? 2.從流對(duì)象中拿到數(shù)據(jù)
2)其它功能
1.獲取請(qǐng)求參數(shù)數(shù)據(jù):不論get方法還是post方法事格,都可以使用下列方法來(lái)獲取請(qǐng)求參數(shù)惕艳。
a.根據(jù)參數(shù)名稱(chēng)獲取參數(shù)值? username=zhangsan&password=123;
String?? getParameter(String name);
b.根據(jù)參數(shù)名稱(chēng)獲取參數(shù)的數(shù)組。? hobby=xx&hobby=game....
String[]? getParameterValues(String name);
c.獲取所有請(qǐng)求參數(shù)的名稱(chēng)
Enumeration<String>?? getParameterNames();
d.獲取所有參數(shù)的Map集合
Map<String,String[]>? getParameterMap();
注意:Request的中文亂碼問(wèn)題驹愚。
get: tomcat8 已將get中文亂碼問(wèn)題解決远搪。
post: 會(huì)中文亂碼
解決:
? ? ? 在獲取請(qǐng)求參數(shù)前設(shè)置request的請(qǐng)求編碼。
? ? request.setCharacterEncoding("編碼格式");
? ? 注意:編碼格式和前端頁(yè)面一致即可逢捺。?
2.請(qǐng)求轉(zhuǎn)發(fā):服務(wù)器內(nèi)部的資源跳轉(zhuǎn)方式谁鳍。
步驟:
? ? ? 1.通過(guò)request獲取轉(zhuǎn)發(fā)器對(duì)象:? RequestDispater
? ? ? ? RequestDispater? ? ? getRequestDispater();
? ? ? 2.使用轉(zhuǎn)發(fā)器對(duì)象進(jìn)行轉(zhuǎn)發(fā)
forward(request,response);
特點(diǎn):
? ? ?? 1.瀏覽器地址欄不會(huì)發(fā)生改變。
? ? ?? 2.只能轉(zhuǎn)發(fā)到當(dāng)前服務(wù)器內(nèi)部資源劫瞳。
?? 3.轉(zhuǎn)發(fā)只是一次請(qǐng)求倘潜。
3.共享數(shù)據(jù)
域?qū)ο螅阂粋€(gè)有作用范圍的對(duì)象,可以在范圍內(nèi)共享數(shù)據(jù)柠新。
request域:
? ? ? ? ? 代表一次請(qǐng)求的范圍窍荧,一般用于請(qǐng)求轉(zhuǎn)發(fā)的多個(gè)資源共享數(shù)據(jù)。
方法:
? ? ? a.存儲(chǔ)數(shù)據(jù)
? ? ? void?? setAttribute(String name,Object obj)
? ? ? b.通過(guò)鍵來(lái)獲取數(shù)據(jù)
? ? ? Object? getAttribute(String name);
? ? ? c.通過(guò)鍵來(lái)移除鍵值對(duì)
? ? ? ?? void?? removeAttribute(String name);
4.獲取ServletContext
ServletContext域?qū)ο螅捍碚麄€(gè)項(xiàng)目中有效(后邊詳細(xì)講解)
獲取方法:ServletContext? getServletContext();