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