Servlet: Server applet
概念:運行在服務器上的一個小程序(動態(tài)資源)
? Servlet是一個接口西篓,定義了java類被瀏覽器訪問到的一套規(guī)則(接口)(有了這套規(guī)則,tomcat便可以識別和創(chuàng)建Servlet)
? 我們只需定義一個類并實現(xiàn)Servlet接口,復寫方法即可。
快速入門:
? ? ? ? 1.創(chuàng)建javaEE項目
? ? ? ? 2.定義一個類并實現(xiàn)Servlet接口
? ? ? ? 3.實現(xiàn)Servlet接口中的抽象方法
? ? ? ? 4.配置Servlet
Servlet執(zhí)行原理: 見圖
Servlet的生命周期:
? 1.被創(chuàng)建:執(zhí)行init()方法只執(zhí)行一次。
? Servlet對象什么時候被創(chuàng)建?
? 默認狀態(tài)下該Servlet第一次被訪問時創(chuàng)建該對象。
? 如何更改Servlet被創(chuàng)建的時機刻剥?
? 在<Servlet>標簽中設置<load-on-startup>
? 負數(shù):第一次被訪問時創(chuàng)建。
? 0或正數(shù):在服務器啟動時創(chuàng)建滩字。
? 2.提供服務: 執(zhí)行service()方法造虏,執(zhí)行多次。
? ? 每次訪問Servlet時麦箍,service()方法都會被調用一次漓藕。
? 3.被銷毀:執(zhí)行destroy()方法,只執(zhí)行一次挟裂。
? 注意:
? ? ?? 1.服務器關閉時Servlet被銷毀享钞。
? ? ?? 2.只有服務器正常關閉時才會執(zhí)行destroy()方法。
? ? ?? 3.一般用于關閉資源诀蓉。
Servlet3.0
好處:支持注解配置栗竖∈畲啵可以不需要web.xml
1.在Servlet實現(xiàn)類上定義注解
@WebServlet("資源路徑")
2.無需配置web.xml即可訪問。
了解:
? ? String name() default ""; //相當于<Servlet-name>
? ? String[] value() default {};//代表urlPatterns()屬性配置
? ? String[] urlPatterns() default {};//相當于<url-pattern>
? ? int loadOnStartup() default -1;//相當于<load-on-startup>
動態(tài)web項目的目錄結構:
-- 根目錄
--WEB-INFO目錄
--web.xml:web項目的核心配置文件
--classes目錄:放置字節(jié)碼文件的目錄
--lib目錄:放置依賴的jar包
Servlet的體系結構:
Servlet(接口)
|實現(xiàn)
GenericServlet(抽象類)
|繼承
HttpServlet(抽象類)
GenericServlet: 將Servlet中其它的方法做了空實現(xiàn)狐肢,繼承自GenericServlet添吗,
只需要重寫service()方法即可。
HttpServlet:對Http協(xié)議進行了封裝处坪,簡化了操作。
步驟:
? ?? 1.定義一個類并繼承自HttpServlet
? ?? 2.重寫doGet()或doPost()方法架专。
Servlet的相關配置:
urlpattern:servlet的訪問路徑同窘。
1.一個Servlet可以配置多個訪問路徑。
?? @webServlet({"/a","/b"});
2.路徑規(guī)則
? ? 1)
/xxx? 路徑匹配 ? ? ? ?
? ?? 2)
? ?? /xxx/xxx 多重路徑
3)
? ? *.do
另:?
/* 所有url都可訪問該servlet
注意:具有最低優(yōu)先級
Request對象
1.Request和Response對象的基本原理部脚。
1)Request對象和Response對象都是服務器創(chuàng)建的想邦。我們只是來使用他們。
2)Request對象用來獲取請求消息委刘。Response對象用來設置響應消息丧没。
2.Request對象的繼承體系。
ServletRequest(接口)
| 繼承
HttpServletRequest(接口)
| 實現(xiàn)
? ? ? ? org.apache.catalina.connector.RequestFacade(實現(xiàn)類:由Tomcat實現(xiàn))
3.Request的具體功能
1)獲取請求消息數(shù)據(jù)
1.請求行
GET /day12_http/myhttpservlet1?username=zhangsan HTTP/1.1
相關方法:
? ? ? ? a.獲取請求方式
? ? ? ? String getMethod();
? ? ? ? b.獲取虛擬目錄
? ? ? ? String getContextPath();
? ? ? ? c.獲取Servlet路徑
? ? ? ? String? getServletPath();
? ? ? ? d.獲取GET請求參數(shù)
? ? ? ? String? getQueryString();
? ? ? ? e.獲取URI: 虛擬路徑+資源路徑?
? ? ? ? 如: day12_http/myhttpservlet1
? ? ? ? String?? getRequestURI():?? day12_http/myhttpservlet1? ? (范圍更大)? ? ? ? 共和國
? ? ? ? StringBuffer?? getRequestURL():?? http://localhost:8080/day12_http/myhttpservlet1(范圍相對較小)?? 朝鮮人民民主主義共和國
? ? ? ? f.獲取協(xié)議版本:? HTTP/1.1
? ? ? ? String? getProtocol();
? ? ? ? g.獲取客戶機的ip地址锡移。
? ? ? ? String? ? getRemoteAddr();
2.請求頭
a.獲取所有請求頭名稱
Enumeration<String>?? getHeaderNames()
b.通過請求頭的名稱獲取請求頭的值E煌!淆珊!
String? getHeader(String name)
3.請求體:只有Post方法才有請求體夺饲,在請求體中封裝了請求參數(shù)。
步驟:
? ?? 1.獲取流對象
? ?? BufferedReader? ? getReader(): 獲取字符輸入流
? ?? ServletInputStream? ? getInputStream():獲取字節(jié)輸入流施符。
? ?? 2.從流對象中拿到數(shù)據(jù)
2)其它功能
1.獲取請求參數(shù)數(shù)據(jù):不論get方法還是post方法往声,都可以使用下列方法來獲取請求參數(shù)。
a.根據(jù)參數(shù)名稱獲取參數(shù)值? username=zhangsan&password=123;
String?? getParameter(String name);
b.根據(jù)參數(shù)名稱獲取參數(shù)的數(shù)組戳吝。? hobby=xx&hobby=game....
String[]? getParameterValues(String name);
c.獲取所有請求參數(shù)的名稱
Enumeration<String>?? getParameterNames();
d.獲取所有參數(shù)的Map集合
Map<String,String[]>? getParameterMap();
注意:Request的中文亂碼問題浩销。
get: tomcat8 已將get中文亂碼問題解決。
post: 會中文亂碼
解決:
? ? ? 在獲取請求參數(shù)前設置request的請求編碼听哭。
? ? request.setCharacterEncoding("編碼格式");
? ? 注意:編碼格式和前端頁面一致即可慢洋。?
2.請求轉發(fā):服務器內部的資源跳轉方式。
步驟:
? ? ? 1.通過request獲取轉發(fā)器對象:? RequestDispater
? ? ? ? RequestDispater? ? ? getRequestDispater();
? ? ? 2.使用轉發(fā)器對象進行轉發(fā)
forward(request,response);
特點:
? ? ?? 1.瀏覽器地址欄不會發(fā)生改變陆盘。
? ? ?? 2.只能轉發(fā)到當前服務器內部資源且警。
?? 3.轉發(fā)只是一次請求。
3.共享數(shù)據(jù)
域對象:一個有作用范圍的對象礁遣,可以在范圍內共享數(shù)據(jù)斑芜。
request域:
? ? ? ? ? 代表一次請求的范圍,一般用于請求轉發(fā)的多個資源共享數(shù)據(jù)祟霍。
方法:
? ? ? a.存儲數(shù)據(jù)
? ? ? void?? setAttribute(String name,Object obj)
? ? ? b.通過鍵來獲取數(shù)據(jù)
? ? ? Object? getAttribute(String name);
? ? ? c.通過鍵來移除鍵值對
? ? ? ?? void?? removeAttribute(String name);
4.獲取ServletContext
ServletContext域對象:代表整個項目中有效(后邊詳細講解)
獲取方法:ServletContext? getServletContext();