(3)RESTful快速开发
-
(2)中的控制器仍然存在大量的冗余代码
-
问题1: 每个方法的@RequestMapping注解中都定义了访问路径/users,重复性太高
-
问题2:每个方法的@RequestMapping注解中都要使用method属性定义请求方式,重复性太高
-
问题3:每个方法响应json都需要加上@ResponseBody注解,重复性太高
-
-
解决方案
-
问题1:将每一个方法路径上的共同路径抽离出来,直接在该控制类的上方直接使用路径前缀@RequestMapper("/users")==》表示当前的类公用此路径
@RequestMapping("/users") public class UserController { @RequestMapping(method = RequestMethod.POST) @ResponseBody public String save(@RequestBody User user) { ... } ... }
-
问题2:根据每一个方法的@RequestMapping属性中的行为动作采取对应的mapping进行取代
@PostMapping public String save(@RequestBody User user) {...} @DeleteMapping("/{id}") public String delete(@PathVariable int id) {...} @PutMapping public String update(@RequestBody User user) {...} @GetMapping public String findUserAll() {...} @GetMapping("/{id}") public String findUserById(@PathVariable int id) {...}
-
问题3:将每一个方法的@ResponseBody抽离到控制类上==》表示该控制类的所有响应均是JSON数据格式
@Controller @RequestMapping("/users") @ResponseBody public class UserController { ... }
-
-
@RestController在控制器类上定义==》@Controller和@ResponseBody的整合,简化书写
@RestController @RequestMapping("/users") public class UserController { ... }
(4)RESTful案例
-
案例需求分析
-
需求一:图片列表查询,从后台返回数据,将数据展示在页面上
-
需求二:新增图片,将新增图书的数据传递到后台,并在控制台打印
-
-
步骤分析
1.搭建项目导入jar包
2.编写Controller类,提供两个方法,一个用来做列表查询,一个用来做新增
3.在方法上使用RESTful进行路径设置
4.完成请求、参数的接收和结果的响应
5.使用PostMan进行测试
6.将前端页面拷贝到项目中
7.页面发送ajax请求
8.完成页面数据的展示
-
环境准备
-
1.创建Maven项目
-
2.向pom.xml文件中添加springmvc相关依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.19</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.5</version> </dependency> </dependencies>
-
3.创建配置类
@Configuration @ComponentScan("com.rest") @EnableWebMvc public class SpringMVCConfig { } public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { protected Class<?>[] getRootConfigClasses() { return new Class[0]; } protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMVCConfig.class}; } protected String[] getServletMappings() { return new String[]{"/"}; } //乱码处理 @Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; } }
-
4.创建图书实体类
public class Book { private Integer id; private String type; private String name; private String description; //setter...getter...toString略 }
-
5.创建图书的控制器类
@Controller public class BookController {}
-
6.创建完成后的项目结构
-
-
后台接口开发
-
1.使用RESTful配置业务接口
@RestController @RequestMapping("/books") public class BookController { @PostMapping public void saveBook(@RequestBody Book book) { System.out.println("Book save... book ==> " + book); //模拟数据库的数据 ArrayList<Book> books = new ArrayList<Book>(); books.add(book); } @DeleteMapping("/{id}") public void deleteBook(@PathVariable int id) { System.out.println("Book delete... id ==> " + id); } @PutMapping public void updateBook(@RequestBody Book book) { System.out.println("Book update... book ==> " + book); } @GetMapping public List<Book> getAllBook() { //模拟数据库的数据 ArrayList<Book> books = new ArrayList<Book>(); books.add(new Book(1, "IT", "计算机操作系统", "计算机基础课程")); books.add(new Book(2, "IT", "计算机网络", "计算机基础课程")); System.out.println("Book find... books ==> " + books); return books; } }
-
2.测试增加图书信息接口
-
3.测试删除图书信息接口
-
4.测试修改图书信息接口
-
5.测试查询所有图书
-
-
将前端代码整合到项目结构中
-
拷贝静态页面到webapp目录下
-
访问pages目录下的books.html
-
运行异常这是由于请求都被SpringMVC拦截处理了,发现控制器没有/pages/books.html这个访问路径对应的处理,因此需要单独处理页面这样的静态资源==》①使用配置类进行过滤静态请求
@Configuration public class SpringMVCSupport extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { //访问静态资源pages目录下的任意资源时,直接访问pages目录下 registry.addResourceHandler("/pages/**").addResourceLocations("/pages/"); //加载其它静态资源 registry.addResourceHandler("/js/**").addResourceLocations("/js/"); registry.addResourceHandler("/css/**").addResourceLocations("/css/"); registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/"); } }
-
②在SpringMVCConfig中扫描mvc支持
@ComponentScan({"com.restfulDemo.controller","com.restfulDemo.config"})
-
重新访问
-
-
在页面中使用Ajax发送异步请求
-
1.在后台使用静态代码块实现模拟数据库
static ArrayList<Book> books = new ArrayList<Book>(); static { books.add(new Book(1, "IT", "计算机操作系统", "计算机基础课程")); books.add(new Book(2, "IT", "计算机网络", "计算机基础课程")); }
-
2.获取所有图书信息
getAll() { axios.get("/SpringMVC_09_restfulDemo_war/books").then((res)=>{ this.dataList = res.data; }); }
-
-
响应到页面上
-
-
2.新增图书信息
saveBook () { axios.post("/SpringMVC_09_restfulDemo_war/books",this.formData).then((res)=>{ }); this.dialogFormVisible = false;//关闭新增弹窗 this.reload();//定时器刷新页面 }
-