JavaWeb——MVC架构模式

news2024/11/16 19:02:50

一、概述:

MVC(Model View Controller)是软件工程中的一种 软件架构模式 ,它把软件系统分为模型、视图和控制器三个基本部分。用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时不需要重新编写业务逻辑。

M代表Model模型层,具体功能如下:

1.存放和数据库对应的实体类以及一些用于存储非数据库表完整相关的VO对象;

2.存放一些对数据进行逻辑运算操作的一些业务处理代码;

V代表view视图层,具体功能如下:

1.存放一些视图文件相关的代码,例如html、css以及js等;

2.在前后端分离的项目中,后端已经没有视图文件,该层次已经衍化成独立的前端项目;

C代表Controller控制层,具体功能如下:

1.接收客户端请求,获得请求数据;

2.将准备好的数据响应给客户端;

二、MVC模式下项目中的常见包:

M:

1.实体类包(pojo /entity /bean):专门存放和数据库对应的实体类和一些VO对象;

2.数据库访问包(dao/mapper):专门存放对数据库不同表格CURD方法封装的一些类;

3.服务包(service):专门存放对数据进行业务逻辑运算的一些类;

C:

控制层包(controller);

V:

1.web目录下的视图资源html、css、js、img等

2.前端工程化后,在后端项目中已经不存在了;

 三、项目搭建:

项目结构:

1.数据库准备:创建schedule_system数据库并执行如下语句

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 8;
DROP TABLE IF EXISTS `sys_schedule`;
CREATE TABLE `sys_schedule`(
`sid` int NOT NULL AUTO_INCREMENT,
`uid` int NULL DEFAULT NULL,
`title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0908_ai_Ci NULL DEFAULT NULL,
`completed` int(1) NULL DEFAULT NULL,
PRIMARY KEY(`sid`)USING BTREE
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = Utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`(
`uid` int NOT NULL AUTO_INCREMENT
`username` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`user_pwd` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY(`uid`)USING BTREE,
UNIQUE INDEX `username`(`username`)USING BTREE
)ENGINE = InnoDB CHARACTER SET =utf8mb4 COLLATE=utf8mb4 0900_ai_ci ROW_FORMAT =Dynamic;
INSERT INTO `sys_user` VALUES(1,'zhangsan','e10adc3949ba59abbe56e057f20f883e');
INSERT INTO `sys_user` VALUES(2,'lisi','e10adc3949ba59abbe56e057f20f883e');
SET FOREIGN_KEY_CHECKS = 1;

2.pojo包处理:使用lombok处理getter、setter、equals、hashcode、构造器

lombok使用步骤:

(1)检查idea是否已经安装lombok插件

(2)检查是否勾选enable,annotation,processing

(3)导入lombok依赖,在实体类上添加注解

package com.atguigu.schedule.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor//添加带有全部参数的构造器
@NoArgsConstructor//添加无参构造器
@Data//添加getter、setter、equals、hashcode
public class SysUser implements Serializable{
    private Integer uid;
    private String username;
    private String userPwd;
}
package com.atguigu.schedule.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SysSchedule implements Serializable{
    private Integer sid;
    private Integer uid;
    private String title;
    private Integer completed;
}

3.dao包的处理:dao类用于定义针对表格的CURD的方法

每张数据表都应该对应一个dao类,该dao类专门用于封装对该数据表的操作内容

(1).创建BaseDao对象

package com.atguigu.schedule.dao;
import com.atguigu.schedule.util.JDBCUtil;
import java.lang.reflect.Field;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
public class BaseDao{
    //公共的查询方法 返回的是单个对象
    public <T>T baseQueryObject(Class<T> clazz, String sql,Object ... args){
        T t = null;
        Connection connection = JDBCUtil.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        int rows = 0;
        try{
        // 准备语句对象
        preparedStatement = connection.prepareStatement(sql);
        //设置语句上的参数
        for(int i=0;i<args.length;i++){
            preparedStatement.setObject(i +1,args[i]);
        }
        // 执行 查询
        resultSet = preparedStatement.executeQuery();
        if(resultSet.next()){
            t = (T) resultSet.getobject(1);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            if(null != resultSet){
                try{
                    resultSet.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(null != preparedStatement){
                try{
                    preparedStatement.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            JDBCUtil.releaseConnection();
        }
        return t;
    }
    //公共的查询方法 返回的是对象的集合
    public <T> List<T> baseQuery(Class clazz,String sql,Object ... args){
        List<T> list =new ArrayList<>();
        Connection connection = JDBCUtil.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null:
        int rows = 0;
        try {
            // 准备语句对象
            preparedStatement = connection.prepareStatement(sql);
            //设置语句上的参数
            for(int i=0;i<args.length;i++){
                preparedStatement.setObject(i +1,args[i]);
            }
            // 执行 查询
            resultSet = preparedStatement.executeQuery();
            ResultSetMetaData metaData = resultSet.getMetaData();
            int columnCount = metaData.getColumnCount();
            //将结果集通过反射封装成实体类对象
            while(resultSet.next()){
                //使用反射实例化对象
                Object obj = clazz.getDeclaredConstructor().newInstance();
                for(int i=1;i<=columnCount;i++){
                    String columnName = metaData.getColumnLabel(i);
                    Object value = resultSet.getObject(columnName);
                    //处理datetime类型字段和java.util.Data转换问题
                    if(value.getClass().equals(LocalDateTime.class)){
                        value = Timestamp.valueOf((LocalDateTime) value);
                    }
                    Field field=clazz.getDeclaredField(columnName);
                    field.setAccessible(true);
                    field.set(obj,value);
                }
                list.add((T)obj);
            }
         } catch (Exception e){
            e.printStackTrace();
          }finally {
            if(null != resultSet){
                try{
                    resultSet.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(null != preparedStatement){
                try{
                    preparedStatement.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            JDBCUtil.releaseConnection();
        }
        return list;
    }
    // 通用的增删改方法
    public int baseUpdate(String sql,Object ... args){
        //获取连接
        Connection connection = JDBCUtil.getConnection();
        PreparedStatement preparedStatement = null;
        int rows =0;
        try {
        // 准备语句对象
        preparedStatement=connection.prepareStatement(sql);
        //设置语句上的参数
        for(int i=0;i<args.length;i++){
            preparedStatement.setObject(i+1,args[i]);
        }
        //执行 增删改executeUpdate
        rows = preparedStatement.executeUpdate();
        // 释放资源(可选)
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            if(null != preparedstatement){
                try{
                    preparedStatement.close();
                }catch(SQLException e){
                    throw new RuntimeException(e);
                }
            }
        JDBCUtil.releaseConnection();
        }
      return rows;
    }
}

(2).dao层所有接口:

package com.atguigu.schedule.dao;
public interface SysUserDao {
}
package com.atguigu.schedule.dao;
public interface SysScheduleDao{
}

(3).dao层所有实现类:

package com.atguigu.schedule.dao.impl;
importcom.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysUserDao;
public class SysUserDaoImpl extends BaseDao implements SysUserDao {
}
package com.atguigu.schedule.dao.impl;
import com.atguigu.schedule.dao.BaseDao;
import com.atguigu.schedule.dao.SysScheduleDao;
public class SysScheduleDaoImpl extends BaseDao implements SysScheduleDao{
}

4.service包处理

(1)接口:

package com.atguigu.schedule.service;
public interface SysUserService{
}
package com.atguigu.schedule.service;
public interface SysScheduleService{
}

(2)实现类:

package com.atguigu.schedule.service.impl;
import com.atguigu.schedule.service.SysUserService;
public class SysUserServiceImpl implements SysUserService{
}
package com.atguigu.schedule.service.impl;
import com.atguigu.schedule.service.SysScheduleService;
public class SysScheduleServiceImpl implements SysScheduleService{
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字符串专题——字符串相乘

1、题目解析 2、算法解析 1、解法一 使用模拟的方法&#xff1a;模拟小学的列竖式运算 细节1&#xff1a;高位相乘的时候要补上“0” 细节2&#xff1a;处理前导“0” 细节3&#xff1a;注意计算结果的顺序 2、解法二 对比解法一做优化->无进位相乘然后相加&#xff0…

Huawei Matebook e 2022 安装 archlinux 双系统

本文同步发布于我的网站 安装之前 wifi 名称修改为英文数字的&#xff0c;以防之后没法联网 准备好 U 盘并使用 GPT 分区表写入最新的 arch 镜像。 基础安装 开机按 F2 进入 UEFI/BIOS 设置&#xff0c;将 Secure Boot&#xff08;安全启动&#xff09;关闭&#xff0c;按…

AI学习记录 - transformers 的 linear 词映射层的详细分析, CrossEntropyLoss 函数解析

创作不易&#xff0c;有用的话点个赞。。。。。。 1. 假设条件 词汇表&#xff1a;假设词汇表包含四个词汇&#xff1a;[token_0, token_1, token_2, token_3]。 模型的输出概率分布&#xff1a;模型的输出经过 Softmax 转换后&#xff0c;得到概率分布&#xff1a;[0.1,0.5,…

JavaScript - Api学习 Day1(WebApi、操作DOM对象)

应用编程接口 (API) 是编程语言中提供的结构&#xff0c;允许开发者更轻松地创建复杂的功能。、 webapi 是一套 操作网页内容(DOM) 与 浏览器窗口(BOM) 的对象Js由ECMAScript、DOM、BOM三个部分组成。 文章目录 零、前言0.1 变量声明 壹、WebAPI的认识1.1 作用1.2 什么是DOM1…

【AI大模型】解锁AI智能:从注意力机制到Transformer,再到BERT与GPT的较量

文章目录 前言一、揭秘注意力机制&#xff1a;AI的焦点如何塑造智能1.什么是注意力机制&#xff1f;2.为什么需要注意力机制&#xff1f; 二、变革先锋&#xff1a;Transformer的突破与影响力1.什么是Transformer&#xff1f;2.为什么Transformer如此重要&#xff1f; 三、路径…

《给所有人的生成式 AI 课》学习笔记(一)

前言 本文是吴恩达&#xff08;Andrew Ng&#xff09;的视频课程《Generative AI for Everyone》&#xff08;给所有人的生成式 AI 课&#xff09;的学习笔记。由于原课程为全英文视频课程&#xff08;时长约 3 个小时&#xff09;&#xff0c;且国内访问较慢&#xff0c;阅读…

零基础转行学网络安全怎么样?

在当今数字化飞速发展的时代&#xff0c;网络安全已成为备受瞩目的领域。那么&#xff0c;对于零基础的人来说&#xff0c;转行学习网络安全究竟怎么样呢? 网络安全行业正处于蓬勃发展的阶段。随着互联网的普及和信息技术的不断进步&#xff0c;网络安全问题日益凸显。政企单位…

本地私有化部署PDF处理神器Stirling PDF并实现无公网IP远程在线访问

文章目录 前言1. 安装Docker2. 本地安装部署StirlingPDF3. Stirling-PDF功能介绍4. 安装cpolar内网穿透5. 固定Stirling-PDF公网地址 前言 本篇文章我们将在Linux上使用Docker在本地部署一个开源的PDF工具——Stirling PDF&#xff0c;并且结合cpolar的内网穿透实现公网随时随…

文心一言 VS 讯飞星火 VS chatgpt (328)-- 算法导论22.5 4题

四、证明&#xff1a;对于任意有向图 G G G来说&#xff0c; ( ( G T ) S C C ) T G S C C ((G^T)^{SCC})^TG^{SCC} ((GT)SCC)TGSCC。也就是说&#xff0c;转置图 G T G^T GT的分量图的转置与图 G G G的分量图相同。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1…

葡萄叶片病虫害数据集。葡萄数据集。葡萄病虫害数据集。

葡萄叶片病虫害数据集。葡萄数据集。葡萄病虫害数据集。 数据集有两种规格&#xff0c;请仔细阅读下面信息以免拍错 [1]规格一&#xff1a;适用于分类任务的数据集&#xff0c;标准的ImageNet数据集格式。注意不是txt格式的更不是xml格式的。数据集已经按照train、val划分好&am…

上海亚商投顾:沪指窄幅震荡 华为海思、猴痘概念股集体爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 市场全天窄幅震荡&#xff0c;三大指数涨跌不一。华为海思概念股持续爆发&#xff0c;世纪鼎利、天邑股份、汇…

ProGrad:Prompt-aligned Gradient for Prompt Tuning

文章汇总 存在的问题 问题1 如图(a),(b)&#xff1a;CoOp随着训练的继续&#xff0c;泛化能力可能会下降&#xff0c;甚至低于zero-shot基线。 如图©,(d)&#xff1a;在shot比较小的情况&#xff0c;即数据量比较少的情况(1-shot,2-shot)&#xff0c;CoOp的性能可能还不…

和鲸携手山东大学数字人文实验室,推动新文科与人工智能融合发展

为深入推进产教融合与校企合作&#xff0c;推动人工智能在人文学科中的广泛应用与深入发展&#xff0c;8 月 15 日&#xff0c;山东大学数字人文实验室与和鲸科技 101 计划推进会暨新文科人工智能实验室标杆案例打造讨论会于威海顺利召开。山东大学数字人文实验室副主任陈建红、…

基于Docker部署最新版本Jenkins

一、创建jenkins挂载路径 mkdir /var/jenkins_home chmod 777 /var/jenkins_home二、运行Jenkins最新lts镜像 docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home --restartalways jenkins/jenkins:latest将/var/jenkins_ho…

若依小程序使用及遇到的问题

1、首先去官网拉取小程序代码&#xff0c;从HBuildx运行到小程序 这个时候项目起来了&#xff0c;但是小程序发生了报错&#xff1b; 解决方法 在 project.config.json 新增指定 app.json 路径 ★一定要有 unpackage文件夹 如果没有的需要到HBuilder X 编译一下&#xff0c;编…

一文说清楚数据集成中的流处理与批处理的区别

流数据处理和批数据处理之间的区别主要在于数据的处理方式、时间性、架构设计和适用场景。虽然批处理系统和流处理系统都可以处理数据&#xff0c;但它们处理数据的方式和目的不同&#xff0c;以我们来对“流数据处理”和“批数据处理”进行差异分析。 1. 流数据处理 vs. 批数…

MySQL索引的性能优化

1.数据库服务器的优化步骤 在数据库调优中&#xff0c;我们的目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优的思路和方式 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢&#xf…

常见的排序算法汇总(详解篇)

目录 排序的概念以及运用 排序的概念 1. 插入排序 1.1 直接插入排序 1.1.1 基本思想 1.1.2 代码实现 直接插入排序的特征总结&#xff1a; 1.1.3 希尔排序&#xff08;缩小增量排序&#xff09;&#x1f680; 1.1.4基本思想&#x1f680; 1.1.5 代码实现&#x1f680; …

Redis 集群三主三从配置

1&#xff1a;安装 Redis安装Linux ubuntu_ubuntu离线安装redis7.2.5-CSDN博客 2&#xff1a;主从复制配置 参考 Redis主从同步配置-CSDN博客 3&#xff1a;哨兵配置 参考 Redis 哨兵模式配置-CSDN博客 4&#xff1a;集群配置 Redis 集群三主三从配置-CSDN博客 5&…

JavaScript初级——对象和函数

一、对象的简介 1、JS中的数据类型 —— String 字符串 —— Number 数值 —— Boolean 布尔值 —— Null 空值 —— Undefined 未定义 ——以上五种类型属于基本数据类型&#xff0c;以后我们看到的值只要不是上面这五种&#xff0c;则为对象 —— Object 对象 2…