这两个都是用来标注类为controller的,不同之处在于@Controller标记的类默认返回视图,@RestController标记的类返回的是数据(字符串,json数据等等),之前为了达到@RestController的效果,需要在@Controller标记的类中使用@ResponseBody标签(@RestController = @Controller + @ResponseBody),@ResponseBody可以加在类或者方法上(指定全类或者某个方法返回数据);
@RequestMapping()用于指定请求路径的映射,可以使用在类或者方法上(控制在整个类的作用域或者方法的作用域,例如可以为类中的方法设置一个总的父级路径);
@RequestMapping()注解可设置的参数:
还有一些特定方法的专用的映射:@GetMapping、@PostMapping、@DeleteMapping、@PatchMapping、@PutMapping,只接受指定method的请求,相当于@RequestMapping加method参数,其他的参数跟@RequestMapping的基本一致;
另外要注意路径映射的唯一性,例如:不能出现两个完全一样的@PostMapping("/abc"),但可以出现@RequestMapping("/abc")和@PostMapping("/abc")并存的情况,这时"/abc"的post请求被分到第二个上,其他method的请求分到第一个;@PostMapping(value = "/aaa", params = "a")和@PostMapping(value = "/aaa", params = "b")也可以共存,带参数a的执行第一个,带参数b的执行第二个,但是如果post请求里既有a又有b参数则会造成歧义返回错误;很多情况下启动时不会报异常,只在请求的时候异常;
controller方法的参数有使用注解和不使用注解两种方式,可用的注解:
该注解可以接收请求地址里?后面用&连接的参数,可以接收post的form表单数据(通常content-type为multipart/form-data),也可以接收浏览器原生form表单数据(content-type为application/x-www-form-urlencoded,数据按照key=val&key=val编码,并进行URL转码);
@RequestParam可设置的参数:
该注解通常可以省略,通常用于参数名不一致、需要默认值、必传的时候;
参数可以一个一个独立的写,也可以封装到一个Bean对象里(get和set方法),另外bean也可以跟独立的参数同时支持,bean里的参数名也可以跟独立的参数同名,都能读取到值,也可以同名不同类型(例如bean里a的是int,独立的a参数也可以是String);如果是内部类的bean主要是static的;
关于参数类型,一般用String接收,有时也可以用数值,用数值时要确保传来的值能转换成数值(传来的都是String,会自动转对应数值类型),对于String类型的参数会将能读取到的3处的值合并在一起,中间用逗号隔开,对于数值类型只会读取最优先的一个;三种数据来源的读取优先顺序:form-data > 请求地址里?后的 > x-www-form-urlencoded;
@RequestParam的form表单也可以用来接收文件,利用MultipartFile类可以接收文件;
接收文件的Demo:
- @RequestMapping("/aaa")
- public String a(@RequestParam MultipartFile myfile) {
- String filename = myfile.getOriginalFilename();
- System.out.println(filename);
- File dest = new File(filename);
- try {
- Files.write(dest.toPath(), myfile.getBytes());
- } catch (IOException e) {
- e.printStackTrace();
- }
- return "ABC";
- }
测试结果:



