目录

一、SpringMVC概述

二、 SpringMVC入门案例

1、案例实现步骤

2、案例类和注解 

三、SpringMVC案例运行流程

1、 启动服务器初始化过程

2、单次请求过程

四、bean加载控制


一、SpringMVC概述

SpringMVC是一种基于Java实现MVC模型的轻量级Web框架

优点:

        使用简单,开发便捷(相比于Servlet)

        灵活性强

 1、三层架构

        web层负责页面数据收集,产生页面;service负责业务处理,处理数据;dao负责数据持久化,查询存储一些数据。通过这三层架构最终得到数据组织成页面返回给客户端。

spring mvc 开发接口 springmvc开发实例_spring mvc 开发接口

 2、MVC模式

        客户端发送请求到控制器,控制器controller调用业务层service,业务层调用数据层dao,最后得到数据组织出数据模型model。但是光有模型用户无法查看,所以将页面view抽取出来,与数据配合使用,最后得出页面返回给客户端。

spring mvc 开发接口 springmvc开发实例_开发语言_02

 3、异步调用

        以前view层采用jsp技术,随着技术迭代,前端发生了变化,采用html,css,vue,elementUI。而后端服务器也发生了变化。浏览器发送请求,前端发出异步调用后端服务器,后端服务器内一步一步将数据处理完成,最终得到model对象,model对象是一个java对象,不能直接传java对象回去页面,而且找到一种前后端通信的格式,就是json数据。

spring mvc 开发接口 springmvc开发实例_MVC_03

二、 SpringMVC入门案例

1、案例实现步骤

1、创建web工程

spring mvc 开发接口 springmvc开发实例_java_04

2、设置tomcat服务器,加载web工程(tomcat插件)

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <port>80</port>
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

3、导入坐标(SpringMVC+Servlet)4、

<dependencies>
    <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.10.RELEASE</version>
    </dependency>
</dependencies>

4、定义处理请求的功能类(UserController)

//定义表现层控制器bean
@Controller
public class UserController {
    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。

5、编写SpringMVC配置类,加载处理请求的Bean

//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.csdn.controller")
public class SpringMvcConfig {
}

 6、加载SpringMVC配置,并设置SpringMVC请求拦截的路径

//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

    //设置由springmvc控制器处理的请求映射路径
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring配置类
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

7、添加tomcat配置

spring mvc 开发接口 springmvc开发实例_spring mvc 开发接口_05

运行结果: 

spring mvc 开发接口 springmvc开发实例_MVC_06

2、案例类和注解 

1、 @Controller注解

- 名称:@Controller
- 类型:类注解
- 位置:SpringMVC控制器类定义上方
- 作用:设定SpringMVC的核心控制器bean
- 范例

@Controller
public class UserController {
}

2、@RequestMapping注解

- 名称:@RequestMapping
- 类型:类、方法注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器方法请求访问路径
- 范例

@RequestMapping("/save")
public void save(){
    System.out.println("user save ...");
}

3、 @ResponseBody注解

- 名称:@ResponseBody
- 类型:方法注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器方法响应内容为当前返回值,无需解析
- 范例

@RequestMapping("/save")
@ResponseBody
public String save(){
    System.out.println("user save ...");
    return "{'info':'springmvc'}";
}

4、 AbstractDispatcherServletInitializer类

- AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类

- AbstractDispatcherServletInitializer提供三个接口方法供用户实现

  - createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。

//加载springmvc配置类,产生springmvc容器(本质还是spring容器)
protected WebApplicationContext createServletApplicationContext() {
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
    ctx.register(SpringMvcConfig.class);
    return ctx;
}

 - getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。

//设置由springmvc控制器处理的请求映射路径
protected String[] getServletMappings() {
    return new String[]{"/"};
}

- createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext() 

//加载spring配置类
protected WebApplicationContext createRootApplicationContext() {
    return null;
}

三、SpringMVC案例运行流程

1、 启动服务器初始化过程

1.服务器启动,执行ServletContainersInitConfig类,初始化web容器

2.执行createServletApplicationContext方法,创建了WebApplicationContext对象

3.加载SpringMvcConfig

4.执行@ComponentScan加载对应的bean

5.加载UserController,每个@RequestMapping的名称对应一个具体的方法

6.执行getServletMappings方法,定义所有的请求都通过SpringMVC

2、单次请求过程

1.发送请求localhost/save

2.web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理

3.解析请求路径/save

4.由/save匹配执行对应的方法save()

5.执行save()

6.检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方

spring mvc 开发接口 springmvc开发实例_开发语言_07

四、bean加载控制

SpringMVC相关bean(表现层bean)

Spring控制的bean

        业务bean(Service)

        功能bean(DataSource等)

SpringMVC相关bean加载控制

        SpringMVC加载的bean对应的包均在com.itheima.controller包内

Spring相关bean加载控制

方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean

- 名称:@ComponentScan
- 类型:类注解
- 范例

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

 属性

        1. excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
        2. includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)

方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { 
    protected WebApplicationContext createServletApplicationContext() { 
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;  
    }   
    protected WebApplicationContext createRootApplicationContext() {  
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();      
        ctx.register(SpringConfig.class);        
        return ctx;  
    }   
    protected String[] getServletMappings() { 
        return new String[]{"/"}; 
    }
}

方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class}
    };
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
}