0


黑马2023Javaweb (5)|请求响应 & 分层解耦(Postman、三层架构、IOC、DI、注解)

目录


浏览器(带参数数据)请求web服务器,web服务器通过匹配请求路径,获得数据,并做出响应。该响应在浏览器中展示

问题一:数据如何从浏览器到服务器(请求:实体/简单/路径/数组/JSON/时间参数)

问题二:数据如何从服务器到浏览器(响应)---统一响应结果格式---实现接口(功能)

接口:****请求路径,响应数据,接收参数

1bd9b08f7c044d169028be4b8d74919d.png

d86a5810aacb4d4a9efac81599ca1c11.png

下面这些都是注解:

(注解与反射机制:springboot核心)

@RequestMapping("/complex-para")
@RequestParam(name ="name")
@RestController

一:请求

6c1ab438db4641da91aab70f1cb3edc0.png

(一)postman(接口测试工具)

1eaf9f462da94c9cba43d0015e2737d9.png

直接下载安装

20a9d8edc94842b68c28439e881e4446.png

ca1dd662c36b44e3a48a0fc1393bf089.png

e1b7a5383ca54ac9b5b22085ba635ee4.png

(二)简单参数

1.get方式

(1)原始方式

4271ae2ba58547fda78477e34a847d46.png

dec12f7b19ec4ea582df1bc0210c5f5b.png

203680d9187d4d819122baf69f0ba7be.png

(2)springboot方式

public class ControlRequest {
    @RequestMapping("/simplepara")
    public  String simplepara(String name,Integer age){
        System.out.println(name+":"+age);
        return "OK";
    }
}

03cf4ebc00774555aa57fc979c8c53e4.png

注意浏览器传递的参数名必须与方法里的形参名一致(name age)

如果不一致,需要注解:

455b6f0d5b3449629430a7be30ac4ae4.png

2ae80f79f2794226a7822a63ecfbb9f5.png

2.post方式

a3415690e8b74a979a9d922c0778b90c.png

61c2fe4dbbd44647acf4f8c006d6fa39.png

(三)实体参数---(对象属性)

1.简单实体参数

@RestController
public class ControlRequest {
    /*@RequestMapping("/simple-para")
    public String simplepara(@RequestParam(name ="name") String username, Integer age){
        System.out.println(username+":"+age);
        return "OK";
    }*/

    @RequestMapping("/complex-para")
    public String simplepara(User user){
        System.out.println(user);
        return "OK";
    }
}

1fb4b184914e485e9a230c0025650dac.png

106f51a304ec456597b026dad43dfdac.png

2.复杂实体参数----对象的属性还是一个对象

da1ecb497b18407899a8d3c486d08b74.png

(四)数组集合参数

f399d1dd34b84e84a3f2602fc4b543b7.png

1.作用

(表单,一个属性有多个值)

e99420c7c8fe4124bdc88703f4b22e6b.pngf148a6ffc81d4cb29f55bb5852a99703.png

bcf688c76d67495f99fc33d67ae37dd4.png

(五)日期参数

日期形式

da592d74cfe6402f90e11413f78f0a62.png

90a05ac305424bcda0c88d9379bf25ef.png

(六)JSON参数

json参数数据由对象接收,json数据的键必须和对象的属性名相同

注意:json数据的格式,大括号,键需要双引号包裹,如果键又对应一个对象,需要用花括号包裹(花括号对应对象数据)

9de808c98c3245daa1ac9b1d6f554d78.png

9a21c42a0b9849a1a4d5c53dcc6994ec.png

(七)路径参数

作用:传参??传一个参数值给后台

1.单个路径参数

2.多个路径参数

a96bc7aabe6542e9aeef494d1d7d5449.png

二:响应

d857b4a041ab46e7ba09b0783fa1b9d1.png

接口;请求路径,响应数据,接收参数

1bd9b08f7c044d169028be4b8d74919d.png

(一)ResponseBody

105c69be59834746b4d80f17f9afcaa4.png

54b82a3a7c04418692d5a97609723aae.png

6852b23cfc6943c68036b641f11e81ff.png

(二).响应规范化-----统一响应结果(数据+响应状态)

0e72de9cfdc74ec6bd82bbe8c89ec39b.png

33a263cce2ba4b7ea07e730cc24c1e78.png

Result类

package com.ithema;

/**
 * 统一响应结果封装类
 */
