一、Servlet的簡介
- Servlet的概述
servlet是運行在服務端的java程序 servlet是一套規范(接口) 外界都可以訪問到 - servlet的快速入門
步驟:
(1) 創建一個類 實現servlet
(2)覆蓋servlet接口中的全部方法(尤其是service方法)
(3)需要進行虛擬路徑的配置
web.xml配置部分:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><servlet><!--servlet-name 這里的名字可以任意取,不過需要和 servlet-mapping中的servlet-name匹配每一個Servlet標簽中只能配置一組屬性--><servlet-name>Demo1</servlet-name><!-- 這里需要填寫正確的完整包名來指向java源文件 --><servlet-class>com.heima.servlet.Demo1</servlet-class></servlet><servlet-mapping><!-- 這里的name需要和servlet標簽中的名字匹配 每一個Servlet-mapping 標簽中只能配置一組--><servlet-name>Demo1</servlet-name><!-- 對外訪問的路徑 --><url-pattern>/demo1</url-pattern></servlet-mapping><welcome-file-list><!-- 這里代表的是歡迎頁面,可以自己去尋找 --><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>
Demo1.java工程內容:
package com.heima.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class Demo1 implements Servlet{@Overridepublic void service(ServletRequest req, ServletResponse res)throws ServletException, IOException{// 主要業務處理的地方,每次訪問都會執行PrintWriter writer = res.getWriter();writer.print("<h1>Hello World</h1>");writer.print("<h1>Hello World</h1>");System.out.println(getServletInfo());}@Overridepublic void destroy(){// 服務器正常關閉的時候調用}@Overridepublic void init(ServletConfig arg0) throws ServletException{// 在服務器servlet對象創建的時候執行}@Overridepublic ServletConfig getServletConfig(){// 這個方法用於返回ServletConfig對象,內部封裝的是Servlet配置信息return null;}@Overridepublic String getServletInfo(){// 用來返回Servlet的一些信息return "";}}
由於servlet頁面回寫的時候使用的PrintWrite流,寫出中文由於編碼問題會出現亂碼,可以通過這個方法解決res.setContentType("text/html;charset=utf-8");
二、Servlet的生命周期
- java中的生命周期:對象什么時候創建 什么時候銷毀 這個過程中必然要實行的方法
- servlet對象的生命周期:
創建:默認第一次訪問servlet時創建 創建之后對象駐留在內存中 等待為后面的訪問服務,所以說,servlet對象只有一個。
銷毀:服務器關閉 web應用從服務器中移除
與生命周期想過的方法說明
public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException{// 主要業務處理的地方每次訪問都會執行}@Overridepublic void destroy(){// 服務器正常關閉的時候調用}@Overridepublic void init(ServletConfig arg0) throws ServletException{// 在服務器servlet對象創建的時候執行}
三、Servlet的相關配置文件
- 基本配置
基本格式:
配置servlet的實體:
<servlet><sevlet-name>隨意書寫</servlet-name><servlet-class>servlet類的一個全包名</servlet-class></servlet>
配置servlet的對外訪問的虛擬路徑例子:
<servlet-mapping><sevlet-name>和那么上面的name一致</servlet-name><url-pattern>/虛擬路徑</url-pattern></servlet-mapping>
<servlet><!--servlet-name 這里的名字可以任意取,不過需要和 servlet-mapping中的servlet-name匹配 --><servlet-name>Demo1</servlet-name><!-- 這里需要填寫正確的完整包名來指向java源文件 --><servlet-class>com.heima.servlet.Demo1</servlet-class></servlet><servlet-mapping><!-- 這里的name需要和servlet標簽中的名字匹配 --><servlet-name>Demo1</servlet-name><!-- 對外訪問的路徑 --><url-pattern>/demo1</url-pattern></servlet-mapping>
虛擬路徑的寫法:
完全匹配: 就是客戶端的訪問地址與配置完全一致才可以訪問到
<url-pattern>/demo1</url-pattern>
目錄匹配:以/開始以*結束 /aaa/bbb/*
<url-pattern>/demo1/*</url-pattern>
擴展名匹配:以*開始 以擴展名結束 *.abc ,如果直接寫*.abc那么前面就不需要加/
<url-pattern>/demo1/*.jpg </url-pattern>
注意:目錄匹配和擴展名匹配不能混用 /aaa/bbb/*.abc(錯誤的!!!)
- 服務器一啟動就實例化servlet
格式:寫在Servlet標簽內,<load-on-startup>數字</load-on-startup>
數字代表實例化的順序 數字越小越早創建
<servlet><servlet-name>Demo2</servlet-name><servlet-class>com.heima.servlet.Servlet</servlet-class><load-on-startup>2</load-on-startup></servlet>
- 缺省的servlet
格式:缺省的servlet就是所有的servlet都不匹配 缺省的servlet去負責執行
就是將url-pattern配置成/
<servlet-mapping><servlet-name>Demo2</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
- 歡迎頁面:相當於IIS里面的的默認打開頁面
<welcome-file-list><!-- 這里代表的是歡迎頁面,可以自己去尋找 --><welcome-file>index.jsp</welcome-file></welcome-file-list>
- tomcat默認的全局web.xml
四、Servlet的繼承體系
- 使用IDE工具創建Servlet類和web.xml配置的對應關系

- 我們自己創建servlet的繼承關系
關系:自定義servlet----->HttpServlet------>GenericServlet------>Servlet - service方法的演化過程
servlet接口中service方法
GenericServlet中的service方法
HttpServlet中service方法
這里service調用的是本類中的另外一個重載service方法。
在service(HttpServletRequest,HttpServletResponse)方法中可以進行提交方式的判斷。通過HttpServlet類中的常量來實現。
HttpServlet類中的常量屬性
判斷實現的方式:

- init(ServletConfig config)演變過程
在servlet接口中的init方法
在GenericServlet中的init方法
這個有參方法用來接收Servlet的配置信息,進行賦值
這個無參重載方法主要用於覆寫,切不影響GenericServlet中的一些get方法
問題:有參數的init和無參數的init的關系?
首先他們是重載關系。
有參發放主要用來賦值和調用無參方法。所以在子類中覆蓋覆寫無參方法不影響最有效果。 - destroy()的演變過程
servlet接口中的destroy方法
GenericServlet中的destroy方法
五、ServletConfig對象
- 概述:是Servlet的配置對象 內部封裝的是servlet的配置信息 在web容器調用init方法時 將ServletConfig作為參數進行傳遞
- 怎樣獲取?
通過getServletConfig()
查看GenericServlet的源碼發現。
可以直接返回GenericServlet類中的config變量,該變量在此類中的有參inti方法中進行了賦值。可以直接調用的原因是應為inti的在服務器開啟的時候就自動調用了此方法,所以可以正常服務,而不會去除null值。前提是子類不覆蓋有參inti方法。 - ServletConfig的作用
- 獲取servlet的名稱
ServletConfig sc=getServletConfig();System.out.println(sc.getServletName());
- 獲取初始化參數(多個參數的獲取方式)
設置參數方式:通過init-param來設置參數
ServletConfig sc=getServletConfig();Enumeration <String> names = sc.getInitParameterNames();while(names.hasMoreElements()){String name=names.nextElement();System.out.println(name+" "+sc.getInitParameter(name));}
- 可以獲取web應用的上下文對象 ServletContext

六、ServletContext對象
- 概述
HttpServletservletContext是servlet上下文對象 實質代表web應用上下文對象 對象只有一個 而且所有的servlet共享一個ServletContext
servletContext什么時候創建?
服務器啟動的時候 就會創建ServletContext對象 將這個對象放置在內存中中 供所有的setvlet訪問(有點想靜態變量)
servletContext什么時候銷毀?
關閉服務器時銷毀 web應用新哦那個服務器中移除 - 怎么獲得ServletContext對象
通過servletConfig對象獲得
ServletContext context = getServletConfig().getServletContext();
- ServletContext的作用
- 獲取初始化參數
XML文件設置:
實現代碼:
ServletContext context = getServletConfig().getServletContext();Enumeration <String> enums =context.getInitParameterNames();while(enums.hasMoreElements()){String name=enums.nextElement();System.out.println(name+" "+context.getInitParameter(name));}
- 可以獲取web資源的絕對路徑:context.getRealPath()
重點:getRealPath()相對的位置:相對web應用
ReadFile方法:
public void readFile(String path){BufferedReader bufr;try{bufr = new BufferedReader(new FileReader(path));System.out.println(bufr.readLine());}catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}}
- 可以作為域對象:域對象:代表存儲數據的區域的對象
- context.setAttribute(鍵,值):設置對象的鍵和值
- context.getAttribute(鍵):通過鍵獲取值
ServletContext context =getServletContext();//設置屬性鍵值context.setAttribute("name", "zhansan");//通過鍵獲取值String attribute=(String) context.getAttribute("name");










