當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
第13章WEB13-JSP模式JDBC高级篇
生活随笔
收集整理的這篇文章主要介紹了
第13章WEB13-JSP模式JDBC高级篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今日任務
? 使用MVC設計模式開發一個轉賬案例
教學導航
教學目標
掌握JSP的設計模式
了解MYSQL的事務管理
掌握JDBC的事務管理
會使用DBUtils完成事務的管理
教學方法
案例驅動法
1.1 上次課內容回顧:
JSP :
- JSP的概述:
- JSP:Java Server Pages.
- JSP的運行原理:翻譯成Servlet,編譯成Class進行執行.
- JSP的腳本元素:
- <%! %>
- <% %>
- <%= %>
- JSP的注釋:
- JSP的三個指令:
- page,include,taglib <%@ 指令名稱 屬性=”屬性值”%>
- JSP的內置對象:
- pageContext,request,session,application,page,response,out,config,exception
- JSP的四個作用范圍
- PageScope :當前頁面
- RequestScope :一次請求范圍.
- SessionScope :一次會話
- ApplicationScope :整個應用范圍.
- JSP的動作標簽:
- <jsp:forward>,<jsp:include>,<jsp:param>,<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>
EL:
- <jsp:forward>,<jsp:include>,<jsp:param>,<jsp:useBean>,<jsp:setProperty>,<jsp:getProperty>
- EL的概述
- EL:Expression Language
- EL的作用:
- 獲取數據${ }
- 執行運算
- 操作web開發中常用的對象${param }
- 調用Java中方法:
JSTL
- JSTL的概述:
- JSTL:JSP 標準標簽庫.
- JSTL標簽庫:core,fmt,sql,xml,fn
- JSTL的核心標簽庫:
- if,forEach
- JSTL的函數庫:
- ${fn:}
1.2 使用MVC設計模式完成轉賬的案例:1.2.1 需求:
設計一個頁面,輸入三個值,一個是付款人,一個是收款人,一個是轉賬的金額.不能出現付款人的錢被扣除而收款人沒有收到錢的情況發生.而且要使用MVC的設計模式.
1.2.2 分析:1.2.2.1 JSP的開發模式:
【動態網頁開發模式的發展】
【JSP的開發模式一】:了解
JSP + JavaBean
- ${fn:}
- 演示模式一的過程:
- 在模式一開發中提供了一些JSP的標簽:<jsp:useBean> ,<jsp:setProperty >,<jsp:getProperty>
- 使用模式一進行簡單的測試:
<%
// 接收數據:
/ String username = request.getParameter("username");
String password = request.getParameter("password");
// 封裝數據:
User user = new User();
user.setUsername(username);
user.setPassword(password); /
%>
<jsp:useBean id="user" class="com.itheima.demo1.domain.User" scope="page"></jsp:useBean>
<%-- <jsp:setProperty property="username" name="user"/>
<jsp:setProperty property="password" name="user"/> --%>
<jsp:setProperty property="*" name="user"/><!-- 表單的元素的name屬性的值與User中的屬性名稱一致 就可以自動封裝 -->
<jsp:getProperty property="username" name="user"/>
【JSP的開發模式二】:掌握
JSP + Servlet + JavaBean 稱為MVC的設計模式.
MVC:
M:Model:模型層
V:View:視圖層
C:Controller:控制層
【Java中的反射技術】(掌握)
? 反射:
? 代碼:
【Java中的內省技術】(了解)
? 內省:用來獲得JavaBean的屬性及屬性的get或set方法.
JavaBean:就是一個滿足了特定格式的Java類: - 需要提供無參數的構造方法:
- 屬性私有
- 對私有的屬性提供public的get/set方法.
? 內省的代碼:
public void demo1() throws Exception{
// 獲得了Bean的信息
BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
// 獲得Bean的屬性描述了
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
System.out.println(pd.getName());
/pd.getReadMethod(); // 獲得get方法
pd.getWriteMethod();// 獲得set方法.
/ }
}
? 使用內省封裝一個MyBeanUtils:
public class MyBeanUtils {
public static void populate(Object obj,Map<String,String[]> map) throws Exception{
// 獲得類的所有的屬性的名稱:
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
// 獲得類中所有的屬性:
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
if(map.containsKey(pd.getName())){
Method method = pd.getWriteMethod();
// 執行set方法:
method.invoke(obj, map.get(pd.getName())[0]);
}
}
}
}
【事務的概述】
? 什么是事務: - 事務指的是邏輯上的一組操作,組成這組操作的各個邏輯單元要么一起成功,要么一起失敗.
? MYSQL的事務的管理:(了解) - 創建一個賬號的表:
create database web_13;
use web_13;
create table account(
id int primary key auto_increment,
name varchar(20),
money double
);
insert into account values (null,'張森',10000);
insert into account values (null,'鳳姐',10000);
insert into account values (null,'如花',10000);
***** MYSQL的事務管理有兩種方式:(MYSQL數據庫事務默認是自動提交的.Oracle數據庫事務默認是不自動提交.) - 1.手動開啟事務
- start transaction; -- 開啟事務
- 多條sql;
- commit/rollback;
- 2.設置一個自動提交參數
- show variables like '%commit%'; -- 查看與commit相關參數.
-
set autocommit = 0; -- 將autocommit參數設置為OFF.
【JDBC中的事務管理】(掌握)
? JDBC的事務的管理的API:
1.2.2.2 步驟分析:
【步驟一】:創建一個頁面:
【步驟二】:導入JDBC相關的jar包和工具類.
【步驟三】:創建包結構.
【步驟四】:提交到Servlet-->Service-->DAO
【步驟五】:頁面跳轉:
1.2.3 代碼實現:1.2.3.1 準備工作:
1.2.3.2 代碼實現:
1.2.3.3 DBUtils實現事務管理:
? 沒有事務管理:
? 有事務管理:
1.2.4 總結:1.2.4.1 事務特性:
? 原子性:強調事務的不可分割.
? 一致性:強調的是事務的執行的前后,數據的完整性要保持一致.
? 隔離性:一個事務的執行不應該受到其他事務的干擾.
? 持久性:事務一旦結束(提交/回滾)數據就持久保持到了數據庫.
1.2.4.2 如果不考慮事務的隔離性,引發一些安全性問題:
? 一類讀問題:
- 臟讀 :一個事務讀到另一個事務還沒有提交的數據.
- 不可重復讀 :一個事務讀到了另一個事務已經提交的update的數據,導致在當前的事務中多次查詢結果不一致.
- 虛讀/幻讀 :一個事務讀到另一個事務已經提交的insert的數據,導致在當前的事務中多次的查詢結果不一致.
? 一類寫問題: - 引發兩類丟失更新:
1.2.4.3 解決引發的讀問題:
設置事務的隔離級別: - read uncommitted :未提交讀.臟讀,不可重復讀,虛讀都可能發生.
- read committed :已提交讀.避免臟讀.但是不可重復讀和虛讀有可能發生.
- repeatable read :可重復讀.避免臟讀,不可重復讀.但是虛讀有可能發生.
- serializable :串行化的.避免臟讀,不可重復讀,虛讀的發生.
***** MYSQL隔離級別:repeatable read Oracle隔離級別:read committed
1.2.4.4 演示臟讀的發生:
? 分別開啟兩個窗口:A,B
? 分別查看兩個窗口的隔離級別:select @@tx_isolation;
? 設置A窗口的隔離級別為:read uncommitted: - set session transaction isolation level read uncommitted;
? 分別在兩個窗口中開啟事務: - start transaction;
? 在B窗口完成轉賬的操作: - update account set money = money - 1000 where name = '張森';
- update account set money = money + 1000 where name = '鳳姐';
? 在A窗口查詢數據:(錢已經到賬---臟讀) - select * from account; -- A事務讀到了B事務還沒有提交的數據.
1.2.4.5 演示避免臟讀,不可重復讀發生
? 分別開啟兩個窗口:A,B
? 分別查看兩個窗口的隔離級別:select @@tx_isolation;
? 設置A窗口的隔離級別為:read committed: - set session transaction isolation level read committed;
? 分別在兩個窗口中開啟事務: - start transaction;
? 在B窗口完成轉賬的操作: - update account set money = money - 1000 where name = '張森';
- update account set money = money + 1000 where name = '鳳姐';
? 在A窗口中進行查詢: - select * from account; -- 避免臟讀.
? 在B窗口提交事務: - commit;
? 在A窗口中再次查詢: - select * from account; -- 轉賬成功.(不可重復讀:一個事務讀到另一個事務中已經提交的update的數據,導致多次查詢結果不一致.)
1.2.4.6 演示避免不可重復讀:
? 分別開啟兩個窗口:A,B
? 分別查看兩個窗口的隔離級別:select @@tx_isolation;
? 設置A窗口的隔離級別為:repeatable read: - set session transaction isolation level repeatable read;
? 分別在兩個窗口中開啟事務: - start transaction;
? 在B窗口完成轉賬的操作: - update account set money = money - 1000 where name = '張森';
- update account set money = money + 1000 where name = '鳳姐';
? 在A窗口查詢: - select * from account; -- 轉賬沒有成功:避免臟讀.
? 在B窗口提交事務: - commit;
? 在A窗口中再次查詢: - select * from account; -- 轉賬沒有成功:避免不可重復讀.
1.2.4.7 演示避免虛讀的發生:
? 分別開啟兩個窗口:A,B
? 分別查看兩個窗口的隔離級別:select @@tx_isolation;
? 設置A窗口的隔離級別為:serializable: - set session transaction isolation level serializable;
? 在A,B兩個窗口中分別開啟事務: - start transaction;
? 在B窗口中完成一個insert操作: - insert into account values (null,'王老師',10000);
? 在A創建中進行查詢的操作: - select * from account; -- 沒有查詢到任何結果.
? 在B窗口提交事務: - commit; -- A窗口馬上就會顯示數據.
轉載于:https://blog.51cto.com/13587708/2097492
總結
以上是生活随笔為你收集整理的第13章WEB13-JSP模式JDBC高级篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thinkphp底层源码分析第一章
- 下一篇: gradle idea java ssm