SpringBoot项目中参数获取与响应
程序结构:
C/S : 客户端/服务器端
-Main方法。
-效果炫目、数据相对安全。
-公司成本高,因为要分别开发客户端和服务器端。B/S: 浏览器端/服务器端
-效果依赖于浏览器、数据相对不如C/S安全(token令牌模式)
-公司成本低,只需要单独开发服务器端。
资源信息:
资源:在网上能够访问的一切信息(文字、图片、音乐、视频…)
静态资源:代码不变、效果不变。
(HTML/CSS/JS/VUE…)动态资源:效果改变根据代码控制。
(Java、servlet…)
通信方式:
WEB程序:请求和响应模式。
-浏览器向服务器发信息: 发请求
-服务器向浏览器发信息:发响应请求-响应是成对出现的。
-先有请求,再有响应。
-必须是 浏览器先向服务器发请求,服务器收到请求后,才能向浏览器发响应。
新建名为—MyController的class类
在MyController中输入
@RestController //标记当前Java类,是一个可以和浏览器进行数据交换的控制器
@RequestMapping("/my") //给该控制器设置一个访问路径,该路径是可以在浏览器上进行访问的
public class MyController {
@RequestMapping("/t1")//给该方法设置一个访问路径,该路径是可以在浏览器上进行访问的
public String t1(){
System.out.println("helloWorld!!!");//在控制台打印信息
return "你好世界!!!";//将信息发给浏览器,让浏览器展示
}
}
程序运行的访问路径:http://localhost:8080/my/t1
传统风格:
http://主机名:端口/资源?参数列表
例如:http://localhost:8080/my/t1?userName=aa&sex=man&hobbies=code&hobbies=swim
- 必须传递参数
@RequestParam("参数名") 参数类型 参数名
- 非必须传递参数
@RequestParam(value="参数名",required=false) 参数类型 参数名
设置为非必须传递参数,如果参数正常传递,可以接收,如果参数未传递,返回为null
例如:
@RequestMapping("/t2")
public void t2(
@RequestParam("userName")String userName,
@RequestParam("sex")String sex,
@RequestParam("hobbies")String[] hobbies
){
//http://localhost:8080/my/t2?userName=aa&sex=man&hobbies=code&hobbies=swim
System.out.println(userName);
System.out.println(sex);
System.out.println(Arrays.toString(hobbies));
}
@RequestMapping("/t3")
public void t3(
@RequestParam("userName")String userName,
@RequestParam(value="sex",required = false)String sex,
@RequestParam("hobbies")String[] hobbies
){
//http://localhost:8080/my/t3/userName=aa&sex=man&hobbies=code&hobbies=swim
//http://localhost:8080/my/t3?userName=aa&hobbies=code&hobbies=swim
System.out.println(userName);
System.out.println(sex);
System.out.println(Arrays.toString(hobbies));
}
RESTFul风格:
http://主机名:端口/资源/参数列表
例如:http://localhost:8080/my/t1/aa/man/code,swim
@PathVariable("参数名") 参数类型 参数名
@RequestMapping("/资源名/{参数名1}/{参数名2}")
例如:http://localhost:8080/my/t1/aa/man/code,swim
@RequestMapping("/t1/{userName}/{sex}/{hobbies}")
@PathVariable("userName") String userName
@RequestMapping("/t4/{userName}/{sex}/{hobbies}")
public void t4(
@PathVariable("userName") String userName,
@PathVariable("sex")String sex,
@PathVariable("hobbies")String[] hobbies
){
//http://localhost:8080/my/t4/aa/man/code,swim
System.out.println(userName);
System.out.println(sex);
System.out.println(Arrays.toString(hobbies));
}
小结: 传统方式:@RequestParam
RESTFul风格:@PathVariable
postman经典测试工具
Swagger2集成到项目中,比postman更加方便测试工具。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
http://localhost:8080/swagger-ui/index.html
JavaBean:
进行数据封装:
属性名 = 属性值;
userName = 张三;
hobbies = 编程,游泳;
创建TestBean1类
@Data
public class TestBean1 {
private String name;
private String sex;
private String[] hobbies;
}
@RequestMapping("/t5")
public void t5(){
//ctrl+alt+v
TestBean1 tb1 = new TestBean1();
tb1.setName("小张");
tb1.setSex("男");
String[] hobbies = {"编程","游泳"};
tb1.setHobbies(hobbies);
System.out.println(tb1);//查看所有属性值
System.out.println(tb1.getName());//小张
}
Map:
创建出来,封装数据。
@RequestMapping("/t6")
public void t6(){
//key:String类型 value:任意类型
Map<String, Object> map1 = new HashMap<>();
map1.put("name","小张");
map1.put("sex","男");
String[] hobbies = {"编程","游泳"};
map1.put("hobbies",hobbies);
System.out.println(map1);//查看所有属性值
System.out.println(map1.get("name"));//小张
System.out.println(Arrays.toString((Object[]) map1.get("hobbies")));
}
Swagger测试同步会导致复选框用hobbies=a1|a2格式,导致服务器解析失败。
普通数据
接收请求:直接在controller方法参数列表上写 JavaBean或map
格式1:(建议)
public 返回值类型 方法名(JavaBean javaBean){
}
格式2:(不建议)
public 返回值类型 方法名(Map map){
}
@RequestMapping("/t7")
public void t7(TestBean1 testBean1){
//http://localhost:8080/my/t7?name=%E5%B0%8F%E5%BC%A0&sex=man&hobbies=code&hobbies=swim
System.out.println(testBean1);
System.out.println(testBean1.getName());
}
@RequestMapping("/t8")
public void t8(Map<String,Object> map){
//http://localhost:8080/my/t8?name=%E5%B0%8F%E5%BC%A0&sex=man&hobbies=code&hobbies=swim
System.out.println(map);//{}
System.out.println(map.get("name"));//null
System.out.println(Arrays.toString((Object[]) map.get("hobbies")));//null
}
@RequestBody JavaBean javaBean
@RequestBody Map map
@RequestMapping("/t9")
public void t9(@RequestBody TestBean1 testBean1){
System.out.println(testBean1);
System.out.println(testBean1.getName());
}
@RequestMapping("/t10")
public void t10(@RequestBody Map<String,Object> map){
System.out.println(map);//{hobbies=[游泳, 编程], name=小张, sex=男}
System.out.println(map.get("name"));//小张
}
小结:如果接收json请求数据,若只是接收并使用一次,用map.
如果多个方法中都有接收和使用,用JavaBean
@ResponseBody JavaBean
@ResponseBody Map
@RequestMapping("/t11")
public @ResponseBody TestBean1 t11(){
TestBean1 tb1 = new TestBean1();
tb1.setName("小张");
tb1.setSex("男");
String[] hobbies = {"编程","游泳"};
tb1.setHobbies(hobbies);
return tb1;
}
@RequestMapping("/t12")
public @ResponseBody Map<String, Object> t12(){
Map<String, Object> map1 = new HashMap<>();
map1.put("name","小张");
map1.put("sex","男");
String[] hobbies = {"编程","游泳"};
map1.put("hobbies",hobbies);
return map1;
}
小结:如果发送json响应数据,若只是响应并使用一次,用map.
如果多个方法中都有响应和使用,用JavaBean