public class Result {
    private Integer code ;//1 成功 , 0 失败
    private String msg; //提示信息
    private Object data; //数据 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(Object data){
        return new Result(1, "success", data);
    }
    public static Result success(){
        return new Result(1, "success", null);
    }
    public static Result error(String msg){
        return new Result(0, msg, null);
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

28d8fdcbdda44f6888cb396616fdd194.png

举例:

统一响应数据

4915b0285e4b4613ab3995f9a3df1e43.png

7793e88ee74d4c10a5ad929955fa8ced.png

694744fb574d4e3e8aa1c89fb8323518.png

对比未统一的

38a4df3440b140c496f4c56a52b156cb.png

(三)案例

1.需求:

3e273b52908c47a7b5514cab496d107a.png

2.步骤

ef00556a4d8a430cbb8e87622d5f65eb.png

c80bdb0256e44cbb8759edda022cc180.png

注意controller文件与其它文件必须都在com.ithema下,或者会找不到路径

f4ff5fc545f7424998fdd26d151a62aa.png

3.编写Controller文件,处理请求,响应数据

重点: 请求路径 接收参数 响应数据

(1)请求路径 接收参数

axios没有要求参数,所以在Controller文件中也不需要参数

926ac95b769140de8c0e730ce4b1e076.png

(2)响应数据

public Result list(){
        // 1. 加载并解析emp.xml
        String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
        //获取根目录下emp.xml文件的动态路径
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
        //parse(x1,x2)第一个参数,要解析的文件,第二个参加,解析的格式
        //调用XmlParserUtils工具包,解析file文件为Emp类,返回值为Emp类的列表

        // 2. 对数据进行转换处理(1返回男,2返回女)
        empList.stream().forEach(emp -> {
            //对empList遍历
            //处理<!-- 1: 男, 2: 女 -->
            String gender= emp.getGender();
            if (gender.equals("1")){
                emp.setGender("男");
            } else if (gender.equals("2")) {
                emp.setGender("女");
            }
            //处理<!-- 1: 讲师, 2: 班主任 , 3: 就业指导 -->
            String job= emp.getJob();
            if (job.equals("1")){
                emp.setJob("讲师");
            } else if (job.equals("2")) {
                emp.setJob("班主任");
            } else if (job.equals("3")) {
                emp.setJob("就业指导");
            }

        });

        // 3. 响应数据
        return Result.success(empList);

    }

3b06e54756d94f1a94361798cb8fb489.png

579fa432636f4486b4febfc90d9e976e.png

三:分层解耦

一个接口实现一个功能,尽可能降低接口的复杂性

8ebe9c067c8041518a35e586c5860df0.png

(一):三层架构

上个例子,只用了一个接口就实现了

936bcb265ef942009a5f9dbd7407f51f.png

388100c1b85340178d8eacc8668aa612.png

1.数据访问层--Dao

注意:不同数据的获取数据方法不同,因此我们设定一个Dao接口,再由一个接口类去实现Dao接口的方法(仅一个方法:获取数据)

Dao接口类的子类去具体实现获取数据的方法

a4480c84b2b64d8091bf3e9f35b68a83.png

// 1. 加载并解析emp.xml
        String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
        //获取根目录下emp.xml文件的动态路径
        System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);
        //parse(x1,x2)第一个参数,要解析的文件,第二个参加,解析的格式
        //调用XmlParserUtils工具包,解析file文件为Emp类,返回值为Emp类的列表

2.逻辑处理--Service

同Dao层,Service接口类+Service接口实现类(在实现类实现具体的逻辑推理,因为不同功能的逻辑推理不同,不能放在一个Service类里)

7da0ca4b05f4454ea5c80c4f3bec8598.png

下面这样用

acbb847e90e447d99af336d999da54b4.png

3.接收请求,响应数据--Controller

1a314ed83756494687c5ed7ec1331050.png

刷新,依旧展示,转换成功

167fd139933b44b2b1e3eea86228c1ba.png

拆分前后代码比较:

d2c32b9c6bd44f729e2c2ffbb81a8190.png

(二):分层解耦

https://panda-tang.blog.csdn.net/article/details/129903630?ydreferer=aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxNzU0L2NhdGVnb3J5XzEyMjY2ODE5Lmh0bWw%3D

1.耦合问题

3ff911c18baf47eaae242773c5154bad.png

19061d2ded3e4144a70e2d2d3d4b3b57.png

2.解耦

在代码中就是删去new对象的过程

90c95c05095e4f159d7b13773c0ccb61.png

c8048d4c873a454f94904e352607a946.png

IOC容器中创建bean对象

ID过程将bean对象注入给下一层

0c834f82449741c48b9746b4ff1d8a6f.png

(三):IOC&DI入门

ae88681545b34850a35b473cea87f0e9.png

7d8d52e866e74c60a3782bbcc9dd2ea2.png

737573812c1f4fd6b386670bdd667358.png

48b920e37da7474ea9b0ec8cc4e8f429.png

注意:是对三层架构中层与层之间进行解耦

如果:某一层有多个实现类,用那个实现类,就对那个实现类进行@Component

1f46fd17c65147fab56852a5e7d25999.png

(四):IOC详解

1.@Component衍生注解

a15a1657576e489789aedc1382ff81a6.png

2.bean的声明

d29fceef5e9046f0a9930edefc4361d0.png

5a7342774ba647f99ab84432e4ed6a63.png

3.组件扫描

c43b56efc73343b5ad9b7a1d01e620db.png

因为只扫描启动类(Spring...Application)所在目录下的文件

68dcbbf9aee0424995d18a8e9b89c7f1.png

1134da3f10b843aabb99915369df0be2.png

(五):DI详解

依赖注入,是指IOC容器要为应用程序去提供运行时所依赖的资源,而资源指的就是对象

1.问题--多个bean对象,如何自动装配

41c1f83b02d94c22a4e3e32c2056a3bf.png

2.解决方法

(1)@Primary

29d916a3e9ee481dbd32cb5c2942a65d.png

(2)@Qualifier

a12b31ec41ca49d6b2a00c769693ac11.png

(3)@Resource

b236144491a44fefbb76004ca5a5db2f.png4117a936a1c64788a7d949dcada2f9bc.png

标签: 架构

本文转载自: https://blog.csdn.net/leeyayai_xixihah/article/details/134877920
版权归原作者 leeyayai_xixihah 所有, 如有侵权,请联系我们删除。

“黑马2023Javaweb (5)|请求响应 & 分层解耦(Postman、三层架构、IOC、DI、注解)”的评论:

还没有评论