【Spring MVC】快速学习使用Spring MVC的注解及三层架构

简介: 【Spring MVC】快速学习使用Spring MVC的注解及三层架构

Spring Web MVC

一: 什么是Spring Web MVC?

SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。它的正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为)SpringMVC).

MVC是⼀种架构设计模式,也⼀种思想,⽽SpringMVC是对MVC思想的具体实现.除此之外,SpringMVC还是⼀个Web框架.

总结来说,SpringMVC是⼀个实现了MVC模式的Web框架

MVC的定义

MVC是ModelViewController的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分

为模型、视图和控制器三个基本部分

• View(视图)指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.

• Model(模型)是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.

• Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型

来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型


二:Spring MVC中常用注解的使用

2.1 @RequestMapping:地址映射

@RequestMapping既可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类路径+⽅

法路径.

@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息

@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息

@RequestMapping("/user")
@RestController
public class UserController {
  @RequestMapping("/sayHi")
  public String sayHi(){
  return "hello,Spring MVC";
  }
}
2.2 @RequestBody:请求正文

RequestBody:请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正

⽂中

@RequestMapping(value = "/m7")
public Object method7(@RequestBody Person person) {
  return person.toString();
}
2.3 @PathVariable:路径变量

pathvariable:路径变量

和字⾯表达的意思⼀样,这个注解主要作⽤在请求URL路径上的数据绑定

默认传递参数写在URL上,SpringMVC就可以获取到

后端实现代码:

@RequestMapping("/m8/{id}/{name}")
public String method8(@PathVariable Integer id, @PathVariable("name") StringuserName){
    return "解析参数id:"+id+",name:"+userName;
}

如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时,可以简写,不⽤给@PathVariable的属性赋

值,如上述例⼦中的id变量

如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时,需要@PathVariable的属性value赋值,

如上述例⼦中的userName变量

2.4 @RequestPart:上传文件

RequestPart主要是用于客户端上传文件交给服务器进行处理

后端代码实现:

@RequestMapping("/m9")
public String getfile(@RequestPart("file") MultipartFile file) throwsIOException {
  //获取⽂件名称
    String fileName = file.getOriginalFilename();
  //⽂件上传到指定路径
    file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
    return "接收到⽂件名称为: "+fileName;
}
2.5 @RequestParam:重命名

某些特殊的情况下,前端传递的参数key和我们后端接收的key可以不⼀致,⽐如前端传递了⼀个

time给后端,⽽后端是使⽤createtime字段来接收的,这样就会出现参数接收不到的情况,如果出现

这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值

后端实现代码:

@RequestMapping("/m4")
public Object method_4(@RequestParam("time") String createtime) {
    return "接收到参数createtime:" + createtime;
}

可以得出结论:

  1. 使⽤ @RequestParam 进⾏参数重命名时,请求参数只能和 @RequestParam 声明的名称⼀
    致,才能进⾏参数绑定和赋值.
  2. 使⽤ @RequestParam 进⾏参数重命名时,参数就变成了必传参数.
2.6 @RestController:数据控制器

是Contronller和ResponseBody的封装,用于返回数据同时能够将注解内容交给Spring进行管理

@RestController = @Controller + @ResponseBody

@Controller :定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理.

@ResponseBody :定义返回的数据格式为⾮视图,返回⼀个text/html信息

2.7 @ResponseBody:数据格式

@ResponseBody :定义返回的数据格式为⾮视图,返回⼀个text/html信息

@ResponseBody
public class IndexController {
  @RequestMapping("/index")
    public Object index(){
    return "/index.html";
  }
}

@ResponseBody 既是类注解,⼜是⽅法注解

如果作⽤在类上,表⽰该类的所有⽅法,返回的都是数据,如果作⽤在⽅法上,表⽰该⽅法返回的是数据.

也就是说:在类上添加 @ResponseBody 就相当于在所有的⽅法上添加了 @ResponseBody 注解.

同样,如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注

解,也就是当前类下所有的⽅法返回值做为响应数据

设置状态码

SpringMVC会根据我们⽅法的返回结果⾃动设置响应状态码,程序员也可以⼿动指定状态码

通过SpringMVC的内置对象HttpServletResponse提供的⽅法来进⾏设置

@ResponseBody
  public String setStatus(HttpServletResponse response) {
    response.setStatus(401);
    return "设置状态码成功";
  }
2.8 @CookieValue:获取Cookie

Cook是用户客户端用于保存用户的基本信息,以便于用户在下一次登录时可以直接进入

@RequestMapping("/getCookie")
public String cookie(@CookieValue("bite") String bite) {
  return "bite:" + bite;
}
2.9 @SessionAttribute:获取Session

Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象

Session的本质就是⼀个"哈希表",存储了⼀些键值对结构.Key就是SessionID,Value就是⽤⼾信息(⽤

⼾信息可以根据需求灵活设计).

SessionId是由服务器⽣成的⼀个"唯⼀性字符串",从Session机制的⻆度来看,这个唯⼀性字符串称

为)SessionId).但是站在整个登录流程中看待,也可以把这个唯⼀性字符串称为)token).

  1. 当⽤⼾登陆的时候,服务器在Session中新增⼀个新记录,并把sessionId返回给客⼾端.(通过
    HTTP响应中的Set-Cookie字段返回).
  2. 客⼾端后续再给服务器发送请求的时候,需要在请求中带上sessionId.(通过HTTP请求中的
    Cookie字段带上).
  3. 服务器收到请求之后,根据请求中的sessionId在Session信息中获取到对应的⽤⼾信息,再进⾏后
    续操作.找不到则重新创建Session,并把SessionID返回
