目录
一、SpringMVC简介
二、SpringMVC快速入门
1、导入坐标
<dependencies>
<!--导入Servlet坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--导入MVC坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
2、配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMVCConfig {
}
3、Controller
@Controller
public class BookController {
@RequestMapping("/save")
//将返回的数据转为json格式
@ResponseBody
public String save(){
System.out.println("save run ..");
return "{'ADASD':'454'}";
}
}
4、Servlet容器启动配置类
//定义一个Servlet容器启动的配置类,在里面加载spring的配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//创建Servlet容器时,初始化Web容器
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMVCConfig.class);
return ctx;
}
//设置哪些请求归属springMVC管理
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
三、入门案例流程分析
四、SpringMVC加载控制
由于SpringMVC只控制controller层的bean,而Spring在进行包扫描时又会加载到controller层的bean,所以在Spring中要修改包扫描的方式
1、方式一
@Configuration
//扫描包中的bean但是排除扫描注解类型的包Controller
@ComponentScan(value = "com.itheima",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
2、方式二
简化SpringMVC开发
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
protected Class<?>[] getRootConfigClasses() {
//springmvc容器
return new Class[]{SpringMVCConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
//spring容器
return new Class[]{SpringConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
五、请求与响应
1、请求映射路径
2、controller接收前端参数
@Controller
public class BookController {
@RequestMapping("/save")
@ResponseBody
//声明入参接收前端数据,请求参数的名称必须匹配
public String save(String name){
System.out.println("save run .." + name);
return "{'ADASD':'454'}";
}
}
方法参数内部使用了@RequestParam注解将请求参数名称与方法参数名称绑定
3、POST请求中文乱码问题
4、各种请求参数的传递
1、请求
1、接收普通参数
2、接收pojo类型
3、接收嵌套pojo类型
4、接收数组参数
5、接收集合参数
要在集合参数前加上@RequestParam注解,将传递的数据作为集合的参数,否则会自动将这个List<String>作为一个pojo,创建这个pojo的对象,而list是接口不能创建对象,会报错
6、接收json格式参数
@RequestMapping("/json")
@ResponseBody
//将前端传递的json参数转为pojo对象
public String json(@RequestBody List<String> likes){
System.out.println(likes);
return "{'ADASD':'454'}";
}
7、接收json对象
8、接收日期类型参数
2、响应
1、响应页面
2、响应文本数据
3、响应json数据(将对象自动转json)
4、@ResposeBody
类型转换内部实现HttpMessageConverter接口
六、REST风格
1、快速入门
@RequestMapping
@PathVariable
2、RESTful快速开发
1、@RestController
2、提交方式
使用@PathVariable注解获取路径中的参数,@GetMapping("/{id}")表示以get方式提交路径参数为id的数据,通过@PathVariable获取这个数据
3、基于RESTful实现数据交互
1、测试后台controller接口
SpringMVC配置类
@Configuration
@ComponentScan("com.itheima")
//开启json转对象的功能
@EnableWebMvc
public class SpringMVCConfig {
}
Servlet容器
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
protected Class<?>[] getRootConfigClasses() {
//springmvc容器
return new Class[]{SpringMVCConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
//spring容器
return new Class[0];
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
//处理前端传递数据乱码
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
controller接口
@RestController
@RequestMapping("/books")
public class BookController {
@PostMapping
public String save(@RequestBody Book book){
System.out.println(book);
return "{save..run}";
}
@GetMapping
public List<Book> getAll(){
List<Book> listBook = new ArrayList<Book>();
Book book = new Book("计算机","SpringMVC入门","一代宗师");
Book book2 = new Book("法学","Spring入门","一代宗师");
listBook.add(book);
listBook.add(book2);
return listBook;
}
}
使用postman测试接口
post请求
Get请求
2、连接前后端进行数据交互(html页面被拦截)
由于所有路径为"/"的数据都被mvc拦截,所以需要对其他静态页面的路径进行放行,记得添加@Configuration,并在SpringMVCConfig中扫描到这个配置类
@Configuration
public class SpringMVCSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//当访问/pages/**这个路径时不被mvc拦截,直接访问/pages/下的文件
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
七、SSM整合
八、表现层数据封装
由于前后端交互,后端向前端发送数据库操作的信息并返回,这时需要与前端进行传递数据的约定,将不同的结果封装成msg对象。
九、异常处理器
//定义异常处理器
//为Rest风格开发的控制器类做增强
@RestControllerAdvice
public class ProjectExceptionAdvice {
//定义当前处理器拦截哪种异常
@ExceptionHandler(Exception.class)
public Result doException(Exception ex){
return new Result(555,"后台出异常了",null);
}
}
1、项目异常
十、拦截器
浏览器访问的过程:浏览器先通过路径向tomacat服务器发送请求,静态资源可以直接访问,动态资源需要先通过过滤器进去Spring中的中央控制器,再由中央控制器根据路径分配不同的Controller,再由这个Controller返回给页面
现在需要加上新的业务,在Controller的执行前后都做一些固定的事情,比如权限校验,是否有权限调用这个Controller,拦截器就能够实现这个方法。
1、拦截器的概念