【SpringMVC】——MVC概论、SpringMVC、控制器Controll、Restful风格、JSON以及拦截器知识总结

🎼个人主页:【Y小夜】

😎作者简介:一位双非学校的大二学生,编程爱好者,

专注于基础和实战分享,欢迎私信咨询!

🎆入门专栏:🎇【MySQLJava基础Rust

🎈热门专栏:🎊【PythonJavawebVue框架

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

目录

🎯MVC概论

😎何为MVC

😎MVC框架要做哪些事情

🎯什么是SpringMVC

😎概述

😎优缺点

✨优点

✨缺点

😎执行原理

😎导入的依赖

🎯 控制器Controller

😎使用注解@Controller

😎RequestMapping

🎯RestFul 风格

😎简介

😎优缺点

😎Rest风格注解

✨基本注解

✨路径和参数注解

✨响应相关注解

✨高级应用

🎯JSON

🎯拦截器


🎯MVC概论

😎何为MVC

  • MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
  • 是将业务逻辑、数据、显示分离的方法来组织代码。
  • MVC主要作用是降低了视图与业务逻辑间的双向偶合
  • MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
        Model(模型): 数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean组件(包含数据和行为),不过现在一般都分离开来: Value Object (数据 Dao ) 和 服务层 (行为Service )。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
        View(视图): 负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
        Controller(控制器): 接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型 数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。
最典型的 MVC 就是 JSP + servlet + javabean 的模式。

😎MVC框架要做哪些事情

  1. 1url映射到java类或java类的方法 .
  2.  封装用户提交的数据 .
  3. 处理请求--调用相关的业务处理--封装响应数据 .
  4. 将响应的数据进行渲染 . jsp / html 等表示层数据 .
说明:
        常见的服务器端MVC 框架有: Struts Spring MVC ASP.NET MVC Zend Framework JSF ;常见 前端MVC 框架: vue angularjs react backbone ;由 MVC 演化出了另外一些模式如: MVP MVVM 等等

🎯什么是SpringMVC

查看官方文档:Web on Servlet Stack (spring.io)

😎概述

Spring MVCSpring Framework的一部分,是基于Java实现MVC的轻量级Web框架

😎优缺点

✨优点

  1. 配置灵活性:Spring MVC提供了灵活的配置方式,可以通过XML或基于注解的方式快速搭建项目结构。

  2. 测试易行性:由于Controller类是POJO,使得单元测试变得简单,无需依赖特定的测试环境。

  3. 插件兼容性:与OpenAPI(如Swagger)等其他框架易于集成,方便API文档的生成和管理。

  4. 清晰的分层设计:优秀的分层设计使得应用程序结构清晰,各部分职责明确,有利于代码的重用和维护。

  5. 强大的数据验证:支持将请求参数自动绑定到方法参数,并且提供强大的验证框架,保证输入数据的正确性和安全性。

✨缺点

  1. 学习曲线陡峭:初学者可能需要较长时间来掌握Spring MVC的工作原理和机制。

  2. 配置繁琐:尽管灵活,但对于新手来说,配置过程可能相对复杂,需要理解多个配置选项和注解的使用。

  3. 系统结构和实现复杂性增加:对于简单的界面应用,严格的MVC分离可能会增加结构的复杂性,并可能导致性能下降。

  4. 视图与控制器连接过紧密:虽然视图和控制器是分离的,但它们之间存在紧密的联系,这在某种程度上限制了它们的独立重用性。

  5. 高级工具支持不足:许多高级的用户界面工具并不完全支持MVC模式,改造这些工具以适应MVC可能需要较高的成本。

😎执行原理

SpringMVC的原理如下图所示:
        当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制 器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图 渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。

😎导入的依赖

<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

  1. 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
  2. 控制器负责解析用户的请求并将其转换为一个模型。
  3. Spring MVC中一个控制器类可以包含多个方法
  4. Spring MVC中,对于Controller的配置方式有很多种

😎使用注解@Controller

         @Controller注解类型用于声明Spring类的实例是一个控制器(在讲IOC时还提到了另外3个注 解);

        Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的 控制器,需要在配置文件中声明组件扫描
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="com.kuang.controller"/>
增加一个 ControllerTest2 类,使用注解实现;
//@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风格:

  1. RestFul风格的定义
    • 资源与表现形态:RestFul风格强调资源的概念,每个资源对应一个唯一的资源定位符(URI),资源可以是任何可标识的信息,如文档、图片等。
    • 状态转移:通过HTTP动词实现资源状态的转移,即对资源进行增删改查操作。
  2. RestFul风格的具体体现
    • 统一接口:RestFul风格规定使用统一的接口,这使得整个系统的设计简单且易于理解。
    • 无状态性:每次请求都应包含所有必要的信息,服务器不保存客户端的状态信息,这有助于提高系统的可扩展性和可靠性。
    • 缓存机制:通过适当的缓存策略减轻服务器负担,提高性能。
    • 分层系统:允许系统中的不同组件独立更新和演进,增加系统的灵活性。
  3. RestFul风格的应用优势
    • 前后端分离:前端只负责展示数据,后端通过RestFul风格的API提供数据,实现真正的前后端分离,提高开发效率和代码的可维护性。
    • 跨平台兼容性:RestFul风格的API可同时支持多种平台,包括Web、iOS、Android等。
    • 简化的编程模型:基于HTTP协议和常见的数据格式(如JSON),开发者可以快速理解和使用。
  4. RestFul风格的应用场景
    • 企业级应用:许多大型企业和组织采用RestFul风格的API设计,如GitHub、白宫网站等。
    • 移动应用开发:RestFul风格的API便于移动设备调用,支持iOS、Android等多个平台。
    • 跨域认证:结合JWT等技术,RestFul风格的API可以实现安全的跨域认证,保护用户数据和隐私。
  5. RestFul风格的挑战
    • 版本管理:在API迭代过程中需要保持向后兼容性或合理地管理不同版本的API。
    • 安全性考量:虽然无状态性能提高系统的扩展性,但同时也增加了身份验证和授权的复杂性。
    • 错误处理:需要设计合理的错误处理机制,确保API在出现异常时能够给出明确和有用的反馈。

