java程序員第九課 javaweb之servlet

day09

1、上節內容回顧
** tomcat安裝
- 使用壓縮文件,解壓到沒有中文和空格的目錄下
- 前提條件:安裝jdk,同時配置JAVA_HOME環境變量
- 啓動:startup.bat

** 端口衝突問題
    - 找到端口進程,結束
    - 修改端口號:在server.xml中進行修改

** 目錄結構
    - bin: 打開和關閉的文件
    - conf:配置文件
    - webapps:部署的項目

** 動態網站的目錄結構
    website
        - WEB-INF(**)
            -- web.xml

            -- classes
            -- lib
** 虛擬路徑
    -- 在server.xml <Context docBase="本地文件夾" path="訪問路徑"></Context>
    -- 找到引擎名稱-主機名稱- 創建一個xml文件,可以使用xml文件名稱進行訪問
        ** <Context docBase="本地文件夾"></Context>

** 網站訪問的過程

** http請求
    - 請求行
    - 請求頭
    - 請求體
        *** 提交數據

    ** Referer: 防盜鏈
    ** User-Agent:獲取瀏覽器信息
    ** If-Modified-Since:本地緩存

** http響應
    - 響應行
        ** 狀態碼
        -- 200 302 304 404 500
    - 響應頭
        ** Refresh
        ** Location
        ** Last-Modified
    - 響應體
        ** 顯示在頁面的內容

2、Servlet快速入門(**)
* 什麼是servlet:通過api文件查看 ,不是jdk,而是javaee文檔。
** servlet是一個運行在web服務器上的java程序。可以接受和響應來自客戶端的請求。

* 實現一個servlet,如何實現?
    ** 可以實現Servlet接口
    ** 繼承GenericServlet和HttpServlet

    ** 在tomcat裏面配置,讓服務器知道這個是一個servlet而不是普通的java程序。

* servlet入門程序:在頁面中輸出內容 hello servlet!
    ** 步驟:
        1、實現servlet
            - 繼承GenericServlet
            - 在頁面上輸出內容:
                -- 使用response裏面的getWriter()方法向頁面輸出
        2、在tomcat中配置,是一個servlet
            - 找到web.xml
            - 加入一個servlet的配置

            - <servlet>
                <servlet-name>helloServlet</servlet-name>
                <servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>
            </servlet>

            <servlet-mapping>
                <servlet-name>helloServlet</servlet-name>
                <url-pattern>/hello</url-pattern>
            </servlet-mapping>

        3、部署到服務器上

        4、訪問servlet
            -直接在地址欄輸入 http://127.0.0.1/servletDemo/hello

3、servlet的執行過程
** 畫圖分析一下過程

4、servlet的生命週期(*)
** 生命週期:從出生到死亡的全過程
** servlet的生命週期:從servlet創建到銷燬這樣的全過程(通過api查看)
** Servlet接口裏面有五個方法,這五個方法有與生命週期相關的方法
- init方法:servlet創建時候執行(執行一次)
- service方法:所有的請求都會執行這個方法(執行多次)
- destroy方法:移除或者銷燬時候執行這個方法(執行一次)
** 訪問servlet時候執行init方法(只會執行一次),每次請求的時候調用service方法(執行多次),
移除或者銷燬(關閉服務器)時候執行destroy方法

5、servlet開發中注意的細節問題(**)
(1)GenericServlet類的init無參數和init有參數方法
* init(ServletConfig config)
* init()
** 使用哪一個?
– init有參數的方法最終也會去執行init沒有參數的方法,
* 所有我們只要使用init沒有參數的方法就可以了

(2)在HttpServlet裏嗎有service方法和doGet doXXX方法
    * service方法會根據提交方式執行不同的方法
    **比如提交方式是get,執行doGet方法,比如提交方式是post,執行doPost方法
*** 實際開發中,一般都是直接繼承HttpServlet來實現servlet開發

(3)HttpServletRequest和ServletRequest關係
    HttpServletResponse和ServletResponse關係
    ** 最開始時候,sun公司設計的,野心的,他們認爲未來互聯網發展可能不僅限於http協議,
    如果增加了新的協議,這個時候都可以使用 ServletRequest和ServletResponse來實現

(4)簡化編程
    ** 比如在doget和dopost裏面實現的功能都是一樣的,這個時候可以使用簡化編程
    ** 可以在dopost裏面直接調用doget方法。比如: this.doGet(request, response);

(5)servlet啓動時候創建
    ** 使用配置方式,在servlet標籤裏面進行配置 
    **  <load-on-startup>2</load-on-startup>;裏面加上一個整數值,數字值越小表示最先創建
    **  <load-on-startup>裏面的值建議一定要大於1
        ×× 會和默認servlet裏面的值有衝突

6、servlet模板修改
** 查看文檔進行修改
** 不要隨便刪除,可以刪除裏面的方法,只保留doget和dopost可以了,註釋可以刪除

7、url-pattern配置
有三種配置方式:
(1)完全路徑匹配 /hello /aa/cc

(2)目錄匹配     /bb/*  /*

(3)擴展名匹配   *.do   *.action

** 比如有這樣的一個路徑 http://127.0.0.1/bb/cc
    - /bb/*  
    - /bb/cc

** 路徑匹配有一個優先級: 完全路徑匹配 > 目錄匹配 > 擴展名匹配
- 看懂ppt上面的例子

8、開發中的路徑問題
* 相對路徑
** 兩個文件在同一個目錄下,可以直接寫文件名稱
- 在webroot下面創建一個html文件,url1.html
在這個頁面裏面訪問servletDemo4,如何訪問(路徑如何寫)?

        * 直接訪問servlet : http://127.0.0.1/day09/ servletDemo4
        * 直接訪問html:     http://127.0.0.1/day09/ url1.html

        *** 可以直接寫servlet路徑 servletDemo4
        *** 還有一種方式  ./servletDemo4

    ** 在上層的目錄下面的情況
        ** 在webroot下面創建一個文件夾path1,在path1裏面創建一個html文件
        在這個頁面裏面訪問servletDemo4,如何訪問(路徑如何寫)?

        * 直接訪問servlet : http://127.0.0.1/day09/  servletDemo4
        * 直接訪問頁面:     http://127.0.0.1/day09/  path1/path1.html

        ** servletDemo4在path1.html所在目錄的上層目錄  ../servletDemo4


    ** 要調用的文件在被調用的上一級目錄,../   上層的上層 ../../

    ** 每次創建不同的文件夾,調用的寫法都不一樣,每次都需要去找路徑是什麼

* 絕對路徑(*****)
    ** 兩種方式
    (1) 直接寫ip+端口+地址 : 比如 http://127.0.0.1/day09/servletDemo4

    (2)直接 工程名 +訪問的路徑  :比如 /day09/servletDemo4

    * 直接訪問servlet  http://127.0.0.1 /day09/servletDemo4
    * 直接訪問頁面 :  http://127.0.0.1 /day09/  path1/path1.html

    ** 在不同的頁面寫法都一樣 ,建議使用 /day09/servletDemo4這種方式來訪問servlet

    * 客戶端路徑和服務器端路徑(****)
        — 客戶端路徑:通過瀏覽器訪問的路徑,帶項目名  /day09/servletDemo4

        - 服務器端路徑:在服務器內部做跳轉操作,不需要帶項目名 /servletDemo4

        ** 重定向 和 轉發
            - 畫圖分析 重定向 和 轉發

    * 在實際開發中,一般使用  /day09/servletDemo4

9、ServletConfig對象(*)
(1)獲取初始化參數(通過初始化參數的名稱獲取到值)

***得到ServletConfig對象,使用getServletConfig();

** getInitParameter(java.lang.String name)
    - 配置初始化參數的方法
    - 找到web.xml裏面servlet標籤 
    -     <!-- 配置初始化參數 -->
        <init-param>
        <!-- 配置參數名稱-->
        <param-name>username</param-name>
        <!-- 配置參數的值 -->
        <param-value>zhangsan</param-value>
        </init-param>

(2)獲取所有的初始化參數的名稱
** getInitParameterNames() 返回 Enumeration
    - Enumeration<String> enumeration = config.getInitParameterNames();
    //遍歷得到名稱,使用getInitParameter得到值
    while(enumeration.hasMoreElements()) {
        //得到初始參數的名稱
        String name = enumeration.nextElement();
        //獲取值
        String value = config.getInitParameter(name);
        System.out.println("value: "+value);
    }

    - 獲取所有初始參數的名稱
    - 遍歷之後得到名稱,
    - 使用getInitParameter根據名稱得到值

(3)獲取ServletContext
** ServletContext getServletContext() 
- //獲取ServletContext對象
ServletContext context = config.getServletContext();
//獲取servletContext對象,直接使用getServletContext();
ServletContext context1 = getServletContext();

(4)獲取servlet名稱
** getServletName() 
- String servletName = config.getServletName();

10、tomcat的jdk配置
** 可以使用myeclipse中tomcat裏面JDK,加入要配置的jdk
* 如果使用手動方式編譯java程序,使用的肯定是本地安裝的jdk
* 如果tomcat運行時候的jdk和編譯使用的jdk不同,運行程序會報錯
** 如何解決:使tomcat運行的jdk和編譯的jdk相同,就可以解決。

11、ServletContext對象(*
** 啓動tomcat時候,tomcat裏面可能有很多的項目,服務器會爲每個項目創建一個唯一的對象ServletContext。

** servletContext作用:可以存取數據,用於存儲全局的數據。
** servletContext有一個有效範圍:整個web項目;如果關閉了服務器,這個時候servletContext裏面的值沒有了。

***** servletContext是一個域對象:
    - 在一定的有效範圍內,可以存取值,一般來講都是使用 setAttribute設置值,使用getAttribute獲取值

** 後面還會學到兩個域對象
    1、request
    2、session

** 在day09裏面,使用servlet1存儲一個值,在day09裏面servlet2裏面也可以取到servlet1存儲一個值

** 通過api查看ServletContext方法
- setAttribute(java.lang.String name, java.lang.Object value) :可以向servletContext裏面存值
    ** setAttribute("name1","zhangsan");
    - //創建servletContext
    ServletContext context = getServletContext();
    //設置值 存值
    context.setAttribute("msg", "itcast");

- getAttribute(java.lang.String name) :從servletContext裏面取值
    ** getAttribute("name1");
    - //創建servletContext
    ServletContext context = getServletContext();
    //取值
    String s = (String) context.getAttribute("msg");

- 獲取全局的初始化參數
** getInitParameter(java.lang.String name): 獲取全局初始化參數
    *** 配置全局初始化參數
    - <context-param>
        <param-name>username1</param-name>
        <param-value>root</param-value>
      </context-param>
       <context-param>
        <param-name>password1</param-name>
        <param-value>1234567890</param-value>
      </context-param>
    * 不能配置在任何一個servlet標籤裏面,web.xml的最上面
    - //獲取servletContext對象
    ServletContext context = getServletContext();
    //使用方法獲取參數值
    String username1 = context.getInitParameter("username1");

** getInitParameterNames() :獲取所有全局初始化參數的名稱
    - //獲取servletContext對象
    ServletContext context = getServletContext();
    //執行方法
    Enumeration<String> enumeration = context.getInitParameterNames();
    //遍歷
    while(enumeration.hasMoreElements()) {
        //獲取每一個name
        String name = enumeration.nextElement();
        //獲取值
        String value = context.getInitParameter(name);
        System.out.println(value);
    }

* 獲取ServletContext對象
** ServletContext getServletContext() 

1、- //獲取ServletContext對象
ServletContext context = config.getServletContext();

2、//獲取servletContext對象,直接使用getServletContext();
ServletContext context1 = getServletContext();

** 操作:
    - 創建servlet1,向servletContext存一個值 msg itcast
    - 創建servlet2,從servletContext取名稱是msg的值

12、案例:統計網站的訪問次數
* 分析開發步驟
- 查看分析的圖片
* 代碼:
- 統計訪問次數的代碼
/
* 1、定義一個變量,放入servletContext裏面
* 2、每次訪問時候從servletContext裏面獲取到值,在這個值基礎之上+1
* 3、再把+1之後的值放回servletContext裏面
*
* */
//創建servletContext
ServletContext context = getServletContext();
//得到count值
int count = (Integer) context.getAttribute(“count”);
//在基礎之上+1
count = count+1;
//把count值放回servletContext裏面
context.setAttribute(“count”, count);

    - 顯示訪問次數
    * //獲取servletContext對象
    ServletContext context = getServletContext();
    //從servletContext裏面取count值
    int count = (Integer) context.getAttribute("count");

