Servlet總結 收藏

 Servlet總結 收藏

"*"表示重要性,星號越多越重要

day1
一、 Web應用基礎
1.B-S架構(***)
  架構的發展
  c/s vs. b/s
    c/s架構 (client客戶端-server服務端)
        (胖客戶端:要求客戶端運行業務;把業務放到服務器端,則是瘦客戶端)
        典型的c/s應用:ftp工具、QQ、郵件系統、殺毒軟件...
        1.建立在tcp/ip協議之上,有自己的通信規則(建立業務)
        2.需要相互配合才能完成一個完整業務邏輯
        3.允許多個客戶端程序同時接入一個server程序(併發)
        4.每一個client(機器)都必須安裝客戶軟件
        5.修改了server程序,通常client程序都要修改(升級)
        優點:利用客戶端的計算能力,分擔服務器的負荷(大型網絡遊戲就利用這點)
        缺點:用戶必須安裝客戶端程序;客戶端需要升級(麻煩)
    b/s架構 (browser - web server(cluster集羣))
        (極瘦客戶端:最低限度地減少客戶端程序,只需要browser(瀏覽器))
        1.基於http協議(應用層)
        2.幾乎所有的業務邏輯處理都在server完成
        3.支持併發
        4.client要求很少,只需要安裝browser(瀏覽器)
        5.修改server之後,client不需要任何變化
        6.server端開發技術:html/js,xhtml,... php,asp,jsp,servlet
        缺點:所有業務都在服務器端完成,服務器負荷大。
        優點:支持高併發訪問;不需另外安裝軟件(只需瀏覽器),免去更新的麻煩。

2.開發一個靜態的Web應用(*)
  1)下載一個tomcat服務器
  2)web服務器-Tomcat的啓動和配置(熟練使用和配置)
    先進入Tomcat主目錄下的bin目錄      // %catalina_home%/bin
    window平臺:啓動---startup.bat
               關閉---shutdown.bat
    Linux平臺:啓動---startup.sh 或 catalina.sh run //catalina單次啓動;startup啓動直至shutdown
              關閉---shutdown.sh 或 Ctrl+C
    測試: 打開瀏覽器,訪問 Tomcat 首頁:http://localhost:8080 或者 http://127.0.0.1:8080/
    獲取進程Id強行殺死tomcat進程
       ps ef|grep tomcat ---查看tomcat的進程id
       kill -9 tomcat進程Id號 --- 強行殺死tomcat進程
  3)介紹Web應用的結構
      嚴格定義爲兩部分
    ① Web應用的根目錄下有一個特定的子目錄稱爲WEB-INF,其中包含不能被客戶訪問的專用Web應用程序軟件,
       包括Servlet類文件、部署描述符web.xml、外部庫以及其他任何由此應用程序使用的專用文件。
    ② 所有位於WEB-INF之外的文件都被看作是公共的,它們可以從客戶端被訪問。資源包括HTML頁面、JSP頁面和圖像等。
    web.xml的模板(一個web.xml中可以配置多個Servlet):

        <?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/javaee
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd ">
          <servlet>
            <servlet-name>servlet的名字1</servlet-name>   //servlet的邏輯名
            <servlet-class>servlet類全名1</servlet-class> //類的完全限定名
          </servlet>
          <servlet>
            <servlet-name>servlet的名字2</servlet-name>
            <servlet-class>servlet類全名2</servlet-class>
          </servlet>
        
          <servlet-mapping>
            <servlet-name>servlet的名字1</servlet-name> //要和servlet標籤中的相同
            <url-pattern>指定servlet相對於應用目錄的路徑</url-pattern> //servlet的訪問路徑
          </servlet-mapping>
          <servlet-mapping>
            <servlet-name>servlet的名字2</servlet-name>
            <url-pattern>指定servlet相對於應用目錄的路徑</url-pattern>
          </servlet-mapping>
          <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>//指定默認的歡迎頁面
          </welcome-file-list>
        </web-app>
  4)注意事項


3.介紹Web服務器的一些特點 
    什麼是靜態內容?什麼是動態內容?
      靜態:返回頁面每個客戶端都相同。  動態:各個客戶端的頁面各不相同。
    產生動態內容的Web輔助應用:CGI & Servlet
      CGI(Common Gateway Interface): 可以產生動態內容,跨語言(C/C++, Perl, python...)
          1.本身是一個進程(數據共享,跨進程調用) --性能較差
          2.可移植性很差(本地語言)
          3.安全性差--可以訪問本地的操作系統,容易受黑客攻擊
      web server / servlet container
          1.性能好 --多線程(而不是進程)
          2.可移植性 --相對好
          3.安全性

