一、springmvc简介
二、springmvc入门案例
步骤如下所示:
代码演示如下所示:
小细节:项目中全部步骤完成之后,把这个web.xml文件删除掉
第一步:导入坐标
第二步:创建springmvc控制器类(等同于servlet类)
@ResponseBody注解作用:设置返回值类型,也就是说响应给客户端数据的注解
第三步:初始化springmvc环境,设定springmvc加载对应的bean
第四步:告诉tomcat服务器加载springmvc环境(web容器)
package com.itheima.config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
/**
* 第四步: 告诉tomcat服务器初始化servlet容器,加载springmvc环境
*
* 实现: 必须要继承 AbstractDispatcherServletInitializer
*/
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
/**
* 该方法的作用就是:加载springmvc容器配置的方法
*
* AnnotationConfigWebApplicationContext ctx =new AnnotationConfigWebApplicationContext();
* ctx.register(SpringMvcConfig.class); // 括号里面对应的就是那个加载初始化springmvc环境的类
* return ctx;
*/
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx =new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class); // SpringMvcConfig.class 对应的就是第三步:初始化springmvc环境的类
return ctx;
}
/**
* 该方法的作用是:设置哪些客户端请求归属springmvc处理
*
* 做法: 直接返回{"/"} 表明所有的客户端请求都归属springmvc进行处理
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
* 该方法的作用是:加载spring容器配置
*
*/
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
开启tomcat服务器,客户端进行请求资源:
二、入门案例的工作流程 (必须理解)
三、springmvc容器(springmvcConfig)与 spring容器(springConfig)共存时,做各自的业务方式
注意:是不希望加载到表现层controller包下的对象,不是config包下的对象
也就是说:springmvc容器(springmvcConfig)等同于servlet,是专门做表现层方面的业务的,因此我们希望springmvcConfig中@ComponentScan("com.itheima.controller")注解加载到表现层包下的含有注解bean的对象当中,这样我们就可以访问获取该对象的资源了
而spring容器(springConfig)是专门做业务逻辑层、数据层方面的业务的,因此我们希望springConfig中@ComponentScan("com.itheima")注解加载到业务逻辑层和数据层包下的含有注解bean的对象当中,但是我们springConfig容器中注解@ComponentScan("com.itheima")到itheima包,而itheima包下含有表现层包、业务逻辑层包、数据层包、但是因为我们不对表现层做业务处理,因此我们不想让springConfig容器加载到表现层包,所以需要进行排除该表现层包中的含有注解对象(排除后,spring容器就获取不到该含有注解的对象了)
代码演示如下所示:
springmvc容器:
spring容器:(就是用以下两种方法,让spring容器扫描bean注解的时候,排除掉表现层controller包下的UserController含有bean注解的对象,排出后也就是说spring容器就获取不到该bean对象了)
测试程序,测试spring容器是否排除了表现层的含有bean注解的UserController对象(如果排除了就获取不到该UserController对象了):
但注意:用那两种方法排除表现层controller包下的含有bean对象的同时,要把springmvc容器中的扫描注解注释掉,因为springmvc扫描路径是到表现层controller包下的,通俗点说,在项目中只要有@ComponentScan注解,无论是spring容器,还是springmvc容器,该注解都是会被执行的,也就是说,虽然spring容器中排除了对表现层controller包下含有bean对象的获取,但是springmvc中因为含有@ComponentScan注解到表现层controller包下,因此spring排除就会失败
因此注释掉就完事了,不注释掉spring容器就会排除失败
结果程序测试的结果发现spring容器本来扫描到itheima包下,却发现确实排除掉表现层包下的含有bean注解的UserController对象了(获取不到该UserController对象了):
3.1、如果我们真的想让tomcat服务器加载spring环境,那么就需要我们和tomcat服务器加载springmvc时操作一样了,操作如下所示:
把上述代码更 简化写法:继承 AbstractAnnotationConfigDispatcherServletInitializer