** 思考的問題:
    - 有購物網站,最終買的東西肯定要放到購物車,購物車是否可以使用servletContext對象存儲購物信息?

13、使用servletContext讀取web中的文件
(1)使用傳統方式獲取web項目中的文件
** 創建一個properties文件
** 使用Properties類裏面 load方法 load(InputStream inStream)
** 獲取具體的值 getProperty(String key)

(2)使用servletContext讀取web項目中的文件(src下面的文件)
    ** getResourceAsStream(java.lang.String path) :得到文件流
        -讀取src下面的文件:
            //獲取到servletContext對象
            ServletContext context = getServletContext();
            //獲取文件流 getResourceAsStream
            InputStream in = context.getResourceAsStream("/WEB-INF/classes/dbtest.properties");
        ** getResourceAsStream裏面的路徑: 第一個字符是/:理解爲項目名 ,後面加上在tomcat裏面具體的路徑

        - 讀取包裏面的文件
            ** InputStream in = context.
            getResourceAsStream("/WEB-INF/classes/cn/itcast/webfile/dbtestfile.properties");
        ** getResourceAsStream裏面的路徑: 第一個字符是/:理解爲項目名 ,後面加上在tomcat裏面具體的路徑

        - 讀取webroot下面的文件
            ** InputStream in = context.
            getResourceAsStream("/dbtestwebroot.properties");

        ***** 如果文件和webroot是同級目錄,這個時候獲取不到文件內容,因爲本身就沒有發佈到tomcat裏面去


    ** getRealPath(java.lang.String path) :得到文件的完整路徑  帶盤符路徑 
        - String path = context.getRealPath("/dbtestwebroot.properties");
        ** 第一個字符是/:理解爲項目名 ,後面加上在tomcat裏面具體的路徑

        ** I:\tomcat\apache-tomcat-7.0.53\webapps\day09\dbtestwebroot.properties

14、使用類的加載器來讀文件
** 使用範圍:讀取classes下面的文件
- ClassLoader classLoader = this.getClass().getClassLoader();
InputStream in = classLoader.getResourceAsStream(“dbtest.properties”);
** 路徑:相當與classes裏面的文件,直接寫文件名稱

15、默認Servlet介紹
* 比如在頁面隨便輸入一個地址,這個地址肯定是不存在的,頁面返回404 或者返回500
** 這些操作都是默認servlet來實現的

* 如果想要實現一個默認的servlet,直接這樣配置 <url-pattern>/</url-pattern>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章