11. SpringBoot项目中参数获取与响应

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

问题解释

  1. SpringBoot启动和关闭

    启动:

    关闭:

    任意按下一个小红方块均可关闭SpringBoot项目

    关闭之后,刷新网页,不再出现运行SpringBoot项目时显示的页面

  2. 代码编写的注意事项

  1. 如果更新了代码,怎么办?
    先正常关闭服务器,再重新正常启动服务器,代码执行的就是最新代码了。

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是端口号

    http://localhost:8080/swagger-ui/index.html

  • 使用操作:

    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
相关推荐
张某布响丸辣9 分钟前
SQL中的时间类型:深入解析与应用
java·数据库·sql·mysql·oracle
大懒的猫猫虫10 分钟前
Upload-Labs-Linux1学习笔迹 (图文介绍)
学习
zhy81030213 分钟前
Node-RED - 编辑器添加用户认证
编辑器
喜欢打篮球的普通人14 分钟前
rust模式和匹配
java·算法·rust
java小吕布27 分钟前
Java中的排序算法:探索与比较
java·后端·算法·排序算法
慢生活的人。33 分钟前
SpringSecurity+jwt+captcha登录认证授权总结
java·认证·rbac·权限·验证
ctrey_36 分钟前
2024-11-13 学习人工智能的Day26 sklearn(2)
人工智能·学习·sklearn
Goboy1 小时前
工欲善其事,必先利其器;小白入门Hadoop必备过程
后端·程序员
向阳12181 小时前
LeetCode40:组合总和II
java·算法·leetcode