【SpringMVC】集成Web、MVC执行流程、数据响应、数据交互

简介: 深入理解SpringMVC

@TOC

前言

SpringMVC确实很麻烦,零碎的点太多

一.Spring集成Web

在Spring的学习中,我们知道在IOC容器中获取Bean时要通过获取上下文的方式
(new ClasspathXmlApplicationContext),这样我想在不同的地方获取Bean我得重新加载配置文件,应用上下文的对象也被创建了多次,造成所谓的“硬编码”问题。
在这里插入图片描述
如何解决?
按照思维习惯,解决此问题的最好方法就是把我的配置文件作用域提高
在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContext域中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了,从而实现数据共享。
如何实现?
①导入Spring集成Web坐标

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.3.5.RELEASE</version>
    </dependency>

②配置ContextLoaderListener监听器
Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装,该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象

 <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

③通过工具获得应用上下文对象

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    ServletContext servletContext = this.getServletContext();   
    ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(servletContext);
    UserService userService = app.getBean(UserService.class);
 }

==补充==:为了解决xml文件名称与代码产生的耦合,引入了设置全局变量这一操作,通过在web.xml里事先定义好后再由具体的的代码获得定义的参数名来读文件,极大降低了耦合性
在这里插入图片描述
这样的话以后要改配置文件我就可以直接在一处修改文件名即可

二.对于SpringMVC的理解

**M——model进行业务逻辑的处理
V——view视图,负责数据的输出,画面的展示
C——controller 负责接收从视图发送过来的数据,同时控制model与view**

Spring MVC是是属于Spring Framework生态里面的一个模块,它是在Servlet基础上构建并且使用MVC模式设计的一个 Web框架,主要的目的是简化传统Servlet+JSP模式下的Web开发方式。其次,Spring MVC的整体架构设计对Java Web里面的MVC架构模式做了增强和扩展,主要有几个方面。把传统MVC框架里面的Controller控制器做了拆分,分成了前端控制器DispatcherServlet和后端控制器Controller,把 Model模型拆分成业务层Service和数据访问层Repository。
在视图层,可以支持不同的视图,比如 Freemark、velocity、JSP等等
在这里插入图片描述
所以,Spring MVC天生就是为了MVC模式而设计的,因此在开发MVC应用的时候会更加方便和灵活。

三.MVC执行流程(🏳️‍🌈)

客户端与服务器端的一次会话代表着一次请求与响应,通过MVC的模式使其更加系统
在这里插入图片描述
具体执行流程如下所示:
**①用户发送请求至前端控制器DispatcherServlet
②DispatcherServlet收到请求调用HandlerMapping处理器映射器
③处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
④DispatcherServlet调用HandlerAdapter处理器适配器
⑤HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
⑥Controller执行完成返回ModelAndView
⑦HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
⑧DispatcherServlet将ModelAndView传给ViewReslover视图解析器
⑨ViewReslover解析后返回具体View
⑩DispatcherServlet根据View进行渲染视图〈即将模型数据填充至视图中),DispatcherServlet响应用户**
在这里插入图片描述

1.组件解析

1.前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性
2.处理器映射器: HandlerMapping
HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等
3.处理器适配器: HandlerAdapter
通过 HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
在这里插入图片描述
4.处理器:Handler
它就是我们开发中要编写的具体业务控制器。由DispatcherServlet把用户请求转发到Handler。由Handler对具体的用户请求进行处理
5.视图解析器:View Resolver
View Resolver负责将处理结果生成View视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户
6.视图:View
SpringMVC框架提供了很多的View视图类型的支持,包括: jstlView、freemarkerView.pdfView等。最常用的视图就是jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面

2.RequestMapping

作用:用于建立请求URL和处理请求方法之间的对应关系
位置:
类上,请求URL的第一级访问目录。此处不写的话,就相当于应用的根目录
方法上,请求URL的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径属性:
value:用于指定请求的URL。它和path属性的作用是一样的method:用于指定请求的方式
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样

四.SpringMVC数据响应

页面跳转

1.直接返回字符串,本质是在配置文件里写好头和尾,在具体的代码中返回文件名后跳转
在这里插入图片描述
2.返回ModelAndView对象

    public ModelAndView back(){
//            Model:模型 作用封装数据,View:视图 作用展示数据
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username","itcast");   //设置模型数据
        modelAndView.setViewName("hello");     //设置视图名称
        return modelAndView;
   }

页面跳转的方式还有,比如向request域存储数据后返回对象

回写数据

1.直接输出字符串

    public void back(HttpServletResponse response) throws IOException {
        response.getWriter().print("Hello Java");
    }

2.写注解直接返回字符串

    @ResponseBody  //告知SpringMVC框架 不进行视图跳转 直接进行数据响应
    public String back() throws IOException {
        return "hello java";
    }

