SpringBoot项目中参数获取与响应
1. 程序结构&通信方式
程序结构:
C/S : 客户端/服务器端
-Main方法。
-效果炫目、数据相对安全。
-公司成本高,因为要分别开发客户端和服务器端。
B/S: 浏览器端/服务器端
-效果依赖于浏览器、数据相对不如C/S安全(token令牌模式)
-公司成本低,只需要单独开发服务器端。
资源信息:
资源:在网上能够访问的一切信息(文字、图片、音乐、视频...)
静态资源:代码不变、效果不变。
(HTML/CSS/JS/VUE...)
动态资源:效果改变根据代码控制。
(Java、servlet...)
通信方式:
WEB程序:请求和响应模式。
-浏览器向服务器发信息: 发请求
-服务器向浏览器发信息:发响应
请求-响应是成对出现的。
-先有请求,再有响应。
-必须是 浏览器先向服务器发请求,服务器收到请求后,才能向浏览器发响应。
2. 创建和浏览器交互的控制器-controller
- 包创建:
- Java程序(Java类)创建:
新建名为---MyController的class类
在MyController中输入
java
@RestController //标记当前Java类,是一个可以和浏览器进行数据交换的控制器
@RequestMapping("/my") //给该控制器设置一个访问路径,该路径是可以在浏览器上进行访问的
public class MyController {
@RequestMapping("/t1")//给该方法设置一个访问路径,该路径是可以在浏览器上进行访问的
public String t1(){
System.out.println("helloWorld!!!");//在控制台打印信息
return "你好世界!!!";//将信息发给浏览器,让浏览器展示
}
}
程序运行的访问路径:http://localhost:8080/my/t1
问题解释
-
SpringBoot启动和关闭
启动:
关闭:
任意按下一个小红方块均可关闭SpringBoot项目
关闭之后,刷新网页,不再出现运行SpringBoot项目时显示的页面
-
代码编写的注意事项
- 如果更新了代码,怎么办?
先正常关闭服务器,再重新正常启动服务器,代码执行的就是最新代码了。
3. 单参数获取
bash
传统风格:
http://主机名:端口/资源?参数列表
例如:http://localhost:8080/my/t1?userName=aa&sex=man&hobbies=code&hobbies=swim
- 必须传递参数
@RequestParam("参数名") 参数类型 参数名
例如:如果忘记传递sex这个参数,浏览器就会报错
bash
- 非必须传递参数
@RequestParam(value="参数名",required=false) 参数类型 参数名
设置为非必须传递参数,如果参数正常传递,可以接收,如果参数未传递,返回为null
例如:
java
@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));
}
java
@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));
}
bash
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
java
@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
4. 多参数获取(JavaBean/Map数据)
4.1. Swagger2
postman经典测试工具
Swagger2集成到项目中,比postman更加方便测试工具。
- 环境搭建:
在pom.xml中添加maven环境---再点击更新maven环境
java
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
添加注解
-
使用入口:
8080是端口号 -
使用操作:
POST请求居多,少量的GET请求JavaBean:
进行数据封装:
属性名 = 属性值;
userName = 张三;
hobbies = 编程,游泳;
创建TestBean1类
java
@Data
public class TestBean1 {
private String name;
private String sex;
private String[] hobbies;
}
java
@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:
创建出来,封装数据。
java
@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")));
}
4.2. application/x-www-form-urlencoded格式
Swagger测试同步会导致复选框用hobbies=a1|a2格式,导致服务器解析失败。
普通数据
接收请求:直接在controller方法参数列表上写 JavaBean或map
格式1:(建议)
public 返回值类型 方法名(JavaBean javaBean){
}
格式2:(不建议)
public 返回值类型 方法名(Map<String,Object> map){
}
java
@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
}
4.3. application/json格式
-
json数据接收请求:
@RequestBody JavaBean javaBean
@RequestBody Map<String,Object> map
java
@RequestMapping("/t9")
public void t9(@RequestBody TestBean1 testBean1){
System.out.println(testBean1);
System.out.println(testBean1.getName());
}
java
@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
-
json数据发送响应
@ResponseBody JavaBean
@ResponseBody Map<String,Object>
java
@RequestMapping("/t11")
public @ResponseBody TestBean1 t11(){
TestBean1 tb1 = new TestBean1();
tb1.setName("小张");
tb1.setSex("男");
String[] hobbies = {"编程","游泳"};
tb1.setHobbies(hobbies);
return tb1;
}
java
@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