😧 SpringMVC_day01(三)

简介: 😧 SpringMVC_day01

2.5.5 设置bean加载控制


方式一:修改Spring配置类,设定扫描范围为精准范围。

https://developer.aliyun.com/article/1107051

说明:


上述只是通过例子说明可以精确指定让Spring扫描对应的包结构,真正在做开发的时候,因为Dao最终是交给MapperScannerConfigurer对象来进行扫描处理的,我们只需要将其扫描到service包即可。


方式二:修改Spring配置类,设定扫描范围为com.itheima,排除掉controller包中的bean

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


  • excludeFilters属性:设置扫描加载bean时,排除的过滤规则
  • type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
  • ANNOTATION:按照注解排除
  • ASSIGNABLE_TYPE:按照指定的类型过滤
  • ASPECTJ:按照Aspectj表达式排除,基本上不会用
  • REGEX:按照正则表达式排除
  • CUSTOM:按照自定义规则排除


大家只需要知道第一种ANNOTATION即可


  • classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean


如何测试controller类已经被排除掉了?

public class App{
  public static void main (String[] args){
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        System.out.println(ctx.getBean(UserController.class));
    }
}

如果被排除了,该方法执行就会报bean未被定义的错误


网络异常,图片无法展示
|


注意:测试的时候,需要把SpringMvcConfig配置类上的@ComponentScan注解注释掉,否则不会报错


出现问题的原因是,


  • Spring配置类扫描的包是com.itheima
  • SpringMVC的配置类,SpringMvcConfig上有一个@Configuration注解,也会被Spring扫描到
  • SpringMvcConfig上又有一个@ComponentScan,把controller类又给扫描进来了
  • 所以如果不把@ComponentScan注释掉,Spring配置类将Controller排除,但是因为扫描到SpringMVC的配置类,又将其加载回来,演示的效果就出不来
  • 解决方案,也简单,把SpringMVC的配置类移出Spring配置类的扫描范围即可。


最后一个问题,有了Spring的配置类,要想在tomcat服务器启动将其加载,我们需要修改ServletContainersInitConfig

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


对于上述的配置方式,Spring还提供了一种更简单的配置方式,可以不用再去创建AnnotationConfigWebApplicationContext对象,不用手动register对应的配置类,如何实现?

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


知识点1:@ComponentScan

名称

@ComponentScan

类型

类注解

位置

类定义上方

作用

设置spring配置类扫描路径,用于加载使用注解格式定义的bean

相关属性

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

includeFilters:加载指定的bean,需要指定类别(type)和具体项(classes)


3,PostMan工具的使用


3.1 PostMan简介


代码编写完后,我们要想测试,只需要打开浏览器直接输入地址发送请求即可。发送的是GET请求可以直接使用浏览器,但是如果要发送的是POST请求呢?


如果要求发送的是post请求,我们就得准备页面在页面上准备form表单,测试起来比较麻烦。所以我们就需要借助一些第三方工具,如PostMan.


  • PostMan是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
    网络异常,图片无法展示
    |
  • 作用:常用于进行接口测试
  • 特征
  • 简单
  • 实用
  • 美观
  • 大方


3.2 PostMan安装


双击资料\Postman-win64-8.3.1-Setup.exe即可自动安装,


安装完成后,如果需要注册,可以按照提示进行注册,如果底部有跳过测试的链接也可以点击跳过注册


网络异常,图片无法展示
|


看到如下界面,就说明已经安装成功。


网络异常,图片无法展示
|


3.3 PostMan使用


3.3.1 创建WorkSpace工作空间


网络异常,图片无法展示
|


3.3.2 发送请求


网络异常,图片无法展示
|


3.3.3 保存当前请求


网络异常,图片无法展示
|


注意:第一次请求需要创建一个新的目录,后面就不需要创建新目录,直接保存到已经创建好的目录即可。


4,请求与响应


前面我们已经完成了入门案例相关的知识学习,接来了我们就需要针对SpringMVC相关的知识点进行系统的学习,之前我们提到过,SpringMVC是web层的框架,主要的作用是接收请求、接收数据、响应结果,所以这一章节是学习SpringMVC的重点内容,我们主要会讲解四部分内容:


  • 请求映射路径
  • 请求参数
  • 日期类型参数传递
  • 响应json数据


4.1 设置请求映射路径


4.1.1 环境准备


  • 创建一个Web的Maven项目
  • pom.xml添加Spring依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.itheima</groupId>
  <artifactId>springmvc_03_request_mapping</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <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>
</project>
  • 创建对应的配置类
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[0];
    }
}
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
  • 编写BookController和UserController
@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'module':'user save'}";
    }
    @RequestMapping("/delete")
    @ResponseBody
    public String save(){
        System.out.println("user delete ...");
        return "{'module':'user delete'}";
    }
}
@Controller
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("book save ...");
        return "{'module':'book save'}";
    }
}

最终创建好的项目结构如下:


网络异常,图片无法展示
|


把环境准备好后,启动Tomcat服务器,后台会报错:


网络异常,图片无法展示
|


从错误信息可以看出:


  • UserController有一个save方法,访问路径为http://localhost/save
  • BookController也有一个save方法,访问路径为http://localhost/save
  • 当访问http://localhost/saved的时候,到底是访问UserController还是BookController?


目录
相关文章
|
JSON 运维 Java
😧 SpringMVC_day02(五)
😧 SpringMVC_day02
100 1
|
JSON 前端开发 Java
😧 SpringMVC_day01(二)
😧 SpringMVC_day01
125 1
|
JSON 前端开发 Java
😧 SpringMVC_day01(一)
😧 SpringMVC_day01
116 1
|
JSON 前端开发 Java
😧 SpringMVC_day02(四)
😧 SpringMVC_day02
99 0
|
前端开发 Java Maven
😧 SpringMVC_day02(二)
😧 SpringMVC_day02
121 0
|
运维 前端开发 Java
😧 SpringMVC_day02(三)
😧 SpringMVC_day02
107 0
|
设计模式 Java 数据库连接
😧 SpringMVC_day02(一)
😧 SpringMVC_day02
79 0
|
JSON 前端开发 Java
😧 SpringMVC_day01(五)
😧 SpringMVC_day01
107 0
|
JSON 前端开发 Java
😧 SpringMVC_day01(四)
😧 SpringMVC_day01
78 0
|
JSON 前端开发 Java
😧 SpringMVC_day01(六)
😧 SpringMVC_day01
140 0