当前位置: 首页 > news >正文

WEB后端复习——MVC、SSM【含登录页面代码】

MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序分解为三个相互关联的组件:模型(Model)、视图(View)和控制器(Controller)。这种模式在构建用户界面和图形界面应用程序时特别有用,它促进了代码的模块化和可维护性。
以下是MVC模式中每个组件的简要描述:
1. **模型(Model)**:
   - 模型是应用程序的核心,代表应用程序的数据和业务逻辑
   - 它管理应用程序的状态和数据,并实现所有的业务规则。
   - 模型不直接与用户界面交互,它通过控制器接收用户的输入和数据请求。
2. **视图(View)**:
   - 视图是用户界面的一部分,负责展示数据(模型)给用户,并接收用户的输入。
   - 它从模型中获取数据,并定义数据的呈现方式。
   - 视图应该尽可能简单,不包含任何业务逻辑。
3. **控制器(Controller)**:
   - 控制器是模型和视图之间的中介,它接收用户的输入并调用模型进行相应的更新。
   - 它还负责选择视图来显示模型的数据,并处理用户的交互。
   - 控制器解释用户的输入,并转换这些输入为对模型的操作或对视图的更新。
MVC模式的工作流程通常如下:
1. 用户与视图交互,发送请求。
2. 控制器接收请求,并决定调用哪个模型来处理请求。
3. 模型根据请求执行业务逻辑,并可能更新其状态。
4. 控制器选择合适的视图来显示模型的数据。
5. 视图呈现数据给用户。
MVC模式的主要优点包括:
- **代码分离**:业务逻辑、数据和用户界面被分离,使得代码更易于管理和维护。
- **可扩展性**:由于组件之间的低耦合,可以独立地修改或替换模型、视图和控制器。
- **可复用性**:模型和控制器可以在不同的视图上复用,视图可以在不同的模型上复用。
- **测试友好**:由于业务逻辑和数据与用户界面分离,可以更容易地进行单元测试。
MVC模式被广泛用于Web应用程序开发,特别是在Java的Spring框架、ASP.NET MVC、Ruby on Rails等Web开发框架中。


SSM框架是指Spring、SpringMVC和MyBatis这三个开源框架的集合,它们通常一起使用来构建复杂的Java Web应用程序。每个框架都承担着不同的角色:
1. **Spring**:Spring是一个轻量级的Java企业级应用开发框架,主要提供IoC(控制反转)和AOP(面向切面编程)的支持。Spring框架的核心功能是提供依赖注入(DI),这使得应用程序的组件更加模块化,易于测试和重用。Spring还提供了对事务管理、数据访问、消息传递、安全性等企业服务的支持。
2. **SpringMVC**:SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的MVC(模型-视图-控制器)模式实现。它分离了应用程序的输入、处理和输出,使得代码更加清晰和易于维护。SpringMVC处理HTTP请求并将它们映射到特定的处理器方法,这些方法通常返回模型和视图,以呈现给用户。
3. **MyBatis**:MyBatis是一个持久层框架,它提供了对数据库的操作支持。MyBatis使用简单的XML或注解用于配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。MyBatis的主要特点是灵活,它允许开发者自己编写SQL,从而提供了更好的性能和可定制性。
SSM框架的结合使用,可以提供一种分层架构,其中:
- Spring负责管理应用程序的业务逻辑和依赖注入。
- SpringMVC负责处理Web层的请求和响应。
- MyBatis负责数据访问层的操作,即与数据库的交互。
这种分层架构有助于提高代码的可读性、可维护性和可扩展性。SSM框架是构建大型Java Web应用程序的流行选择,因为它结合了三个框架的最佳特性,提供了一个强大、灵活且易于使用的开发环境。
 


Spring框架的三个核心技术是IoC(控制反转)、DI(依赖注入)和AOP(面向切面编程)。下面是这三个技术的简述:
1. **IoC(控制反转)**:
   - 控制反转是一种设计原则,它将对象创建和依赖管理的控制权从程序代码转移到外部容器(在Spring中是Spring容器)。
   - 通过IoC,开发者不再直接在代码中创建对象和配置依赖,而是通过配置文件或注解来描述这些关系,由Spring容器负责对象的创建和依赖的注入。
   - IoC有助于减少代码的耦合度,提高代码的可测试性和可维护性。
