SpringBoot中各种Controller的写法

 更新时间:2023年07月19日 09:35:05   作者:元宇宙iwemeta  
这篇文章主要介绍了SpringBoot中各种Controller的写法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot各种Controller写法

最近玩SpingBoot,以下是一些Controller的各种写法

本文我们将分为四部分:

  • 1、Controller的类型(传统的 和 REST)
  • 2、路由(Routes)
  • 3、如何接收数据
  • 4、Controller示例

Controller 类型

你也许每天都在使用Spring ,但你知道controller有几种类型吗?其实controller是有两种的,一种就是传统的web的那种controller,而另外一种就是REST类型的controller。

@Controller 通常是被使用服务于web 页面的。默认,你的controller方法返回的是一个string 串,是表示要展示哪个模板页面或者是要跳转到哪里去。

@RestController 就是专门用在编写API的时候,特别那种返回一个JSON,或者是XML等等。然后方法返回的是可以是一个对象,是一个可以被序列化的对象。

当然了你也可以通过controller来实现返回JSON、XML这些。只是这里为了"REST",得另立门户,这样会更加的清晰明了。

路由(Routes)

这里的路由就是指http method。(GET,POST,PUT,PATCH,DELETE)。

HTTP Methods

在Spring boot中,http method可以被用类似“*Mapping”的格式来表示:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @PatchMapping
  • @DeleteMapping

然后这些注解中可以添加path,像下面这样:

例子:

@GetMapping("/users")

一个比较典型的REST controller 一般是像下面这样来映射路由的:

@RestController
public class UsersController {   
   @GetMapping("/users")    
    public List<User> index() {...}  
    @GetMapping("/users/{id}")    
    public User show(...) {...}
    @PostMapping("/users")    
    public User create(...) {...}  
    @PutMapping("/users/{id}")   
    public User update(...) {...}    
    @DeleteMapping("/users/{id}")    
    public void delete(...) {...}
}

还有一种比较常见的做法是通过在controller类上添加一个@RequestMapping注解。这样相当于可以把上面的所有的mapping前缀添加到这里。

像下面这样(基于上面的例子修改):

@RestController
@RequestMapping("/users")
public class UsersController {
    @GetMapping
    public List<User> index() {...}
    @GetMapping("{id}")    
    public User show(...) {...}   
    @PostMapping
    public User create(...) {...} 
    @PutMapping("{id}")   
    public User update(...) {...}   
    @DeleteMapping("{id}")    
    public void delete(...) {...}
}

返回状态

Controller的方法可以去指定一个返回状态码。默认的是返回一个200 OK,如果是没有返回值(void)则返回 204 No Content。

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User create(...) {...}

路径变量

你可以通过添加@PathVariable注解来把路径上的值捕获下来:

// DELETE /users/123
@DeleteMapping("/users/{id}")
public void delete(@PathVariable long id) {...}

默认情况下,参数名必须要和路径上的变量名一样。

但你也可以通过下面的方式来修改,就是你通过给@PathVariable赋值为路径变量名,然后参数名就可以是不一样的了:

// GET /users/me@example.com/edit
@GetMapping("/users/{email}/edit"
public String edit(@PathVariable("email") String userEmail) {...}

接收数据

查询字符参数

如果是通过?xxx=xxx&yyy=yyy来传递过来的参数,那么我们可以通过@RequestParam来获取:

// GET /users?count=10
@GetMapping("/users")
public List<User> index(@RequestParam int count) {...}

默认的话,变量名必须要和查询字符参数是一样的。你也可以通过下面的方式来修改:

// GET /users?num_per_page=50
@GetMapping("/users")
public List<User> index(@RequestParam("num_per_page") int numPerPage) {...}

提交HTML表单数据

如果我们想要创建一个用户。这时候,我么可能在前端,写下面这样一个form:

<form action="/users" method="POST">
  <input name="name"/>
  <input name="email"/>
  <button type="submit">Create User</button>
</form>

现在我们创建一个请求模型,用来匹配我们的前端form结构:

class UserCreateRequest {    
   private String name;    
   private String email;    
   /* Getters & Setters omitted */
}

然后我们就可以在controller对应的方法上来捕获form里的值,我们通过对参数添加一个@ModelAttribute注解就可以实现了:

@PostMapping("/users")
public User create(@ModelAttribute UserCreateRequest request) {...}

提交JSON

就像上面例子那样,我们创建一个用户,然后是一个JSON格式:

{ "name": "Som Eone", "email": "someone@example.com"}

然后请求模型还是沿用之前的:

class UserCreateRequest {
private String name;
private String email; 
}

然后我们使用@RequestBody来捕获前端发送过来的JSON串,然后反序列化到我们的请求模型UserCreateRequest:

@PostMapping
public User create(@RequestBody UserCreateRequest request) {...}

Controller 举例

以下是使用上述所有注解创建Controller的示例。 没有具体逻辑,只是简单的展示上面说到的各个注解。

传统的controller

这类型的controller返回值表示要展示的页面或要跳转到哪个请求。

@Controller
@RequestMapping("/users")
public class UsersController {    
   @GetMapping
    public String index() {        
        return "users/index";
    }    
    @GetMapping("{id}")    
    public String show(@PathVariable long id) {        
         return "users/show";
    }    
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)    
    public String create(@ModelAttribute UserCreateRequest request) {
      return "redirect:/users";
    }    
    @PutMapping("{id}")    
    public String update(@PathVariable long id, @RequestBody UserUpdateRequest request) {        
       return "redirect:/users/" + id;
    }   
    @DeleteMapping("{id}")    
    public String delete(@PathVariable long id) {        
        return "redirect:/users";
    }
}

