SSM学习7:SpringMVC简介、SpringMVC入门案例、SpringMVC bean加载控制

SpringMVC简介

Spring MVCSpring 框架的一部分,它是一个用于构建 Web 应用程序的模型-视图-控制器(Model-View-Controller,MVC)框架。Spring MVC 提供了一种清晰的方式来分离业务逻辑、用户界面和控制流程,使得应用程序更加模块化、易于维护和扩展。

SpringMVC入门案例

注意点

  • 导入依赖
java 复制代码
 <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>

  <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>
  • 创建SpringMVC控制器类
java 复制代码
//定义表现层控制器bean
@Controller
public class UserController {

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

    //设置映射路径为/delete,即外部访问路径
    @RequestMapping("/delete")
    @ResponseBody
    public String delete(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}
  • 初始化SpringMVC环境(同Spring环境),设置SpringMVC加载对应的bean

config/SpringMvcConfig .class

java 复制代码
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
  • 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
    config/ServletContainersInitConfig.class
java 复制代码
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        //初始化WebApplicationContext对象
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }

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

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

注解

  • 名称:@Controller
  • 类型:类注解
  • 位置:SpringMVC控制器类定义上方
  • 作用:设定SpringMVC的核心控制器bean
  • 示例
java 复制代码
@Controller
public class UserController {
}
  • 名称:@RequestMapping
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径
  • 示例
java 复制代码
 //设置映射路径为/save,即外部访问路径
 @RequestMapping("/save")
 public String save(){
     System.out.println("user save ...");
     return "{'info':'springmvc'}";
 }
  • 名称:@ResponseBody
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析
  • 示例
java 复制代码
  //设置映射路径为/save,即外部访问路径
  @RequestMapping("/save")
  //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
  @ResponseBody
  public String save(){
      System.out.println("user save ...");
      return "{'info':'springmvc'}";
  }

工作流程

  • 启动服务器初始化过程

    • 服务器启动,执行ServletContainersInitConfig类,初始化web容器
    • 执行createServletApplicationContext方法,创建了WebApplicationContext对象
    • 加载SpringMvcConfig
    • 执行@ComponentScan加载对应的bean
    • 加载UserController,每个@RequestMapping的名称对应一个具体的方法
    • 执行getServletMappings方法,定义所有的请求都通过SpringMVC
  • 单次请求过程

    • 发送请求localhost/save
    • web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
    • 解析请求路径/save
    • /save匹配执行对应的方法save()
    • 执行save()
    • 检测到有@ResponseBody直接将save()方法的返回值作为响应体返回给请求方

SpringMVC bean加载控制

Controller加载控制与业务bean加载控制

  • SpringMVC相关bean(表现层bean
  • Spring控制的bean
    • 业务bean (Service)
    • 功能bean (DataSource等)

因为功能不同,如何避免Spring错误的加载到SpringMVCbean
SpringMVC加载的bean对应的包均包含在controller包内,Spring加载的bean设定扫描范围为精准范围,例如service包、dao

config/SpringConfig.class

java 复制代码
@Configuration
@ComponentScan({"com.itheima.service","com.itheima.dao"})
public class SpringConfig {
}

config/SpringMvcConfig.class

java 复制代码
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}

config/ServletContainersInitConfig.class

java 复制代码
//web配置类简化开发,仅设置配置类类名即可
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

或者

java 复制代码
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[]{"/"};
    }

}
相关推荐
四谎真好看7 天前
SSM学习笔记(SpringBoot篇)
spring boot·笔记·学习·学习笔记·ssm
四谎真好看10 天前
SSM学习笔记(SpringMVC篇 Day02)
笔记·学习·学习笔记·ssm
四谎真好看12 天前
SSM学习笔记(SpringMVC篇 Day01)
笔记·学习·学习笔记·ssm
四谎真好看16 天前
SSM学习笔记(Spring篇Day03)
笔记·学习·学习笔记·ssm
四谎真好看17 天前
SSM学习笔记(Spring篇 Day02)
笔记·学习·学习笔记·ssm
四谎真好看19 天前
SSM学习笔记(Spring篇 Day01)
笔记·学习·学习笔记·ssm
tctctttccc20 天前
不属于c2c电子商务模式的网站是:成功案例与发展优势详解
utf-8·mybatis·ssm·配置·整合
qq_124987075321 天前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
biyezuopinvip22 天前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
我真会写代码24 天前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm