第13章WEB13-JSP模式&JDBC進階篇

來源:互聯網
上載者:User

標籤:javaweb   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:
  • 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
  • 示範模式一的過程:
    • 在模式一開發中提供了一些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視窗馬上就會顯示資料.

第13章WEB13-JSP模式&JDBC進階篇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.