🎼个人主页:【Y小夜】
😎作者简介:一位双非学校的大二学生,编程爱好者,
专注于基础和实战分享,欢迎私信咨询!
感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️
目录
🎯MVC概论
😎何为MVC
- MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
- 是将业务逻辑、数据、显示分离的方法来组织代码。
- MVC主要作用是降低了视图与业务逻辑间的双向偶合。
- MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

😎MVC框架要做哪些事情
- 1将url映射到java类或java类的方法 .
- 封装用户提交的数据 .
- 处理请求--调用相关的业务处理--封装响应数据 .
- 将响应的数据进行渲染 . jsp / html 等表示层数据 .
🎯什么是SpringMVC
查看官方文档:Web on Servlet Stack (spring.io)
😎概述
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架
😎优缺点
✨优点
-
配置灵活性:Spring MVC提供了灵活的配置方式,可以通过XML或基于注解的方式快速搭建项目结构。
-
测试易行性:由于Controller类是POJO,使得单元测试变得简单,无需依赖特定的测试环境。
-
插件兼容性:与OpenAPI(如Swagger)等其他框架易于集成,方便API文档的生成和管理。
-
清晰的分层设计:优秀的分层设计使得应用程序结构清晰,各部分职责明确,有利于代码的重用和维护。
-
强大的数据验证:支持将请求参数自动绑定到方法参数,并且提供强大的验证框架,保证输入数据的正确性和安全性。
✨缺点
-
学习曲线陡峭:初学者可能需要较长时间来掌握Spring MVC的工作原理和机制。
-
配置繁琐:尽管灵活,但对于新手来说,配置过程可能相对复杂,需要理解多个配置选项和注解的使用。
-
系统结构和实现复杂性增加:对于简单的界面应用,严格的MVC分离可能会增加结构的复杂性,并可能导致性能下降。
-
视图与控制器连接过紧密:虽然视图和控制器是分离的,但它们之间存在紧密的联系,这在某种程度上限制了它们的独立重用性。
-
高级工具支持不足:许多高级的用户界面工具并不完全支持MVC模式,改造这些工具以适应MVC可能需要较高的成本。
😎执行原理
😎导入的依赖
<dependencies>
<!--Junit-->
1
2
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Servlet - JSP -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
🎯 控制器Controller
- 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
- 控制器负责解析用户的请求并将其转换为一个模型。
- 在Spring MVC中一个控制器类可以包含多个方法
- 在Spring MVC中,对于Controller的配置方式有很多种
😎使用注解@Controller
@Controller注解类型用于声明Spring类的实例是一个控制器(在讲IOC时还提到了另外3个注 解);
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="com.kuang.controller"/>
//@Controller注解的类会自动添加到Spring上下文中
@Controller
public class ControllerTest2{
//映射访问路径
@RequestMapping("/t2")
public String index(Model model){
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "ControllerTest2");
//返回视图位置
return "test";
}
}
😎RequestMapping
- @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
- 为了测试结论更加准确,我们可以加上一个项目名测试 myweb
- 只注解在方法上面
@Controller
@RequestMapping("/admin")
public class TestController {
@RequestMapping("/h1")
public String test(){
return "test";
}
}
🎯RestFul 风格
😎简介
RestFul 风格是一种软件架构风格,其核心理念是资源在网络中以某种表现形式进行状态转移。RestFul风格将请求的资源定位和对资源的操作分离,使得接口设计更加清晰和简洁。下面将从不同的角度来探讨RestFul风格:
- RestFul风格的定义
- 资源与表现形态:RestFul风格强调资源的概念,每个资源对应一个唯一的资源定位符(URI),资源可以是任何可标识的信息,如文档、图片等。
- 状态转移:通过HTTP动词实现资源状态的转移,即对资源进行增删改查操作。
- RestFul风格的具体体现
- 统一接口:RestFul风格规定使用统一的接口,这使得整个系统的设计简单且易于理解。
- 无状态性:每次请求都应包含所有必要的信息,服务器不保存客户端的状态信息,这有助于提高系统的可扩展性和可靠性。
- 缓存机制:通过适当的缓存策略减轻服务器负担,提高性能。
- 分层系统:允许系统中的不同组件独立更新和演进,增加系统的灵活性。
- RestFul风格的应用优势
- 前后端分离:前端只负责展示数据,后端通过RestFul风格的API提供数据,实现真正的前后端分离,提高开发效率和代码的可维护性。
- 跨平台兼容性:RestFul风格的API可同时支持多种平台,包括Web、iOS、Android等。
- 简化的编程模型:基于HTTP协议和常见的数据格式(如JSON),开发者可以快速理解和使用。
- RestFul风格的应用场景
- 企业级应用:许多大型企业和组织采用RestFul风格的API设计,如GitHub、白宫网站等。
- 移动应用开发:RestFul风格的API便于移动设备调用,支持iOS、Android等多个平台。
- 跨域认证:结合JWT等技术,RestFul风格的API可以实现安全的跨域认证,保护用户数据和隐私。
- RestFul风格的挑战
- 版本管理:在API迭代过程中需要保持向后兼容性或合理地管理不同版本的API。
- 安全性考量:虽然无状态性能提高系统的扩展性,但同时也增加了身份验证和授权的复杂性。
- 错误处理:需要设计合理的错误处理机制,确保API在出现异常时能够给出明确和有用的反馈。
😎优缺点
- 优点
- 清晰性和简单性:RestFul架构基于HTTP协议,每个HTTP方法都有其特定的含义和用途,使得API更容易理解和实现。
- 灵活性:支持多种数据格式,如JSON、XML等,并允许自定义HTTP头部和参数,让开发者能够根据需要定制API的行为。
- 易于扩展:通过添加新的HTTP方法或使用新的数据格式来扩展API的功能。
- 良好的性能:由于基于HTTP协议,RestFul架构具有很好的性能,HTTP协议已被广泛用于Web开发并得到优化。
- 前后端分离:前端只负责展示数据,后端通过RestFul风格的API提供数据,实现真正的前后端分离,提高开发效率和代码的可维护性。
- 缺点
- 过于依赖HTTP协议:虽然RestFul架构基于HTTP协议,但有时HTTP可能不是最佳选择,如对于需要高性能或低延迟的应用程序,使用RestFul可能不是最佳方案。
- 安全问题:RestFul架构基于开放的HTTP协议,可能存在安全性问题,例如HTTP本身没有加密,可能会被窃听,某些HTTP方法在某些浏览器中可能被限制使用。
- 复杂性:在设计和实现API时需要考虑许多因素,如资源定义、HTTP方法的选用、数据格式的选择等,可能会使得API设计和实现变得复杂。
- 无状态性:服务器不会保存任何客户端状态,这可能会导致处理用户认证和授权时需要额外的逻辑和查询操作。
- 多次数据交互:当需要获取多个资源时必须请求多个不同的URL,带来多次数据交互,增加响应时间。
- API版本控制问题:当API响应格式发生更改时,创建新版本会导致新的URL,使得API维护和使用变得更加困难。
😎Rest风格注解
✨基本注解
- @GetMapping:该注解用于映射HTTP GET请求,通常用于查询操作。例如,
@GetMapping("/users")
会处理对"/users"路径的GET请求。 - @PostMapping:该注解用于映射HTTP POST请求,通常用于创建新资源。例如,
@PostMapping("/users")
会处理对"/users"路径的POST请求,以创建新的用户。 - @PutMapping:该注解用于映射HTTP PUT请求,通常用于更新资源。例如,
@PutMapping("/users/{id}")
可用于更新指定ID的用户信息。 - @DeleteMapping:该注解用于映射HTTP DELETE请求,用于删除资源。例如,
@DeleteMapping("/users/{id}")
会删除指定ID的用户。 - @PatchMapping:该注解用于映射HTTP PATCH请求,用于部分更新资源。例如,
@PatchMapping("/users/{id}")
可以用于只更新用户的某些字段。
✨路径和参数注解
- @RequestMapping:这是一个非常通用的注解,可以用于类或方法级别,定义了请求的基本路径或请求方式。如果没有指定请求方式,它将匹配所有类型的HTTP请求。
- @PathVariable:该注解用于获取URL中的动态参数。例如,在
@GetMapping("/users/{id}")
中,可以使用@PathVariable("id")
来获取URL中的用户ID。 - @RequestParam:该注解用于获取HTTP请求中的查询参数。例如,在
@GetMapping("/users")
中,可以使用@RequestParam("name")
来获取请求参数中名为"name"的值。 - @RequestBody:该注解用于将HTTP请求体中的数据绑定到方法参数上,通常用于处理JSON或XML格式的数据。例如,在
@PostMapping("/users")
中,可以使用@RequestBody User user
来接收客户端发送的用户数据。
✨响应相关注解
- @ResponseBody:该注解用于将方法返回的数据转换为HTTP响应体,并发送给客户端。通常与@RestController一起使用,以返回JSON或XML格式的数据。
- @RestController:这是@Controller和@ResponseBody的组合注解,用于标识一个类是RESTful风格的控制器。使用此注解后,类中的所有方法都会自动返回JSON或其他指定的数据格式。
✨高级应用
- @ExceptionHandler:该注解用于处理特定的异常,并返回适当的错误信息或状态码。这对于开发中的错误处理非常有用。
- @CrossOrigin:该注解用于支持跨域请求,允许不同域的客户端访问API。
🎯JSON
- 基本概念
- 定义:JSON是一种轻量级的数据交换格式,起源于JavaScript,但现已成为独立于编程语言的通用数据格式。
- 语法特点:JSON使用键值对表示数据,其中键必须是字符串,值可以是字符串、数字、布尔值、null、对象或数组。
- 主要类型
- 字符串:由双引号包围,可包含转义字符。
- 数字:可以是整数或浮点数,表示方式与大多数编程语言一致。
- 布尔值:表示为true或false。
- null:表示空值。
- 对象:用大括号包裹一系列无序的键值对。
- 数组:用中括号包含有序的元素列表,元素之间用逗号分隔。
- 数据结构
- 简单结构:简单的键值对,如 { "name": "John", "age": 30 }。
- 嵌套结构:值可以是另一个对象或数组,支持多层嵌套。
- 解析序列化
- JSON.parse():将JSON字符串转换为JavaScript对象。
- JSON.stringify():将JavaScript对象转换为JSON字符串。
- 应用场景
- 数据传输:用于前后端之间的数据传输,特别是在AJAX和API调用中。
- 数据存储:由于其简洁性,JSON也被用作配置文件和数据的存储格式。
- 优势挑战
- 优势:相比XML,JSON更简洁,解析速度更快,且易于读写和生成。
- 挑战:处理不当可能存在安全风险,如XSS攻击,需要谨慎处理用户输入的数据。
🎯拦截器
package com.kuang.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
//在请求处理的方法之前执行
//如果返回true执行下一个拦截器
//如果返回false就不执行下一个拦截器
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("------------处理前------------");
return true;
}
//在请求处理方法执行之后执行
public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, ModelAndView
modelAndView) throws Exception {
System.out.println("------------处理后------------");
}
//在dispatcherServlet处理后执行,做清理工作.
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) throws
Exception {
System.out.println("------------清理------------");
}
}