SpringBoot中的MVC支持

本文主要介绍SpringBoot中对MVC的支持,分析了几个常见注解的使用方式和特点,包括@RestController、@RequestMapping、@PathVariable、@RequestParam以及RequestBody


1.@RestController

我们先从RestController源码中看看该注解里都包含了哪些东西

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    String value() default "";
}

从源码我们知道,@RestController注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式。但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

注意点:如果不是前后端分离,需要使用模板来渲染的话,一般Controller中都会返回到具体的页面,那么此时就不能使用@RestController了,比如:

public String getUser(){
	return "user";

其实是需要返回到user.html页面的,如果使用@RestController的话,会将user作为字符串返回的,所以这时候我们需要使用@Controller注解

1.1 @Controller

控制器,处理http请求。

1.2 @ResponseBody

通过HttpMessageConverter读取Request Body并反序列化为Object(泛指)对象,用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过json提交传来两个参数userName和passWord,此时我们需要在后端封装一个实体来接收,在传递的参数比较多的情况下,使用@RequestBody接收会非常方便
举个例子:

package com.example.springdemo1.pojo;

public class User {
    private String userName;
    private String passWord;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}
package com.example.springdemo1.controller;

import com.example.springdemo1.pojo.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class testController3 {

    @PostMapping("/testRequestBody")
    public String testRequestBody(User user){
        System.out.println("userName:"+user.getUserName());
        System.out.println("passWord:"+user.getPassWord());
        return "success";
    }
}

我们使用postman工具来测试一下效果,参数使用json格式
在这里插入图片描述
同时看一下后台控制台输出的日志:

userName:lyh
passWord:123456

可以看出,@RequestBody注解用于POST请求上,接收json实体参数。

2.@component

@component (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

3.@SpringBootApplication

@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan这三个注解

3.1 @SpringBootConfiguration 注解

继承@Configuration注解,主要用于加载配置文件,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。

3.2 @EnableAutoConfiguration 注解

开启自动配置功能,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。

3.3 @ComponentScan 注解

主要用于组件扫描和自动装配,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下

4.@RequestMapping

是一个用来处理请求地址映射的注解,他可以应用于类上,也可以用于方法上,在类的级别上的注解会将一个特定的请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径,在方法的级别表示进一步指定到处理方法的映射关系。
该注解有6个属性,一般项目中比较常用的有三个属性:value、method、produces

  • value 属性:指定请求的实际地址,value 可以省略不写
  • method 属性:指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET
  • produces属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”

举个例子:

@RestController
@RequestMapping(value = "/test", produces = "application/json; charset=UTF-8")
public class TestController {
 
    @RequestMapping(value = "/get", method = RequestMethod.GET)
    public String testGet() {
        return "success";
    }
}

4.1 @GetMapping

  • 用于将HTTP get请求映射到特定处理程序的方法注解

@RequestMapping(value = "/say",method = RequestMethod.GET)等价于:@GetMapping(value = "/say")

4.2 @PostMapping

  • 用于将HTTP post请求映射到特定处理程序的方法注解

@RequestMapping(value = "/say",method = RequestMethod.POST)等价于:@PostMapping(value = "/say")

相应的,还有DeleteMapping、PutMapping,这里就不再赘述

5.@PathVariable

获取url中的数据,举个例子:一个GET请求携带一个参数id过来,我们将id作为参数接收,可以使用@PathVariable注解

@GetMapping("/user/{id}")
public String testPathVariable(@PathVariable Integer id) {
	System.out.println("id:" + id);
	return "success";
}

这里需要注意一个问题,如果想要url中占位符中的id直接赋值到参数id中,需要保证url中的参数和方法接收参数一致,否则就无法接收,如果不一致的话,需要用@PathVariable中的value属性来指定对应关系

@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) {
	System.out.println("获取到的id为:" + id);
	return "success";
}

对于访问的url,占位符的位置可以在任何位置,不一定非要在最后,比如:/xxx/{id}/user,url也支持多个占位符,方法参数使用同样数量的参数来接收。

@GetMapping("/user/{idd}/{name}")
    public String testPathVariable(@PathVariable(value = "idd") Integer id, @PathVariable String name) {
        System.out.println("获取到的id为:" + id);
        System.out.println("获取到的name为:" + name);
        return "success";
    }

运行项目,在浏览器中请求:localhost:8082/test/user/2/lyh可以看到控制台输出如下信息:
在这里插入图片描述
支持多个参数的接收,同样的,如果url中的参数名称不同的话,也需要使用value属性绑定两个参数

6.@RequestParam

获取请求参数的值,与@PathVariable主要区别在于:@PathVariable是从url模板中获取参数值,即这种风格的urlhttp://localhost:8080/user/{id}而@RequestParam是从request里面获取参数值,即这种风格的urlhttp://localhost:8080/user?id=1,和@PathVariable类似,url上面的参数和方法的参数需要一致,如果不一致,也需要使用value属性来说明,比如url为http://localhost:8080/user?id=1

@RequestMapping("/user")
public String testRequestParam(@RequestParam(value = "idd", required = false) Integer id) {
	System.out.println("获取到的id为:" + id);
	return "success";
}

6.1 @RequestParam其他属性

  • required:true表示该参数必须要穿,否则就会报404错误,false表示可有可无
  • fefaultValue属性:默认值,表示如果请求中没有同名参数时的默认值

6.2 注意点

从url中可以看出,@RequestParam注解用于GET请求上时,接收拼接在url中的参数,该注解还可用于POST请求,接收前端表单提交的参数,加入前端通过表单提交username和password两个参数,那我们可以使用@RequestParam来接收

package com.example.springdemo1.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class testController4 {
    @PostMapping("/form")
    public String testForm(@RequestParam String userName,@RequestParam String passWord){
        System.out.println("userName:"+userName);
        System.out.println("passWord:"+passWord);
        return "success";
    }
}

我们使用postman来模拟一下表单提交
在这里插入图片描述
在表单数据很多的情况下,我们不可能在后台方法中写上很多参数,每个参数还要@RequestParam注解,针对这种情况,我们需要封装一个实体类来接收这些参数,实体中的属性名和表单中的参数名一致即可

public class User{
	private String userName;
	private String passWord;
	//get set
}

使用实体接收的话,我们不能在前面加上@RequestParam注解了,直接使用即可

package com.example.springdemo1.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class testController4 {
    @PostMapping("/form")
    public String testForm(User user){
        System.out.println("userName:"+user.getUserName);
        System.out.println("passWord:"+user.getPassWord);
        return "success";
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 是一个用于构建基于Java的微服务的开发框架。它提供了一种快速开发、简化配置的方式,使得开发者能够更容易地构建和部署应用程序。 Spring Boot MVC 是 Spring Boot 用于构建Web应用程序的一部分。它基于 Spring MVC 框架,提供了简化的配置和开发方式,使得开发者能够更高效地构建和维护Web应用。 gRPC是一种高性能、开源的远程过程调用(RPC)框架,由Google开发并开源。它使用Protocol Buffers作为接口定义语言(IDL),可以跨语言地进行通信。与传统的HTTP+JSON通信相比,gRPC提供了更快、更轻量级、更高效的跨网络通信方式。 Spring Boot可以集成gRPC,实现基于gRPC的远程过程调用。集成gRPC的步骤如下: 1. 在Spring Boot项目添加gRPC的依赖,例如在pom.xml添加相关依赖。 2. 使用Protocol Buffers编写接口定义文件(.proto文件),定义服务和消息格式。 3. 使用gRPC编译器生成相应的Java代码。 4. 编写服务的实现类,实现生成的接口。 5. 在Spring Boot配置gRPC服务端和客户端的相关信息。 6. 启动Spring Boot应用程序。 通过上述步骤,就可以在Spring Boot实现基于gRPC的远程过程调用。通过gRPC,服务端和客户端可以直接调用对方提供的方法,以实现跨网络的通信。gRPC使用Protocol Buffers进行序列化和反序列化,提供了高效的通信方式。同时,通过Spring Boot的集成,开发者可以更方便地进行开发和部署。总之,Spring Boot MVC gRPC实现可以为开发者提供快速、高效地构建基于gRPC的微服务应用的能力。 ### 回答2: Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的配置和部署过程,并提供了大量的开箱即用的功能。而MVC(Model-View-Controller)是一种常用的软件设计模式,用于将应用程序的业务逻辑、数据和呈现逻辑分离。 gRPC是一种高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言。gRPC支持多种语言,包括Java和Spring Boot。使用gRPC,可以定义消息类型和服务接口,并生成用于客户端和服务器之间通信的代码。 在Spring Boot使用gRPC实现通常需要以下步骤: 1.定义gRPC服务接口:使用Protocol Buffers定义服务接口和消息类型,并生成相应的代码。 2.实现gRPC服务接口:在Spring Boot应用程序实现gRPC服务接口定义的方法。 3.配置gRPC服务器:在Spring Boot应用程序配置gRPC服务器,指定端口和服务实现类。 4.编写客户端代码:编写客户端代码以使用gRPC调用服务器端提供的服务。 使用gRPC的好处包括高性能、跨语言支持、自动化的代码生成等。在Spring Boot使用gRPC可以方便地将gRPC集成到现有的Spring应用程序,并利用Spring Boot提供的便利功能,如自动配置和部署。 总结:Spring Boot MVC和gRPC是两种不同的技术,分别用于构建Web应用程序和实现远程过程调用。在Spring Boot应用程序使用gRPC实现时,需要通过定义gRPC服务接口、实现服务接口方法、配置和启动gRPC服务器等步骤来集成gRPC。这样可以在Spring Boot应用程序使用gRPC高性能的远程过程调用功能。 ### 回答3: Spring Boot是一个基于Spring框架的快速开发框架,它简化了Spring的配置和部署过程。而MVC是Spring框架的一种设计模式,通过它可以将应用程序的不同部分进行解耦,使得每个部分可以独立开发、测试和部署。 gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用Google Protocol Buffers作为接口定义语言,并支持多种编程语言。通过gRPC,我们可以轻松地定义RPC服务,然后使用自动生成的客户端和服务端代码进行通信。 在Spring Boot集成MVC和gRPC可以实现两者的优势互补。我们可以使用Spring MVC来处理HTTP请求,同时使用gRPC来处理RPC请求。这样一来,我们就可以使用Spring Boot的自动配置和注解来简化开发,同时利用gRPC的高效性能和跨语言能力。 首先,我们需要在Spring Boot项目引入gRPC的依赖。然后,我们可以定义gRPC的服务接口和实现类,就像定义普通的Java接口和实现类一样。接着,我们可以使用gRPC的注解来定义服务的类型、方法、输入参数和返回值。同时,我们也可以在服务实现类编写具体的逻辑代码。 在Spring MVC,我们可以使用@RestController注解来定义HTTP接口,通过调用gRPC服务来处理请求。这样,我们就可以将HTTP请求转发到gRPC服务,从而实现在一个应用同时支持HTTP和RPC两种协议。 总之,通过Spring Boot集成MVC和gRPC,我们可以在一个应用同时支持HTTP和RPC协议,并可以充分利用两者的优势。这样,我们就可以更加方便地开发和部署分布式系统,提高系统的性能和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值