java程序員第十一課 javaweb之request&response

java程序員第十一課 javaweb之request&response

1、上節內容回顧
1、Response的簡介
http響應裏面
** 響應行
- setStatus()
** 響應頭
- setHeader()
- addHeader()
- 針對特殊類型設置頭

    ** 響應體
        - 頁面顯示的內容
        - 字節流
        - 字符流

2、案例一:使用Response實現登錄重定向
3、案例二:使用Response實現頁面定時刷新
4、案例三:使用Response實現禁用瀏覽器緩存

5、Response向頁面輸出中文亂碼解決(字節流和字符流)
    (1) 使用字節流輸出中文亂碼問題
        - 設置瀏覽器編碼
        - 設置字節數組的編碼

    (2) 使用字符流輸出中文亂碼問題
        - 設置緩衝區的編碼
        - 設置瀏覽器編碼

        - 簡寫方式 setContentType("text/html;charset=utf-8")


    (3) 幾點注意的問題
        * 字節流和字符流互斥
        * 不能直接向頁面輸出數字


7、案例四(**):使用Response實現文件的下載(兩種方式)
    - 使用頭:Content-Disposition: 無論什麼格式的文件,瀏覽器都是以下載方式打開

8、案例五(**):使用Response實現驗證碼的開發
    (1)Response驗證碼的編寫
    (2)Response實現中文驗證碼

9、Request獲得客戶機信息和請求頭信息
    - getHeader方法獲取請求頭信息

10、Request獲取提交的數據
    * getParameter("輸入項裏面name的值")
    * getParameterValues();類似複選框
    * getParameterMap():獲取所有輸入項name名稱和輸入的值

    * getParameterNames()

11、Request獲取提交的中文數據亂碼解決
    (1) post請求中文亂碼解決
        - 設置request緩衝區的編碼

    (2) get請求中文亂碼解決
        - 三種方式
        new String("".getBytes("iso8859-1"),"utf-8");

12、重定向和轉發的區別
    (1) request域
        - 域:在一定的範圍內,存取數據
        * servletContext域:web域
        * request域:一次請求

    (2) 重定向和轉發

13、案例六:使用轉發重寫登錄案例
    - ${msg}

1、jsp入門
* sun公司提供了兩種開發動態網站的技術 servlet jsp
* 使用servlet向頁面輸出內容(html) getWriter().println()

* jsp就是servlet,最終也會被編譯成servlet

* java server pages:java服務器端頁面

** html+java代碼+標籤(el表達式)

* jsp的執行過程:執行jsp時候會編譯成servlet

* 在jsp裏面如何嵌入java代碼
    - 三種方式
    ** <%!  %>
        - 定義的變量是成員變量 

    ** <%=  %>
        - 可以向頁面輸出內容,代碼生成在service方法裏面
        - 生成這樣的一段代碼 out.print("hello" );
        - <%="hello" %>

    ** <%   %>
        - 也會生成到service方法裏面
        - *** 不能定義方法
        - 寫java代碼
        - <%
            for(int i=0;i<5;i++) {

            }
          %>

* 實際開發中,把html代碼和java代碼混合使用
    - 在jsp頁面裏面輸出一個 5行 5列的表格
    -     <table border="1">
        <!-- 循環行  tr-->
        <%
        for(int i=1;i<=5;i++) {
        %>
          <tr>
        <!-- 循環列 td -->
        <%
            for(int j=1;j<=5;j++) {
        %>

            <td>hello</td>
        <%      
            }
         %>
          </tr>
        <%
        }       
        %>
        </table>

2、el的入門
* 表達式:獲取域對象裏面的值
** servletContext
** request

* 語法:${域對象裏面名稱}
*  <!-- 向request域裏面設置值 -->

    <%
    request.setAttribute("msg", "itcast1");

    getServletContext().setAttribute("msg", "itcast2");
     %>
     <!-- 使用傳統方式獲取 -->

     <%=request.getAttribute("msg1") %>
    <%--  <%=getServletContext().getAttribute("msg") %> --%>

    <!-- 
    通過傳統方式獲取域對象裏面的值,如果名稱不存在,得到值 null
    會出現空指針異常
     -->

     <hr/>
     <!-- 使用el表達式獲取 -->   
     <!-- 如何域值名稱相同,通過el表達式獲取是域範圍小的那個裏面的值 -->
     <!-- ${requestScope.msg}
     ${applicationScope.msg}-->
      ${msg1}
      <!-- 
    通過el表達式的方式獲取域對象裏面的值,如果名稱不存在,得到值 "" 空字符串
    不會出現空指針異常
     -->

3、會話管理
* 什麼是會話管理:打開瀏覽器,進行網頁的瀏覽,到關閉瀏覽器的過程。

* 會話管理做什麼事情?

** 畫圖分析:
* servletContext域是否可以存儲購物信息?
    - 不能存儲購物信息
    - 誰先結算,把servletContext裏面的所有商品都結算

* request域是否可以存儲購物信息?
    - 不能存儲購物信息
    - request域是一次請求有效,沒有任何的購物信息