2. **DI(依赖注入)**:
   - 依赖注入是IoC的一种实现方式,它允许将依赖的对象通过构造函数、工厂方法或属性设置注入到另一个对象中。
   - Spring通过DI来管理应用程序中的对象依赖关系,使得开发者可以专注于业务逻辑,而不必担心对象的创建和依赖问题。
   - DI有助于实现模块化和可重用的组件,同时也使得单元测试更加容易。
3. **AOP(面向切面编程)**:
   - 面向切面编程是一种编程范式,它允许开发者将横切关注点(如日志、事务、安全等)与业务逻辑分离。
   - AOP通过切面(Aspect)来定义横切关注点,并通过通知(Advice)将这些关注点织入到程序的指定位置(连接点,Join Point)。
   - Spring AOP提供了一种声明式的方式来管理横切关注点,从而减少了代码的重复性和复杂性,提高了代码的可维护性。
总结来说,IoC和DI使得依赖管理更加灵活和可配置,而AOP则提供了在不修改核心业务逻辑的情况下,将横切关注点织入到应用程序中的能力。这三个核心技术共同构成了Spring框架的核心优势,使得它成为开发企业级Java应用程序的流行选择。
 


【登录操作】

①业务逻辑层(模型)建立 JavaBean类 User【GET SET方法 无参构造方法】

public class User {private String username;private String password;public User() {}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}

②接口类 UserDao 

public interface UserDao {void saveUser(User user);ArrayList<User> selectUser();
}

③接口实现 UserDaoimpl

3.1实现数据库链接

public class UserDaoimpl  implements UserDao{//先接入JDBCprivate static String driver = "com.mysql.jdbc.Driver";private static String dbUrl = "jdbc:mysql://localhost:3306/db";private static String dbUser = "root";private static String dbpsw="123456";//无参构造法public UserDaoimpl(){}//获取Connectionpublic Connection getConnection(){Connection con = null;try {Class.forName(driver);con = DriverManager.getConnection(dbUrl,dbUser,dbpsw);}catch (Exception e){e.printStackTrace();}return con;}
}

3.2实现保存用户信息功能(在impl类中继续添加方法)

    @Overridepublic void saveUser(User user) {Connection con =null;PreparedStatement stmt =null;try {con.setAutoCommit(false);con = getConnection();String sql = "insert into user (username,password) values (?,?)";stmt = con.prepareStatement(sql);stmt.setString(1,user.getUsername());stmt.setString(2,user.getPassword());stmt.execute();con.commit();} catch (Exception e){try {con.rollback();}catch (SQLException s){s.printStackTrace();}finally {try {stmt.close();con.close();}catch (Exception e){e.printStackTrace();}}}}

3.3查询所有用户信息

    @Overridepublic ArrayList<User> selectUser() {Connection con= null;PreparedStatement pstm =null;ResultSet rs = null;ArrayList<User> users =new ArrayList<>();try {con = getConnection();String sql = "select * from User";pstm = con.prepareStatement(sql);rs = pstm.executeQuery();User user =new User();while (rs.next()){user.setUsername(rs.getString(1));user.setPassword(rs.getString(2));users.add(user);}rs.close();pstm.close();con.close();} catch (SQLException e) {throw new RuntimeException(e);}return users;}
}

④Servlet类

@WebServlet("/login")
public class Http extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("username");String psw = req.getParameter("password");User user = new User();UserDao userDao =new UserDaoimpl();ArrayList<User> users = userDao.selectUser();//实现登录功能//实现条件查询方法 与查询类似只需更改sql语句//用getParameter接受到的name psw与数据库中的一致if (name.equals(users.get(0).getUsername())&&psw.equals(users.get(0).getPassword())){req.setAttribute("username",name);//携带name返回req.getRequestDispatcher("/welcome.jsp").forward(req,resp);//跳转至welcome页 请求转发携带信息return;}else {resp.sendRedirect("/login.jsp");//重定向不携带信息}}
}