3.返回对象或者集合
事先要配置SpringMVC注解驱动<mvc:annotation-driven/>默认底层就会集成Jackson进行对象集合与json格式字符串的转换

    @ResponseBody
    public Sheep back() throws IOException {
        Sheep sheep = new Sheep();
        sheep.setUsername("懒羊羊");
        sheep.setAge(2);
        return sheep;  //SpringMVC自动将Sheep转换成json格式的字符串
    }

五.SpringMVC获得请求数据

1.获得基本数据类型,形如:

    @RequestMapping(value="/resp")
    @ResponseBody
    public void save11(String username,int age) throws IOException {
        System.out.println(username);
        System.out.println(age);
    }

然后我在URL中输入相应的路径,传入相应的参数即可获得请求的数据
http://localhost:yu7daily/demo1?username=lyy&age=2
2.获得POJO类型参数

    @RequestMapping(value="/demo2")
    @ResponseBody
    public void back(User user) throws IOException {
        System.out.println(user);
    }

同样在URL传入路径,即可获得数据
http://localhost:yu7daily/demo2?username=lyy&age=2

相关文章
|
5月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
884 43
|
5月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。
360 0
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
|
5月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
648 66
|
5月前
|
SQL 关系型数据库 Apache
从 Flink 到 Doris 的实时数据写入实践 —— 基于 Flink CDC 构建更实时高效的数据集成链路
本文将深入解析 Flink-Doris-Connector 三大典型场景中的设计与实现,并结合 Flink CDC 详细介绍了整库同步的解决方案,助力构建更加高效、稳定的实时数据处理体系。
2244 0
从 Flink 到 Doris 的实时数据写入实践 —— 基于 Flink CDC 构建更实时高效的数据集成链路
|
5月前
|
机器学习/深度学习 SQL 大数据
什么是数据集成?和数据融合有什么区别?
在大数据领域,“数据集成”与“数据融合”常被混淆。数据集成关注数据的物理集中,解决“数据从哪来”的问题;数据融合则侧重逻辑协同,解决“数据怎么用”的问题。两者相辅相成,集成是基础,融合是价值提升的关键。理解其差异,有助于企业释放数据潜力,避免“数据堆积”或“盲目融合”的误区,实现数据从成本到生产力的转变。
什么是数据集成?和数据融合有什么区别?
|
12月前
|
容灾 安全 关系型数据库
数据传输服务DTS:敏捷弹性构建企业数据容灾和集成
数据传输服务DTS提供全球覆盖、企业级跨境数据传输和智能化服务,助力企业敏捷构建数据容灾与集成。DTS支持35种数据源,实现全球化数据托管与安全传输,帮助企业快速出海并高效运营。瑶池数据库的全球容灾、多活及集成方案,结合DTS的Serverless和Insight功能,大幅提升数据传输效率与智能管理水平。特邀客户稿定分享了使用DTS加速全球业务布局的成功经验,展示DTS在数据分发、容灾多活等方面的优势。
384 0
|
7月前
|
运维 安全 数据管理
Dataphin V5.1 企业级发布:全球数据无缝集成,指标管理全新升级!
企业数据管理难题?Dataphin 5.1版来解决!聚焦跨云数据、研发效率、指标管理和平台运维四大场景,助力数据团队轻松应对挑战。无论是统一指标标准、快速定位问题,还是提升管理安全性,Dataphin都能提供强大支持。3分钟了解新版本亮点,让数据治理更高效!
128 0
|
7月前
|
监控 JavaScript 前端开发
🎉 Harmony OS Next里的Web组件:网页加载的全流程掌控手册
本文详细解析了Harmony OS Next中ArkUI Web组件的九大生命周期回调,帮助开发者全面掌控网页加载流程。从组件初始化到加载完成,再到异常处理与性能优化,每个阶段都配有具体代码示例和注意事项。内容涵盖关键回调(如aboutToAppear、onPageBegin)的使用场景、网页加载进度监控(FCP/FMP/LCP)、以及前端页面优化实践。通过本文,开发者可以高效管理网页加载过程,提升应用性能与用户体验。
|
11月前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
2749 45
|
12月前
|
机器学习/深度学习 PyTorch 测试技术
LossVal:一种集成于损失函数的高效数据价值评估方法
LossVal是一种创新的机器学习方法,通过在损失函数中引入实例级权重,直接在训练过程中评估数据点的重要性,避免了传统方法中反复重训练模型的高计算成本。该方法适用于回归和分类任务,利用最优传输距离优化权重,确保模型更多地从高质量数据中学习。实验表明,LossVal在噪声样本检测和高价值数据点移除等任务上表现优异,具有更低的时间复杂度和更稳定的性能。论文及代码已开源,为数据价值评估提供了高效的新途径。
296 13
LossVal:一种集成于损失函数的高效数据价值评估方法