日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

第13章WEB13-JSP模式JDBC高级篇

發布時間:2023/12/20 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第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:
  • 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窗口馬上就會顯示數據.

轉載于:https://blog.51cto.com/13587708/2097492

總結

以上是生活随笔為你收集整理的第13章WEB13-JSP模式JDBC高级篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。