* 會話管理有兩個技術 cookie和session

*** 畫圖分析使用cookie和session如何存儲購物信息?

** cookie:客戶端的技術
    - 發送一個請求,服務器會把購買的東西返回到瀏覽器的內容中(cookie)
    - 發送第二次請求,會帶着第一次返回到瀏覽器的購物信息,把新購買的商品和之前的商品一起返回到瀏覽器的內存中

** session:服務器端的技術
    - 發送一個請求,服務器會分配一個空間,把購物信息放到空間裏面,同時返回一個可以打開這個空間的唯一key(鑰匙)
    - 發送第二次請求,帶着這個key發送請求,使用這個鑰匙打開服務器空間,把新的購物信息放入到空間裏面,返回可以打開這個空間的唯一key(鑰匙)。

4、案例一:使用cookie記錄用戶上次訪問時間
** 畫圖分析實現步驟

** 方法:
    1、獲取cookie: request裏面:Cookie[] getCookies() 
    2、回寫cookie: response裏面:addCookie(Cookie cookie)
    3、創建cookie對象: 構造方法,Cookie(java.lang.String name, java.lang.String value) 

** 步驟:
     * 1、得到cookie
     * 2、判斷是否是第一次訪問  lastVisit
     * ** 如果是第一次訪問,直接頁面輸出歡迎信息
     *  - 同時獲取當前時間,把時間回寫到瀏覽器
     * ** 如果不是第一次,顯示上次訪問時間
     *  - 同時獲取當前時間,把時間回寫到瀏覽器
     */

5、cookie的API的查看
**方法:
- 構造方法:Cookie(java.lang.String name, java.lang.String value)
- 獲取cookie的名稱:getName()
- 獲取cookie的值:getValue()

    *** 更常用的方法
    - setMaxAge(int expiry):設置cookie的有效時長  int expiry: 秒   60*60
        ** 適用於持久化的cookie
    - setPath(java.lang.String uri) :設置cookie的有效路徑

    - setDomain(java.lang.String pattern):設置有效域名

** cookie的分類
    分爲兩類:
    1、會話級別的cookie
        * 關閉瀏覽器之後,cookie銷燬了。默認情況下,是會話級別
    2、持久化的cookie
        * 設置一個有效時長 使用 setMaxAge(秒)  
        * 可以手動銷燬cookie 銷燬之前路徑必須要一致
        *** 創建一個和要銷燬的cookie相同名稱的cookie
                Cookie cookieTime = new Cookie("lastVisit","");
                setMaxAge(0);
                setPath("/");
                response.addCookie(cookieTime); 

        * 設置有效路徑 setPath("/")

** 有效路徑(持久化的cookie)
    * 設置 setPath("/day11"):訪問路徑帶/day11,會攜帶cookie信息

    比如1:
    http://127.0.0.1/day11/aa
    http://127.0.0.1/day12/bb

    比如2:
    setPath("/day11/cc")

    http://127.0.0.1/day11/cc
    http://127.0.0.1/day11/dd

    * 技巧:setPath("/")

** 設置有效域名
    比如:
    http://www.sina.com
    http://sport.sina.com
    http://music.sina.com

    setDomain(".sina.com"); 只有地址欄請求地址包含這個信息,都會攜帶cookie信息

**cookie開發的細節
    1、一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。

    2、一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。

    ******
    3、瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制爲4KB。
    4、如果創建了一個cookie,並將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),        
    用戶退出瀏覽器之後即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,並給出一個以秒爲單位的時間。
    5、刪除持久cookie,可以將cookie最大時效設爲0,注意,刪除cookie時,path必須一致,否則不會刪除

6、案例二:使用cookie記錄用戶瀏覽的商品
* /*
* 1、得到商品的id
* 2、判斷是否第一次瀏覽 his
* * 如果是第一次瀏覽,直接把信息放入到cookie裏面
* * 如果不是第一次,
* - 首先判斷,cookie是否存在前一次訪問商品名稱 his : 1
* - 如果沒有存在,his : 1,2 在前一次cookie之後做一個追加操作
*/

** 清空瀏覽器記錄操作(清空cookie)
    1、創建一個和要刪除的cookie名稱相同的cookie
    2、設置一個相同path
    3、設置有效時間是0
    4、回寫到瀏覽器

    5、回到商品頁面

7、session簡介
** session是服務器端技術,生成一個key(唯一的打開的空間)返回瀏覽器的內存中(使用cookie技術實現返回到瀏覽器的內存中)
- 回寫的key稱爲:jsessionid=key的值

** session如何創建
    request.getSession() 方法可以創建session
    - 第一次訪問request.getSession()創建session

** 創建一個servlet,執行 request.getSession(),查看一下id值

8、案例三:使用session實現購物車功能
* 實現步驟:
· /**
* 1、獲取到id
* 2、得到商品名稱 創建一個數組
*
* 3、判斷是否是第一次購物 (得到session,是否爲空)
- Map

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