MVC

574 篇文章 4 订阅
272 篇文章 1 订阅

MVC
第一章转账系统实现
1-1 转账系统需求分析
表 t_account
id account balance
1 zs 2000
2 ls 2000

需求:zs给ls转500块钱
核心功能,两条更新,将zs余额更新为1500,将ls余额更新为2500
转账流程

  1. 验证转出账号有没有
  2. 验证转入账号有没有
  3. 根据转出账号,取出转出账号余额,看看钱够不够
  4. 转出账号更新余额扣钱
  5. 根据转入账号,取出转入账号余额
  6. 转入账号更新余额加钱
    以上的每一步操作,都是一次与数据库的交互
    以上的每一步操作,都需要一次jdbc的操作

转账版本0 将所有的内容都写在了servlet中,servlet压力过大,将来如果遇到到了复杂的业务,非常难于维护.
所以我们急需对servlet进行减压.
controller(控制层/表现层):接收请求,接收参数,处理业务逻辑,为浏览器做响应.
dao(持久层):与数据库的交互(jdbc代码)

升级转账版本1
dao层的创建步骤:

  1. 创建dao层的包结构,命名为dao
  2. 在dao包下,创建dao层的接口,命名为 domain+Dao
  3. 在接口中创建,dao层的方法,方法是以完成业务逻辑的子操作为单位,每一个dao层的方法,就是一次jdbc操作.
  4. 在dao包下,创建子包,命名为impl
  5. 在impl包下,创建接口的实现类,命名为接口名+Impl
  6. 实现类,实现接口,重写方法,完成方法体
  7. 在我们完成业务逻辑的过程中,只要是遇到与数据的交互,就调用dao层方法就可以了.

1-2 转账系统搭建
(1)建表
(2)建工程(版本号0)
a.导入jar包
b.创建前端页面
c.创建后端包结构
d.创建controller
e.由controller来接收参数
(3)转账功能实现(负面教材)
1-3 转账版本1 抽取dao层
dao层的创建步骤

1-4 MVC
(1) MVC概述
MVC是一种基于web开发的设计模式.它更是一种设计思想,由该设计思想延伸出来的分层开发,已经是我们现在所有做web开发必用的一种设计模式.
M:model 模型
V:view 视图
C:controller 控制器
在这里插入图片描述
(2) MVC的两种模式
model1模式(了解)
控制器和视图统一使用jsp的形式来呈现,model1模式全程没有servlet参与.
但是这种纯jsp的形式,前端和后端代码会大量的结合,使得页面非常混乱,代码不具有可读性和可维护性.
这种形式仅仅针对于市面上的微小型项目来使用.最大的好处是,如果项目特别小,使用该形式,纯jsp的开发会使得我们的开发非常便捷.(市面上这种项目基本已经没有了)

model2模式
在这里插入图片描述

(3)MVC相关面试题
	a. 什么是MVC?
	

	b.基于MVC思想如何分层?
	
	模型层:service dao
	视图层:jsp , jquery ui, easy ui, ext js,bootstrap,freemarker…
	控制层:servlet springmvc/struts/struts2
	
	由mvc思想延伸出来的开发中的分层
	cotroller:控制层
	service:业务层
	dao:持久层
	
	
	




	c. 分层开发的好处是?
	(1)分层开发之后,层与层之间分工明确,各司其职,使得我们的代码结构具有可读性,可复用性,可维护性.尽量的达到了我们开发代码的最终的目的,使得代码具有高内聚低耦合的性能.
	(2)分层开发后,更有利于团队协作开发.

1-5 转账版本2 加入MVC思想进行分层开发
service层的创建步骤

  1. 创建包结构,命名为service
  2. 在service包下,创建业务接口,命名为 domain+Service
  3. 在接口中,写业务方法.业务方法以业务为单位.
    比如我们现在的转账的例子,就一个业务(转账),所以在接口中写一个方法就可以了.
    方法参数:一般来讲参数都是由上一层(控制层)接收的参数
    返回值:如果业务是以添加修改删除为主的业务,那么就不需要返回值.如果业务是以查询为主的业务,那么返回值为相应的需要返回的数据类型.
    比如我们现在的转账,是以更新为主的业务,所以不需要有返回值.
  4. 在service包下,创建子包,命名为impl
  5. 在impl包下,创建接口的实现类,命名为接口名+Impl
  6. 实现类实现接口,重写方法,完成方法体.以后我们的业务逻辑就在这个业务方法中完成.

分层开发,一定要注意:
必须是上层调用下层,不能下层调用上层(这种需求不存在)
不要同层之间做调用
不要跨层调用

1-6 转账版本3 加入事务机制

1-7 转账版本4 加入ThreadLocal
ThreadLocal是基于当前线程安全的一种存取机制.
将值存放到ThreadLocal对象中后,取值范围为当前线程.只要当前线程还在,就可以取得ThreadLocal对象中的值.
set:存值
get:取值
remove:移除里面所有的内容
在这里插入图片描述

