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[]{"/"};
    }

}
相关推荐
计算机软件程序设计12 小时前
如何使用IDEA创建Maven/SSM工程?
java·maven·intellij-idea·ssm
V+zmm101341 天前
随堂测微信小程序ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm·课程设计
尚学教辅学习资料1 天前
基于SSM的社区物业管理系统+LW参考示例
java·毕业设计·ssm·物业管理系统
V+zmm101344 天前
停车共享小程序ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm·课程设计·1024程序员节
尚学教辅学习资料6 天前
基于SSM+uniapp的营养食谱系统+LW参考示例
java·uni-app·ssm·菜谱
尚学教辅学习资料9 天前
基于SSM的扶贫信息管理系统+lw示例参考
ssm·java源码·扶贫
Yaml419 天前
智慧旅游微信小程序平台
vue.js·spring boot·微信小程序·uni-app·ssm·1024程序员节
尚学教辅学习资料19 天前
基于SSM的在线旅游美食展现管理系统源码
ssm·旅游·美食·java源码
阿亮说技术20 天前
Java毕业设计 基于SSM jsp餐厅卫生安全系统
java·毕业设计·ssm·课程设计·jsp
代码吐槽菌22 天前
基于SSM的学生管理系统【附源码】
java·数据库·毕业设计·ssm·计算机专业