REST controller

这类型的controller返回值是一些对象,这些对象要被序列化成JSON、XML等其他格式,并不是表示要跳转到哪个HTML模板。

@RestController
@RequestMapping("/users")
public class UsersController {    
   @GetMapping
    public List<User> index() {        return new ArrayList<User>();
    }   
    @GetMapping("{id}")    
    public User show(@PathVariable long id) {        return new User();
    }    
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)    
    public User create(@RequestBody UserCreateRequest request) {
       return new User();
    }    
    @PutMapping("{id}")    
    public User update(@PathVariable long id, @RequestBody UserUpdateRequest request) {        
       return new User();
    }    
    @DeleteMapping("{id}")    
    public void delete(@PathVariable long id) {}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Maven pom的distributionManagement配置方式

    Maven pom的distributionManagement配置方式

    文章主要介绍了Maven的distributionManagement配置方式,以及它的作用、配置方法和重要性,distributionManagement用于指定构件的发布位置,包括下载URL、状态等,文章还详细解释了如何配置repository和snapshotRepository,以及它们的用途和区别
    2025-01-01
  • springboot之端口设置和contextpath的配置方式

    springboot之端口设置和contextpath的配置方式

    这篇文章主要介绍了springboot之端口设置和contextpath的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 解决feign之间文件上传报错:Error converting request body的问题

    解决feign之间文件上传报错:Error converting request body

    这篇文章主要介绍了解决feign之间文件上传报错:Error converting request body的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Java基础学习之IO流应用案例详解

    Java基础学习之IO流应用案例详解

    这篇文章主要为大家详细介绍了Java IO流的三个应用案例:点名器、集合到文件和文件到集合,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-09-09
  • Java 超详细讲解设计模式之原型模式讲解

    Java 超详细讲解设计模式之原型模式讲解

    原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,今天通过本文给大家介绍下Java 原型设计模式,感兴趣的朋友一起看看吧
    2022-03-03
  • java实现单链表倒转的方法

    java实现单链表倒转的方法

    这篇文章主要为大家详细介绍了java实现单链表倒转的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java如何实现数据压缩所有方式性能测试

    Java如何实现数据压缩所有方式性能测试

    本文介绍了多种压缩算法及其在Java中的实现,包括LZ4、BZip2、Deflate、Gzip和7z等,LZ4以其高效的压缩和解压缩速度而受到青睐,特别是在大数据处理场景中,通过对比不同压缩算法的性能和压缩率,我们选择了最适合当前项目需求的压缩工具
    2025-02-02
  • JavaMail实现发送超文本(html)格式邮件的方法

    JavaMail实现发送超文本(html)格式邮件的方法

    这篇文章主要介绍了JavaMail实现发送超文本(html)格式邮件的方法,实例分析了java发送超文本文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    本文中主要陈述一种实时监听文件夹中是否有文件增加的功能,可用于实际文件上传功能的开发。本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-09-09
  • Reactive Programming入门概念详解

    Reactive Programming入门概念详解

    这篇文章主要为大家介绍了Reactive Programming入门概念详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论