SpringBoot如何使用Controller呢?

戚薇 SpringBoot 发布时间:2023-06-23 20:13:45 阅读数:4752 1
下文笔者讲述SpringBoot中使用Controller的方法分享,如下所示
学完本篇之后,你将掌握SpringBoot中Controller的用法

SpringBoot中使用Controller的实现思路

SpringBoot中使用@Controller和@RestController注解

@Controller和@RestController注解的功能

用于标注类为controller
  @Controller标记的类默认返回视图
  @RestController标记的类返回的是数据(字符串,json数据等等)
  @RestController注解是@Controller注解和@ResponseBody注解的组合
 

@RequestMapping()注解的功能

@RequestMapping()注解的功能:
    用于设置请求路径的映射
    可使用在类或方法上
	(控制在整个类的作用域或方法的作用域
     例:
	 可以为类中的方法设置一个总的父级路径)

@RequestMapping()注解可设置参数

consumes:
  设定Content-Type缩小请求范围
    只处理指定content-type的请求
     可直接使用字符串或数组或MediaType定义好的类型
      也支持“*”通配符匹配
	   (例:
	      consumes = "text/plain"、
		  consumes = {"text/plain", "application/*"}、
		  consumes = MediaType.IMAGE_JPEG_VALUE)
     可使用“!”进行否定指定该类型之外(consumes = "!text/plain")
	 该参数可以用在类和方法上,并且方法上的会覆盖类上的设定;

headers:
     设定header缩小请求范围
     可指定header(headers = "My-Header=myValue")
      也使用“!=”指定排除(headers = "My-Header!=myValue")
	  也可以不设置值指定必须拥有该名称的header(headers = "My-Header")
       或使用“!”指定不能有该名称的header(headers = "!My-Header")
	   也支持“*”通配符(headers = "content-type=text/*")
       也可以配置多个header(headers = {"myheader1=abc", "!myheader2"})
     该参数可以用在类和方法上
     当用在类上时,所有方法都继承该参数,即在运行方法前先验证类上的header限制

method:
    设定http请求的方法缩小请求范围
    支持:
	   GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE
       该参数可以用在类和方法上
       当用在类上时
         所有方法都继承该参数
         运行方法前先验证类上的method

name:
    为映射分配一个名字
	 该参数可以用在类和方法上
        当类和方法都使用name时
        组合名字是使用“#”连接起来

params:
    设定请求的参数缩小请求范围
      参数跟headers的设置类似
      也支持“a=1”、“a!=1”、“a”、“!a”
    该参数可以用在类和方法上
    当用在类上时
     所有方法继承该参数
     在运行方法前先验证类上的params限制

path:
    映射路径(等同value参数)
    支持Ant-style格式通配符
	   (?匹配任何单字符、*匹配0或任意数量的字符、
	     **匹配0或任意数量的目录)
	 在方法上也支持相对类中path的路径
       也支持使用占位符("/{my_path}")
     支持配置多个路径(path = {"/abc", "/def"})
     该参数可放在类和方法上
     当用在类上时
       所有方法继承该path
       没有显式配置路径映射方法的都会映射到空路径;

produces:
     设置媒体类型
       可以设置多个
        其中一个必须配合请求里的可接受的媒体类型
        通常是从Accept标头里提取的;
	  如果媒体类型带有参数(像“charset=UTF-8”)
	    且请求里的媒体类型也带有参数
        则参数的值必须匹配
        也可以使用“!”匹配指定媒体类型之外的其他所有Accept配置类型的请求
     该参数可以用在类和方法上,且方法级的会覆盖掉类级

value:
     path的别名
     @RequestMapping("/test")和@RequestMapping(path = "/test")效果相同

还有其他注解
   @GetMapping、@PostMapping、@DeleteMapping、@PatchMapping、@PutMapping
   只接受指定method的请求 其注解通@RequestMapping加method参数
    其它的参数跟@RequestMapping的基本一致;
//当一个方法上使用两个注解  
   @RequestMapping("/abc")和@PostMapping("/abc")时
    此时"/abc"的post请求被分到第二个上
    其他method的请求分到第一个

============================================================
@PostMapping(value = "/aaa", params = "a")和@PostMapping(value = "/aaa", params = "b")并存时
  带参数a的运行第一个
  带参数b的运行第二个
如果post请求里既有a又有b参数时,此时请求的时会报异常

controller之参数注解

@RequestParam

此注解的功能:
  可接收请求地址里?后面用&连接的参数
  可以接收post的form表单数据(通常content-type为multipart/form-data)
也可以接收浏览器原生form表单数据(content-type为application/x-www-form-urlencoded,数据按照key=val&key=val编码,并进行URL转码)