⑤表单提交

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="login" name="1" ><input type="text" placeholder="name" name="username"><br><input type="password" name="password" placeholder="psw"><br><button type="submit" value="login">denglu</button></form></body>
</html>

相关文章:

WEB后端复习——MVC、SSM【含登录页面代码】

MVC&#xff08;Model-View-Controller&#xff09;是一种软件设计模式&#xff0c;用于将应用程序分解为三个相互关联的组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这种模式在构建用户…...

灵卡科技HDMI音视频采集及H.264编码一体化采集卡—LCC260

推荐一款由灵卡科技倾力打造的高品质HDMI音视频采集卡——LCC260。以创新的技术&#xff0c;精湛的工艺和卓越的性能&#xff0c;为您提供全方位的音视频解决方案。 LCC260是一款集HDMI音视频采集与H.264编码于一身的全功能采集卡。它的输入端配备了最先进的HDMI 1.4a标准接口&…...

智能自助终端主板RK3288/RK3568在酒店前台自助机方案的应用,支持鸿蒙,支持免费定制

酒店前台自助机解决方案是一款基于自助服务终端&#xff0c;能够让客人通过简单的操作完成入住登记/退房的解决方案&#xff0c;大幅提高酒店的工作效率&#xff0c;提升客人体验&#xff0c;降低人力成本。 该方案解决了以下传统前台登记入住方式的痛点&#xff1a; 1、人流量…...

Visual Studio环境搭载

环境搭建步骤&#xff1a; 下载软件 安装软件 运行软件 1 下载软件 在百度搜索 visual studio&#xff0c;选择 如下图中的选项 进入Visual Studio 官网后&#xff0c;选择 下载Windows版&#xff0c;并选择Community 2017 社区版本进行下载保存软件到电脑中 2 安装软件 双击…...

添砖Java之路(其八)——继承,final关键字

目录 继承&#xff1a; super关键字&#xff1a; 方法重写&#xff1a; 继承特点&#xff1a; 继承构造方法&#xff1a; final关键字&#xff1a; 继承&#xff1a; 意义&#xff1a;让类于类之间产生父类于子类的关系&#xff0c;子类可以直接使用父类中的非私有成员(包…...

一篇详解Git版本控制工具

华子目录 版本控制集中化版本控制分布式版本控制 Git简史Git工作机制Git和代码托管中心局域网互联网 Git安装基础配置git的--local&#xff0c;--global&#xff0c;--system的区别 创建仓库方式1git init方式2git clone git网址 工作区&#xff0c;暂存区&#xff0c;本地仓库…...

谷歌邮箱2024最新注册教程

大家好&#xff0c;我是蓝胖子&#xff0c;今天教大家如何注册谷歌邮箱 谷歌邮箱的注册后面的用途会经常用得到 首先&#xff0c;需要魔法自行解决 第一步&#xff1a;打开谷歌官网 www.google.com 确保谷歌官网能正常打开 第二步&#xff1a;创建账号 接下来可能会遇到这…...

Spring事务深度解析

Spring事务深度解析 介绍 在现代的软件开发中&#xff0c;事务管理是一个非常重要的话题。Spring框架提供了强大的事务管理功能&#xff0c;使得开发人员能够轻松地处理数据库操作的一致性和并发性问题。本文将深入探讨Spring事务的原理和使用方法。 什么是事务&#xff1f;…...

机器学习周报第41周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 背景1.3 论文方法1.3.1 局部特征提取1.3.2 局部特征转换器 (LoFTR) 模块1.3.4 建立粗粒度匹配1.3.5 精细匹配 1.4 损失1.5 实现细节1.6 实验1.6.1 单应性估计1.6.2 相对位姿估计 二、论文代码总结 摘要 本周阅读了一篇特征匹配领域的…...

gin框架学习笔记(三) ——路由请求与相关参数

参数种类与参数处理 查询参数 在讲解查询参数的定义之前&#xff0c;我们先来看一个例子&#xff0c;当我打开了CSDN&#xff0c;我现在想查看我的博客浏览量&#xff0c;那么我就需要点击我的头像来打开我的个人主页,像下面这样: 我们现在把浏览器的网址取下来&#xff0c;…...

