SpringMvc学习笔记-SpringMvc概述

SpringMVC概述

  • SpringMVC与Servlet技术功能等同,均属于web层开发技术(表现层功能开发)。
  • SpringMVC是一种基于Java实现MVC模型的轻量级Web框架(表现层框架技术)。
  • SpringMVC优点:
    • 使用简单,开发便捷
    • 灵活性强

SpringMVC入门案例

  • 使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标

    • <!--servlet-->
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
      </dependency>
      
      <!--spring-mvc-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.10.RELEASE</version>
      </dependency>
      
  • 创建SpringMVC控制器类(等同于Servlet功能)

    • @Controller:设定SpringMVC的核心控制器bean

    • @RequestMapping(“/save”):设置当前控制器方法请求访问路径

    • @ResponseBody:设置当前控制器方法相应内容为当前返回值

    • @Controller//设定SpringMVC的核心控制器bean
      public class UserController {
          @RequestMapping("/save")//设置当前控制器方法请求访问路径
          @ResponseBody//设置当前控制器方法相应内容为当前返回值
          public String save(){
              System.out.println("save");
              return "{'springmvc':'1024'}";
          }
      }
      
  • 定义SpringMVC的配置类

    • //创建SpringMVC的配置文件,加载Controller对应的bean
      @Configuration//配置类
      @ComponentScan("com.controller")//扫描bean
      public class SpringMvcConfig {
      }
      
  • 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求

    • public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
          @Override//加载SpringMvc容器
          protected WebApplicationContext createServletApplicationContext() {
              //创建web容器
              AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
              //加载配置
              webApplicationContext.register(SpringMvcConfig.class);
              return webApplicationContext;
          }
      
          @Override//设置哪些请求由SpringMvc处理
          protected String[] getServletMappings() {
              return new String[]{"/"};//所有请求由SpringMvc处理
          }
      
          @Override//加载Spring容器
          protected WebApplicationContext createRootApplicationContext() {
              return null;
          }
      }
      
  • 删除web.xml:因为使用配置类来代替配置文本

    在这里插入图片描述

  • 添加tomcat7插件

    • <build>
          <plugins>
            <plugin>
              <groupId>org.apache.tomcat.maven</groupId>
              <artifactId>tomcat7-maven-plugin</artifactId>
              <version>2.2</version>
              <configuration>
                <port>80</port>
                <path>/</path>
              </configuration>
            </plugin>
          </plugins>
        </build>
      
  • 添加Maven运行配置

    • 在这里插入图片描述
  • 启动程序

    • 在这里插入图片描述
  • 使用浏览器访问localhost/save

    • 在这里插入图片描述
  • SpringMVC入门程序开发总结

    • 一次性工作
      • 创建工程,设置服务器,加载工程
      • 导入坐标
      • 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
      • SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
    • 多次工作
      • 定义处理请求的控制器类
      • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
  • 启动服务器初始化过程

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

在这里插入图片描述

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

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

  • SpringMVC相关的bean

    • 表现层bean
  • Spring相关的bean

    • 业务bean(Service)
    • 功能bean(DataSource等)
  • Spring相关bean加载控制

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

      • @Configuration
        //设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean
        @ComponentScan(value="com.itheima",
            excludeFilters = @ComponentScan.Filter(//excludeFilters属性:设置扫描加载bean时,排除的过滤规则
                type = FilterType.ANNOTATION,//按注解排除
                classes = Controller.class//排除Controller注解类型
            )
        )
        public class SpringConfig {
        }
        
    • 方式二(开发常用):Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等

      • @Configuration
        //注:如果使用自动代理来得到实现类对象,可以不扫描dao层,但是一般会扫描提高通用性。
        @ComponentScan({"com.itheima.service","com.itheima.dao"})
        public class SpringConfig {
        }
        
    • 方式三:不区分Spring与SpringMVC的环境,加载到同一环境中

    • 修改web配置类使服务器启动时获取Spring和SpringMVC容器:

      • 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[]{"/"};
            }
        
        }
        
    • 实现AbstractAnnotationConfigDispatcherServletInitializer接口简化开发:

      • public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
            /**
             * Spring环境加载SpringConfig.class获取Spring容器
             * @return
             */
            protected Class<?>[] getRootConfigClasses() {
                return new Class[]{SpringConfig.class};
            }
            
            /**
             * SpringMVC环境加载SpringMvcConfig.class获取SpringMVC容器
             * @return
             */
            protected Class<?>[] getServletConfigClasses() {
                return new Class[]{SpringMvcConfig.class};
            }
        
            protected String[] getServletMappings() {
                return new String[]{"/"};
            }
        }
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值