@RequestParam可设置参数

defaultValue:
   当未提供参数或者参数为空时,设置一个默认值,当提供默认值时会默认required为false;
name:
  给参数绑定一个名字;(等同value)
required:
  设置参数是否是必须,默认true(不传递参数会异常);如果参数非必须可设置为false,或者提供一个defaultValue;
value:
  name的别名;
  该注解通常可以省略,通常用于参数名不一致、需要默认值、必传的时候;
  参数可以一个一个独立的写
   也可以封装到一个Bean对象里(get和set方法)
   bean也可以跟独立的参数同时支持
   bean里的参数名也可以跟独立的参数同名,都能读取到值
   也可以同名不同类型(例bean里a的是int,独立的a参数也可以是String)
 
@RequestParam
   form表单也可以用来接收文件
   使用MultipartFile类可以接收文件;
例:Controller的示例
@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";
}

Controller其他注解

@RequestBody

用于接收post请求体的数据,一般是json数据,也可以是字符串或数值;

@RequestBody可设置的参数

required:
  设置body内容是否是必须
   默认true(不传递body会异常)
  如果想要body为空时传递null,则设该值为false;

@RequestBody只能有一个
   通常接收json数据使用自定义类
    将各个字段放到一个类中
   字段属性使用@JsonProperty注释或使用getter()setter()
   如果是内部类也需要static class;

关于@JsonProperty可设置的项:
	access:
	  可选属性
     用于改变访问器(getter)和构造器(构造函数里、setter)的可见性
      或
	 由其他私有或者其他可见性控制(例private getter)
     默认Access.AUTO完全由其他可见性和注解控制;
	   可用的值:
	   Access.AUTO、Access.READ_ONLY、Access.READ_WRITE、Access.WRITE_ONLY;
	defaultValue:
	   设置默认值;
	index:
	   设置属性的数值索引,使用二进制表示,可能用于其他语言或者工具;
	required:
	   设置属性是否必须,默认false,只用于创建属性的时候验证,对于其他setter等方式不验证;
	value:
	  设置属性的名字,默认值为“”,将尝试使用注释的属性名
       (构造方法没有默认属性名可用,空字符串是非法的值)

@PathVariable
    用于获取url地址里的参数
    通@RequestMapping设置的路径里的{}搭配使用;

@PathVarialbe可设置的参数:
	name:
	   为路径参数绑定一个名字
	     (对应路径url里{}里的名字)
		 (等同value)
	required:
	   设置路径参数是否必须
        默认true(不传递路径参数会异常)
    如果希望没有路径参数时传递null则可以设置为false
	value:name别名 

@RequestHeader
   用于获取请求的header 

@RequestHeader可设置的参数:
	defaultValue:
	   设置默认header的值,设置会将required默认为false;
	name:
	   设置header的名字;
	required:
	   设置header是否必须,默认true;
	value:
	   name别名;

@CookieValue
    用于获取cookie值;

@CookieValue可设置的参数:
	defaultValue:
	   设置默认cookie值,设置会将required默认为false;
	name:
	   设定绑定cookie的名字;
	required:
	   设置cookie是否必须,默认true;
	value:
	   name别名; 

关于返回值

可以返回任意数据
   也可以不返回数据
    可以返回字符串,数值,集合,对象等可序列化的值
     复杂类型的返回值会被转换成json数据返回;

返回自定义的对象
    类里的属性需要至少有一个是可公开可访问的,没有可访问属性会报错
     需要序列化返回给调用接口的属性可以使用public修饰属性
       或
	 使用public的getter方法
       或
     使用@JsonProperty标签里的access控制(可以用默认的AUTO或者READ_ONLY、READ_WRITE都可)
配置文件test5.properties:

server.port=8899
server.servlet.context-path=/test5controller
 
result.ok=success
启动类:


package testspringboot.test5controller;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
 

@SpringBootApplication
@PropertySource("test5.properties")
public class Test5Main {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SpringApplication.run(Test5Main.class, args);
	}
}

//controller类

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;
 
@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<String, String> test3(@RequestParam("Name") String name, @RequestParam("No") String no) {
		System.out.println(String.format("Name=%s,No=%s", name, no));
		Map<String, String> 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);
	}
}

package testspringboot.test5controller;
 
public class MyParams {
 
	public String stringParam;
	public int intParam;
	@Override
	public String toString() {
		return "MyParams [stringParam=" + stringParam + ", intParam=" + intParam + "]";
	}	
}

package testspringboot.test5controller;
public class MyResult {
	public long code;
	public String description;
	public MyResult(long code, String description) {
		super();
		this.code = code;
		this.description = description;
	}
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202306/6866.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者