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

【Spring】Spring MVC 入门(2)

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

目录

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。

博客涉及框架的重要知识点,根据序号学习即可。

1、什么是MVC

1.1定义

1.2模型

1.3详解

2、什么是Spring Web MVC

2.1官方定义

2.2三大功能

2.3 模型

2.4建立连接

2.5@RequestMapping 注解

3、请求

3.1传递单个参数

3.2传递多个参数

3.3传递数组

3.4传递集合

3.5传递JSON

3.6在URL中获取参数

3.7文件上传

​编辑

4、响应

4.1返回静态页面

4.2返回数据@Responsebody

4.3返回HTML代码片段

4.4返回JSON

4.5设置状态码

4.6设置header

4.6.1设置Content-Type

4.6.2设置其他header

5、应用分层

5.1什么是应用分层

5.2如何分层-----三层架构

5.3MVC与三层架构的区别


1、什么是MVC

1.1定义

        MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分。

1.2模型

1.3详解

  • View(视图) 指在应⽤程序中专门用来与浏览器进行交互,展示数据的资源. 
  • Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分
  • Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型



2、什么是Spring Web MVC

2.1官方定义

(1)Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC"
(2)MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架。 总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架。
(3)Spring MVC 全称是 Spring Web MVC 。其实, Spring MVC 我们在前⾯已经⽤过了, 在创建 Spring Boot 项目时,我们勾选的 Spring Web 框架 其实就是 Spring MVC 框架。这时候可能大家就懵了, 前⾯创建的不是SpringBoot项⽬吗? 怎么又变成了Spring MVC项⽬? 他们之间到底有着什么样的关系? ---------Spring Boot 只是实现Spring MVC的其中⼀种⽅式。Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能。Spring Boot 通过添加Spring Web MVC框架, 来实现web功能。

2.2三大功能

咱们学习Spring MVC, 重点也就是学习如何通过浏览器和程序进行交互。主要分以下三个方⾯:
1. 建⽴连接:将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的
Spring 程序。
2. 请求: 用户请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是获取参数的功能。
3. 响应: 执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应.
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC

2.3 模型

2.4建立连接

2.5@RequestMapping 注解

@RequestMapping 是 Spring Web MVC 应用程序中最常被用到的注解之⼀,它是⽤来注册接⼝的
路由映射的。表示服务收到请求时, 路径为/hello的请求就会调⽤ hello() 这个⽅法的代码.
路由映射: 当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。 既然 @RequestMapping 已经可以达到我们的目的了, 我们为什么还要加 @RestController
呢? 我们把 @RestController 去掉, 再来访问⼀次:
可以看到, 程序报了404, 找不到该页面。这就是 @RestController 起到的作用。
⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法, Spring程序怎么知道要执⾏哪个⽅法呢?
Spring会对所有的类进⾏扫描, 如果类加了注解@RestController, Spring才会去看这个类⾥⾯的⽅法 有没有加 @RequestMapping 这个注解, 当然他的作⽤不⽌这⼀点,后续详说。
  • @RequestMapping 即可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + 方法路径
  • @RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
  • @RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息



3、请求

3.1传递单个参数

(1)后端代码:

@RequestMapping("/param")
@RestController
public class ParamController {@RequestMapping("/m1")public String m1(String name){//传递单个参数return "传递的单个参数为:"+name;}
}

运行结果:

(2)后端代码:

