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目录下(没用)

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="${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:开启事务,事务手动提交与事务回滚-------------------------------------------------
jdbc会自动提交,开启事务,不让他自动提交
注意2:在web WEB-INF中添加mysql连接jar包

注意1: 转账之前判断余额是否充足,不足则异常,(创建一个异常类)- //余额不足异常类
- public class MoneyNotEnoughException extends Exception {
- //构造方法
- public MoneyNotEnoughException() {
- }
- public MoneyNotEnoughException(String msg) {
- super(msg);
- }
- }
复制代码 下面分析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.Driver
- url=jdbc:mysql://localhost:3306/mvc
- user=root
- password=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数据增删改查的
- Data Access Object(数据访问对象)
- Dao是一种设计模式,是j2EE的设计模式之一,不是23种设计模式
- Dao只负责数据库的CRUD,没有任何业务逻辑
- 没有业务逻辑,只负责表中数据增删改查对象,有一个特殊称谓:DAO对象
- 为什么叫做AccountDao呢?
- 这是因为这个DAO是专门处理t_act这张表的。
- 如果处理t_user表的话,可以叫做:UserDao
- 如果处理t_student表的话,可以叫做:StudentDao
时间
2022.08.30
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |