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