    @RequestMapping("/m2")public String m2(int age){//传递单个参数  接收参数为基本数据类型时,必须传参,否则会报500,所以最好用包装类接收return "传递的单个参数为:"+age;}

运行结果:

3.2传递多个参数

(1)后端代码:

    @RequestMapping("/m3")public String m3(String name,String password){//传递多个参数 return "name:"+name+",password:"+password;}

 运行结果:

(2)后端代码:

@RequestMapping("/param")
@RestController
public class ParamController {  @RequestMapping("/m4")public String m4(Person person){//传递多个参数return person.toString();}
}public class Person {private int id;private String name;private String password;@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

 运行结果:

(3)后端代码:

    @RequestMapping("/m5")public String m5(@RequestParam(value = "username",required = false) String name){//重命名,前后端定义的字段名不一样    前端:username   后端:name//并且@RequseParam注解是必传,没有传参会报错  除非required设置为falsereturn " 接收到的name:"+name;}

运行结果:

3.3传递数组

后端代码:

    @RequestMapping("/m6")public String m6(String[] arr){//传递数组return Arrays.toString(arr);}

运行结果:

3.4传递集合

后端代码:

    @RequestMapping("/m7")public String m7(@RequestParam List<Integer> list){//传递集合和传递数组类似,同一个请求参数名有多个时,默认情况下是封装为数// 组的,但是如果要封装到集合,要使用注解//@RequestParam 绑定参数关系return "size:"+list.size()+",list:"+list;}

 运行结果:

3.5传递JSON

后端代码:

    @RequestMapping("/m8")public String m8(@RequestBody Person person){//传递JSON,需要使用@RequestBody注解//requestbody:请求正文,意思这个注解作用//在请求正文的数据绑定,请求参数必须写在请求正文中return person.toString();}

 运行结果:【用postman进行接口测试】

3.6在URL中获取参数

后端代码:

    @RequestMapping("/m9/{id}/{name}")public String m9(@PathVariable Integer id,@PathVariable String name){//获取URL中的参数//@PathVariable,这个注解主要作用在请求url路径上的数据绑定return "id:"+id+",name:"+name;}

 运行结果:

3.7文件上传

后端代码:

    @RequestMapping("/m10")public String m10(@RequestPart MultipartFile file) throws IOException {//上传文件使用注解@RequestPart//获取文件名称String fileName=file.getOriginalFilename();//文件上传到指定路径file.transferTo(new File("D:/108code/"+file.getOriginalFilename()));return "接收到的文件名"+fileName;}

 运行结果:




4、响应

4.1返回静态页面

静态页面index.html

<!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>hello,index
</form>
</body>
</html>

后端代码: 

@RestController
@RequestMapping("/index")
public class IndexController {@RequestMapping("/m1")public Object m1(){//返回静态页面return "/index.html";}
}

结果: 

结果却发现, ⻚⾯未正确返回, http响应把 "/index.html" 当做了http响应正⽂的数据
那Spring MVC如何才能识别出来 index.html 是⼀个静态⻚⾯, 并进⾏返回呢?
我们需要把 @RestController 改为 @Controller
正确代码如下:
@Controller
@RequestMapping("/index")
public class IndexController {@RequestMapping("/m1")public Object m1(){//返回静态页面return "/index.html";}
}
注解:@RestController与@Controller的区别:
MVC的概念也逐渐发⽣了变化, View不再返回视图, ⽽是返回显⽰视图时需要的数据.
所以前⾯使⽤的 @RestController 其实是返回的数据.
@RestController = @Controller + @ResponseBody
@Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
@ResponseBody : 定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息

4.2返回数据@Responsebody

    @RequestMapping("/m2")public Object m2(){//返回数据@ResponseBodyreturn "/index.html";}

4.3返回HTML代码片段

    @RequestMapping("/m3")public String m3(){//返回HTML代码片段return "<h1>hello,html</h1>";}

4.4返回JSON

    @RequestMapping("/m4")public HashMap<String,String> m4(){//返回JSONHashMap<String,String> map=new HashMap<>();map.put("java","java value");map.put("mysql","mysql value");return map;}

4.5设置状态码

    @RequestMapping("/m5")public String m5(HttpServletResponse response){//设置状态码response.setStatus(401);return "设置状态码成功";}

【Fiddle抓包查看状态码是否设置成功】

4.6设置header

4.6.1设置Content-Type
    @RequestMapping(value = "/m6",produces = "application/json")public String m6(){//设置content-typereturn "{\"success\":true}";}

4.6.2设置其他header
    @RequestMapping(value = "/m7")public String m7(HttpServletResponse response){//设置其他headerresponse.setHeader("MyHeader","MyHeaderValue");return "设置header成功";}



5、应用分层

5.1什么是应用分层

(1)什么是应⽤分层
        应⽤分层 是⼀种软件开发设计思想, 它将应⽤程序分成N个层次, 这N个层次分别负责各⾃的职责, 多个层次之间协同提供完整的功能. 根据项⽬的复杂度, 把项⽬分成三层, 四层或者更多层.
常⻅的MVC设计模式, 就是应⽤分层的⼀种具体体现
(2)为什么需要应⽤分层?
        在最开始的时候,为了让项⽬快速上线,我们通常是不考虑分层的. 但是随着业务越来越复杂,⼤量的 代码混在⼀起,会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动⼀处就牵⼀发⽽动全⾝等 问题. 所以学习对项⽬进⾏分层就是我们程序员的必修课了

5.2如何分层-----三层架构

(1)之前学习的 "MVC", 就是把整体的系统分成了 Model(模型), View(视图)和Controlle(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现 了表现和逻辑的解耦,是⼀种标准的软件分层架构。

(2)目前现在更主流的开发方式是 "前后端分离" 的⽅式, 后端开发⼯程师不再需要关注前端的实现, 所以对 于Java后端开发者, 又有了⼀种新的分层架构: 把整体架构分为表现层、业务逻辑层和数据层。这种分层方式也称之为"三层架构".
  • 表现层: 就是展⽰数据结果和接受⽤⼾指令的,是最靠近⽤⼾的⼀层
  • 业务逻辑层: 负责处理业务逻辑, ⾥⾯有复杂业务的具体实现
  • 数据访问层: 负责存储和管理与应⽤程序相关的数据
(3)按照上面的层次划分, Spring MVC 站在后端开发⼈员的⻆度上, 也进行了支持, 把上面的代码划分为三 个部分:
  • Controller:控制层。接收前端发送的请求,对请求进⾏处理,并响应数据。
  • Service:业务逻辑层。处理具体的业务逻辑。
  • Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查

5.3MVC与三层架构的区别

(1)关于二者的关系, ⼀直存在不同的观点。有人认为三层架构是MVC模式的⼀种实现, 也有⼈认为MVC是三层架构的替代方案, 等等各种说法都有。根本原因是⼤家站在不同的角度来看待这个问题的
(2)从概念上来讲, 二者都是软件⼯程领域中的架构模式
  • MVC架构模式由三部分组成, 分别是: 模型(Model), 视图(View)和控制器(Controller);三层架构将业务应⽤划分为:表现层, 业务逻辑层, 数据访问层
  • MVC中, 视图和控制器合起来对应三层架构中的表现层. 模型对应三层架构中的业务逻辑层, 数据层, 以及实体类,二者其实是从不同⻆度对软件工程进行了抽象
  • MVC模式强调数据和视图分离, 将数据展示和数据处理分开, 通过控制器对两者进行组合;三层架构强调不同维度数据处理的高内聚和低耦合, 将交互界⾯, 业务处理和数据库操作的逻辑分开。角度不同也就谈不上互相替代了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • TeamTalk消息服务器学习
  • spring入门(一)spring简介
  • debian系统安装mysql
  • taro ui 小程序at-calendar日历组件自定义样式+选择范围日历崩溃处理
  • 阿里龙晰系统上将yum安装的myql_8.0.36升级到mysql_8.4.0的过程
  • 279.完全平方数
  • 【Qt 事件】—— 详解Qt事件处理
  • 代码随想录Day 31|leetcode题目:56.合并区间、738.单调递增的数字、968.监控二叉树
  • 【网络原理】从0开始学习计算机网络常识,中学生看了都能学会
  • 倒计时1天!每日一题,零基础入门FPGA
  • 【时间盒子】-【2.准备】HarmonyOS 开发前需要准备什么?
  • Mysql8 主从复制主从切换(超详细)
  • 如何在 CentOS 6 上安装 Nagios
  • 面试(九)
  • 今日算法:蓝桥杯基础题之“星期一”
  • [数据结构]链表的实现在PHP中
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • CAP理论的例子讲解
  • javascript数组去重/查找/插入/删除
  • JavaWeb(学习笔记二)
  • react 代码优化(一) ——事件处理
  • Vue组件定义
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 时间复杂度与空间复杂度分析
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • $refs 、$nextTic、动态组件、name的使用
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (篇九)MySQL常用内置函数
  • (一)80c52学习之旅-起始篇
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .md即markdown文件的基本常用编写语法
  • .Net - 类的介绍
  • .net 发送邮件
  • .NET 给NuGet包添加Readme
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NetCore发布到IIS
  • .NET微信公众号开发-2.0创建自定义菜单
  • .NET中分布式服务
  • ??在JSP中,java和JavaScript如何交互?
  • @RequestParam详解
  • [4.9福建四校联考]
  • [AIGC] 如何建立和优化你的工作流?
  • [Android] Android ActivityManager
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C/C++入门][字符与ASCII码]6、用代码来转换字符与它的ASCII码
  • [c]统计数字
  • [Contest20180313]灵大会议
  • [Django ]Django 的数据库操作