回顧:
mvc
jsp的設計模式1:
jsp+javabean
jsp的設計模式2:
jsp+javabean+servlet
jsp:展示資料
javabean:封裝資料 封裝對資料的通路
servlet:處理請求
mvc:
将業務邏輯 代碼 顯示相分離
M:model 模型 封裝資料 封裝對資料的通路
V:view 視圖 展示資料 目前由jsp擔任
C:controller 控制 處理請求
三層架構:
web:
作用:
展示資料
接受請求
調用service
頁面的跳轉,資訊的生成
service:
作用:
處理邏輯
調用dao
dao:
作用:
對資料庫的curd操作
/
反射:
先擷取class對象,無所不能
事務:
一件完整的事情.可以包含多個操作,操作要麼成功,要麼全部失敗
mysql中的事務:
預設是事務自動送出
手動送出:
1.關閉自動送出
2.手動開啟一個事務
start transaction;
commit;
rollback;
java中的事務:
Connection接口的api
setAutoCommit(false):手動的開啟一個事務
commit():送出
rollback():復原
DBUitls使用事務:
1.建立QueryRunner
new QueryRunner():手動事務 調用他的方法的時候必須手動傳入一個連接配接,連接配接得手動關閉,事務得手動控制.
new QueryRunner(DataSource ds):自動事務 調用他的方法的時候不需要傳入一個連接配接,連接配接自動關閉,事務自動控制.
2.使用的方法 (手動事務)
query(...)
update(Connection conn .....)
事務中要想保證在一個事務中,必須保證使用同一個連接配接
方式1:向下傳遞連接配接
方式2:将連接配接和目前線程綁定
ThreadLocal
常用的方法:
set(Object value)
Object get()
remove()
事務的特性:
ACID
原子性 一緻性 隔離性 持久性
若不考慮隔離性的時候會發生的問題
髒讀
不可重複讀
虛讀
隔離級别:
read uncommitted:讀未送出 什麼問題都避免不了
read committed:讀已送出 避免髒讀
repeatable read:可重複讀 避免髒讀和不可重複讀
serializable:串行化 避免所有的問題 鎖表
安全:
serializable>repeatable read>read committed>read uncommitted
效率
serializable<repeatable read<read committed<read uncommitted
mysql中預設隔離級别 repeatable read
oracle中預設隔離級别 read committed
/
案例1-展示所有商品
需求:
點選首頁上的超連結,在頁面上展示所有的商品資訊
步驟分析:
1.資料庫和表
create database day14;
use day14;
create table `product` (
`pid` varchar (96),
`pname` varchar (150),
`market_price` double ,
`shop_price` double ,
`pimage` varchar (600),
`pdate` date ,
`pdesc` varchar (765)
);
INSERT INTO `product` VALUES('1','小米 4c 标準版','1399','1299','products/1/c_0001.jpg','2015-11-02','小米 4c 标準版 全網通 白色 移動聯通電信4G手機 雙卡雙待');
INSERT INTO `product` VALUES('10','華為 Ascend Mate7','2699','2599','products/1/c_0010.jpg','2015-11-02','華為 Ascend Mate7 月光銀 移動4G手機 雙卡雙待雙通6英寸高清大屏,纖薄機身,智能超八核,按壓式指紋識别!!選擇下方“移動老使用者4G飛享合約”,無需換号,還有話費每月返還!');
INSERT INTO `product` VALUES('11','vivo X5Pro','2399','2298','products/1/c_0014.jpg','2015-11-02','移動聯通雙4G手機 3G運存版 極光白【購機送藍牙耳機+藍牙自拍杆】新更新3G運作記憶體·雙2.5D弧面玻璃·眼球識别技術');
INSERT INTO `product` VALUES('12','努比亞(nubia)My 布拉格','1899','1799','products/1/c_0013.jpg','2015-11-02','努比亞(nubia)My 布拉格 銀白 移動聯通4G手機 雙卡雙待【嗨11,下單立減100】金屬機身,快速充電!布拉格相機全新體驗!');
INSERT INTO `product` VALUES('13','華為 麥芒4','2599','2499','products/1/c_0012.jpg','2015-11-02','華為 麥芒4 晨曦金 全網通版4G手機 雙卡雙待金屬機身 2.5D弧面屏 指紋解鎖 光學防抖');
INSERT INTO `product` VALUES('14','vivo X5M','1899','1799','products/1/c_0011.jpg','2015-11-02','vivo X5M 移動4G手機 雙卡雙待 香槟金【購機送藍牙耳機+藍牙自拍杆】5.0英寸大屏顯示·八核雙卡雙待·Hi-Fi移動KTV');
INSERT INTO `product` VALUES('15','Apple iPhone 6 (A1586)','4399','4288','products/1/c_0015.jpg','2015-11-02','Apple iPhone 6 (A1586) 16GB 金色 移動聯通電信4G手機長期省才是真的省!點選購機送費版,月月送話費,月月享優惠,暢享4G網絡,就在聯通4G!');
2.建立一個項目
3.導入jar包
驅動 dbutils c3p0 jstl beanutils
4.包結構
utils工具類:datasourceutils
導入c3p0配置檔案
5.建立一個首頁index.jsp
添加一個超連結
6.點選超連結 發送一個servlet上(FindAllServlet)
7.FindAllServlet:
調用service,查詢所有的商品 傳回值:list
将list放入request域中,請求轉發 prodouct_list.jsp
案例2-添加商品
需求:
在index.jsp添加一個超連結,跳轉到一個頁面,用來填寫商品資訊,點選儲存按鈕,将商品儲存到資料庫中
步驟分析:
1.在index.jsp添加一個超連結
跳轉到add.jsp
2.add.jsp放入一個表單
3.表單送出到 AddProductServlet
封裝資料
調用service完成儲存操作
跳轉到FindAllServlet
(請求轉發和重定向)
有表單使用的時候若使用請求轉發會出現重複送出
方案1:重定向
方案2:令牌機制
擴充:令牌機制
在添加頁面上随機生成一個字元串,
放入session中一份,放入表單中一份
送出的時候在背景擷取兩個碼
然後移除session中碼(隻使用一次)
然後判斷兩個碼是否一緻,
若不一緻就是重複送出了
/
案例3-修改商品資訊:
需求:
在product-list.jsp每一個商品後面都有修改操作.點選修改操作,到了一個edit.jsp(将原來的資料展示出來),最後儲存就可以了
步驟分析
先查詢後修改
查詢步驟分析:
點選修改連接配接的時候
<a href="/day14/getProductById?pid=sss">修改</a>
getProductById
擷取pid
通過pid擷取到商品 傳回值product
将product放入request域中 請求轉發到edit.jsp
//
修改步驟分析:
edit.jsp已經将商品的所有資訊展示出來
需要将商品的id通過隐藏域放入表單中
點選儲存,跳轉到editProductServlet
editProductServlet:
1.封裝資料
2.調用servcie完成修改更新操作
3.頁面跳轉到 FindAllServlet(重定向)
/
案例4-删除商品
需求:
在清單頁面上,點選一個商品的删除操作,彈出一個提示,點選确定的時候,商品目前商品
步驟分析:
先給删除添加事件
單擊事件 彈出提示
confirm()
點選确定再去删除商品
location.href="/day14/deleteProductById?pid=xxx" 相當于超連結
deleteProductById
1.擷取商品id
2.調用service完成删除操作
3.頁面重定向 FindAllServlet
擴充:删除多個商品:
需求:
在每個商品前面添加複選框,勾選需要删除的商品,添加一個按鈕(删除選中),點選之後删除選中的商品
步驟分析:
給每一個商品添加複選框(全選全不選),同時添加name屬性 值為"pid",value為目前商品的pid
點選删除選中,需要将勾選上的商品的id送出到背景
request.getParameterValues("pid")
必須把所有的商品的放入一個表單中,
需要在按鈕添加事件
需要先擷取表單,
調用表單的submit()
delCheckedServlet
1.擷取所有要删除的商品的id String[] ids
2.調用servcie完成操作
3.頁面重定向 FindAllServlet
/
擴充:案例5-多條件查詢
需求:
在product_list.jsp頁面上添加一個表單,輸入商品名稱 和 關鍵詞,點選确定,将符合條件的商品展示在目前頁面上
步驟分析:
在product_list.jsp頁面上添加一個表單,添加一個查詢按鈕
送出的路徑 findProductByCondition
1.擷取兩個條件
2.調用service完成查詢 傳回值:list
3.将list放入request域中,請求轉發
productDao
基本sql:select * from product where 1=1
若商品名稱不為空 and pname like ...
若商品名不為空 and pdesc like ...
//
案例6-分頁展示商品
需求:
将商品進行分頁展示
技術分析:
分頁
///
分頁:
将資料按照頁碼劃分,提高使用者的體驗度.
分類:
實體分頁:(開發中經常使用)
一次隻去資料庫中查詢目前頁需要的資料.
邏輯分頁:
一次性将所有資料查詢出來,放入記憶體(集合),每次查詢隻需要去記憶體中截取
mysql中分頁:
limit
格式1:
select .... limit m,n;
從索引為m條開始向後查找n條資料
就是從第m+1條 到 第m+n條 []
格式2:
select .... limit n;
等價于:select .... limit 0,n;
每頁顯示3條資料
第一頁 limit 0,3
第二頁 limit 3,3
第三頁 limit 6,3
第n頁 limit (n-1)*3,3
擴充:
oracle中 rownum
sqlserver中 top
/
每一頁需要的資料有
目前頁内容 limit查詢
目前頁碼 從前台傳遞過去
每頁顯示的條數 固定
總條數 count(*)
總頁數 總條數/每頁顯示的條數 Math.ceil(double)
以後開發中一般會将這5個參數封裝一個javabean(PageBean)
private List<T> list;//目前頁内容 查詢
private int currPage;//目前頁碼 傳遞
private int pageSize;//每頁顯示的條數 固定
private int totalCount;//總條數 查詢
private int totalPage;//總頁數 計算
/
步驟分析:
最終結果:
[首頁][上一頁][下一頁][尾頁]
[首頁][上一頁]x x x[下一頁][尾頁]
1.建立一個頁面 product_page.jsp
有上面的内容
還需要有目前頁的資料
2.在首頁上有一個超連結,點選超連結将第一頁查詢出來
<a href="/day14/showProductsByPage?currPage=1">分頁展示商品</a>
3.showProductsByPage
擷取第幾頁
調用service 完成查詢操作,傳回值:pagebean
将pagebean放入request域中,請求轉發product_page.jsp
4.service.showProductsByPage
傳回值pagebean
查詢目前頁的資料
查詢出總條數
在頁面上展示
1.展示目前也資料
通過<c:forEach items="${pb.list}">
2.添加首頁 上一頁 ....的超連結
3.判斷是否是第一頁.若是第一頁 不展示首頁和上一頁
4.判斷是否是最後一頁 若是最後一頁 不展示尾頁和下一頁
5.展示所有頁碼
<c:forEach begin='1' end="${pb.totalPage}">
6.判斷是否是目前頁
若是目前頁 不加超連結
若不是目前頁 添加超連結
擴充:頁面多的時候 采用前五後四的方式
隻需要控制begin和end
begin 判斷目前頁-5>0?目前頁-5:1
end 判斷 目前頁+4>總頁數?總頁數:目前頁+4