😎优缺点

  • 优点
    1. 清晰性和简单性:RestFul架构基于HTTP协议,每个HTTP方法都有其特定的含义和用途,使得API更容易理解和实现。
    2. 灵活性:支持多种数据格式,如JSON、XML等,并允许自定义HTTP头部和参数,让开发者能够根据需要定制API的行为。
    3. 易于扩展:通过添加新的HTTP方法或使用新的数据格式来扩展API的功能。
    4. 良好的性能:由于基于HTTP协议,RestFul架构具有很好的性能,HTTP协议已被广泛用于Web开发并得到优化。
    5. 前后端分离:前端只负责展示数据,后端通过RestFul风格的API提供数据,实现真正的前后端分离,提高开发效率和代码的可维护性。
  • 缺点
    1. 过于依赖HTTP协议:虽然RestFul架构基于HTTP协议,但有时HTTP可能不是最佳选择,如对于需要高性能或低延迟的应用程序,使用RestFul可能不是最佳方案。
    2. 安全问题:RestFul架构基于开放的HTTP协议,可能存在安全性问题,例如HTTP本身没有加密,可能会被窃听,某些HTTP方法在某些浏览器中可能被限制使用。
    3. 复杂性:在设计和实现API时需要考虑许多因素,如资源定义、HTTP方法的选用、数据格式的选择等,可能会使得API设计和实现变得复杂。
    4. 无状态性:服务器不会保存任何客户端状态,这可能会导致处理用户认证和授权时需要额外的逻辑和查询操作。
    5. 多次数据交互:当需要获取多个资源时必须请求多个不同的URL,带来多次数据交互,增加响应时间。
    6. API版本控制问题:当API响应格式发生更改时,创建新版本会导致新的URL,使得API维护和使用变得更加困难。

😎Rest风格注解

✨基本注解

  1. @GetMapping:该注解用于映射HTTP GET请求,通常用于查询操作。例如,@GetMapping("/users")会处理对"/users"路径的GET请求。
  2. @PostMapping:该注解用于映射HTTP POST请求,通常用于创建新资源。例如,@PostMapping("/users")会处理对"/users"路径的POST请求,以创建新的用户。
  3. @PutMapping:该注解用于映射HTTP PUT请求,通常用于更新资源。例如,@PutMapping("/users/{id}")可用于更新指定ID的用户信息。
  4. @DeleteMapping:该注解用于映射HTTP DELETE请求,用于删除资源。例如,@DeleteMapping("/users/{id}")会删除指定ID的用户。
  5. @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

  1. 基本概念
    • 定义:JSON是一种轻量级的数据交换格式,起源于JavaScript,但现已成为独立于编程语言的通用数据格式。
    • 语法特点:JSON使用键值对表示数据,其中键必须是字符串,值可以是字符串、数字、布尔值、null、对象或数组。
  2. 主要类型
    • 字符串:由双引号包围,可包含转义字符。
    • 数字:可以是整数或浮点数,表示方式与大多数编程语言一致。
    • 布尔值:表示为true或false。
    • null:表示空值。
    • 对象:用大括号包裹一系列无序的键值对。
    • 数组:用中括号包含有序的元素列表,元素之间用逗号分隔。
  3. 数据结构
    • 简单结构:简单的键值对,如 { "name": "John", "age": 30 }。
    • 嵌套结构:值可以是另一个对象或数组,支持多层嵌套。
  4. 解析序列化
    • JSON.parse():将JSON字符串转换为JavaScript对象。
    • JSON.stringify():将JavaScript对象转换为JSON字符串。
  5. 应用场景
    • 数据传输:用于前后端之间的数据传输,特别是在AJAX和API调用中。
    • 数据存储:由于其简洁性,JSON也被用作配置文件和数据的存储格式。
  6. 优势挑战
    • 优势:相比XML,JSON更简洁,解析速度更快,且易于读写和生成。
    • 挑战:处理不当可能存在安全风险,如XSS攻击,需要谨慎处理用户输入的数据。

🎯拦截器

想要自定义拦截器,必须实现 HandlerInterceptor 接口。
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("------------清理------------");
}
}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值