【Spring教程23】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC简介与SpringMVC概述

news2025/1/28 1:14:28

目录

  • 1,SpringMVC简介
  • 2、SpringMVC概述

欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《Spring事务角色与 Spring事务属性、事务传播行为》
在这里插入图片描述

1,SpringMVC简介

从这一节开始,我们开始学 习SpringMVC,看到SpringMVC这个名字我们会发现其中包含Spring,那么SpringMVC和Spring之间的会有关系么?答案是肯定有,SpringMVC隶属于Spring,是Spring技术中的一部分。那么SpringMVC到底是用来做什么的呢?

  • 回想web阶段,我们学习过Servlet,而SpringMVC与Servlet技术功能等同,均属于web层或者说表现层开发技术。

那么既然已经有了Servlet为什么还需要花时间再学习一个SpringMVC技术?要回答这个问题,我们
就需要搞清楚SpringMVC与Servlet相比,有什么优势:

框架我们都知道是用来简化开发的,所以SpringMVC与Servlet相比,开发起来更简单快捷,用更少的代码完成表现层代码的开发,那么问题又来了,到底有多简单呢?我们通过一个例子来体验一把吧。

将资料中的项目导入到IDEA中,打开后格式如下
在这里插入图片描述

  • UserSaveServlet:使用Servlet开发的用户新增模块
@WebServlet("/user/save")
public class UserSaveServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		//1.接收请求参数
		String name = req.getParameter("name");
		System.out.println("servlet save name ==> " + name);
		//2.生产响应
		resp.setContentType("text/json;charset=utf-8");
		PrintWriter pw = resp.getWriter();
		pw.write("{'module':'servlet save'}");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		this.doGet(req,resp);
	}
}
  • UserUpdateServlet:使用Servlet开发的用户修改模块
@WebServlet("/user/update")
public class UserUpdateServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
	//1.接收请求参数
	String name = req.getParameter("name");
	System.out.println("servlet update name ==> " + name);
	 //2.生产响应
	resp.setContentType("text/json;charset=utf-8");
	PrintWriter pw = resp.getWriter();
	 pw.write("{'module':'servlet update'}");
}

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		this.doGet(req,resp);
	}
}
  • UserDeleteServlet:使用Servlet开发的用户删除模块
@WebServlet("/user/delete")
public class UserDeleteServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		//1.接收请求参数
		String name = req.getParameter("name");
		System.out.println("servlet delete name ==> " + name);
		//2.生产响应
		resp.setContentType("text/json;charset=utf-8");
		PrintWriter pw = resp.getWriter();
		pw.write("{'module':'servlet delete'}");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
		this.doGet(req,resp);
	}
}
  • UserSelectServlet:使用Servlet开发的用户查询模块
@WebServlet("/user/select")
public class UserSelectServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {
		//1.接收请求参数
		String name = req.getParameter("name");
		System.out.println("servlet select name ==> " + name);
		//2.生产响应
		resp.setContentType("text/json;charset=utf-8");
		PrintWriter pw = resp.getWriter();
		pw.write("{'module':'servlet select'}");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {
		this.doGet(req,resp);
	}
}

启动项目,测试结果如下:
在这里插入图片描述
上面就是通过Servlet的方式来实现的用户模块的增删改查功能。那么如果使用SpringMVC来开发相
同的功能,做出来是什么样子的呢?

打开项目springmvc包下的UserController类,内容如下:

@Controller
public class UserController {

	@RequestMapping("/save")
	@ResponseBody
	public String save(String name){
		System.out.println("springmvc save name ==> " + name);
		return "{'module':'springmvc save'}";
	}
	
	@RequestMapping("/delete")
	@ResponseBody
	public String delete(String name){
		System.out.println("springmvc delete name ==> " + name);
		return "{'module':'springmvc delete'}";
	}
	
	@RequestMapping("/update")
	@ResponseBody
	public String update(String name){
		System.out.println("springmvc update name ==> " + name);
		return "{'module':'springmvc update'}";
	}
	
	@RequestMapping("/select")
	@ResponseBody
	public String select(String name){
		System.out.println("springmvc select name ==> " + name);
		return "{'module':'springmvc select'}";
	}
}

启动项目,测试结果如下:
在这里插入图片描述
通过两种技术对相同功能的实现,我们会发现打印输出的结果是一样的,但是对比编写的代码会发现
SpringMVC这种开发方式更简单、更高效

所以接下来我们就需要来学习下SpringMVC这门技术,主要学习那些内容呢?

学习之前大家需要记住一件事是,SpringMVC是用来替换Servlet的,所以Servlet能实现的,
SpringMVC就能实现,主要学习的内容包含如下模块:

  • SpringMVC简介
  • 请求与响应
  • REST风格
  • SSM整合(注解版)
  • 拦截器
    在这里插入图片描述