@RequestMapping("/getSess2")
public String sess2(@SessionAttribute(value = "username",required = false)String username) {
    return "username:"+username;
}

Cookie和Session的区别

• Cookie是客⼾端保存⽤⼾信息的⼀种机制.Session是服务器端保存⽤⼾信息的⼀种机制.

• Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的

桥梁

• Cookie和Session经常会在⼀起配合使⽤.但是不是必须配合.

◦ 完全可以⽤Cookie来保存⼀些数据在客⼾端.这些数据不⼀定是⽤⼾⾝份信息,也不⼀定是

SessionId

◦ Session中的sessionId也不需要⾮得通过Cookie/Set-Cookie传递,⽐如通过URL传递.

2.10 @Data:类注解

Lombok是⼀个Java⼯具库,通过添加注解的⽅式,简化Java的开发其中@Data 注解会帮助我们⾃动⼀些⽅法,包含getter/setter,equals,toString等

Lombok的作⽤如下图所⽰:

如果觉得@Data⽐较粗暴(⽣成⽅法太多),lombok也提供了⼀些更精细粒度的注解

注解 作⽤
@Getter ⾃动添加getter⽅法
@Setter ⾃动添加setter⽅法
@ToString ⾃动添加toString⽅法
@EqualsAndHashCode ⾃动添加equals和hashCode⽅法
@NoArgsConstructor ⾃动添加⽆参构造⽅法
@AllArgsConstructor ⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull 属性不能为null
@RequiredArgsConstructor ⾃动添加必需属性的构造⽅法,final+@NonNull的属性为必需

@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsConstructor

因此可以说明在创建类对象时可以通过引入lambok工具包中的@Data注解,可以自动为我们添加其很多常用的赋值方法


三:应用分层-三层架构

⽬前现在更主流的开发⽅式是"前后端分离"的⽅式,后端开发⼯程师不再需要关注前端的实现,所以对

于Java后端开发者,⼜有了⼀种新的分层架构:把整体架构分为表现层、业务逻辑层和数据层.这种分层

⽅式也称之为"三层架构".

  1. 表现层:就是展⽰数据结果和接受⽤⼾指令的,是最靠近⽤⼾的⼀层;
  2. 业务逻辑层:负责处理业务逻辑,⾥⾯有复杂业务的具体实现;
  3. 数据层:负责存储和管理与应⽤程序相关的数据
    可以看到,咱们前⾯的代码,并不符合这种设计思想,⽽是所有的代码堆砌在⼀起

按照上⾯的层次划分,SpringMVC站在后端开发⼈员的⻆度上,也进⾏了⽀持,

• 请求处理、响应数据:负责,接收⻚⾯的请求,给⻚⾯响应数据.

• 逻辑处理:负责业务逻辑处理的代码.

• 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作

• Controller:控制层。接收前端发送的请求,对请求进⾏处理,并响应数据。

• Service:业务逻辑层。处理具体的业务逻辑。

• Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查

MVC和三层架构的区别和联系

关于⼆者的关系,⼀直存在不同的观点.有⼈认为三层架构是MVC模式的⼀种实现,也有⼈认为MVC是

三层架构的替代⽅案,等等各种说法都有.根本原因是⼤家站在不同的⻆度来看待这个问题的.

JavaEE部分的学习重在"实践",⼤家根据⾃⼰的理解,能够⾃圆其说,说出⾃⼰的观点即可,也不建议

⼤家去背书.

从概念上来讲,⼆者都是软件⼯程领域中的架构模式.

MVC架构模式由三部分组成,分别是:模型(Model),视图(View)和控制器(Controller).

三层架构将业务应⽤划分为:表现层,业务逻辑层,数据访问层.

MVC中,视图和控制器合起来对应三层架构中的表现层.模型对应三层架构中的业务逻辑层,数据层,

以及实体类

⼆者其实是从不同⻆度对软件⼯程进⾏了抽象.

MVC模式强调数据和视图分离,将数据展⽰和数据处理分开,通过控制器对两者进⾏组合.

三层架构强调不同维度数据处理的⾼内聚和低耦合,将交互界⾯,业务处理和数据库操作的逻辑分开.

⻆度不同也就谈不上互相替代了,在⽇常的开发中可以经常看到两种共存的情况,⽐如我们设计模型

层的时候往往也会拆分出业务逻辑层(Service层)和数据访问层(Dao层)


四:总结

1.学习SpringMVC,其实就是学习各种Web开发需要⽤的到注解

a. @RequestMapping:路由映射
b. @RequestParam:后端参数重命名
c. @RequestBody:接收JSON类型的参数
d. @PathVariable:接收路径参数
e. @RequestPart:上传⽂件
f. @ResponseBody:返回数据
g. @CookieValue:从Cookie中获取值
h. @SessionAttribute:从Session中获取值
i. @RequestHeader:从Header中获取值
j. @Controller:定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理.默认返回
视图.
k. @RestController:@ResponseBody+@Controller返回数据

2. Cookie和Session都是会话机制,Cookie是客⼾端机制,Session是服务端机制.⼆者通过SessionId

来关联.SpringMVC内置HttpServletRequest,HttpServletResponse两个对象.需要使⽤时,直接在

⽅法中添加对应参数即可,Cookie和Session可以从HttpServletRequest中来获取,也可以直接使⽤

HttpServletResponse设置Http响应状态码.

相关文章
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
9月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
499 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
9月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
346 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
746 0
|
9月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping("/user/{id}")` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable("自定义名")` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
488 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = "/test", produces = "application/json; charset=UTF-8")`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
429 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
348 0
|
5月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
339 0
|
5月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
157 0