2015/1/21
## 回顧昨天案例 ##
# 模擬購物車;
>> 基本步驟;
|-- 顯示所有的書籍;
|-- 制作書記列表/模仿數據庫;
|-- 參見昨天示例;
|-- 制作查看詳情鏈接;
|-- 參見昨天示例;
|-- 顯示購物車中的所有商品;
|-- request.getSession(); --- 得到session對象;
|-- 假定購物車的名字 "cart";
|-- 用集合制作購物車;
|-- 可以用泛型限定購買的商品類型;
|-- 遍歷;
|-- 先判斷!null;
|-- 輸出購物車中商品的名字;
|-- 制作購買鏈接;
|-- request.getSession(); --- 得到session對象;
|-- 獲取購物車;
|-- 判斷,如果是第一次進入,將購物車綁定到session上;
|-- 將商品添加到購物車;
|-- 提供返回鏈接;
# Cookie和Session的關系;
>> 當本地Cookie被禁用之后,Session將失效;
|-- 解決方案
|-- 重寫URL;
|-- response.encodeURL(String str);
|-- 注意,該方法需要重寫所有URL;
|-- 原理:將jsessionID帶到超鏈接里;
# Session的生命周期;
>> 新建;
|-- 第一次創建;
>> 運行;
|-- > 鈍化 --- 序列化到磁盤上;
活化 < --- 從磁盤上反序列化到內存中;
>> 銷毀;
## JSP和EL表達式 ##
# 基本概念;
>> Java Server Page
|-- 一個可以嵌入java代碼和HTML代碼的界面;
>> 基本運行流程;
|-- 當客戶端第一次訪問jsp的時候,服務器會將其中的java抽出編譯成為servlet;
|-- 然后分離出HTML代碼,顯示在瀏覽器上;
|-- 最后會將編譯完成的class文件返回給客戶端;
# 基本語法;
>> JSP表達式;
|-- <%= %> 聲明一個表達式,其中不能有分號,因為是用於輸出,
內部語句被out.println();包裹;
|-- <% %> 聲明一個片段,其中主要存放Java代碼;
|-- Java代碼片段中支持Java注釋;
|-- <!-- --> 聲明一個注釋,會被發送給客戶端,
其中如果嵌套<% %>表達式的話,內部的代碼會被執行;
但執行完畢的結果依然會被作為HTML的注釋發送到客戶端;
|-- <%-- --%> jsp注釋;內部代碼在編譯時會被忽略;
|-- <%! %> 聲明一個變量或方法;內部代碼會被放到service方法外部;
# JSP指令;
>> taglib指令
|-- 導入一個外部的標簽庫;
>> <%@include file="地址" %> --- 靜態包含;
|-- 包含一個外部界面;
該指令將被包含的界面中的源碼全部獲取;
和發起包含的文件一起編譯;
|-- 動態包含;<jsp:include page="地址"></include>
|-- 包含的兩個文件會分別編譯;
>> <%@ page language="java " import="java.util.*" pageEncoding="UTF-8"%>
|-- import --- 導入需要使用的包;
|-- pageEncoding --- 告知瀏覽器界面使用哪種編碼進行顯示;
|-- contentType --- 告知瀏覽器界面使用哪種編碼進行顯示;
|-- language --- 聲明界面包含的語言,可以不寫;
|-- errorPage --- 可以在源碼中生成一個Exception對象;
>> jsp標簽
|-- <jsp:forward page="add"></jsp:forward> 實現轉發;
|-- <jsp:param value="20" name="xxx" /> 轉發中實現攜帶參數;
|-- 該標簽無法解決中文參數傳遞的問題;
# JSP九大內置對象;
>> 基本概念;
|-- 由JSP本身定義好的一些對象,這些對象不需要聲明可以直接使用;
>> 九個內置對象;
|-- request
> 四大作用域中的一個;
> 作用於每次請求;
|-- response
|-- pageContext
> 四大作用域中的一個;
> 作用於當前頁面;
> 可以通過它操作其他三個域對象;
> 可以通過它獲取其他八個內置對象;
> 可以依次從四個域范圍中找值;
> 實現轉發和包含功能;
|-- session
> 四大作用域中的一個;
> 作用於每次會話;
|-- exception
|-- application
|-- ServletContext
> 四大作用域中的一個;
> 作用於整個servlet;
|-- config
|-- out
> 在輸出是默認輸出到頁面緩沖區中(默認8KB);
> 可以將buffer關閉,讓數據直接輸出到界面;
> 也可以寫出后直接采用flush();將數據刷到response緩存中;
|-- page
# JavaBean
>> 基本概念;
|-- 簡單java類
|-- 有一定的規范
|-- 用於封裝數據;
>> 開發模型;
|-- JSP+JavaBean;
|-- MVC
M: javabean;
V: jsp+html
C: servlet;
## EL表達式 ##
# 基本概念;
>> 替代Java代碼;
>> 進行算術計算;
>> 從域中搜索值;
# 基本格式;
>> ${放在域范圍中的變量}
|-- 內部實現原理;
|-- pageContext.findAttribute("值");
>> 只能寫在JSP界面上面;
>> 在指定的域中搜索;
|-- ${requestScope.name}
|-- ${sessionScope.name}
|-- ${applicationScope.name}
|-- ${pageScope.name} (默認范圍,可以不寫)
>> 兩種運算符;
|-- 【.】
> .后跟取值名稱;
> 注意 --- EL不支持.調用方法;
|-- 【[]】
> 取值需要加上""/'' ;
> 當對數組進行取值時,可以加也可以不加;
> 對於數組只能使用[]操作;
>> 獲取集合;
|-- 使用[]獲取對應角標元素;
|-- 獲取Map集合;
|-- map集合可以用. 后跟字符串獲取元素;
|-- 可以用[]跟上""/''獲取元素;
>> EL的三元運算符;
|-- ${表達式?值1:值2}
|-- ${seesionScope.loginedUser==null ?"未登錄":"歡迎"}
|-- EL表達式不支持字符串相關運算,即連接符等用法;
# EL的11個內置隱式對象;
>> 總結如下;
1.requestScope
2.sessionScope
3.applicationScope
4.pageScope
//--------------通過以上4個內置對象可以對4大域進行訪問
//--------------下面的內置對象用處不大,
5.param
6.paramValues 這兩個對象封裝了表單參數
7.header
8.headerValues 這兩個對象封裝了HTTP請求頭
9.initParam 封裝了web.xml中 配置
10.pageContex 封裝了 9大內置對象中的 pageContext
11.cookie 封裝了cookie信息
# EL函數
>> 基本概念;
|-- 簡化頁面中靜態方法的調用,使用EL函數代替JAVA代碼.
>> 使用步驟;
|-- 在外部定義Java工具類;
|-- 配置tld文件;
|-- 從tomcat的配置中尋找然后替換相關標簽內容;
|-- <uri>
|-- <function>
|-- 在JSP中引入tld文件;
|-- 然后就可以在JSP中調用EL自定義函數;
>> 實際使用;
|-- SUN已經定義了足夠的函數;
|-- 基本不需要自己定義新的函數;