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

目录

  • 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{@Overrideprotected 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'}");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req,resp);}
}
  • UserUpdateServlet:使用Servlet开发的用户修改模块
@WebServlet("/user/update")
public class UserUpdateServlet extends HttpServlet{@Overrideprotected 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'}");
}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req,resp);}
}
  • UserDeleteServlet:使用Servlet开发的用户删除模块
@WebServlet("/user/delete")
public class UserDeleteServlet extends HttpServlet {@Overrideprotected 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'}");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req,resp);}
}
  • UserSelectServlet:使用Servlet开发的用户查询模块
@WebServlet("/user/select")
public class UserSelectServlet extends HttpServlet{@Overrideprotected 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'}");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {this.doGet(req,resp);}
}

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

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

@Controller
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(String name){System.out.println("springmvc save name ==> " + name);return "{'module':'springmvc save'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(String name){System.out.println("springmvc delete name ==> " + name);return "{'module':'springmvc delete'}";}@RequestMapping("/update")@ResponseBodypublic String update(String name){System.out.println("springmvc update name ==> " + name);return "{'module':'springmvc update'}";}@RequestMapping("/select")@ResponseBodypublic 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.mzph.cn/news/213215.shtml

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

相关文章

python使用vtk与mayavi三维可视化绘图

VTK(Visualization Toolkit)是3D计算机图形学、图像处理和可视化的强大工具。它可以通过Python绑定使用,适合于科学数据的复杂可视化。Mayavi 依赖于 VTK (Visualization Toolkit),一个用于 3D 计算机图形、图像处理和可视化的强大…

AS安装目录

编辑器: sdk: gradle: gradle使用的jdk目录:Gradle使用的jdk是android studio安装目录下的jbr 成功项目的android studio配置:

H264码流结构

视频编码的码流结构是指视频经过编码之后得到的二进制数据是怎么组织的,或者说,就是编码后的码流我们怎么将一帧帧编码后的图像数据分离出来,以及在二进制码流数据中,哪一块数据是一帧图像,哪一块数据是另外一帧图像。…

C++面试宝典第4题:合并链表

题目 有一个链表,其节点声明如下: struct TNode {int nData;struct TNode *pNext;TNode(int x) : nData(x), pNext(NULL) {} }; 现给定两个按升序排列的单链表pA和pB,请编写一个函数,实现这两个单链表的合并。合并后,…

Vuex快速上手

一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如:购…

VSCode SSH登录服务器 提示XHR failed

设置->搜索“代理” 把图中的√去掉 重启 即可

tidb安装 centos7单机集群

安装 [rootlocalhost ~]# curl --proto https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh [rootlocalhost ~]# source .bash_profile [rootlocalhost ~]# which tiup [rootlocalhost ~]# tiup playground v6.1.0 --db 2 --pd 3 --kv 3 --host 192.168.1…

SQL自学通之函数 :对数据的进一步处理

目录 一、目标 二、汇总函数 COUNT SUM AVG MAX MIN VARIANCE STDDEV 三、日期/时间函数 ADD_MONTHS LAST_DAY MONTHS_BETWEEN NEW_TIME NEXT_DAY SYSDATE 四、数学函数 ABS CEIL 和FLOOR COS、 COSH 、SIN 、SINH、 TAN、 TANH EXP LN and LOG MOD POW…

【SpringBoot教程】SpringBoot 实现前后端分离的跨域访问(Nginx)

作者简介:大家好,我是撸代码的羊驼,前阿里巴巴架构师,现某互联网公司CTO 联系v:sulny_ann(17362204968),加我进群,大家一起学习,一起进步,一起对抗…

Mybatis之核心配置文件详解、默认类型别名、Mybatis获取参数值的两种方式

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

arm-none-eabi-gcc not find

解决办法:安装:gcc-arm-none-eabi sudo apt install gcc-arm-none-eabi; 如果上边解决问题了就不用管了,如果解决不了,加上下面这句试试运气: $ sudo apt-get install lsb-core看吧方正我是运气还不错,感…

SSL 数字证书的一些细节

参考:TLS/SSL 协议详解(6) SSL 数字证书的一些细节1 证书验证 地址:https://wonderful.blog.csdn.net/article/details/77867063 参考:TLS/SSL协议详解 (7) SSL 数字证书的一些细节2 地址:https://wonderful.blog.csdn.net/articl…

Python学习笔记-类

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

福德植保无人机:绿色农业的新篇章

今天,我们荣幸地向您介绍福德植保无人机,一种改变传统农业种植方式,引领绿色农业的新科技产品。福德植保无人机以其高效、环保、安全的特点,正逐渐成为植保行业的新宠。福德植保无人机是一种搭载了高性能发动机和精确喷洒系统的飞…

代码随想录算法训练营第四十六天 _ 动态规划_背包问题总结。

学习目标: 动态规划五部曲: ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录! 本文大多数内容引用自代码随想录 60天训练营打卡计划! 学习内容: …

POJ - 2528 Mayor‘s posters

本题注意离散化的时候可能会出现区间串联情况&#xff0c;比如 [1,10] [5,10] [1,4] 和 [1,10] [6,10] [1,4] 直接离散化的话两者一样&#xff0c;但是实际上是不一样的 解决办法是你在相邻的差不是1的数对中再插一个数就好了 离线区间染色 查询根节点 #include<iostrea…

数组|73. 矩阵置零 48. 旋转图像

73. 矩阵置零 **题目:**给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 题目链接&#xff1a;矩阵置零 class Solution {public void setZeroes(int[][] matrix) {Stack<int[]> mapofzerone…

【Python必做100题】之第三题(找出100以内的奇数并打印)

思路&#xff1a; 1、定义一个空列表来存储所有的奇数 2、判断是奇数就追加到列表的末尾 3、打印所有的奇数 代码如下&#xff1a; list [ ] #定义一个列表来存储所有的奇数 for i in range (1,100):if i % 2 ! 0: #判断是否为奇数list.append(i) #追加到列表的末尾 prin…

使用draw.io如何让矩形单个边框有颜色其余边框为空白?

方法步骤: 第一步&#xff1a;用户打开Draw.io软件&#xff0c;并来到流程图的编辑页面上&#xff1b; 第二步&#xff1a;接着在左侧的图形库中点击矩形选项&#xff0c;成功将其添加到流程图的绘制页面上&#xff1b; 第三步&#xff1a;这时用户点击矩形并在右侧窗口中点…

C++ //习题2.3 写出以下程序运行结果。请先阅读程序,分析应输出的结果,然后上机验证。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 习题2.3 习题2.3 写出以下程序运行结果。请先阅读程序&#xff0c;分析应输出的结果&#xff0c;然后上机验证。 #include <iostream> using namespace std;int main(){char c1 a, c2 b, c3 c, c4 \101, c5 \116…