【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

相关文章
|
1月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
57 7
|
1月前
|
前端开发 测试技术 开发者
MVC模式在现代Web开发中有哪些优势和局限性?
MVC模式在现代Web开发中有哪些优势和局限性?
|
2月前
|
监控 数据安全/隐私保护 异构计算
借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
【8月更文挑战第8天】借助PAI-EAS一键部署ChatGLM,并应用LangChain集成外部数据
70 1
|
2月前
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
131 1
|
2月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
39 0
|
2月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
77 0
|
2月前
|
Java 测试技术 容器
从零到英雄:Struts 2 最佳实践——你的Web应用开发超级变身指南!
【8月更文挑战第31天】《Struts 2 最佳实践:从设计到部署的全流程指南》深入介绍如何利用 Struts 2 框架从项目设计到部署的全流程。从初始化配置到采用 MVC 设计模式,再到性能优化与测试,本书详细讲解了如何构建高效、稳定的 Web 应用。通过最佳实践和代码示例,帮助读者掌握 Struts 2 的核心功能,并确保应用的安全性和可维护性。无论是在项目初期还是后期运维,本书都是不可或缺的参考指南。
38 0
|
2月前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
35 0
|
2月前
|
SQL 存储 数据管理
掌握SQL Server Integration Services (SSIS)精髓:从零开始构建自动化数据提取、转换与加载(ETL)流程,实现高效数据迁移与集成——轻松上手SSIS打造企业级数据管理利器
【8月更文挑战第31天】SQL Server Integration Services (SSIS) 是 Microsoft 提供的企业级数据集成平台,用于高效完成数据提取、转换和加载(ETL)任务。本文通过简单示例介绍 SSIS 的基本使用方法,包括创建数据包、配置数据源与目标以及自动化执行流程。首先确保安装了 SQL Server Data Tools (SSDT),然后在 Visual Studio 中创建新的 SSIS 项目,通过添加控制流和数据流组件,实现从 CSV 文件到 SQL Server 数据库的数据迁移。
73 0
|
2月前
|
存储 前端开发 数据库
神秘编程世界惊现强大架构!Web2py 的 MVC 究竟隐藏着怎样的神奇魔力?带你探索实际应用之谜!
【8月更文挑战第31天】在现代 Web 开发中,MVC(Model-View-Controller)架构被广泛应用,将应用程序分为模型、视图和控制器三个部分,有助于提高代码的可维护性、可扩展性和可测试性。Web2py 是一个采用 MVC 架构的 Python Web 框架,其中模型处理数据和业务逻辑,视图负责呈现数据给用户,控制器则协调模型和视图之间的交互。
31 0