4.Http基礎(**)
  HTTP(Hyper Text Transfer Protocol)是超文本傳輸協議的縮寫,它用於傳送 WWW 方式的數據。
  HTTP 協議採用了請求/響應模型。基於 TCP/IP 之上的協議,在 Web 上廣泛使用。無狀態。
  如果來自服務器的響應是 html 頁面,那麼 html 內容會嵌入到 Http 響應中。
  Http 會話:是一個簡單的請求-響應序列。
  1)請求響應模型
    請求的關鍵要素:1.http方法(要完成的動作) 2.要訪問的頁面(URL請求) 3.表單參數
    響應的關鍵要素:1.狀態碼(請求是否成功) 2.內容類型(txt,img,html等) 3.返回內容(具體資源:html,圖片等)
  2)URL的分析
    URL(Uniform Resoure Locator)統一資源定位器。Web 上的每一個資源都有唯一的地址,採用的就是 url 格式
  3)使用Http Monitor截獲http的請求與響應信息
    Http 請求方法包括:Get()方法;Post()方法; 其他方法:Head, Trace, Put, Delete, Connect 等
    Get()方法: Http 最簡單的方法,其最主要的任務:從服務器上獲取資源
    Post()方法:更強大的請求方法,不僅可以請求資源,還可以向服務器發送表單數據
  4)分析http請求的信息
    客戶端向服務器發送一個請求,請求頭包含:1.請求的方法; 2.URI; 3.協議版本; 4.以及包含請求修飾符;
                                    5.客戶信息和內容的類似於 MIME 的消息結構
  5)分析http響應的信息
    截獲內容:
        HTTP/1.1 200 OK      // HTTP/1.1 是web服務器使用的版本;200 是狀態碼;OK 是狀態碼的文本版本
        ETag: W/"472-1198101802343"
        Last-Modified: Wed, 19 Dec 2007 22:03:22 GMT
        Content-Type: text/html  // MIME類型:告訴瀏覽器所要接收的是哪一類型的數據。以供瀏覽器顯示。
        Content-Length: 472
        Date: Wed, 19 Dec 2007 22:05:44 GMT
        Server: Apache-Coyote/1.1
        //以上是Http響應的首部
        //響應體中包含了Html以及其他要顯示的內容
        <html><head><title>User Login</title></head>
        <body><center>……</center></body></html>
    Http 響應狀態碼分析(具體代碼含義參看 http 代碼對照表):
        1xx:信息響應類,表示接收到請求並且繼續處理
        2xx:處理成功響應類,表示動作被成功接收、理解和接受
        3xx:重定向響應類,爲了完成指定的動作,必須接受進一步處理
        4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行
            如:404——無法找到,表示無法找到指定位置的資源。
        5xx:服務端錯誤,服務器不能正確執行一個正確的請求


二、Servlet基礎
1.介紹Servlet的基本概念(***)
    (Servlet、Servlet容器、Servlet vs. CGI)——————圖示
  1)它是由 java 編寫的、服務端的小程序。相對而言,Applet和javaScript是客戶端小程序。
  2)基於Http協議的,運行在web服務器內的。Servlet和CGI都是運行在Web服務器上,用來生成Web頁面。
  3)沒有 main 方法。是接受來自網絡的請求(form表單,以及其他的請求),並對不同請求作出不同的響應。
  4)由容器管理和調用。這個web容器可以控制Servlet對象的生命週期,控制請求由Servlet對象處理。
  5)Web 服務器的輔助應用,處理特定的用戶請求,並返回響應。
    web服務器,這裏的服務器不是硬件概念,而是軟件,常用的web服務器有 Tomcat,Jboss等
    Tomcat是一個用java語言編寫的web服務器,所以需要有相應的java運行環境,也就是JVM,還要配置tomcat的具體路徑。
  6)繼承 java 的優點,與協議、平臺無關

2.開發第一個Servlet應用(**)
    Web應用的結構
    開發一個Servlet應用的步驟
    1)建立 Web 應用目錄(注意細節:各目錄的位置、名稱與包含的內容)
    2)編寫 Java 代碼,如:HelloWorld.java
      把生成的.class 文件放置到 WebRoot/WEB-INF/classes 目錄下
    3)編寫配置文件:web.xml
      放置到 WebRoot/WEB-INF/  目錄下
    4)把整個 web 應用放到 %catalina_home%/webapps  //放到 tomcat的 webapps目錄下

