RESTful快速开发

发布于:2024-11-27 ⋅ 阅读:(37) ⋅ 点赞:(0)
(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();//定时器刷新页面
    }

网站公告

今日签到

点亮在社区的每一天
去签到