SpringBoot入门(三)Controller

新建一个Controller类:

在这里插入图片描述

Controller的写法有两种:

1.@Controller+@RequestMapping+@ResponseBody方式:

1
2
3
4
5
6
7
8
9
10
java复制代码@Controller
public class TestController {

@RequestMapping(value = "/hello", method = RequestMethod.GET)
@ResponseBody
public String hello() {
return "Hello World!";
}

}

2.@RestController+@GetMapping(PostMapping、PutMapping…)方式:

1
2
3
4
5
6
7
8
9
java复制代码@RestController
public class TestController {

@GetMapping("/hello")
public String hello() {
return "Hello World!";
}

}

运行项目,在地址栏输入:http://localhost:8080/hello

得到结果:

在这里插入图片描述

可以每种方式都试一遍!

然后我们创建success.html文件,再来说他们的区别:

在这里插入图片描述
首先用第一种方式,添加success()方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
java复制代码@Controller
public class TestController {

@RequestMapping(value = "/hello",method = RequestMethod.GET)
@ResponseBody
public String hello() {
return "Hello World!";
}

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

}

浏览器访问:http://localhost:8080/success
在这里插入图片描述
报错,控制台信息:

1
powershell复制代码javax.servlet.ServletException: Circular view path [success]: would dispatch back to the current handler URL [/success] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

意思就是无法识别方法中返回的success,此时我们需要引入thymeleaf模板引擎,在pom.xml中引入:

1
2
3
4
xml复制代码<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

重启,再次打开http://localhost:8080/success

在这里插入图片描述

成功进入success.html!

关于thymeleaf作用,大家应该很容易猜到,不明白的可以去看下他的文档,很简单,springboot中常用,使用方法类似于Vue的v-xxx指令,或者微信小程序的wx:xxx指令,简单使用方法:

1
html复制代码<html xmlns:th="http://www.thymeleaf.org">
1
html复制代码<span th:text="${param.id}"></span>

我们在访问http://xxx?id=xxx时,就可以直接在通过上面的代码获取到id!

言归正传,继续说说Controller两种写法的区别:

如果使用 @Controller,那就必须指明方法中返回数据类型,如@ResponseBody,表明返回的是具体的数据如字符串,json等(如果我们直接返回一个对象,SpringBoot会自动为我们转成json格式),如上面的hello方法:

1
2
3
4
5
java复制代码 @RequestMapping(value = "/hello",method = RequestMethod.GET)
@ResponseBody
public String hello() {
return "Hello World!";
}

如果不指明,则代表返回的是一个网页路径,如上面的success方法:

1
2
3
4
java复制代码@RequestMapping(value = "/success",method = RequestMethod.GET)
public String success() {
return "success";
}

我们可以按着Ctrl鼠标点击return的”success”,会直接跳转到对应的success.html界面!

所以@Controller既可以返回指定数据格式数据,也可以返回具体网页路径!
@RestController则只能返回json等固定数据格式数据,不能再返回html,jsp页面等,因为它是@Controller+@ResponseBody的组合(可以点击@RestController注解进入内部查看),所以我们在为前端写接口时,就经常使用@RestController了!

我们在实际开发过程中,经常会划分业务模块,因为在书写Controller时,往往会为Controller里的所有方法定义一个父级RequestMapping来区分业务模块:

1
2
3
4
5
6
7
8
9
10
java复制代码@RestController
@RequestMapping("/test")
public class TestController {

@GetMapping("/hello")
public String hello() {
return "Hello World!";
}

}

浏览器访问:http://localhost:8080/test/hello

在这里插入图片描述

安卓或前端同学会深有感触了!

另外,我们往往也会为项目声明一个总的路径名,如:

1
xml复制代码server.servlet.context-path=/byl

那么此时,在访问时就需要加上该路径:http://localhost:8080/byl/test/hello

在这里插入图片描述

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%