3.分析Servlet應用(***)
  1)Servlet的繼承體系
    javax.servlet.Servlet接口 --> GenericServlet抽象類 --> HttpServlet  -->  自定義類
    所有的servlet都必須實現該接口    處理各種協議(包括http)   專職處理http協議  也可繼承GenericServlet
  2)Servlet接口;GenericServlet抽象類;HttpServlet類
    Servlet接口(位置:javax.servlet.Servlet) 定義了特定的生命週期方法:
        init(ServletConfig config)
        service(HttpServletRequest request, HttpServletResponse response)
        destroy()
    GenericServlet implements Servlet
        實現了 init(ServletConfig config)、destroy()等方法;並提供了 init()方法。
        還實現了 ServletConfig 接口。由於這是抽象類,所以必須實現抽象方法:service()
    HttpServlet extends GenericServlet   (位置:javax.servlet.http.HttpServlet)
        具有父類 GenericServlet 類似的方法和對象,是使用 Servlet 編程常用的類
        支持 HTTP 的 post 和 get 等方法。
  3)容器如何找到指定的Servlet?(圖示)
    Servlet有 3 個"名字": url 名、 應用中的邏輯名、 實際的名字
    配置文件 web.xml 都把這幾個名字一一對應起來了
  Servlet是受容器管理的
    request對象、response對象都是容器根據客戶端請求而產生的。
    容器根據url請求,通過DD(web.xml)配置(url名,內部邏輯名,完全限定名)定位具體的servlet。
    容器根據客戶請求創建/分配一個線程,並調用servlet的service()方法,把request對象、respone對象作爲參數傳過去
    service()方法會根據客戶端請求的Http方法調用不同的HttpServlet的方法(doGet(),doPost(),...);
    Servlet使用response對象把處理完的結果響應到客戶端。
    service()方法結束後,線程要麼撤銷,要麼返回容器的線程池;request對象、response對象都被gc回收。

4.使用Servlet來發送用戶輸入的信息
  1)開發用戶登錄的應用
  2)如何使用Form表單來提交數據
     <form action="login" method="POST" enctype="multipart/form-data">
     (1)action: 表單提交給服務器的哪個資源處理
       "login" 爲在 web.xml 中配置的 url-pattern 或者是 jsp、html 文件等。
     (2)Get vs. Post方法的比較(使用Http Monitor)
       GET---->通過 URL 提交表單信息,由於受到 URL 長度的限制,只能傳遞大約 1024(1K)字節。
          通過 http monitor 工具截獲請求信息(下面僅寫出請求行,請求首部略):
          GET /welcome/login.html?username=zhangsan&password=lisi HTTP/1.1
          //GET是請求方式; /welcome/login.html是請求路徑; ?號後面是參數列表,以&分隔; 最後是協議版本
       POST--->通過 Http Body 提交表單信息,傳輸的數據量大,可以達到 2M。
          由請求行、請求首部、消息體 三部分組成。數據包的形式發送。
          參數放在消息體中,長度不再受限,更安全;而 GET 必須把參數放在請求行。
          通過 http monitor 工具截獲請求信息(大略):
          POST /welcome/login.html HTTP/1.1     //請求行
          Accept: ...
          Accept-Language: zh-cn,en-us;q=0.5
          .....
          Host: 127.0.0.1
          .....                                 //從請求行以下到這行,都是請求首部
          username=zhangsan&password=zhangsan   //消息體(有效負載)
       enctype: multipart/form-data :在form中設置此屬性後,傳輸的就是二進制數據,常可用於上傳文件