SpringMVC简介:主要是来认识下到底什么是SpringMVC。

请求与相应:SpringMVC是替换Servlet处于Web的框架,所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端,所以如何处理请求和响应是SpringMVC中非常重要的一块内容。

REST风格:是一种软件架构风格,可以降低开发的复杂性,提高系统的可伸缩性,在以后开发中非常重要和常用。

SSM整合:是把咱们所学习的SpringMVC+Spring+Mybatis整合在一起来完成业务开发,是对我们所学习这三个框架的一个综合应用。

拦截器:是SpringMVC中的一个小知识点。

对于SpringMVC的学习,最终要达成的目标:

  1. 掌握基于SpringMVC获取请求参数和响应json数据操作
  2. 熟练应用基于REST风格的请求路径设置与参数传递
  3. 能够根据实际业务建立前后端开发通信协议并进行实现
  4. 基于SSM整合技术开发任意业务模块功能
    在这里插入图片描述

下面我们就进入SpringMVC这一章内容的学习,在这一章中,我们主要学习如下内容:

  • SpringMVC概述
  • 入门案例
  • 入门案例工作流程分析
  • Controller加载控制
  • PostMan

本章的核心内容为:入门案例和入门案例工作流程分析。

2、SpringMVC概述

我们要学习的SpringMVC究竟是一门什么技术呢?

在这里插入图片描述
在这里插入图片描述

当前WEB程序的工作流程:
三层架构

  • web程序通过浏览器访问前端页面,发送异步请求到后端服务器
  • 后台服务器采用三层架构进行功能开发
    • 表现层负责接收请求和数据然后将数据转交给业务层
    • 业务层负责调用数据层完成数据库表的增删改查,并将结果返给表现层
    • 表现层将数据转换成json格式返回给前端
  • 前端页面将数据进行解析最终展示给用户。

表现层与数据层的技术选型:

  • 数据层采用Mybatis框架
  • 表现层采用SpringMVC框架,SpringMVC主要负责的内容有:
    • controller如何接收请求和数据
    • 如何将请求和数据转发给业务层
    • 如何将响应数据转换成json发回到前端

介绍了这么多,最后我们来对SpringMVC一个概述:

  • SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
  • 优点
    • 使用简单、开发便捷(相比于Servlet)
    • 灵活性强

这里所说的优点,就需要我们再使用的过程中慢慢体会。从下一节开始,我们将正式开始SpringMVC的学习。

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

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

相关文章

Java基础课的中下基础课04

