SpringMVC(三)【REST 风格】(2)

简介: SpringMVC(三)【REST 风格】

SpringMVC(三)【REST 风格】(1)https://developer.aliyun.com/article/1534212

1.3.2、标准请求动作注解

       经过上一步的简化,我们的 UserController 现在变成了这样:

@RestController
@RequestMapping("/users")
public class UserController {
 
    @RequestMapping(method = RequestMethod.POST)
    public String save(@RequestBody User user){
        System.out.println("user save,  name = " + user.getName() + " , age = " + user.getAge());
        return "{'module':'user save'}";
    }
 
    @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    public String delete(@PathVariable Integer id){
        System.out.println("user deleted ... user id => " + id);
        return "{'module': 'user delete'}";
    }
 
    @RequestMapping(method = RequestMethod.PUT)
    public String update(@RequestBody User user){
        System.out.println("user deleted ... user => " + user.toString());
        return "{'module': 'user update'}";
    }
 
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public String getById(@PathVariable Integer id){
        System.out.println("user get ... user id => " + id);
        return "{'module': 'user get'}";
    }
 
    @RequestMapping(method = RequestMethod.GET)
    public String getAll(){
        System.out.println("user get all ...");
        return "{'module': 'user get all'}";
    }
}

       现在看起来还是很冗余,我们可以对这些方法的请求行为进行进一步简化,现在这么长的参数太扎眼了,现在我们的代码就变成了这样(把 value =  "/{param}" 和  method = RequestMethpd.X 合并到一个注解中):

@RestController
@RequestMapping("/users")
public class UserController {
 
    @PostMapping
    public String save(@RequestBody User user){
        System.out.println("user save,  name = " + user.getName() + " , age = " + user.getAge());
        return "{'module':'user save'}";
    }
 
    @DeleteMapping("/{id}")
    public String delete(@PathVariable Integer id){
        System.out.println("user deleted ... user id => " + id);
        return "{'module': 'user delete'}";
    }
 
    @PutMapping
    public String update(@RequestBody User user){
        System.out.println("user deleted ... user => " + user.toString());
        return "{'module': 'user update'}";
    }
 
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("user get ... user id => " + id);
        return "{'module': 'user get'}";
    }
 
    @GetMapping
    public String getAll(){
        System.out.println("user get all ...");
        return "{'module': 'user get all'}";
    }
}

显然一下子变得清新脱俗!舒服多了。

1.4、基于 RESTful 页面数据交互

实体类

package com.lyh.domain;
 
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
 
    public Book(){}
 
    public Book(Integer id, String type, String name, String description) {
        this.id = id;
        this.type = type;
        this.name = name;
        this.description = description;
    }
 
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + '\'' +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getDescription() {
        return description;
    }
 
    public void setDescription(String description) {
        this.description = description;
    }
}

SpringMVC 配置类

@Configuration
@ComponentScan("com.lyh.controller") // 扫描
@EnableWebMvc // 开启 json 转对象的功能等各种格式转换
public class SpringMvcConfig {
 
}

Sevlet 容器配置类

public class ServletContainersInitConfig 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};
    }
}

BookController 控制器类

@RestController
@RequestMapping("/books")
public class BookController {
 
 
    @PostMapping
    public String save(@RequestBody Book book){
        System.out.println("book save ... book => " + book.toString());
        return "{'module':'book save'}";
    }
 
    @GetMapping
    public List<Book> getAll(){
        List<Book> list = new ArrayList<Book>();
        list.add(new Book(1,"编程","《图解Spark》","大数据技术"));
        list.add(new Book(2,"小说","《黄金时代》","王小波著作"));
        return list;
    }
}

测试

       导入静态资源后访问 localhost:85/pages/boos.html 发现报错找不到映射:No Mapping for GET /pages/books.html 这是因为我们现在的请求都被 SpringMVC 拦截走了,其实这些静态资源应该是由 Tomcat 处理的。

1.4.1、放行非 SpringMVC 请求

       上面的问题是对于静态资源的访问,本该是由 Tomcat 处理,但是前面我们在 Servlet 配置类中设置了所有请求都由 SpringMVC 来响应。所以,现在我们需要通过添加一个配置类来实现放行静态资源:

@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/");
        }
}

       然后,我们需要让 SpringMVC 去加载这个新的配置类:

这样就可以访问到了:

相关文章
|
缓存 NoSQL 应用服务中间件
万字攻略,社招腾讯天美C++后台面经,面试题整理(上)
万字攻略,社招腾讯天美C++后台面经,面试题整理
|
数据可视化 安全 搜索推荐
探析低代码开发平台的核心能力
探析低代码开发平台的核心能力
424 0
|
6月前
|
人工智能 搜索推荐 数据可视化
用 Python 制作简单小游戏教程:手把手教你开发猜数字游戏
本教程详细讲解了用Python实现经典猜数字游戏的完整流程,涵盖从基础规则到高级功能的全方位开发。内容包括游戏逻辑设计、输入验证与错误处理、猜测次数统计、难度选择、彩色输出等核心功能,并提供完整代码示例。同时,介绍了开发环境搭建及调试方法,帮助初学者快速上手。最后还提出了图形界面、网络对战、成就系统等扩展方向,鼓励读者自主创新,打造个性化游戏版本。适合Python入门者实践与进阶学习。
724 1
|
Docker 容器 Ubuntu
docker container 设置编码为utf8
以Ubuntu 14.04 为例创建编码为utf8的container
6112 0
|
开发框架 安全 .NET
使用grpcui测试gRPC服务
使用grpcui测试gRPC服务
376 0
|
存储 机器学习/深度学习 关系型数据库
mysql中char和varchar的区别
mysql中char和varchar的区别
467 1
|
存储
STM32F103C8 GPIO
STM32F103C8 GPIO
510 0
|
安全 Java 编译器
[√]Android内存泄露排查
[√]Android内存泄露排查
266 0
|
Docker 容器
Harbor v2.3.2安装启动报错解决:Creating network “harbor_harbor“ with th..
Harbor v2.3.2安装启动报错解决:Creating network “harbor_harbor“ with th..
406 0
|
关系型数据库 MySQL 数据挖掘
聚焦数据总和:解析MySQL中的SUM()函数
在数据库管理中,计算数据总和是常见的数据分析任务,SUM()函数正是用于帮助我们实现这一目标的工具。
813 0

热门文章

最新文章