5.如何在服務器端獲得表單提供的數據
  1)HttpServletRequest 對象
    由 Web Container 封裝了用戶的 Http 請求數據包而生成,可通過它獲得所有跟用戶請求數據報相關的信息。
    getProtocol():String                     ——返回對應的協議       (如:HTTP/1.1)
    getMethod():String                       ——返回 http 對應的方法 (Get|Post)
    getRemoteHost():String                   ——返回遠程主機名       (如:127.0.0.1)
    getRemotePort():int                      ——返回遠程端口號       (如:55013)
    getHeader(String config):String          ——返回http對應的首部信息(參數如Accept-Language)
    getParameter(String name):String         ——返回指定參數(name)的值(value)   (如:zhangsan)
    getParameterValues(String name):String[] ——返回指定輸入參數(名爲 name)的所有值(輸入的參數列表)
    getParameterNames():Enumeration          ——返回請求對象中全部輸入參數的名稱
                                               (如:java.util.Hashtable$Enumerator@1ff395a )
  2)解決 Servlet 的中文亂碼問題
    (1)響應輸出靜態頁面時,處理中文信息亂碼: response.setContentType("text/html; charset=utf-8");
    (2)獲取數據過程中,處理中文輸入亂碼(3 種方法):
       方法一:設置字符編碼來解決 post 方法提交表單中文亂碼問題。
             request.setCharacterEncoding("gbk");
             response.setContentType("text/html;charset=utf-8");
             必須在第一個 request.getParameter("name"); 之前執行上面的語句。
       方法二:重新生成指定編碼的字符串
             String name = new String(request.getParamete("name").getBytes("iso-8859-1"));
       方法三:修改服務器的編碼設置——解決 get 方法提交表單中文亂碼問題
             例如:Tomcat,通過修改%TOMCAT%/conf/server.xml
             加入 URIEncoding="utf-8"
    (3)靜態 html 頁面的中文化問題
       <head>
            <meta http-equiv="content-type" content="text/html; charset=gbk">
       </head>

