Springboot官网学习(7、Web应用程序【一 Spring Web MVC Application之@Controller和@RestController、Rest风格接口写法】)

众所周知,spring在后台web领域的霸主地位呆了很多年了,springmvc和spring的无缝整合让开发者减轻了很多负担,spring全家桶成为了web程序开发的必然之选。
那么今天我们就来学习一下springboot开发Web应用程序:

Spring Boot非常适合于Web应用程序开发。您可以使用嵌入式Tomcat,Jetty,Undertow或Netty创建独立的HTTP服务器。大多数Web应用程序都使用该spring-boot-starter-web模块来快速启动和运行。您还可以选择使用该spring-boot-starter-webflux模块来构建反应式Web应用程序

官方都说了,springboot非常适合开发web,那么我们就来学习一下web程序开发吧!(其实也是奔着web开发来学习的)

一、@Controller和@RestController

springmvc是一个丰富的“模型视图控制器” Web框架,他允许您创建特殊的@Controller或@RestControllerbean来处理传入的HTTP请求。控制器中的方法通过使用@RequestMapping注释映射到HTTP。
这几话使用过 mvc的都应该懂,下面贴一段:
@controller和@RestController区别

@RestController
@RequestMapping("my")
public class MyRestController {

    @RequestMapping("getStr")
    public String getStr(){
        return "str";
    }
}

@Controller
@RequestMapping("my")
public class MyController {

	@ResponseBody
    @RequestMapping("getStr")
    public String getStr(){
        return "str";
    }

}

看这两个类,他们的效果是一致的,他们的写法上区别是:
1、在类上面:注解不同,一个是@Controller,一个是@RestController
2、方法上面:在有@Contooler注解下面的方法上面多了一个@ResponseBody,而@RestController下面的没有这个注解

再看他们的注解源码:


public @interface Controller {
	@AliasFor(annotation = Component.class)
	String value() default "";
}


public @interface RestController {
    @org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Controller.class)
    java.lang.String value() default "";
}

@Controller注解其实就是一个和Component注解一样,springmvc会扫描当做bean处理。
@RestController 上面也打了一个注解@AliasFor(Controller.class)从这里看出,他们的本质都是一样的,都作为控制器上面的注解,
然后@RestController注解上面有这么一段注释
Types that carry this annotation are treated as controllers where

  • {@link RequestMapping @RequestMapping} methods assume
  • {@link ResponseBody @ResponseBody} semantics by default.
    根据我的野生英语加上编程经验读:
    带有@RestController注解的类,会被springmvc当做控制器来处理,如果类下面的方法上面带有@RequestMapping注解的方法,那么springmvc会默认的将其带上@ResponseBody注解,这样一看,就容易理解了吧;
    从他命名来看也能才出一半,REST应该就是RESTFULL的缩写,RESTFULL风格的地址,他推荐的是只返回数据,而不返回视图,所以他就把所有带@Request注解的方法下面都默认加上了@RequestBody注解了,这就回归到原来的样子了。
    结论:@RestController注解下面的方法中,带有@RequestMapping注解的方法springmvc都会默认加上@RequestBody注解
    这也是开发的一种思想吧,把大量重复的代码抽离出去。

二、REST风格的接口

上面提了一个rest,下面我们就来看看springmvc中如何使用rest风格的接口的使用吧

@RestController
@RequestMapping("users")
public class MyController {

    @RequestMapping(value="/{user}", method= RequestMethod.GET)
    public String getUser(@PathVariable int user) {
        // ...
    }

    @RequestMapping(value="/{id}/{status}", method= RequestMethod.GET)
    public String getUserById(@PathVariable("id") int id1, @PathVariable("status") int status1) {
        // ...
    }
    
	@RequestMapping(value="/{id}/{status}", method= RequestMethod.GET)
    public String getUserById(@PathVariable(value = "id") int id, @PathVariable(name = "status") int status) {
        // ...
    }

}

在spingmvc中,rest风格的接口写法/{user}:用大括号包起来一个变量名,那么springmvc在处理url的时候,就url对应位置的值绑定在方法的打有@PathVariable注解的参数上,

接口一:/{user}:
如果我们的请求地址为/users/1,那么他就会把1这个值传递给方法参数user,因为大括号里面的名称,和方法的参数名一致,所以他会自动绑定.

接口二:/{id}/{status}:
这个接口和第一个接口不同的是,url中大括号里面的值和方法参数名不一致了,这种情况下,如果我们不指定,程序他也不知道绑定给谁,所以@PathVariable注解提供了value和name属性,用于自定义绑定的url中大括号的名称;
比如地址为/users/1/2
那么id1的值就是1,status1的值就是2

接口二:/{id}/{status}:
和接口二一样,这里想说明的就是写name或者value都行,设计者可能就是要满足大多数人的习惯才设计出这种来的吧,
那么我们就看一下他的源码就知道了

	@AliasFor("name")
	String value() default "";

	/**
	 * The name of the path variable to bind to.
	 * @since 4.3.3
	 */
	@AliasFor("value")
	String name() default "";
	
	boolean required() default true;

这就理解了吧,相互别名,写谁都一样,看个人习惯了
他还有一个属性就是required,默认为true,也就是说可以传,可不传

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值