HTML常用标签-多媒体标签(图片、音频、视频)

多媒体标签 1 图片标签2 音频标签3 视频标签 1 图片标签 img(重点) 图片标签,用于在页面上引入图片 代码 <!-- src用于定义图片的连接 title用于定义鼠标悬停时显示的文字 alt用于定义图片加载失败时显示的提示文字 --> <img src"路径" title"悬停显…...

Flutter 中的 AnimatedIcon 小部件:全面指南

Flutter 中的 AnimatedIcon 小部件&#xff1a;全面指南 AnimatedIcon是Flutter Material组件库中的一个独特动画组件&#xff0c;它允许开发者在两个图标之间进行平滑的过渡动画。这使得它非常适合用于表示应用程序的状态变化&#xff0c;如菜单打开/关闭、搜索打开/关闭等。…...

0510Goods的Maven项目

0510Goods的Maven项目包-CSDN博客 数据库字段 商品主页 修改页面 点击商品主页更改信息&#xff0c; 跳转到修改页面&#xff0c; 并保留初始信息。 商品类别最多选取三项&#xff0c;最少选取一项 添加界面 商品类别最多选取三项&#xff0c;最少选取一项...

使用Pyramid、Mako和PyJade生成 HTML

Pyramid 是一个流行的 Python Web 框架&#xff0c;而 Mako 和 PyJade 是用于模板引擎的工具&#xff0c;它们可以与 Pyramid 配合使用来生成 HTML 内容。但是在实际使用中还是有些差别的&#xff0c;尤其会遇到各种各样的问题&#xff0c;下面我将利用我所学的知识一一为大家解…...

什么是Facebook付费广告营销?

Facebook作为全球最大的社交平台之一&#xff0c;成为了跨境卖家不可或缺的营销阵地。它不仅拥有庞大的用户基数&#xff0c;还提供了丰富的广告工具和社群互动功能&#xff0c;让商家能够精准触达目标市场&#xff0c;提升品牌影响力。云衔科技通过Facebook付费广告营销的专业…...

面对.halo勒索病毒,如何有效防范与应对?

导言&#xff1a; 随着网络技术的不断发展&#xff0c;网络安全问题也日益凸显。其中&#xff0c;勒索病毒作为一种极具破坏性的网络攻击手段&#xff0c;近年来在全球范围内频发。其中&#xff0c;.halo勒索病毒作为勒索病毒家族中的一员&#xff0c;其危害性和传播性不容忽视…...

JSON 转为json串后出现 “$ref“

问题描述 转为JSON 串时出现 "$ref":"$.RequestParam.list[0]" $ref&#xff1a; fastjson数据重复的部分会用引用代替&#xff0c;当一个对象包含另一个对象时&#xff0c;fastjson就会把该对象解析成引用 “$ref”:”..” 上一级 “$ref”:”” 当前对…...

Nachi那智不二越机器人维修技术合集

一、Nachi机械手维护基础知识 1. 定期检查&#xff1a;定期检查机器人的各个部件&#xff0c;如机械手伺服电机、机器人减速器、机械臂传感器等&#xff0c;确保其运行正常。 2. 清洁与润滑&#xff1a;定期清洁Nachi工业机器人表面和内部&#xff0c;并使用合适的润滑油进行润…...

C++类与对象基础探秘系列(二)

目录 类的6个默认成员函数 构造函数 构造函数的概念 构造函数的特性 析构函数 析构函数的概念 析构函数的特性 拷贝构造函数 拷贝构造函数的概念 拷贝构造函数的特性 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类的成员函数 取地址及const取地址操作…...

MyBatis-Plus核心功能详解:条件构造器、自定义SQL与Service接口

在Java的Web开发中&#xff0c;MyBatis-Plus作为MyBatis的增强工具&#xff0c;提供了许多实用的功能&#xff0c;极大地简化了数据库操作的开发过程。下面&#xff0c;我们将详细探讨MyBatis-Plus的三大核心功能&#xff1a;条件构造器、自定义SQL以及Service接口。 一、条件…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...