6.請求路徑
  請求路徑是把請求導向到一個 servlet 來響應服務。它是由幾個重要的部分來組成的。
  通過 HttpRequest 對象,暴露了如下信息(對照應用的目錄結構):
  1)上下文路徑(Context Path)
    該路徑的前綴是和 ServletContext 相關的。
    如果 Context 就是 Web 服務器的 URL 命名空間的缺省的根上下文時,那麼上下文路徑將會是一個空的字符串。
    如果上下文並不是服務器的命名空間的根,則上下文路徑就以“/”開始,但不能以“/”結束。
  2)Servlet 路徑(Servlet Path)
    該路徑就是直接與激活該請求的相應映射,它也是以“/”開頭。
    但要注意的是,如果指定的請求是與“/*”模式相匹配,則此時 Servlet 路徑就是一個空字符串。
  3)路徑信息(PathInfo)
    請求路徑中除了上下文路徑和 Servlet 路徑以外的部分。
    當沒有額外的路徑時路徑信息就是空的(null),或者它會以“/”開始的字符串。
  在 HttpServletRequest 接口中定義如下的方法來訪問請求路徑的相應信息:
    getContextPath();
    getServletPath();
    getPathInfo();
    值得注意的是,請求 URI 和路徑的各部分之間的 URL 編碼的不同之外,下面的等式恆成立:
    requestURI = contextPath + servletPath + pathInfo


Day2
1.配置開發環境
  如何利用IDE開發(構建)一個web project
  部署web project到Tomcat
    ————結果是把WebRoot下的內容打成包,發佈到webapps中
2.在集成環境開發過程中的注意事項
  如果修改了Java文件(修改了方法簽名除外),無需重啓,也無需重部署
  如果修改了html文件,無需重啓,但需要重部署
  修改了web.xml,系統會自動重部署

3.Servlet的生命週期
  生命週期有哪幾個過程(4個)?
  每個過程都對應有特殊的生命週期方法
    裝載&實例化————構造方法
    初始化————————init()       只調用一次,並且在service()之前完成
    處理請求———————service()   處理客戶的請求,每個請求都在單獨的線程中完成,可多次調用
    銷燬——————————destroy()   只調用一次,通常在停止WEB應用或者是Web應用重啓時

  1)實例化(兩種時機):
    A.配置了<load-on-startup>元素,啓動應用時實例化
      其中,配置數值建議從1開始計數,值越小,載入的優先級越高。
      優先級提倡從1開始,1以下的數字,有些容器不理會。負數則被認爲是“默認”。
    B.如果沒有配置,則在第一次請求時才實例化
  2)初始化——init()/init(ServletConfig config)
    實例化之後,容器馬上調用init()方法來初始化。
    對 Servlet 將要使用的資源作初始化,如讀入配置文件信息等(只執行一次)。
    在初始化過程中,容器會創建 ServletConfig 對象並把它作爲 init 方法的參數傳入。
    該配置對象允許 servlet 從訪問 Web 應用的配置信息中讀取出初始化參數的名-值對。
    Servlet 提供2個初始化方法:  init()  和  init(ServletConfig config) 。
  3)請求處理——service()
    初始化後,容器會調用 servlet 的 service()方法,向客戶端提供服務
    service()能夠被多客戶端多次調用(每個請求都要執行一次)
  4)銷燬——destroy()
    在Web Container停止 Web App 或 WebApp 被停止/reload 時調用此方法。

4.ServletConfig & ServletContext
  1)ServletConfig
    servlet訪問配置數據的一個對象,由容器創建,每個servlet獨享
    僅對本 servlet 有效,一個 servlet 的 ServletConfig 對象不能被另一個 servlet 訪問。
    主要用來讀取 web.xml 中配置的Servlet初始信息,不能被其它 Servlet 共享。還可以用於訪問 ServletContext。
  2)ServletContext
    ServletContext 是多個 Servlet 共享數據的對象。
    對同一個 Web 應用中的任何 servlet,在任何時間都有效。
    對應整個 Web Application 運行環境,可以用來讀取 web.xml 中配置的應用初始信息,寫日誌,共享數據等
    ServletContext 被所有 Servlet 共享。可以理解爲真正意義上的全局對象
  3)如何獲取ServletConfig
    A.init(ServletConfig config){.....}
      容器在Servlet初始化之前已經創建了ServletConfig
      但如果Override此方法,需要記得調用:super.init(config);//其實是調用GenericServlet的 init(config)
      //這裏的config只是方法內部的變量。如果其它方法中需調用,還得:this.config=config;給成員變量的config賦值
    B.其他地方(包括在init()方法中),可以使用Servlet API本身的方法
      this.getServletConfig();  //任何方法中都可以調用,包括init(ServletConfig config)方法
    注:這也是爲什麼把這個知識點放在這裏的原因
  4)如何獲取ServletContext
    A.config.getServletContext();//前提是config在之前已獲取
    B.Servlet API提供了  this.getServletContext();//沒有config也可以用
  5)注意:不能在Servlet中使用this.getServletConfig或者this.getServletContext()來初始化成員變量
    因爲創建成員變量優先於構造方法和init方法;而 config 和 context 只有調用了 init 方法之後才初始化
  6)利用ServletContext.log()來寫日誌
    如:this.log("String"+(new Date()));
  7)例子
    使用ServletContext來獲取<context-param>參數
    使用SerlvetConfig來獲取Servlet的<init-param>

5.產生動態內容的另一個方面:根據業務邏輯進行請求傳遞(頁面跳轉)
  RequestDispatcher(請求分發器)
    ————forward(request, response)//跳轉到其他資源
    ————include(request, response)//包含其他資源
  如何獲取RequestDispatcher
    request.getRequestDispatcher(page)
    servletcontext.getRequestDispatcher(page);
    兩者之間的區別?(後面會詳細講述)
6. 網上書店(打折優惠)
  SerlvetConfig來獲取Servlet的<init-param>
  ServletContext來獲取<context-param>參數
  RequestDispatcher進行頁面包含


Day3——————訪問資源,Servlet如何與數據庫構建應用系統
1.兩種訪問DB的方法
  1)直接連接DB,通過JDBC API
  2)配置Tomcat的連接池
    server.xml配置<Resource>
    web.xml:應用引用資源
    init():通過JNDI API來獲取DB Connection
  2種方法都需要在Servlet的init()方法中,把DB Connection注入到Servlet中

2、用Tomcat的jndi服務獲取數據源
    第一步:爲 Tomcat 配置連接池:
        修改tomcat/conf/server.xml
        在<host>節點中加入 Resource 配置
        <Context path="/usermanager">            //Web應用的根
        <Resource
        name="jdbc/tarena"                       //JNDI名字,用於查找
        type="javax.sql.DataSource"              //資源類型
        username="root"
        password="11111111"
        driverClassName="com.mysql.jdbc.Driver"  //JDBC驅動
        maxIdle="10"                             //最大空閒連接數
        maxWait="5000"                           //等待時間,配置爲-1就是無限等待,直到有空閒連接爲止
        url="jdbc:mysql://localhost/tarena"      //連接的 URL
        maxActive="10"/>
        </Context>
    第二步:在應用中配置資源引用 (此步驟可以省略)
        修改web.xml
        <resource-ref>
        <res-ref-name>jdbc/tarena</res-ref-name>    //資源引用名
        <res-type>javax.sql.DataSource</res-type>   //資源的類型
        <res-auth>Container</res-auth>               //Application
        <res-sharing-scope>Shareable</res-sharing-scope> //Unshareable
        </resource-ref>
     第三步:在 Servlet 的 init 方法中通過 JNDI 接口來獲取 DataSource
        Context ctx=new InitialContext();
        DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/tarena");
        Connection con=ds.getConnection();

3.如何構建一個Web應用系統(Servlet + JDBC + DB)
  分層設計的思想:表示層(view) + Dao層
  Servlet層的設計:
    廢棄“爲每個請求提供一個Servlet”的做法,引入Action接口與參數控制
  Dao模式
  工廠模式:DaoFactory

day4 會話管理
     Cookie機制  Session機制
   HTTP協議與狀態保持:Http是一個無狀態協議

1. 實現狀態保持的方案:
   1)修改Http協議,使得它支持狀態保持(難做到)
   2)Cookies:通過客戶端來保持狀態信息
     Cookie是服務器發給客戶端的特殊信息
     cookie是以文本的方式保存在客戶端,每次請求時都帶上它
   3)Session:通過服務器端來保持狀態信息
     Session是服務器和客戶端之間的一系列的交互動作
     服務器爲每個客戶端開闢內存空間,從而保持狀態信息
     由於需要客戶端也要持有一個標識(id),因此,也要求服務器端和客戶端傳輸該標識,
     標識(id)可以藉助Cookie機制或者其他的途徑來保存
2. COOKIE機制
   1)Cookie的基本特點
     Cookie保存在客戶端
     只能保存字符串對象,不能保存對象類型
     需要客戶端瀏覽器的支持:客戶端可以不支持,瀏覽器用戶可能會禁用Cookie
   2)採用Cookie需要解決的問題
     Cookie的創建
       通常是在服務器端創建的(當然也可以通過javascript來創建)
       服務器通過在http的響應頭加上特殊的指示,那麼瀏覽器在讀取這個指示後就會生成相應的cookie了
     Cookie存放的內容
       業務信息("key","value")
       過期時間
       域和路徑
     瀏覽器是如何通過Cookie和服務器通信?
       通過請求與響應,cookie在服務器和客戶端之間傳遞
       每次請求和響應都把cookie信息加載到響應頭中;依靠cookie的key傳遞。
3. COOKIE編程
   1)Cookie類
     Servlet API封裝了一個類:javax.servlet.http.Cookie,封裝了對Cookie的操作,包括:
     public Cookie(String name, String value)  //構造方法,用來創建一個Cookie
     HttpServletRequest.getCookies()           //從Http請求中可以獲取Cookies
     HttpServletResponse.addCookie(Cookie)     //往Http響應添加Cookie
     public int getMaxAge()                    //獲取Cookie的過期時間值
     public void setMaxAge(int expiry)         //設置Cookie的過期時間值
   2)Cookie的創建
     Cookie是一個名值對(key=value),而且不管是key還是value都是字符串
        如: Cookie visit = new Cookie("visit", "1");
   3)Cookie的類型——過期時間
     會話Cookie
        Cookie.setMaxAge(-1);//負整數
        保存在瀏覽器的內存中,也就是說關閉了瀏覽器,cookie就會丟失
     普通cookie
        Cookie.setMaxAge(60);//正整數,單位是秒
        表示瀏覽器在1分鐘內不繼續訪問服務器,Cookie就會被過時失效並銷燬(通常保存在文件中)
     注意:
        cookie.setMaxAge(0);//等價於不支持Cookie;

4. SESSION機制
   每次客戶端發送請求,服務斷都檢查是否含有sessionId。
   如果有,則根據sessionId檢索出session並處理;如果沒有,則創建一個session,並綁定一個不重複的sessionId。
   1)基本特點
     狀態信息保存在服務器端。這意味着安全性更高
     通過類似與Hashtable的數據結構來保存
     能支持任何類型的對象(session中可含有多個對象)
   2)保存會話id的技術(1)
     Cookie
        這是默認的方式,在客戶端與服務器端傳遞JSeesionId
        缺點:客戶端可能禁用Cookie
     表單隱藏字段
        在被傳遞迴客戶端之前,在 form 裏面加入一個hidden域,設置JSeesionId:
        <input type=hidden name=jsessionid value="3948E432F90932A549D34532EE2394" />
     URL重寫
        直接在URL後附加上session id的信息
        HttpServletResponse對象中,提供瞭如下的方法:
         encodeURL(url); //url爲相對路徑
5. SESSION編程
   1)HttpSession接口
     Servlet API定義了接口:javax.servlet.http.HttpSession, Servlet容器必須實現它,用以跟蹤狀態。
     當瀏覽器與Servlet容器建立一個http會話時,容器就會通過此接口自動產生一個HttpSession對象
   2)獲取Session
     HttpServletRequest對象獲取session,返回HttpSession:
       request.getSession();        //表示如果session對象不存在,就創建一個新的會話
       request.getSession(true);    //等價於上面這句;如果session對象不存在,就創建一個新的會話
       request.getSession(false);   //表示如果session對象不存在就返回 null,不會創建新的會話對象
   3)Session存取信息
     session.setAttribute(String name,Object o)  //往session中保存信息
     Object session.getAttribute(String name)    //從session對象中根據名字獲取信息
   4)設置Session的有效時間
     public void setMaxInactiveInterval(int interval)
        設置最大非活動時間間隔,單位秒;
        如果參數interval是負值,表示永不過時。零則是不支持session。
     通過配置web.xml來設置會話超時,單位是分鐘
        <seesion-config>
             <session-timeout>1</session-timeout>
        </session-config>
     允許兩種方式並存,但前者優先級更高
   5)其他常用的API
     HttpSession.invalidate()     //手工銷燬Session
     boolean HttpSession.isNew()  //判斷Session是否新建
         如果是true,表示服務器已經創建了該session,但客戶端還沒有加入(還沒有建立會話的握手)
     HttpSession.getId()          //獲取session的id

6. 兩種狀態跟蹤機制的比較
       Cookie                        Session
    保持在客戶端                     保存在服務器端
    只能保持字符串對象                支持各種類型對象
    通過過期時間值區分Cookie的類型     需要sessionid來維護與客戶端的通信
       會話Cookie——負數                Cookie(默認)
       普通Cookie——正數                表單隱藏字段
       不支持Cookie——0                 url重寫


7. RequestDispatcher.forward(req, resp);    vs.   HttpServletResponse.sendRedirect("url");
   請求分發器 rd.forward(req, resp); 只能訪問內部資源。瀏覽器地址不變。針對同一個請求。
      可獲取表單傳遞過來的信息req.getParameter("name");
      應用內部數據共享的方式  req.getAttribute("name");
   重定向 resp.sendRedirect("url"); 可以跨網站訪問資源。瀏覽器地址會改變。變成另外的一個請求。

8. 相對路徑 與 絕對路徑
   1)形式:
     絕對路徑:以/開頭的路徑
     相對路徑:不是以/開頭的路徑
   2)絕對路徑:
     運行在客戶端時:請求的參考點是站點(站臺)本身;即是 http://localhost:8080/
        如: <form action="/WebTest/login" ...> ...
            路徑等於 http://localhost:8080/WebTest/login
     運行在服務器時:請求相對於應用的根 http://localhost:8080/ 工程/
        web.xml, servlet, jsp... 這些都是運行在服務器端
        如:RequestDispatcher rd = request.getRequestDispatcher(url); //相對路徑,也可以絕對路徑
           RequestDispatcher rd = servletcontext.getRequestDispatcher(url); //只能絕對路徑
   3)相對路徑:
     運行在客戶端時:請求的參考點是應用的當前路徑;即是頁面所在的目錄 http://localhost:8080/ 工程/頁面所在目錄/
        主要用在兩處:
        一是表單中的 action="..."  如: <form action="login" ...> ...
            路徑等於 http://localhost:8080/ 工程/頁面當前目錄/login
        二是在重定向中用 resp.SendRedirect("logon/er.html");
            路徑等於 http://localhost:8080/ 工程/頁面當前目錄/logon /er.html
  運行在服務器時:都是相對於應用的當前路徑;可認爲是直接在當前url後面加上相對路徑
     如: rd.forward("target");

9. 範圍對象   context > session > request > config
   對比HttpSession、HttpServletRequest、ServletContext、ServletConfig的作用範圍
   1)ServletConfig:在一個Servlet實例化後,就創建了一個ServletConfig對象。
     主要用來讀取web.xml中配置的Servlet初始信息,不能被其他Servlet共享。
     作用範圍:處於同一個Servlet中,均起作用。
   2)HttpServletRequest:這是由Web容器對客戶Http請求數據封裝而成的對象,可通過它獲得所有跟客戶請求相關的信息。
     比如Http請求方法(Get or Post)。 注意:request是可以跨Servlet的。
     作用範圍:只要處於同一個請求中,均起作用。
   3)HttpSession: 當瀏覽器與Servlet容器建立一個Http會話時,容器就會通過此接口自動產生一個HttpSession對象。
     作用範圍:處於同一個會話中,均起作用。(用JsessionId標識同一個會話)
   4)ServletContext:對同一個Web應用中的任何Servlet,在任何時候都有效,是一個全局的對象。
     作用範圍:處於同一個Web應用中,均起作用。(不同的session和請求都可用)    


Day5
一、 過濾器 Filter
1. why Filter?
   針對通用WEB服務、功能,透明的處理

2. 什麼是 Servlet Filter?
     過濾是 Servlet 2.3 版才引入的新特性。過濾器可以認爲是實現 Http 請求、響應以及頭信息等內容的傳送的代碼片斷。
     過濾器並不能創建響應,但它可以“過濾”傳給 servlet 的請求,還可以“過濾”從 servlet發送到客戶端的響應;
     它不僅能處理靜態內容,還可以處理動態內容。換而言之,filter 其實是一個“servlet chaining”(servlet 鏈)。
   一個 filter 包括:
    1) 在 servlet 被調用之前截獲;
    2) 在 servlet 被調用之前檢查 servlet request;
    3) 根據需要修改 request 頭和 request 數據;
    4) 根據需要修改 response 頭和 response 數據;
    5) 在 servlet 被調用之後截獲.

3. 過濾器的生命週期
   Filter 組件的生命週期與 Servlet 的類似。
   過濾器有四個階段(與servlet類似):
    1) 實例化;
    2) 初始化(調用init()方法);
    3) 過濾(調用doFilter()方法);
    4) 銷燬(調用destroy()方法);

4. Filter編程
   1)定義Filter(implements Filter)
   2)配置Filter
     配置對哪些資源進行過濾(url)

     <filter>
        <filter-name>Logger</filter-name>                   //過濾器名
        <filter-class>com.LoggerFilter</filter-class>       //具體過濾器類
        <init-param>                                        //初始化參數
           <param-name>xsltfile</param-name>
           <param-value>/xsl/stockquotes.xsl</param-value>
        </init-param>
     </filter>
     <filter-mapping>                
         <filter-name>Logger</filter-name>
         <url-pattern>/*</url-pattern> //將過濾器應用於Web應用中的每個Web資源;可以只指定某個資源
     </filter-mapping>

5. FilterChain
   1) chain是如何配置,順序
      當同一個應用中配置了多個 filter 時,其執行順序是如何的呢?
      答:按 web.xml 中<filter-mapping>的順序來執行的
   2) chain.doFilter(req, resp)
      調用下一個Filter,到最後一個Filter則正式調用 TargetServlet
   3) 調用過程(類似於遞歸調用)

6. Filter的類型
   Filter 有4種類型,主要體現在<filter-mapping>中的<dispatcher>屬性:
   <dispatcher>REQUEST</dispatcher>       默認,客戶端的直接的請求,才觸發該過濾器
   <dispatcher>FORWARD</dispatcher>       servlet 調用 rd.forward(req,resp)時觸發
   <dispatcher>INCLUDE</dispatcher>       servlet 調用 rd.include(req,resp)時觸發
   <dispatcher>ERROR</dispatcher>         發生錯誤,跳轉到錯誤頁面時觸發

二、監聽器 Listener
    Listener 是 Servlet 的監聽器,它可以監聽客戶端的請求、服務端的操作等。通過監聽器,可以自動激發一些操作。
    如:監聽在線的用戶數量。當增加一個session時,就激發sessionCreated(HttpSessionEvent se),給在線人數加1
1. 監聽器的種類
   一共分三大類型,有 8 種 listener:
    a.監聽 servlet context
      1)生命週期事件
        接口: javax.servlet.ServletContextListener
        內容: servlet 上下文已經被創建,並且可以用來向其第一個請求提供服務,或者 servlet 上下文即將關閉
      2)屬性的改變
        接口: javax.servlet.ServletContextAttributeListener
        內容: 在 servlet 上下文中,增加、刪除或者替換屬性
    b.監聽 servlet session
      1)生命週期事件
        接口: javax.servlet.http.HttpSessionListener
        內容: 對一個 HttpSession 對象進行創建、失效處理或者超時處理
      2)屬性改變
        接口: javax.servlet.http.HttpSessionAttributeListener
        內容: 在 servlet 會話中,增加、刪除或者替換屬性
      3)會話遷移
        接口: javax.servlet.http.HttpSessionActivationListener
        內容: HttpSession 被激活或者鈍化
      4)對象綁定
        接口: javax.servlet.http.HttpSessionBindingListener
        內容: 對 HttpSession 中的對象進行綁定或者解除綁定
    c.監聽 servlet request
      1)生命週期
        接口: javax.servlet.ServletRequestListener
        內容: 一個 servlet 請求開始由 web 組件處理
      2)屬性改變
        接口: javax.servlet.ServletRequestAttributeListener
        內容: 在 ServletRequest 中,增加、刪除或者替換屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章