SpringMVC学习目标:
🛳️ 1、掌握基于SpringMVC获取请求参数与响应json数据操作
🛳️ 2、熟练应用基于REST风格的请求路径设置与参数传递
🛳️ 3、能够根据实际业务建立前后端开发通信协议并进行实现
🛳️ 4、基于SSM整合技术开发任意业务功能
目录
一、SpringMVC概述
➠SpringMVC是一种基于Java实现MVC模型的轻量级 web框架
➠是一种表现层框架技术,用于进行表现层功能开发
➠ SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
二、SpringMVC入门
●初始化 SpringMVC项目环境
① 新建模块,选择使用webapp的骨架
②添加源码目录(web程序骨架没有源码目录)
●SpringMVC项目的开发
① 导入SpringMVC坐标与Servlet坐标
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
② 创建SpringMVC控制器类( 等同于Servlet功能)
package com.GY.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//开发表现层bean(SpringMvc开发专用声明bean的注解)
@Controller
public class UserController {
/* 用户发送哪个请求能调用到save()方法?
//设置当前操作的访问路径(调用名称,返回Json数据)*/
@RequestMapping("/save")
//设置当前操作的返回值类型
@ResponseBody
public String save(){
System.out.println("save........");
return "{...springmvc...}";
}
}
③ 初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean
④ 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术请求(web容器的配置类)
package com.GY.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//4、定义一个servlet容器启动的配置类,在里面加载Spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//Tomcat容器加载springmvc配置
protected WebApplicationContext createServletApplicationContext(){
AnnotationConfigWebApplicationContext A=new AnnotationConfigWebApplicationContext();
//注册配置
A.register(SpringmvcConfig.class);
return A;
}
//配置拦截请求,设置哪些请求归属springMVC处理(此时Tomcat接收的所有请求将交由SpringMVC处理)
protected String []getServletMappings(){
//所有请求归springMVC处理
return new String[]{"/"};
}
//加载spring容器配置
protected WebApplicationContext createRootApplicationContext(){
return null;
}
}
此时我们便可启动服务器
●配置tomcat插件
<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>
●启动程序
🎊🎊️️
tomcat启动成功
🛳️🛳️🛳️
在浏览器进行访问(请求成功并且成功打印)
三、SpringMVC入门开发总结
四、SpringMVC工作流程分析
●启动服务器初始化过程
1、服务器启动,执行ServletContainersInitConfig类,初始化web容器
2、执行createServletApplicationContext方法,创建WebApplicationContext(SpringMVC容器)对象
3、加载SpringMvcConfig
4、执行@ComponentScan加载对应的bean
5、加载UserController,每个@RequestMapping的名称对应一个具体的方法
6、 执行getServletMapping方法,定义所有的请求都通过SpringMVC
●单次请求过程
1、发送请求 http://localhost:81/save
2、web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
3、解析请求路径 /save
4、由 /save 匹配执行对应的方法save()
5、执行save()
6、检测到有@ResponseBody直接将save()方法的返回值作为响应体返回给请求方
五、SpringMVC-Controller加载控制与业务bean加载控制
➠SpringMVC相关的bean(表现层bean)
➠Spring控制的bean
●业务bean(Service)
●功能bean(DateSource等)
🚸思考
1、因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?
SpringMVC的bean一一加载Spring控制的bean的时候排除掉SpringMVC控制的bean
🛳️方法
➠①SpringMVC相关bean加载控制
●SpringMVC加载的bean对应的包均在com.GY.controller
➠②Spring相关bean加载控制
●方式一:Spring加载的bean设定扫描范围为com.GY,排除controller包内的bean
@Configuration
@ComponentScan(value = "com.GY",
excludeFilters = @ComponentScan.Filter(
//按注解过滤(排除)
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
●方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包
●方式三:不区分Spring与Spring与SpringMVC的环境,加载到同一个环境中
六、SpringMVC-简化Servlet容器配置类
将Servlet容器配置类继承 AbstractAnnotationConfigDispatcherServletInitializer类 (AbstractDispatcherServletInitializer的子类)
package com.GY.controller.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringmvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}