1-8 代理模式
(1) 代理模式概述
GoF23种设计模式其中的一种,实际项目开发中应用的非常广泛.指的是当一个组件不方便去做某些事的时候,可以交给代理对象去完成这件事.
(2) 代理模式的创建步骤
zs(真正要做这件事的人)要送花(要做的事)给ww,交代给ls(代理去做这件事的人)去送.
a. 创建业务接口
b. 创建接口的真正的实现类(zs),实现接口,重写方法,完成方法体
c. 创建接口的代理实现类(ls),实现接口,重写方法
代理实现类:
首先创建成员变量,类型为真正的实现类
再创建一个带有一个参数的构造方法(覆盖掉原有默认的无参数的构造方法),参数类型为真正的实现类,由该参数为成员变量赋值.
完成方法体
代理类的方法体由两部分内容来组成
一部分内容为使用成员变量完成业务逻辑
一部分内容为原有业务逻辑的增强(增强指的是对于业务逻辑的扩充,或者说是真正的实现类不方便做的事)
我们在应用的时候,先创建真正的实现类的对象,再创建代理实现类的对象.我们用就用代理实现类的对象.
(3)对比代理模式和装饰模式概念上的区别
(4)代理模式在实际项目开发中的案例
我们先在给甲方开发的项目,已经上线2年了,项目运行的一直很稳定.
甲方换领导了(程序员出身),要求乙方(我们),为系统加入日志功能.

	GoF23种设计模式,基于6大开发原则.
	其中有一项最重要的原则,为开闭原则.
	开闭原则指的是,对于一个成熟的项目,以java源文件为单位,对添加开放,对修改关闭.

在这里插入图片描述

1-9 转账版本5 加入代理模式

1-10 转账版本6 加入动态代理***************
基于我们的版本5,加入了代理模式.在我们的实际项目开发中,所有的业务都需要有事务机制的增强.那么就相当于我们每写一个业务接口真正的实现类Impl,就得搭配写一个代理实现类Proxy.
每写一个zs,就得搭配写一个ls用来增强事务.开发量倍增.
我们现在需要加入动态代理的模式,使得我们对于事务的处理,写出一份就可以了.
我们的目的是,写一个ls来处理事务,所有的zs共用一个ls.
动态代理不是23种设计模式其中之一,是基于原有的代理模式结合反射机制来完成的功能的扩充.

1-11 数据库连接池
(1) 数据库连接池的作用
对连接进行有效的管理
当我们使用连接时,不用自己创建连接,直接从连接池中取得一根连接使用,提升效率.复用性强
以前的conn.close,为销毁连接
今天的从数据库连接池中取得的连接,conn.close,不是销毁连接,而是将连接存放回数据库连接池中.
(2) 市面上常见的数据库连接池
dbcp
c3p0
druid:阿里巴巴

(3) 数据库连接池的搭建步骤
a. 导入连接池所用jar包
b. 导入properties属性文件
c. 通过properties属性文件的加载,创建出连接池的对象
d. 使用连接的时候,从数据库连接池对象中get一根连接
e. 当我们conn.close的时候,conn会自动的回收到数据库连接池中.

(4)druid连接池的属性文件解析
	driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/test
username=root
password=root
initialSize=20 #初始化连接数
maxActive=300 #最大连接数
maxWait=60000 #获取连接时最大等待时间,单位毫秒
maxIdle=10 #最大空闲连接数已失效
timeBetweenEvictionRunsMillis=60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
minEvictableIdleTimeMillis=300000 #配置一个连接在池中最小生存的时间,单位是毫秒

1-12 转账版本7 加入druid数据库连接池
Properties prop = new Properties();
DruidDataSource dds = null;
try {
//db_server.properties
prop.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(“db_server.properties”));
dds = (DruidDataSource) DruidDataSourceFactory
.createDataSource(prop);
}catch (Exception e) {
e.printStackTrace();
}


案例:
学生信息管理系统
第一章 学生信息管理系统
1-1 项目搭建
(1)导入所需jar包
(2)导入properties属性文件
(3)导入jquery类库
(4)创建前端结构(登录页,列表页,添加页,修改页)
(5)创建后端包结构
(6)创建工具类(DBUtil,动态代理等)
(6)搭建用户模块和学生模块的dao层,service层结构
(7)搭建用户模块和学生模块的controller层(模板模式)
1-2 完成登录系统功能

1-3 完成显示学生信息列表功能
在这里插入图片描述
1-4 完成添加学生功能

1-5 完成修改和删除学生功能
在这里插入图片描述

1.使用MVC架构模式的优点是什么*

分层开发:$1.可读性,复用性,可维护性强尽量达到了我们开发代码的最终目的,高内聚,低耦合的 性能。
$2.分层开发更有利于团队协作与开发。

2.理解高内聚、低耦合吗*

低耦合就是修改一处,不影响其他模块,高内聚是单一职责原则,分块做某件事,高内聚与低耦合是相辅相成的。

3.Model1和Model2分别是什么*

mvc的两种模式 Model1:控制器和视图统一使用jsp的形式来呈现,model1模式全程没有servlet参与.纯jsp编程,前端和后端的代码会大量的结合,代码不具有可读性和可维护性。

Model2:分层开发的模式:controller/控制层,也叫做表现层 service:业务层 dao:持久层

4.说一说你对MVC架构的理解*

MVC是一种基于web开发的设计模式.它更是一种设计思想,
由该设计思想延伸出来的分层开发,
已经是我们现在所有做web开发必用的一种设计模式.

5.MVC是系统的职能分工*

controller:职能是整体调动其他模块工作/service:处理业务逻辑/dao与数据库交互的

6.横向看称为MVC(Model View Controller),纵向看是三层或多层架构(表示层 业务层 持久层)*

7.service dao都属于Model,View层对应的技术有JSP、FreeMarker,Controller对应Servlet*

8.ThreadLocal是什么,它是干什么用的?*

ThreadLocal是基于当前线程安全的一种存取机制.
将值存放到ThreadLocal对象中后,取值范围为当前线程.只要当前线程还在,就可以取得ThreadLocal对象中的值.

9.连接对象Connection关闭后,为什么要调用threadLocal的remove()方法进行移除*

connection关闭的是连接方式,并没有把数据移除,这时候就要调用remove 方法移除。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值