Spring Boot Web相关的基础知识

电子说

1.3w人已加入

描述

上一篇文章我们已经学会了如何通过IDEA快速建立一个Spring Boot项目,还介绍了Spring Boot项目的结构,介绍了项目配置文件pom.xml的组成部分,并且撰写了我们Spring Boot的第一个接口。接下来将会将会介绍使用Spring Boot开发Web应用的相关内容,其主要包括使用spring-boot-starter-web组件来实现Web应用开发、URL地址映射、参数传递、数据校验规、统一数据返回和统一异常处理等等。

Web基础

Spring Boot将传统Web开发的mvc、json、validation、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置和开发的难度,将开发者从繁杂的配置项中拯救出来,专注于业务逻辑的开发。

正如上一篇文章所提到的,我们只需要在pom.xml文件中的dependencies中添加以下代码就可以引入spring-boot-starter-web。其中的webmvc是Web开发的基础框架,json是JSON数据解析组建,tomcat为自带的容器依赖。

<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-web<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>

@Controller和@RestController

Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求,如果请求的是页面和数据,使用@Controller注解即可,如何只请求数据,则可以使用哦@RestController注解。

@Controller

@Controller主要主要用于页面和数据的返回,如果在@Controller类中只返回数据到前台页面,则需要使用@ResponseBody注解,否则会报错,其代码如下:

@Controller
public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "Hello @Spring Boot!!!";
    }
}

@RestController

@RestController注解用于实现数据请求的处理,默认情况下@RestController注解会将返回的对象数据转换为JSON格式,其代码如下:

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/getUser")
    @ResponseBody
    public User getUser() {
        User u = new User();
        u.setName("QStack");
        u.setAge(20);
        u.setPassword("123456");
        return u;
    }
}

在上述的例子中,定义/user/getUser接口返回JSON格式的User数据,近几年前端框架越来越强大,前后端分离的RESTful架构成为主流,Spring Boot对RESTful也做了非常完善的支持,使用也特别简单,使用@RestController注解自动返回JSON格式的数据,与此同时可以使用@GetMapping和@PostMapping等注解实现映射RESTful接口。

@ResponseBody

@ResponseBody注解主要用于定义数据的返回格式,作用在方法上,默认使用Json序列化成JSON字符串后返回给客户端,如果是字符串则直接返回。在@Controller中有时需要返回数据体,则需要在方法上使用@Responsebody。

@RequestMapping与URL映射

注解@RequestMapping注解主要负责URL的路由映射,它可以添加在Controller类或具体的方法上,如果添加在Controller类上,则这个Controller中所有的路由映射都会加上此映射规则,如果添加在方法上则只对当前方法生效。@RequestMapping注解包含很多属性参数来定义HTTP,具体属性参数如下所示,与此相应的Spring Boot支持URL路径匹配、HTTP Method匹配、params和header匹配等URL映射。

  • value:请求URL的路径,支持URL模版、正则表达式
  • method:HTTP请求的方法
  • consumes:允许的媒体类型,如consumes=“application/json”为HTTP的Content-Type
  • produces:相应的媒体类型,如produces=“application/json”为HTTP的Accept字段
  • params:请求参数
  • headers:请求头参数

URL路径匹配

精确匹配

@RequestMapping的value属性用于匹配URL映射,value支持简单表达式。示例代码如下,其中@PathVariable注解作用在方法参数中,用于表示参数的值来自于URL路径。

@RequestMapping("/getUserById/{id}")
public String getUserById(@PathVariable("id") Long id) {
    return "getUserById" + id;
}

如果URL中的参数名称与方法中的参数名一致,则可以简化为如下

@RequestMapping("/getUserById/{id}")
public String getUserById(@PathVariable Long id) {
    return "getUserById" + id;
}

通配符匹配

@RequsetMapping支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求,示例的代码如下

@RequestMapping("/getJson/*.json")
public String getJson() {
    return "get json data";
}

在上例中,无论请求/getJson/a.json还是请求/getJson/b.json都会匹配到getJson方法。

Method匹配

@RequestMapping注解提供了method参数指定请求的Mathod类型,包括RequestMethod.GET 、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method,以下是以GET方法为例说明。

@RequestMapping(value = "/getData", method = RequestMethod.GET)
public String getData() {
    return "RequestMethod GET";
}

consumes和produces匹配

@RequestMapping注解提供了consumes和produces参数用于验证HTTP请求的内容类型和返回类型。

  • consumes表示请求的HTTP头的Content-Type媒体类型与consumes的值匹配才可以调用方法。
  • produces表示HTTP请求中Accept字段匹配成功才可以调用。下面的例子演示了consumes参数的用法。
@RequestMapping(value = "/content", method = RequestMethod.POST, consumes = "application/json")
public String Consumes(@RequestBody Map param){
    return "Consumes POST Content-Type=application/json";
}

params和header匹配

@RequestMapping注解还提供header参数和params参数映射URL请求的能力,Spring Boot可以从请求参数或HTTP头中提取参数,通过判断参数如params=“action=save”是否通过来实现映射,代码如下

@RequestMapping(value = "/testParam", params = "action=save")
public String testParam(@RequestBody Map param) {
    return "param test";
}
@RequestMapping(value = "/testHead", headers = {"Host=localhost:8080"})
public String testHead() {
    return "header test";
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分