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

}
相关推荐
尚学教辅学习资料4 天前
基于SSM的农产品供销小程序+LW示例参考
小程序·ssm·uniapp·java毕设·农产品·助农
大叔_爱编程4 天前
wx059基于ssm+vue+uniapp的小区疫情防控小程序
vue.js·小程序·uni-app·毕业设计·ssm·源码·课程设计
神仙别闹5 天前
基于Springmvc+MyBatis+Spring+Bootstrap+EasyUI+Mysql的个人博客系统
java·mysql·ssm
李白的粉6 天前
基于ssm的在线考试系统
java·毕业设计·ssm·课程设计·在线考试系统·源代码
硬件人某某某8 天前
ssm校园二手交易平台小程序
小程序·ssm·校园二手交易·交易平台
这里是杨杨吖10 天前
SSM仓库物品管理系统 附带详细运行指导视频
java·ssm·仓库物品管理
飞翔的佩奇11 天前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的装饰工程管理系统(含源码+数据库+毕业论文)
java·数据库·spring boot·mybatis·ssm·毕设·装饰工程
不修×蝙蝠1 个月前
vue(七) vue进阶
前端·javascript·vue.js·前端框架·vue·ssm·进阶
毕业设计-011 个月前
0051.ssm+小程序校园餐厅订餐小程序+论文
后端·小程序·毕业设计·ssm·源代码管理
V+zmm101341 个月前
基于微信小程序疫苗预约系统ssm+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm