JavaWeb笔记_05

1. SpringBootWeb请求响应

1.1 Postman
  • Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。

    Postman原是Chrome浏览器的插件,可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求

    使用Postman还可以在发起请求时,携带一些请求参数、请求头等信息

  • 作用:常用于进行接口测试

1.2 简单参数
  • 简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
  • 原始方式获取参数(略)
  • SpringBoot方式
    • 直接将请求参数名写进形参
@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=张衰彪&age=666

	//形参名和请求参数名保持一致
    @RequestMapping("/simpleParam")
    public String simpleParam(String name , Integer age ){
        System.out.println(name+"  :  "+age);
        return "OK";
    }
}
1.2.1 参数名不一致
  • 参数名不一致时,因参数名不匹配,所以值为null
  • 解决方案:使用Spring提供的@RequestParam注解完成映射
    • 在方法形参前面加上 @RequestParam 然后通过value属性执行请求参数名,从而完成映射
@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=张衰彪&age=666

    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam("name") String username , Integer age ){
        System.out.println(username+"  :  "+age);
        return "OK";
    }
}

注意事项:@RequestParam中的required属性默认为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错

1.3 实体参数
  • 当传递参数很多时,一个一个写参数会很繁琐,我们可以将请求参数封装到一个实体对象中

要想完成数据封装,请求参数名必须与实体类的属性名相同,否则其属性值为null

1.3.1 简单实体对象
  1. 定义实体对象
public class User {
    private String name;
    private Integer age;
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public Integer getAge() {return age;}
    public void setAge(Integer age) {this.age = age;}
    @Override
    public String toString() {return "User{" + "name='" + name + '\'' + ", age=" + age +'}';
    }
}
  1. 定义Controller方法
@RestController
public class RequestController {
    //实体参数:简单实体对象
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        System.out.println(user);
        return "OK";
    }
}
1.3.2 复杂实体对象
  • 套娃的实体类,(实体类中包含实体类属性)
  1. 定义实体类
  • Address 实体类
public class Address {
    private String province;
    private String city;
    getter/setter...
    }
  • User实体类
public class User {
    private String name;
    private Integer age;
    private Address address;
    getter/setter...
    }
  1. 定义Controller方法
@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=张衰彪&age=666&address.province="小韩"&address.city="尔首"
    //实体参数:复杂实体对象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "OK";
    }
}
1.4 数组集合参数
  • 用来收集表单中支持多选项的(复选框)同名的多个值
1.4.1 数组
  • 数组参数:请求参数名与形参数组名称相同,定义数组类型形参即可接收参数
@RestController
public class RequestController {
	//http://localhost:8080/arrayParam?hobby=game&hobby=java
    //数组集合参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }
}
1.4.2 集合
  • 集合参数:请求参数名与形参集合对象名相同,y用@RequestParam 绑定参数关系
@RestController
public class RequestController {
    //数组集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }
}
1.5 日期参数
  • 需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式后,方可传参
@RestController
public class RequestController {
    //日期时间参数
   @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "OK";
    }
}
1.6 JSON参数
  • JSON在前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。 (JSON是开发中最常用的前后端数据交互方式)

服务端Controller方法接收JSON格式数据:

  • 传递json格式的参数,在Controller中会使用实体类进行封装。
  • 封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。
  • JSON数据如下
[
	{
		"name":"张衰彪",
		"age":666,
		"address":{
			"province":"小韩",
			"city":"尔首"
		}
	}
]
@RestController
public class RequestController {
    //JSON参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }
}
1.7 路径参数
  • 在现在的开发中,经常还会直接在请求的URL中传递参数
http://localhost:8080/user/1		
http://localhost:880/user/1/张衰彪

以上路径中,尾部数字既是路径也是参数

  • 后端接受路径参数时,使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数,当路径参数有多个时,使用多个{…}来标识该路径参数
@RestController
public class RequestController {
    //路径参数
    @RequestMapping("/path/{id}/{name}")
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "OK";
    }
}

2. 响应

  • 从后端将数据返回给前端
2.1 @ResponseBody
  • 当我们需要将方法中处理好的数据通过return返回给前端时,将@ResponseBody注解书写在Controller方法上或类上即可

@RequestMapping注解是一个组合注解
@RestController = @Controller + @ResponseBody
在类上添加@RestController就相当于添加了@ResponseBody注解


方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器

2.2 统一响应结果
  • 上述方法的返回值五花八门,如果我们开发一个大型项目,项目中controller方法将成千上万,使用上述方式将造成整个项目难以维护
  • 在真实的项目开发中,无论是哪种方法,我们都会定义一个统一的返回结果
  • 解决方法:将返回值定义为一个实体类,规定返回数据的格式

统一的返回结果使用类来描述,在这个结果中包含:

  • 响应状态码:当前请求是成功,还是失败

  • 状态码信息:给页面的提示信息

  • 返回的数据:给前端响应的数据(字符串、对象、集合)
    代码如下

public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应码 描述字符串
    private Object data; //返回的数据

    public Result() { }
    public Result(Integer code, String msg, Object data) { this.code = code;this.msg = msg;  this.data = data; }

    public Integer getCode() {  return code;  }

    public void setCode(Integer code) {  this.code = code;  }

    public String getMsg() {   return msg;  }

    public void setMsg(String msg) {  this.msg = msg; }

    public Object getData() {  return data;  }

    public void setData(Object data) {  this.data = data; }

    //增删改 成功响应(不需要给前端返回数据)
    public static Result success(){ return new Result(1,"success",null); }
    //查询 成功响应(把查询结果做为返回数据响应给前端)
    public static Result success(Object data){ return new Result(1,"success",data); }
    //失败响应
    public static Result error(String msg){ return new Result(0,msg,null);  }
}

3. 分层解耦

3.1 三层架构

在我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。

单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。

这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利用后期的维护。

  • 三层架构分别为
    在这里插入图片描述
  • Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
  • Service:业务逻辑层。处理具体的业务逻辑。
  • Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值