1.Why?我們為什麼需要Servlet?
1.1 Web應用基本運作模式
①生活中的例子

2. What?什麼是Servlet?
●如果把Web應用比作一個餐廳,Servlet就是餐廳中的服務員——負責接待顧客、上菜、結賬。
●從廣義上來講,Servlet規範是Sun公司制定的一套技術标準,包含與Web應用相關的一系列接口,是Web應用實作方式的宏觀解決方案。而具體的Servlet容器負責提供标準的實作。
●從狹義上來講,Servlet指的是javax.servlet.Servlet接口及其子接口,也可以指實作了Servlet接口的實作類。
●Servlet作為伺服器端的一個元件,它的本意是“伺服器端的小程式”。Servlet的執行個體對象由Servlet容器負責建立;Servlet的方法由容器在特定情況下調用;Servlet容器會在Web應用解除安裝時銷毀Servlet對象的執行個體。
3 How?如何使用Servlet?
3.1 操作步驟
①搭建Web開發環境
②建立動态Web工程
③建立javax.servlet.Servlet接口的實作類:com.atguigu.servlet.MyFirstServlet
④在service(ServletRequest, ServletResponse)方法中編寫如下代碼,輸出響應資訊:
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//1.編寫輸出語句,證明目前方法被調用
System.out.println("Servlet worked...");
//2.通過PrintWriter對象向浏覽器端發送響應資訊
PrintWriter writer = res.getWriter();
writer.write("Servlet response");
writer.close();
}
⑤在web.xml配置檔案中注冊MyFirstServlet
<!-- 聲明一個Servlet元件 -->
<servlet>
<!-- 為Servlet元件指定一個友好名稱,以便于引用 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- 注冊Servlet實作類的全類名 -->
<servlet-class>com.atguigu.servlet.MyFirstServlet</servlet-class>
</servlet>
<!-- 建立一個從虛拟路徑到Servlet元件之間的映射關系 -->
<servlet-mapping>
<!-- 引用Servlet元件名稱 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- 映射到Servlet的虛拟路徑:“/MyFirstServlet” -->
<url-pattern>/MyFirstServlet</url-pattern>
</servlet-mapping>
⑥在WebContent目錄下建立index.html
⑦在index.html中加入超連結
To Servlet⑧點選超連結測試Servlet
3.2 運作分析
4. Servlet技術體系
4.1 Servlet
①Servlet接口
②GenericServlet抽象類
●對Servlet功能進行了封裝和完善,将service(ServletRequest req, ServletResponse res)保留為抽象方法,讓使用者僅關心業務實作即可。
③HttpServlet抽象類
●對GenericServlet進行了進一步的封裝和擴充,更貼近HTTP協定下的應用程式編寫,在service(ServletRequest req, ServletResponse res)方法中,根據不同HTTP請求類型調用專門的方法進行處理。
●今後在實際使用中繼承HttpServlet抽象類建立自己的Servlet實作類即可。重寫doGet(HttpServletRequest req, HttpServletResponse resp)和doPost(HttpServletRequest req, HttpServletResponse resp)方法實作請求處理,不再需要重寫service(ServletRequest req, ServletResponse res)方法了。
4.2 ServletConfig接口:封裝了Servlet配置資訊
4.3 ServletContext接口:封裝了目前Web應用上下文資訊
4.4 HttpServletRequest接口:封裝了HTTP請求資訊,ServletRequest的子接口
4.5 HttpServletResponse接口:封裝了HTTP響應資訊,ServletResponse的子接口
5. Servlet生命周期
5.1 應用程式中的對象不僅在空間上有層次結構的關系,在時間上也會因為處于程式運作過程中的不同階段而表現出不同狀态和不同行為——這就是對象的生命周期。
5.2 Servlet對象是Servlet容器建立的,生命周期方法都是由容器調用的。這一點和我們之前所編寫的代碼有很大不同。在今後的學習中我們會看到,越來越多的對象交給容器或架構來建立,越來越多的方法由容器或架構來調用,開發人員要盡可能多的将精力放在業務邏輯的實作上。
5.3 Servlet生命周期的主要過程
①Servlet對象的建立
預設情況下,Servlet容器第一次收到HTTP請求時建立對應Servlet對象。容器之是以能做到這一點是由于我們在注冊Servlet時提供了全類名,容器使用反射技術建立了Servlet的對象。
②Servlet對象初始化
●Servlet容器建立Servlet對象之後,會調用init(ServletConfig config)方法,對其進行初始化。在javax.servlet.Servlet接口中,public void init(ServletConfig config)方法要求容器将ServletConfig的執行個體對象傳入,這也是我們擷取ServletConfig的執行個體對象的根本方法。
③處理請求
●在javax.servlet.Servlet接口中,定義了service(ServletRequest req, ServletResponse res)方法處理HTTP請求,同時要求容器将ServletRequest對象和ServletResponse對象傳入。
④Servlet對象銷毀
●Web應用解除安裝或伺服器停止執行時會銷毀Servlet對象,而銷毀之前為了執行一些諸如釋放緩存、關閉連接配接、儲存資料等操作,是以設計了public void destroy()方法。
6. ServletConfig接口
6.1 ServletConfig接口封裝了Servlet配置資訊,這一點從接口的名稱上就能夠看出來。但同時,代表目前Web應用的ServletContext對象也封裝到了ServletConfig對象中,使ServletConfig對象成為了擷取ServletContext對象的一座橋梁。
6.2 ServletConfig對象的主要功能
①擷取Servlet友好名稱
②擷取Servlet初始化參數
③擷取ServletContext對象
7. ServletContext接口
7.1 Web容器在啟動時,它會為每個Web應用程式都建立一個對應的ServletContext對象,它代表目前Web應用——作用很像餐廳的經理。
7.2 由于一個Web應用程式中的所有Servlet都共享同一個ServletContext對象,是以ServletContext對象也被稱為 application 對象(Web應用程式對象)。
7.3 在應用程式中能夠擷取運作環境或容器資訊的對象通常稱之為“上下文對象”。
7.4 ServletContext對象的主要功能
①擷取WEB應用程式的初始化參數
●設定Web應用初始化參數的方式是在web.xml的根标簽下加入如下代碼
<!-- Web應用初始化參數 -->
<context-param>
<param-name>ParamName</param-name>
<param-value>ParamValue</param-value>
</context-param>
●擷取Web應用初始化參數
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.擷取ServletContext對象
ServletContext context = this.getServletContext();
//2.擷取Web應用初始化參數
String paramValue = context.getInitParameter("ParamName");
System.out.println("paramValue="+paramValue);
}
②擷取虛拟路徑所映射的本地路徑
●虛拟路徑:浏覽器通路Web應用中資源時所使用的路徑。
●本地路徑:資源在檔案系統中的實際儲存路徑。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.擷取ServletContext對象
ServletContext context = this.getServletContext();
//2.擷取index.html的本地路徑
//index.html的虛拟路徑是“/index.html”,其中“/”表示目前Web應用的根目錄,
//即WebContent目錄
String realPath = context.getRealPath("/index.html");
//realPath=D:\DevWorkSpace\MyWorkSpace\.metadata\.plugins\
//org.eclipse.wst.server.core\tmp0\wtpwebapps\MyServlet\index.html
System.out.println("realPath="+realPath);
}
③application域範圍的屬性
8. HttpServletRequest接口
①該接口是ServletRequest接口的子接口,封裝了HTTP請求的相關資訊,由Servlet容器建立其實作類對象并傳入service(ServletRequest req, ServletResponse res)方法中。以下我們所說的HttpServletRequest對象指的是容器提供的HttpServletRequest實作類對象。
②HttpServletRequest對象的主要功能有
●擷取請求參數。
●在請求域中儲存資料。
●将請求轉發給另外一個URL位址,參見[請求的轉發與重定向]。
●擷取項目虛拟路徑。
9. HttpServletResponse接口
①該接口是ServletResponse接口的子接口,封裝了HTTP響應的相關資訊,由Servlet容器建立其實作類對象并傳入service(ServletRequest req, ServletResponse res)方法中。以下我們所說的HttpServletResponse對象指的是容器提供的HttpServletResponse實作類對象。
②主要功能
●使用PrintWriter對象向浏覽器輸出資料
●實作請求重定向,參見[請求的轉發與重定向]。
10. 請求的轉發與重定向
10.1 請求的轉發與重定向是Servlet控制頁面跳轉的主要方法,在Web應用中使用非常廣泛。
10.2 請求的轉發
①Servlet接收到浏覽器端請求後,進行一定的處理,先不進行響應,而是在伺服器端内部“轉發”給其他Servlet程式繼續處理。在這種情況下浏覽器端隻發出了一次請求,浏覽器位址欄不會發生變化,使用者也感覺不到請求被轉發了。
②轉發請求的Servlet和目标Servlet共享同一個request對象。
③實作轉發的API
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//1.使用RequestDispatcher對象封裝目标資源的虛拟路徑
RequestDispatcher dispatcher = request
.getRequestDispatcher("/index.html");
//2.調用RequestDispatcher對象的forward()方法“前往”目标資源
//[注意:傳入的參數必須是傳遞給目前Servlet的service方法的
//那兩個ServletRequest和ServletResponse對象]
dispatcher.forward(request, response);
}
10.3請求的重定向
①Servlet接收到浏覽器端請求并處理完成後,給浏覽器端一個特殊的響應,這個特殊的響應要求浏覽器去請求一個新的資源,整個過程中浏覽器端會發出兩次請求,且浏覽器位址欄會改變為新資源的位址。
②重定向的情況下,原Servlet和目标資源之間就不能共享請求域資料了。
③實作重定向的API
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//1.調用HttpServletResponse對象的sendRedirect()方法
//2.傳入的參數是目标資源的虛拟路徑
response.sendRedirect("index.html");
}