通常用于接收post请求体的数据,一般是json数据,也可以是字符串或数值;
@RequestBody可设置的参数:
@RequestBody只能有一个,通常接收json数据使用自定义类,将各个字段放到一个类中,字段属性使用@JsonProperty注释或者使用getter()setter(),如果是内部类也需要static class;
关于@JsonProperty可设置的项:
用于获取url地址里的参数,跟@RequestMapping设置的路径里的{}搭配使用;
@PathVarialbe可设置的参数:
用于获取请求的header;
@RequestHeader可设置的参数:
用于获取cookie值;
@CookieValue可设置的参数:
另外,注解可以一同使用,用来同时读取请求地址上的路径参数、地址?后的参数、消息体的内容、header、cookie等等;
可以返回任意数据,也可以不返回数据;可以返回字符串,数值,集合,对象等可序列化的值,复杂类型的返回值会被转换成json数据返回;
返回自定义的对象,类里的属性需要至少有一个是可公开可访问的,没有可访问属性会报错;需要序列化返回给调用接口的属性可以使用public修饰属性,或者使用public的getter方法,或者使用@JsonProperty标签里的access控制(可以用默认的AUTO或者READ_ONLY、READ_WRITE都可),其他没有修饰的属性不会返回;
测试Demo:
配置文件test5.properties:
- server.port=8899
- server.servlet.context-path=/test5controller
-
- result.ok=okay
启动类:
- /**
- * 2022年11月3日上午10:57:27
- */
- package testspringboot.test5controller;
-
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.context.annotation.PropertySource;
-
- /**
- * @author XWF
- *
- */
- @SpringBootApplication
- @PropertySource("test5.properties")
- public class Test5Main {
-
- /**
- * @param args
- */
- public static void main(String[] args) {
- SpringApplication.run(Test5Main.class, args);
- }
-
- }
controller类:
- /**
- * 2022年11月3日上午11:02:28
- */
- package testspringboot.test5controller;
-
- import java.util.HashMap;
- import java.util.Map;
-
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
-
- import com.fasterxml.jackson.annotation.JsonProperty;
-
- import testspringboot.test.MyParams;
- import testspringboot.test.MyResult;
-
- /**
- * @author XWF
- *
- */
- @RestController
- @RequestMapping(value = "/myController")
- public class MyController {
-
- @Value(value = "${result.ok}")
- private String ok;
-
- //处理/和/test0两个请求,并指定必须为PUT请求,并且参数必须有a不能有b,参数c必须为C,参数d不能为D或者不存在d
- @RequestMapping(value = {"/", "/test0"}, method = RequestMethod.PUT, params = {"a", "!b", "c=C", "d!=D"})
- public void test0(@RequestParam String a, @RequestParam(required = false) String d ) {//有@RequestParam String d则必须要有d参数,可以用required设置非必须
- System.out.println("a=" + a);
- System.out.println("d=" + d);
- }
-
- @RequestMapping(value = "/test1/{x1}/{x2}")
- public String test1(@PathVariable String x1, @PathVariable String x2) {
- System.out.println("x1=" + x1);
- System.out.println("x2=" + x2);
- return "test1 ok";
- }
-
- //处理get请求
- @GetMapping(value = "/test2{num}")
- public int test2(@PathVariable("num") int x) {
- System.out.println("x=" + x);
- return x;
- }
-
- //处理post请求
- @PostMapping(value = "/test3/form")
- public Map
test3(@RequestParam("Name") String name, @RequestParam("No") String no) { - System.out.println(String.format("Name=%s,No=%s", name, no));
- Map
m = new HashMap<>(); - m.put("K1", name.toUpperCase());
- m.put("K2", no.toUpperCase());
- return m;
- }
-
- @PostMapping(value = "/test4")
- public Result test4(@RequestBody Params params) {
- System.out.println("params=" + params);
- return new Result(100, "Finished");
- }
-
- static class Params{//内部类参数需要指定static
- @JsonProperty("name")//指定json字段
- String name;
- @JsonProperty("age")
- int age;
- public Params() {//内部类参数需要构造方法
- ;
- }
- @Override
- public String toString() {
- return "Params [name=" + name + ", age=" + age + "]";
- }
- }
-
- class Result{
- @JsonProperty("ResultCode")
- int code;
- @JsonProperty("CodeDescription")
- String desc;
- public Result(int code, String desc) {
- super();
- this.code = code;
- this.desc = desc;
- }
- }
-
- @PostMapping(value = "/test5")
- public MyResult test5(@RequestBody MyParams p) {
- System.out.println("MyParams=" + p);
- return new MyResult(200, ok);
- }
- }
- /**
- * 2022年11月3日上午11:24:23
- */
- package testspringboot.test5controller;
-
- /**
- * @author XWF
- *
- */
- public class MyParams {
-
- public String stringParam;
- public int intParam;
- @Override
- public String toString() {
- return "MyParams [stringParam=" + stringParam + ", intParam=" + intParam + "]";
- }
-
- }
- /**
- * 2022年11月3日上午11:24:32
- */
- package testspringboot.test5controller;
-
- /**
- * @author XWF
- *
- */
- public class MyResult {
-
- public long code;
- public String description;
- public MyResult(long code, String description) {
- super();
- this.code = code;
- this.description = description;
- }
-
- }
测试结果:
test0






test1


test2


test3


test4


test5

