位置: IT常识 - 正文

MVC架构-01(MVC架构模式)

编辑:rootadmin
MVC 本文为动力节点老杜web课程mvc部分笔记,以银行转账项目为例 不使用MVC框架(分析存在的问题 1.搞个数据库 CREATE TABLE `t_act` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自然主键,与业务无关,自增', `actn ... MVC

推荐整理分享MVC架构-01(MVC架构模式),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:MVC架构图怎么画,MVC架构图怎么画,MVC架构的优点,MVC架构类图,MVC架构图怎么画,MVC架构和springboot,MVC架构图,MVC架构模式示意图,内容如对您有帮助,希望把文章链接给更多的朋友!

本文为动力节点老杜web课程mvc部分笔记,以银行转账项目为例

不使用MVC框架(分析存在的问题1.搞个数据库CREATE TABLE `t_act` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自然主键,与业务无关,自增', `actno` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号', `balance` decimal(10,2) DEFAULT NULL COMMENT '余额', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;2.创建项目bank(不使用maven,手动配置2.1基本流程创建空project(无需序号 1. 空格)moudle手动添加Framwork支持project structure在dependency目录下添加相关jar包,切不可添加在source目录下(没用)

添加tomcat服务器。。。2.2遇到的问题 Servlet包找不到(低级错误

原因

上述jar包添加过程有误

措施

1.以为jdk17与tomcat9不适配,换成10仍不适配

2.在web WEB-INF中创建lib目录,将servlet-api.jar拷过去,仍不管用

2.3 jsp文档写一个简单页面(EL表达式不熟练<%@ page contentType="text/html;charset=UTF-8" language="java" %><html> <head> <base href="https://www.cnblogs.com/tsangfandy/p/${pageContext.request.scheme}://${pageContext.request.serverPort}${pageContext.request.contextPath}/"> <title>银行账户转账</title> </head> <body> <form action="transfer" method="post"> 转出账户:<input type="text" name="fromActno"><br> 转入账户:<input type="text" name="toActno"><br> 转账金额:<input type="text" name="money"><br> <input type="submit" name="转账"> </form> </body></html>

2.4servlet类实现转账功能

别忘了加注解 @WebServlet("/transfer")

从前端获取用户输入的转账信息

String fromActno = request.getParameter("fromActno");String toActno = request.getParameter("toActno");double money = Double.parseDouble(request.getParameter("money"));

编写转账业务逻辑代码,连接数据库,进行转账操作(JDBC那一套)

​注意3:开启事务,事务手动提交与事务回滚-------------------------------------------------

MVC架构-01(MVC架构模式)

​jdbc会自动提交,开启事务,不让他自动提交

​注意2:在web WEB-INF中添加mysql连接jar包

​注意1: 转账之前判断余额是否充足,不足则异常,(创建一个异常类)

//余额不足异常类public class MoneyNotEnoughException extends Exception { //构造方法 public MoneyNotEnoughException() { } public MoneyNotEnoughException(String msg) { super(msg); }}Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;PreparedStatement ps2 = null;//有了新的sql语句PreparedStatement ps3 = null;try { //注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //获取连接 String url = "jdbc:mysql://localhost:3306/mvc"; String user = "root"; String password = "123456"; conn = DriverManager.getConnection(url,user,password); //注意3 //开启事务 //获取预编译的sql对象 String sql = "select id,balance from t_act where actno = ? "; ps = conn.prepareStatement(sql); ps.setString(1,fromActno); //执行sql语句,返回结果集 rs = ps.executeQuery(); //拿到结果集后处理结果集 //因为只有一条结果,if即可 if (rs.next()){ //取出余额 double balance = rs.getDouble("balance"); if (balance < 0){ //余额不足 throw new MoneyNotEnoughException("余额不足"); } //程序走到这里已经说明余额充足,不必加else,因为if中如不足则exception //下面转账,实现功能 //act01 - 10000 //act02 + 10000 String sql2 = "update t_act set balance = balance - ? where actno = ? ";ps2 = conn.prepareStatement("sql2"); ps2.setDouble(1,money); ps2.setString(2,fromActno); int count = ps2.executeUpdate(); //执行更新,并返回更新的条数 //---------------------模拟异常-------------------------------- //此处模拟一个异常,此时钱转出,未转入 String s = null;//空指针异常 //试验证明,出问题。引入事务 s.toString(); //---------------------模拟异常-------------------------------- String sql3 = "update t_act set balance = balance + ? where actno = ? "; ps3 = conn.prepareStatement("sql3"); ps3.setDouble(1,money); ps3.setString(2,fromActno); count += ps3.executeUpdate(); if (count != 2){ //转账失败,再来异常 throw new AppException("App异常,请联系管理员"); } //提交事务(转账成功肯定能提交了----------------------------- conn.commit(); //转账成功 out.print("转账成功"); }} catch (Exception e) { //-------------------------------事务回滚-------------------- try { if (conn != null) { //保险起见,不等于null才回滚 conn.rollback();//只要遇到异常就回滚 } } catch (SQLException ex) { ex.printStackTrace(); } //----------------------------------------------------- //异常处理,发生上述异常后怎么做 //e.printStackTrace(); 不打印异常信息了,搞到前端去 out.print(e.getMessage()); //getMessage可以获取到上面写的"余额不足" // 因为构造方法中有参那个,调用父类的massage,父类中还有super继续上调, //直到一个private的成员变量,那么值就给他了,而getMassage恰好获得他的值}finally { //释放资源 if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps2 != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps3 != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } }}

下面分析mvc存在的问题

3.分析问题3.1AccountTransferServlet负责什么业务(业务逻辑是什么)数据接收核心业务处理,转账业务连接数据库,CRUD页面数据展示

这个servlet负责所有的事情

3.2缺点是什么

代码复用性太差,实现一个功能就要搞一个servlet,比如R,查一个数据就得写一个servlet,可以搞一个专门查数据的方法,查询数据时调用即可。

原因:没有进行"职能分工",没有独立组件的概念,没有办法进行代码复用,代码之间耦合度太高,扩展力太差

耦合度高导致代码很难扩展。

操作数据库的代码和业务逻辑混杂在一起,编写代码时很容易出错。无法专注业务逻辑。所以才需要分层。

MVC架构模式1.理论基础

C调用M和V

M:数据处理、业务处理

V:页面展示

2.JDBC工具类封装

jdbc.properties

driver=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/mvcuser=rootpassword=123456

DBUtil

package bank.utils;import java.sql.*;import java.util.ResourceBundle;/** * JDBC工具类 * @author d * @version 1.0 * @since 1.0 */public class DBUtil { private static ResourceBundle bundle = ResourceBundle.getBundle("resources/jdbc"); private static String driver = bundle.getString("com.mysql.cj.jdbc.Driver"); private static String url = bundle.getString("jdbc:mysql://localhost:3306/mvc"); private static String user = bundle.getString("root"); private static String password = bundle.getString("123456"); //工具类一般搞个私有的构造方法,因为不让创建对象。工具类中的方法都是静态的,不需要创建对象 // 为了防止创建对象,故私有化 private DBUtil(){} //DBUtil在类加载时注册驱动 static { try { Class.forName(driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 这里没有使用数据库连接池,直接创建的连接对象 * 每一次调用这个方法,都是一个新的对象 * @return 连接对象 * @throws SQLException */ public static Connection getConnection() throws SQLException { Connection connection = DriverManager.getConnection(url, user, password); return connection; } /** * 关闭资源 * @param conn 连接对象 * @param stmt 数据库操作对象 * @param rs 结果集对象 */ public static void close(Connection conn , Statement stmt, ResultSet rs){ if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } }}3.DAO与数据对象实体类3.1DAO

AccountDao是负责Account数据增删改查的

什么是DaoData Access Object(数据访问对象)Dao是一种设计模式,是j2EE的设计模式之一,不是23种设计模式Dao只负责数据库的CRUD,没有任何业务逻辑没有业务逻辑,只负责表中数据增删改查对象,有一个特殊称谓:DAO对象为什么叫做AccountDao呢?这是因为这个DAO是专门处理t_act这张表的。如果处理t_user表的话,可以叫做:UserDao如果处理t_student表的话,可以叫做:StudentDao

时间2022.08.30

本文链接地址:https://www.jiuchutong.com/zhishi/304073.html 转载请保留说明!

上一篇:vue使用Print.js打印页面样式不出现的解决(vue-print-nb-jeecg)

下一篇:现代 C++ 编程指南(现代c++教程)

  • 华为nova7地震预警怎么开启(华为nova7地震预警怎么没有?)

    华为nova7地震预警怎么开启(华为nova7地震预警怎么没有?)

  • 苹果手机隐形按键该怎么设置(苹果手机隐形按键怎么不见了)

    苹果手机隐形按键该怎么设置(苹果手机隐形按键怎么不见了)

  • 电脑怎么同时打开两个窗口

    电脑怎么同时打开两个窗口

  • 打印机老打偏是怎么回事(打印机老打偏是什么原因)

    打印机老打偏是怎么回事(打印机老打偏是什么原因)

  • 快捷搜索ctrl+什么(快捷搜索按键)

    快捷搜索ctrl+什么(快捷搜索按键)

  • 微信电话连接失败的原因(微信电话连接失败但能发消息)

    微信电话连接失败的原因(微信电话连接失败但能发消息)

  • 淘宝上架宝贝时间技巧(淘宝上架宝贝时间怎么设置不会重复)

    淘宝上架宝贝时间技巧(淘宝上架宝贝时间怎么设置不会重复)

  • 小米手机怎么设置黑色微信(小米手机怎么设置闹钟)

    小米手机怎么设置黑色微信(小米手机怎么设置闹钟)

  • mpgt2是ipad什么版本(mp2g2ch/a是ipad几)

    mpgt2是ipad什么版本(mp2g2ch/a是ipad几)

  • 屏幕排线坏了会出现什么情况(屏幕排线坏了会触屏不了吗)

    屏幕排线坏了会出现什么情况(屏幕排线坏了会触屏不了吗)

  • airpods二代充电盒充电要多久(airpods二代充电头多少w)

    airpods二代充电盒充电要多久(airpods二代充电头多少w)

  • 迅雷曲线图什么意思(迅雷曲线功能什么意思)

    迅雷曲线图什么意思(迅雷曲线功能什么意思)

  • 华为areal10是什么型号(华为手机areal10)

    华为areal10是什么型号(华为手机areal10)

  • cpu的主频指的是什么(主频最高的cpu排行)

    cpu的主频指的是什么(主频最高的cpu排行)

  • i7蓝牙耳机怎么用(i7蓝牙耳机怎么开机)

    i7蓝牙耳机怎么用(i7蓝牙耳机怎么开机)

  • 手机怎么p漫画脸(如何p漫画脸手机软件)

    手机怎么p漫画脸(如何p漫画脸手机软件)

  • 华为nova5pro耳机设置教程(华为nova5pro耳机孔在哪里怎么插)

    华为nova5pro耳机设置教程(华为nova5pro耳机孔在哪里怎么插)

  • 京东锁单是什么意思(京东锁单可以多长时间)

    京东锁单是什么意思(京东锁单可以多长时间)

  • word怎么一页显示两页(word怎么一页显示四张)

    word怎么一页显示两页(word怎么一页显示四张)

  • 移动硬盘可以连手机吗(移动硬盘可以连接手机吗)

    移动硬盘可以连手机吗(移动硬盘可以连接手机吗)

  • 苹果手机呼吸灯怎么开(苹果手机呼吸灯在哪)

    苹果手机呼吸灯怎么开(苹果手机呼吸灯在哪)

  • wpsoffice可以删除吗(wps2019怎么删除)

    wpsoffice可以删除吗(wps2019怎么删除)

  • 宪法小卫士怎么打卡(宪法小卫士怎么做)

    宪法小卫士怎么打卡(宪法小卫士怎么做)

  • 保密相册怎么打开(保密相册怎么打开OPPO)

    保密相册怎么打开(保密相册怎么打开OPPO)

  • 手机锁屏时间怎么移动(手机锁屏时间怎么换位置)

    手机锁屏时间怎么移动(手机锁屏时间怎么换位置)

  • 微博怎么设置粉丝可见(微博如何设为粉丝可见)

    微博怎么设置粉丝可见(微博如何设为粉丝可见)

  • switch可以用充电宝充电吗(switch可以用充电宝吗?)

    switch可以用充电宝充电吗(switch可以用充电宝吗?)

  • 怎么删除快手通讯录好友(怎么删除快手通话记录)

    怎么删除快手通讯录好友(怎么删除快手通话记录)

  • 计提应交个人所得税分录怎么做
  • 新公司需要去当地街道报备劳动关系证明吗
  • 税务是怎么回事
  • 企业所得税本年实际缴纳不包括上年汇算清缴补缴税款吗
  • 运输公司轮胎如何做会计分录
  • 发票红票和退票区别在哪
  • 会计分录借贷符号
  • 转让长期股权投资的净收益计入
  • 预缴增值税时可抵扣吗
  • 工会经费和职工教育经费比例
  • 技术维护费280全额抵扣会计分录
  • 划拨土地使用权出租
  • 对于税收会计记账科目应该如何设置?
  • 增值税发票含税不含税怎样调整
  • 免税单位无租使用纳税单位土地
  • 水利建设专项收入怎么计算
  • 不得抵扣且未抵扣什么意思
  • 领款凭证可以当收据吗
  • 文化事业税收优惠政策
  • 旅行社的综合服务费
  • 公司购买自用房产税如何征收
  • 汽车4s店厂家返利计算方法
  • windows 11怎么用
  • macbook不用键盘膜会进灰吗
  • web前端综合案例开发离线作业1
  • 资产负债表应付账款怎么填列
  • twig里使用js变量的方法
  • 员工每月补助表怎么做
  • 今日清明节的下一句是什么
  • js如何实现异步编程
  • javaweb实验一
  • 一阶段目标检测算法
  • vue和react区别大吗
  • face_recognition库采用了什么算法
  • 端午假期干什么
  • phpcms怎么用
  • 纳税人填报的纳税申报表
  • 递延所得税资产借贷方向
  • 企业注销时还有进项税
  • Postgresql ALTER语句常用操作小结
  • sql将一列数据变成一行显示
  • 房产税的纳税义务人
  • access 模糊匹配
  • 长期待摊费用做账
  • 安装调试费计入
  • 房地产开发企业分为几个等级
  • 政府补助都有哪些类型
  • 合同没签定金可以退的吗
  • 长期股权投资如何入账
  • 增值税转型不得超过多少
  • 公司赠送客户礼品怎么做账
  • 不动产什么时候取得所有权
  • 累计扣税标准2021标准
  • 销售不动产计税税率
  • 生物性资产折旧处理
  • 会计记账基础有哪两种
  • 会计年初如何轻松工作
  • Computer Browser是什么进程,Computer Browser有什么用?
  • solaris route add
  • mac中的快捷键大全
  • 使用移动硬盘快速启动
  • ie10怎么设置ie8兼容模式
  • linux 杀掉指定用户的进程
  • linux的web
  • win7桌面点不了怎么回事
  • 你不知道的关于现代主义的故事
  • windows7软件卸载
  • 第三方win7系统哪个最好
  • 使用cp命令时以下说法错误的是
  • linux如何直接访问gpio不用设备树
  • win7英文输入法
  • cocos2djs教程
  • 微信小程序实现账号密码登录
  • 微信和qq时间格式不一样
  • 安卓工程如何正常启动
  • ui课程入门
  • python字号
  • 浙江省国税电子税务局如何新增企业
  • 重庆税务局发票作废怎么处理
  • 小规模企业所得税申报流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设