第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窗口马上就会显示数据.

原文地址:http://blog.51cto.com/13587708/2097492

时间: 2024-10-11 11:14:02

第13章WEB13-JSP模式&JDBC高级篇的相关文章

第13章 模版方法模式(Template Method)

原文  第13章 模版方法模式(Template Method) 模板模式 模板模式 举例:模拟下数据库的update方法,先删除在插入. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47     abstract class SqlManage     {         publi

设计模式@第13章:外观模式

第13章:外观模式 13.1 影院管理项目 组建一个家庭影院: DVD 播放器.投影仪.自动屏幕.环绕立体声.爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统筹各设备开关 开爆米花机 放下屏幕 开投影仪 开音响 开 DVD,选 dvd 去拿爆米花 调暗灯光 播放 观影结束后,关闭各种设备 二.传统方式解决影院管理 ? 三.传统方式解决影院管理问题分析 在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没

第13章 MySQL数据库与JDBC编程

13.1 JDBC基础 13.1.1 JDBC简介 13.1.2 JDBC驱动程序 13.2 SQL语法 13.2.1 安装数据库 13.2.2 关系数据库基本概念和MySQL基本命令 13.2.3 SQL语句基础 13.2.4 DDL语言 13.2.5 数据库约束 13.2.6 索引 13.2.7 视图 13.2.8 DML语句语法 13.2.9 单表查询 13.2.10 数据库函数 13.2.11 分组和组函数 13.2.12 多表连接查询 13.2.13 子查询 13.2.14 集合查询

第13章 结构型模式—享元模式

1. 享元模式(Flyweight Pattern)的定义 (1)运用共享技术高效地支持大量细粒度的对象 ①对象内部状态:数据不变且重复出现,这部分不会随环境变化而改变,是可以共享的. ②对象外部状态:数据是变化的,会随环境变化而改变,是不可以共享的. ③所谓的享元,就是把内部状态的数据分离出来共享,通过共享享元对象,可以减少对内存的占用.把外部状态分离出来,放到外部,让应用程序在使用的时候进行维护,并在需要的时候传递给享元对象使用. ④享元模式真正缓存和共享的是享元的内部状态,而外部状态是不被

敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述

第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dynamic diagram)展示了软件实体在运行过程中是如何变化的,其中描述了运行流程或者实体改变状态的方式.物理图(physical diagram)展示了软件实体不变的物理结构,其中描述了诸如源文件.库.二进制文件.数据文件等物理实体以及它们之间的关系. 查看如下代码,这段程序实现了一个基于简单

基于JSP+Serlvet+JDBC的开发(1)

好久没用JSP+Servlet+JDBC这种组合,可以说自从没有这种作业后就没有这种方式开发了.最近也没怎么学东西,感觉计划都乱了,趁着这个周末写点东西找找感觉. 这次想利用JSP+Servlet+JDBC写个小小的商品展示平台DEMO.功能很简单,就是能够展示商品的类型,然后根据类型展示所属类型的商品就可以了,说是小小的商品展示平台还不如说是一个增删查改的DEMO. 下图是整个项目的结构: 为了方便解耦,使用MVC模式进行开发,这里介绍各个包的作用: action 存放的servlet类,负责

JavaScript权威指南第13章 web浏览器中的javascript

13.1 客户端javascript window对象是所有的客户端javascript特性和api的主要接入点.表示浏览器的一个窗口,可以通过window对象来引用它. window 的方法 alert() prompt() confirm() 13.2 在html里嵌入javascript 4种方法: 内联:放置在<script></script>标签之中 外部引入:<script src="   "></script> html程序

阅读《实例化需求》1-3章有感

今天我阅读了<实例化需求>的1-3章. 第一章主要是讲实例化需求的好处.实例化需求说明是一组过程模式,他帮助团队构建正确的产品. 使用实例化需求说明,团队编写的文档恰到好处,在短迭代或基于流的开发中可以有效地协助变更. <实例化需求>这本书不是以理论的方式来构建一个案例来阐述实例化需求说明的好处,而是来自 于那些来自于那些大大受益于实例化需求说明的团队. 实例化需求可以更有效地实施变更,主要是通过活文档.活文档是系统功能的一个信息源,与程序 代码一样可靠,但更容易使用和理解.他帮助

使用Micrisoft.net设计方案 第三章Web表示模式

第三章Web表示模式 体系结构设计者在设计第一个作品时比较精简和干练.在第一次设计时,并清除自己做什么,因此比较小心谨慎.第二个作品是最危险的一个作品,此时他会对第一个作品做修饰和润色,以及把第一次设计的边缘性设计思想都用在第二个作品,结果导致设计过头. 最初的Web很简单,只是有几个简单的Html页面组成,实现信息共享.随着业务的发展,需要根据业务来决定显示什么,于是开发了CGI编程,把大量的业务逻辑写到CGI中,然后输出到页面.随着发展,CGI编程模式受到了挑战,不能满足发展的需求,于是开发