众所周知,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,也就是说可以传,可不传