SpringMVC(一)【入门】(2)

简介: SpringMVC(一)【入门】

SpringMVC(一)【入门】(1)https://developer.aliyun.com/article/1534189

2.2、注解&配置类说明

2.2.1、注解

名称 类型 位置 作用 参数
@Controller 类注解 控制器类上方 设置SpringMVC的核心控制器Bean 无参
@RequestMapping 方法注解 控制器方法上面 设置当前控制器方法请求访问路径 @RequestMapping("/save") 访问的时候就访问 localhost:85/save
@ResponseBody 方法注解 控制器方法上面 设置当前控制器方法的返回值就是响应内容 无参

2.2.2、AbstractDispatcherServletInitializer

AbstractDispatcherServletInitializer 是 SpringMVC 提供的快速初始化 Web3.0 容器的抽象类,它提供了三个接口抽象方法供用户实现:

1)createServletApplicationContext

作用:加载 SpringMVC 容器,一旦 tomcat 启动,就会把这个容器加载到 tomcat 容器中。

2)getServletMappings

作用:设定 SpringMVC 对应的请求路径,也就是哪些请求由 SpringMVC 管,哪些由 tomcat 管。返回 "/" 代表拦截所有请求交给 SpringMVC 处理。

3)createRootApplicationContext

作用:加载除了 SpringMVC 之外的所有容器的内容(Bean)

3c37109fbef19d0d20a11b4b59c28f4b_0af23177ecef47e1af53a3fd1bba9f8a.png

这里我们没有其它容器,所以直接返回 null。

2.3、总结

对于一次性工作,我们以后做项目直接 CV 大法然后改一改就好了。我们真正做的最多的还是多次工作:定义控制器、定义控制器中的方法等。

3、SpringMVC 工作流程分析

工作流程主要分为两部分:

  1. 启动服务器
  2. 发送一次请求

3.1、服务器初始化过程

在 Web3.0 的规范中,我们不再需要 web.xml 来配置,而是通过一个配置类(继承 AbstractDispatcherServletInitializer 抽象类)来完成。

3.2、单次请求工作流程

4、Bean 加载控制

4.1、Controller 加载控制与业务 Bean 加载控制

现在我们的项目结构是这样的:

  • config目录存入的是配置类,我们之后的配置类会有:
  • ServletContainersInitConfig
  • SpringConfig
  • SpringMvcConfig
  • JdbcConfig
  • MybatisConfig
  • controller目录存放的是SpringMVC的controller类
  • service目录存放的是service接口和实现类
  • dao目录存放的是dao/Mapper接口

4.1.1、SpringMVC 相关 Bean 加载控制

  • SpringMVC 加载的 Bean 都放在 com.lyh.controller 包下

       controller 包下的所有 Bean 会被 SpringMVC 来加载,而其它包(dao、service等)下的 Bean 都应该由 Spring 来加载,但是如何控制 Spring 不去加载 SpringMVC 中的 Bean ?

4.1.2、Spring 相关 Bean 加载控制

  • 方式一:Spring 加载的 Bean 设定扫描范围为 com.lyh,排除掉 controller 包内的 Bean
  • 方式二:Spring 加载的 Bean 设定扫描范围为精准范围,比如 service、dao包等
  • 方式三:不区分 Spring 和 SpringMVC 的环境,都加载到同一个环境中。

方式一:只加载 Spring 管理的 Bean:

@Configuration
@ComponentScan({"com.lyh.service","com.lyh.dao"})
public class SpringConfig {
 
}

方式二:按照注解进行过滤,过滤掉由 SpringMVC 管理的包下的 Bean:

@Configuration
@ComponentScan(value = "com.lyh",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ANNOTATION,
                classes = Controller.class
        ))
public class SpringConfig {
 
}

测试

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        // 如果Controller类被Spring注册了,会输出对象地址
        // 如果没有被注册,那么会报错
        System.out.println(ctx.getBean(UserController.class));
    }
}

注意:在测试时,SpringMvcConfig 的注解 Configuration 需要去掉,因为 SpringConfig 中我们设置 Spring 会扫描所有 com.lyh 目录下的目录(除了 exclude 之外的),但是 Spring 会把所有带有 @Configuration 注解的类加载一遍,而 SpringMvcConfig 上面除了 @Configuration 之外还有一个注解 @ComponentScan 用来扫描 controller 包,所以 Spring 又会把 controller 目录下的 Bean 加载一遍。

       所以我们可以把这两个带有 @Configuration 注解的配置类放到 com.lyh 包外边,防止被 Spring 加载。

到这里,我们需要把由 Spring 加载的环境配置放到 ServletContainersInitConfig 中:

这样,当服务器启动后,tomcat 容器中就不只有 SpringMVC 的容器了,还有 Spring 的容器。

4.1.3、简化开发

目前,我们需要在 Servlet 容器中分别指定两个配置类(SpringMVC 和 Spring),能不能再简化一些呢? 答案是可以的,我们只需要继承抽象类  AbstractAnnotationConfigDispatcherServletInitializer 即可:

本节注解说明

名称 位置 作用 参数
@ComponentScan 类注解 类定义上方 excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)和具体项(classes) includeFilters:加载指定的bean,需要指定类别(type)和具体项(classes)

5、Postman

       目前我们测试请求都是直接在地址栏输入参数,但是这种方式只能模拟 get 请求,对于 post 请求我们还需要创建表单,对于更复杂的 Ajax 请求我们不只需要表单,还是配置 JavaScript 代码来完成异步提交。

       postman 的作用就是用来模拟各种网页请求的,所以作为一个后端程序员,我们就再也不用去写一些恶心的前端代码去测试了。

相关文章
|
9月前
|
前端开发 Java Spring
SpringMvc进阶
SpringMvc进阶
33 1
|
9月前
|
设计模式 前端开发 Java
SpringMVC系列(一)之SpringMVC入门详细介绍
SpringMVC系列(一)之SpringMVC入门详细介绍
|
19天前
|
JSON 前端开发 Java
SpringMVC(一)【入门】
SpringMVC(一)【入门】
|
2月前
|
XML 存储 前端开发
SpringMVC入门
SpringMVC入门
24 0
|
8月前
|
XML 前端开发 Java
SpringMVC之入门
SpringMVC之入门
31 0
|
9月前
|
存储 设计模式 前端开发
SpringMvc入门
SpringMvc入门
44 0
|
9月前
|
前端开发 Java 应用服务中间件
SpringMVC学习
SpringMVC学习
31 0
|
前端开发 Java 应用服务中间件
一文带你入门SpringMVC
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。 Spring MVC的特点: 轻量级,简单易学 高效 , 基于请求响应的MVC框架 与Spring兼容性好,无缝结合 约定优于配置 功能强大:RESTful、数据验证、格式化、本地化、主题等 简洁灵活
118 1
一文带你入门SpringMVC
|
前端开发 Java 测试技术
springMVC学习总结
springMVC学习总结
101 0
springMVC学习总结
|
设计模式 JSON 缓存