Spring学习三:spring-web及spring-webmvc

spring-web:spring与web集成

spring-web的作用:包含web应用开发时,用到spring框架时所需的核心类,包括自动载入webapplicationcontext特性的类、struts与jsf集成类、文件上传的支持类、filter类和大量工具辅助类。

通过spring获取应用上下文对象

  • 在仅仅使用spring的时候,应用上下文的获取如下图:
    弊端:每次从容器中获取bean都要编写new ClassPathXmlApplicationContext,每次获取都要加载一次核心配置文件,应用上下文创建多次。

  • 自己写工具类实现(模拟spring获取app原理)
    在web项目中,可以使用ServletContextListener监听web应用的启动,在tomcat启动的时候加载一次spring配置文件并创建应用上下文对象,并将其存储在最大的域servletContext域中,这样就可以在任意位置从域中获取上下文对象了。

  • spring-web提供获取应用上下文的工具
    本功能使用依赖:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.2.7.RELEASE</version>
    </dependency>
    

    spring-web提供了一个监听器ContextLoaderListener,该监听器内部加载spring配置文件,创建应用上下文对象,并存储在ServletContext域中,提供一个客户端工具WebApplicationContextUtils供使用者获取应用上下文对象。

spring-webmvc

本功能使用依赖:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.7.RELEASE</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.13.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.1</version>
</dependency>

spring-webmvc所依赖的包:(包含spring-context,spring-web)

在使用springmvc之前,我们都需要写servlet接口的实现类。现在使用springmvc,通过一套注解,可以让一个简单的java类成为处理请求的控制器,无需实现任何接口。

springmvc快速入门

开发步骤:
1. 导入springmvc坐标
2. 配置springmvc核心前端控制器DispathcerServlet,让servlet去加载springmvc配置文件
3. 使用注解配置Controller类中业务方法的映射地址
4. 配置springmvc核心配置文件spring-mvc.xml(可任意命名)
5. 客户端发起请求

概念理解:Spring父容器与子容器
父子容器的主要作用应该是划分框架边界。有点单一职责的味道。查看文章:spring和springmvc父子容器的理解 父子容器概念

springmvc执行流程

springmvc框架是使用servlet充当前端控制器。

  • 流程图示
  • 完整执行流程

springmvc响应返回

  • 重点是springmvc自动将对象转化为json字符串返回数据
    • 需要引入jackson包
    • @ResponseBody声明告知mvc,不进行视图跳转,而是直接进行数据响应
    • 配置mvc的注解驱动:<mvc:annotation-driven/>
      在springmvc的各个组件中,处理器映射器,处理器适配器,视图解析器称为springmvc的三大组件。
      使用<mvc:annotation-driven/>自动加载RequestMappingHandlerMapping(处理器映射器)和RequestMappingHandlerAdpter(处理器适配器)。
      可以在spring-mvc.xml配置文件中配置<mvc:annotation-driven/>代替注解处理器和适配器的配置,
      同时使用<mvc:annotation-driven/>默认底层就会集成jsckson进行对象或集合的json字符串转换。
      

springmvc获得请求数据

  • 获得基本类型参数

    • Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配
  • 获得POJO类型参数

    • Controller中的业务方法的POJO参数的属性名要与请求参数的name一致,参数值会自动映射匹配
  • 获得数组类型参数

    • Controller中的业务方法的数组名称要与请求参数的name一致,参数值会自动映射匹配
  • 获得集合类型参数

    • 前端发起ajax请求时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据,二无需使用POJO包装
  • 参数绑定:@RequestParam

    • 当请求参名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示绑定
  • 占位符参数获取:@PathVariable

  • 获取请求头信息

  • 解决请求中文乱码

代码

学习来源:https://www.bilibili.com/video/BV1Fi4y1S7ix?p=43

posted @ 2022-01-23 17:53  扬帆去远航  阅读(3820)  评论(0编辑  收藏  举报