目录 二十三、集合相关 23.1 集合 (1)集合的分支 23.2 List有序可重复集合 (1)ArrayList类 (2)泛型 (3)ArrayList常用方法 (4)Vector类 (…

【论文阅读笔记】NeRF+Mip-NeRF+Instant-NGP

目录 前言NeRF神经辐射场体渲染连续体渲染体渲染离散化 方法位置编码分层采样体渲染推导公式(1)到公式(2)部分代码解读相机变换(重要!) Mip-NerfTo do Instant-NGPTo do 前言 NeRF是NeRF系列的…

字节跳动ZNS SSD应用案例分析

字节给出未来数据中心的发展趋势,包括计算、网络、存储三大组件。 字节目前遇到云存储的痛点主要包括:性能、成本、稳定性、定制化。性能方面,SSD的垃圾回收在传统SSD并不可控。成本方面,传统SSD需要预留一定的OP预留空间。稳定性…

【Marp】基于Markdown-Marp快速制作PPT

【Marp】基于Markdown-Marp快速制作PPT 文章目录 【Marp】基于Markdown-Marp快速制作PPT零、参考资料一、Marp基本语法(创建分页,排版图片,更换主题,Marp扩展指令修改样式)1、创建新的PPT页面2、插入图片 & 排版图…

Python学习笔记-类

1 定义类 类是函数的集合,class来定义类 pass并没有实际含义,只是为了代码能执行通过,不报错而已,相当于在代码种占一个位置,后续完善 类是对象的加工厂 2.创建对象 carCar()即是创建对象的过程 3、类的成员 3.1 实例…

【CiteSpace】引文可视化分析软件CiteSpace下载与安装

CiteSpace 译“引文空间”,是一款着眼于分析科学分析中蕴含的潜在知识,是在科学计量学、数据可视化背景下逐渐发展起来的引文可视化分析软件。由于是通过可视化的手段来呈现科学知识的结构、规律和分布情况,因此也将通过此类方法分析得到的可…

Unity中C#如何访问并修改Shader材质

文章目录 前言一、我们用点击按钮来改变Shader传入的颜色值1、在渲染GUI时,绘制一个按钮2、我们使用一个公共的成员变量存储需要进行修改的游戏对象3、最后给绘制的按钮点击增加逻辑即可 二、测试使用的代码1、Shader代码:2、C#脚本 前言 我们写好Shade…

MFC CLXHHandleEngine动态库-自定义设置对话框使用

实现的效果如下所示: void CSampleDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CSgxMemDialog dlg(180, 100); dlg.SetEnable(true); dlg.SetWindowTitle(_T("自定义对话框")); dlg.AddStatic(1000, //控件资源…

vue构建项目

vue构建项目 全局安装脚手架 npm install -g vue/cli vue -V(版本号查看) 官方介绍:Installation | Vue CLI 一、vue可视化创建项目 vue 可视工具 vue ui 新建项目(可视化) 功能选择 配置 二、VSCode 命令行创建…

D28|买卖股票的最佳时机+跳跃游戏

122.买卖股票的最佳时机 II 初始思路: 这道题解题的时候比较像在找规律,发现只要计算这个过程中的两数之差然后相加即可。 题解复盘: 可以更加清晰的发现如何从题意中获得贪心的思路。 如何贪心:局部最优:收集每天的…

Redis高效恢复策略:内存快照与AOF

第1章:Redis宕机恢复的重要性和挑战 大家好,我是小黑。今天咱们来聊聊Redis宕机后的恢复策略。想象一下,你的网站突然宕机了,所有的数据都飘了,这种情况下,快速恢复数据就显得尤为重要。Redis作为一个高性…

neuq-acm预备队训练week 8 P1144 最短路计数

题目描述 给出一个 N 个顶点 M条边的无向无权图,顶点编号为 1∼N。问从顶点 1 开始,到其他每个点的最短路有几条。 题目限制 输入格式 第一行包含 22 个正整数 N,M,为图的顶点数与边数。 接下来 M 行,每行 2个正整数 x,y&…

江科大 STM32入门教程 P14 定时中断和定时器外部时钟

1 通用定时器中断的初始化(Time2) 1.1 开启RCC的TimxCLK时钟, 由于Time2是由APB1总线的外设控制的 RccAPB1PeriphClockCmd(RCC_APB1PeriPh_TIM2,ENABLE);//使能APB1总线1.2 选择时基单元时钟 选择时基单元内部时钟 TIM_InteralClockConfig(IIM2);//内…

谷歌笔记应用Notebook LM,添加Gemini Pro模型并扩大应用范围;Fine-Tuning预训练模型

🦉 AI新闻 🚀 谷歌更新AI笔记应用Notebook LM,添加Gemini Pro模型并扩大应用范围 摘要:谷歌在今年5月推出的AI笔记应用Notebook LM进行了更新,主要添加了最新的Gemini Pro模型,并扩大了应用使用范围。Not…

【K8S in Action】服务:让客户端发现pod 并与之通信(1)

服务是一种为一组功能相同的 pod 提供单一不变的接入点的资源。当服务存在时,它的 IP 地址和端口不会改变。 客户端通过 IP 地址和端口号建立连接, 这些连接会被路由到提供该服务的任意一个 pod 上。 pod 是短暂,会删除增加,调度…

ffmpeg6.0之ffprobe.c源码分析二-核心功能源码分析

本篇我们继续分析: 1、ffprobe -show_packets 参数的处理流程;2、ffprobe -show_frames 参数的处理流程;3、ffprobe -show_streams 参数的处理流程;4、ffprobe -show_format 参数的处理流程; 因为前面的文章已经回顾了这些命令的使用,以及作用。本文就不在赘述,以免篇幅…

4-SpringMVC

文章目录 项目源码地址回顾-MVC什么是MVC?MVC各部分组成 回顾-ServletMaven创建Web项目1、创建Maven父工程pom,并导入依赖2、用Maven新建一个Web Module3、代码:HelloServlet.java3、代码-hello.jsp3、代码-web.xml4、配置Tomcat5、浏览器测试…

通过生成模拟释放无限数据以实现机器人自动化学习

该工作推出RoboGen,这是一种生成机器人代理,可以通过生成模拟自动大规模学习各种机器人技能。 RoboGen 利用基础模型和生成模型的最新进展。该工作不直接使用或调整这些模型来产生策略或低级动作,而是提倡一种生成方案,该方案使用…

分子生成领域的stable diffusion - GEOLDM

一、关于stable diffusion 很多人都知道stable diffusion,stable diffusion的出现改变了机器生成领域,让AI技术第一次无比的接近正常人。大语言模型,AIGC概念于是兴起。基于stable diffusion 大家开发了lora, hyperwork等微调技术…

React-hooks

1 hooks使命 #逻辑组件复用 逻辑与UI组件分离 React 官方推荐在开发中将逻辑部分与视图部分结耦,便于定位问题和职责清晰 函数组件拥有state 在函数组件中如果要实现类似拥有state的状态,必须要将组件转成class组件 逻辑组件复用 社区一直致力于逻辑…