[JavaWeb]【六】web后端开发-请求响应

前言:请求响应

目录

[一 引子](#一 引子)

[二 请求](#二 请求)

[2.1 Postman](#2.1 Postman)

[2.1.1 安装](#2.1.1 安装)

[2.1.2 创建工作空间](#2.1.2 创建工作空间)

[2.1.3 添加接口](#2.1.3 添加接口)

[2.2 简单参数](#2.2 简单参数)

[2.2.1 原始方式(不推荐)](#2.2.1 原始方式(不推荐))

[2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)](#2.2.2 SpringBoot方式-GET(参数名与形参变量名相同))

[2.2.3 SpringBoot方式-POST(参数名与形参变量名相同)](#2.2.3 SpringBoot方式-POST(参数名与形参变量名相同))

[2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同)](#2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同))

[2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同)](#2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同))

[2.3 实体参数](#2.3 实体参数)

[2.3.1 简单的实体类参数](#2.3.1 简单的实体类参数)

[2.3.1.1 创建实体类User](#2.3.1.1 创建实体类User)

[2.3.1.2 创建接口](#2.3.1.2 创建接口)

[2.3.2 复杂实体参数](#2.3.2 复杂实体参数)

[2.3.2.1 创建实体类Address](#2.3.2.1 创建实体类Address)

[2.3.2.2 修改实体类User](#2.3.2.2 修改实体类User)

[2.3.2.3 创建接口](#2.3.2.3 创建接口)

[2.4 数组集合参数](#2.4 数组集合参数)

[2.4.1 数组参数](#2.4.1 数组参数)

[2.4.2 集合参数](#2.4.2 集合参数)

[2.5 日期参数](#2.5 日期参数)

[2.6 Json参数](#2.6 Json参数)

[2.7 路径参数](#2.7 路径参数)

[2.7.1 单个路径参数](#2.7.1 单个路径参数)

[2.7.2 多个路径参数](#2.7.2 多个路径参数)

[2.8 总结](#2.8 总结)

[三 响应](#三 响应)

[3.1 @Responbody响应示例(发现不便管理、难以维护)​编辑](#3.1 @Responbody响应示例(发现不便管理、难以维护)编辑)

[3.1.1 创建类ResponseController](#3.1.1 创建类ResponseController)

[3.1.2 执行结果](#3.1.2 执行结果)

[3.1.2.1 返回字符串](#3.1.2.1 返回字符串)

[​编辑3.1.2.2 返回对象json](#编辑3.1.2.2 返回对象json)

[​编辑 3.1.2.3 返回集合json](#编辑 3.1.2.3 返回集合json)

[​编辑3.2 统一响应结果](#编辑3.2 统一响应结果)

[3.2.1 统一结果处理类Result](#3.2.1 统一结果处理类Result)

[3.2.2 优化类ResponseController](#3.2.2 优化类ResponseController)

[3.2.3 执行结果(返回统一)](#3.2.3 执行结果(返回统一))

[3.3 总结](#3.3 总结)

[3.4 统一响应结果的案例](#3.4 统一响应结果的案例)

[3.4.1 分析步骤](#3.4.1 分析步骤)

[3.4.2 引入dom4j](#3.4.2 引入dom4j)

[3.4.3 引入工具类XmlParserUtils](#3.4.3 引入工具类XmlParserUtils)

[3.4.4 引入实体类 Emp](#3.4.4 引入实体类 Emp)

[3.4.5 引入emp.xml文件](#3.4.5 引入emp.xml文件)

[3.4.6 引入前端页面](#3.4.6 引入前端页面)

[3.4.7 新增EmpController类](#3.4.7 新增EmpController类)

[3.4.8 访问](#3.4.8 访问)

[3.4.9 思考](#3.4.9 思考)

[四 分层解耦](#四 分层解耦)

[4.1 三层架构](#4.1 三层架构)

[4.1.1 概述](#4.1.1 概述)

[4.1.2 Dao层](#4.1.2 Dao层)

[4.1.2.1 新增EmpDao接口](#4.1.2.1 新增EmpDao接口)

[4.1.2.2 新增EmpDaoA实现类](#4.1.2.2 新增EmpDaoA实现类)

[4.1.3 Service层](#4.1.3 Service层)

[4.1.3.1 新增EmpService接口](#4.1.3.1 新增EmpService接口)

[4.1.3.2 新增EmpServiceA实现类](#4.1.3.2 新增EmpServiceA实现类)

[4.1.3 Controller层](#4.1.3 Controller层)

[4.1.3.1 优化EmpController](#4.1.3.1 优化EmpController)

[4.1.4 对比](#4.1.4 对比)

[4.2 分层解耦](#4.2 分层解耦)

[4.2.1 解耦](#4.2.1 解耦)

[4.3 IOC(控制反转) & DI(依赖注入)入门](#4.3 IOC(控制反转) & DI(依赖注入)入门)

[4.3.1 优化EmpDaoA实现类](#4.3.1 优化EmpDaoA实现类)

['4.3.2 优化EmpServiceA实现类](#’4.3.2 优化EmpServiceA实现类)

[4.3.3 优化EmpController类](#4.3.3 优化EmpController类)

[4.3.4 如何更改为:实现类EmpserviceB](#4.3.4 如何更改为:实现类EmpserviceB)

[4.3.5 总结](#4.3.5 总结)

[4.4 IOC详解](#4.4 IOC详解)

[4.4.1 优化EmpDaoA实现类](#4.4.1 优化EmpDaoA实现类)

['4.4.2 优化EmpServiceA实现类](#’4.4.2 优化EmpServiceA实现类)

[4.4.3 优化EmpController类](#4.4.3 优化EmpController类)

[4.4.4 bean组件扫描](#4.4.4 bean组件扫描)

[4.4.5 总结](#4.4.5 总结)

[4.5 DI详解](#4.5 DI详解)

[4.5.1 @Primary](#4.5.1 @Primary)

[4.5.2 @Qualifier](#4.5.2 @Qualifier)

[4.5.3 @Resource](#4.5.3 @Resource)

[4.5.3 总结](#4.5.3 总结)


一 引子

二 请求

2.1 Postman

2.1.1 安装

2.1.2 创建工作空间

2.1.3 添加接口

2.2 简单参数

2.2.1 原始方式(不推荐)

2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)

2.2.3 SpringBoot方式-POST(参数名与形参变量名相同)

2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同)

参数不同 获取null

2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同)

此问题是解决2.2.4的问题

java 复制代码
package com.runa.controller;


import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }
}

2.3 实体参数

2.3.1 简单的实体类参数

2.3.1.1 创建实体类User

java 复制代码
package com.runa.pojo;

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 +
                '}';
    }
}

2.3.1.2 创建接口

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

}

2.3.2 复杂实体参数

2.3.2.1 创建实体类Address

java 复制代码
package com.runa.pojo;

public class Address {
    private String province;
    private String city;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

2.3.2.2 修改实体类User

java 复制代码
package com.runa.pojo;

public class User {
    private String name;
    private Integer age;
    private Address address;

    public String getName() {
        return name;
    }


    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    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 +
                ", address=" + address +
                '}';
    }
}

2.3.2.3 创建接口

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    //2.1 简单的实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

    //2.1 复杂的实体参数
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "ok";
    }

}

2.4 数组集合参数

2.4.1 数组参数

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    //2.1 简单的实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

    //2.2 复杂的实体参数
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "ok";
    }

    // 3 数组集合参数
    // 3.1 数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "ok";
    }

}

2.4.2 集合参数

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    //2.1 简单的实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

    //2.2 复杂的实体参数
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "ok";
    }

    // 3 数组集合参数
    // 3.1 数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "ok";
    }

    // 3.2 集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "ok";
    }

}

2.5 日期参数

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    //2.1 简单的实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

    //2.2 复杂的实体参数
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "ok";
    }

    // 3 数组集合参数
    // 3.1 数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "ok";
    }

    // 3.2 集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "ok";
    }

    // 4 日期时间参数
    @RequestMapping("/dataParam")
    public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "ok";
    }

}

2.6 Json参数

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    //2.1 简单的实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

    //2.2 复杂的实体参数
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "ok";
    }

    // 3 数组集合参数
    // 3.1 数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "ok";
    }

    // 3.2 集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "ok";
    }

    // 4 日期时间参数
    @RequestMapping("/dataParam")
    public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "ok";
    }

    // 5 json 参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "ok";
    }

}

2.7 路径参数

2.7.1 单个路径参数

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    //2.1 简单的实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

    //2.2 复杂的实体参数
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "ok";
    }

    // 3 数组集合参数
    // 3.1 数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "ok";
    }

    // 3.2 集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "ok";
    }

    // 4 日期时间参数
    @RequestMapping("/dataParam")
    public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "ok";
    }

    // 5 json 参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "ok";
    }

    // 6 路径 参数
    @RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "ok";
    }

}

2.7.2 多个路径参数

java 复制代码
package com.runa.controller;


import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

@RestController
public class RequestController {
    // 1、 简单参数
//    //原始方式
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
        //获取请求参数
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        int age = Integer.parseInt(ageStr);
//
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        //获取请求参数
//        System.out.println(name + ":" + age);
//        return "ok";
//    }

    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String username, Integer age){
//        //获取请求参数
//        System.out.println(username + ":" + age);
//        return "ok";
//    }
    //SpringBoot 方式 GET  POST 都可以(参数名与形参变量名不相同)
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name="name")String username, Integer age){  //@RequestParam(name="name", required = false)
        //获取请求参数
        System.out.println(username + ":" + age);
        return "ok";
    }

    // 2 实体参数
    //2.1 简单的实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        //获取请求参数
        System.out.println(user);
        return "ok";
    }

    //2.2 复杂的实体参数
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "ok";
    }

    // 3 数组集合参数
    // 3.1 数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "ok";
    }

    // 3.2 集合参数
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "ok";
    }

    // 4 日期时间参数
    @RequestMapping("/dataParam")
    public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "ok";
    }

    // 5 json 参数
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "ok";
    }

    // 6 路径 参数
    // 6。1  单个路径 参数
    @RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "ok";
    }

    // 6。2  多个路径 参数
    @RequestMapping("/path/{id}/{name}")
    public String pathParam(@PathVariable Integer id, @PathVariable String name){
        System.out.println(id + ":" + name);
        return "ok";
    }

}

2.8 总结

三 响应

3.1 @Responbody响应示例(发现不便管理、难以维护)

3.1.1 创建类ResponseController

java 复制代码
package com.runa.controller;

import com.runa.pojo.Address;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试响应数据
 */

@RestController
public class ResponseController {
    @RequestMapping("/helloWorld")
    public String helloWorld(){
        System.out.println("Hello World ~");
        return "Hello World ~";
    }

    @RequestMapping("/getAddr")
    public Address getAddr(){
        Address addr = new Address();
        addr.setProvince("云南");
        addr.setCity("大理");
        return addr;
    }

    @RequestMapping("/listAddr")
    public List<Address> listAddr(){
        List<Address> list = new ArrayList<>();

        Address addr = new Address();
        addr.setProvince("云南");
        addr.setCity("大理");

        Address addr2 = new Address();
        addr2.setProvince("新疆");
        addr2.setCity("乌鲁木齐");

        list.add(addr);
        list.add(addr2);
        return list;
    }

}

3.1.2 执行结果

3.1.2.1 返回字符串

3.1.2.2 返回对象json

3.1.2.3 返回集合json

3.2 统一响应结果

3.2.1 统一结果处理类Result

java 复制代码
package com.runa.pojo;

/**
 * 统一响应结果封装类
 */
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 +
                '}';
    }
}

3.2.2 优化类ResponseController

java 复制代码
package com.runa.controller;

import com.runa.pojo.Address;
import com.runa.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * 测试响应数据
 */

@RestController
public class ResponseController {
    @RequestMapping("/helloWorld")
    public Result helloWorld(){
        System.out.println("Hello World ~");
//        return new Result(1,"success","Hello World`");
        return Result.success("Hello World ~");
    }

    @RequestMapping("/getAddr")
    public Result getAddr(){
        Address addr = new Address();
        addr.setProvince("云南");
        addr.setCity("大理");
        return Result.success(addr);
    }

    @RequestMapping("/listAddr")
    public Result listAddr(){
        List<Address> list = new ArrayList<>();

        Address addr = new Address();
        addr.setProvince("云南");
        addr.setCity("大理");

        Address addr2 = new Address();
        addr2.setProvince("新疆");
        addr2.setCity("乌鲁木齐");

        list.add(addr);
        list.add(addr2);
        return Result.success(list);
    }



}

3.2.3 执行结果(返回统一)

3.3 总结

3.4 统一响应结果的案例

3.4.1 分析步骤

3.4.2 引入dom4j

XML 复制代码
<!-- 解析XML -->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

3.4.3 引入工具类XmlParserUtils

java 复制代码
package com.runa.utils;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class XmlParserUtils {

    public static <T> List<T> parse(String file , Class<T> targetClass)  {
        ArrayList<T> list = new ArrayList<T>(); //封装解析出来的数据
        try {
            //1.获取一个解析器对象
            SAXReader saxReader = new SAXReader();
            //2.利用解析器把xml文件加载到内存中,并返回一个文档对象
            Document document = saxReader.read(new File(file));
            //3.获取到根标签
            Element rootElement = document.getRootElement();
            //4.通过根标签来获取 user 标签
            List<Element> elements = rootElement.elements("emp");

            //5.遍历集合,得到每一个 user 标签
            for (Element element : elements) {
                //获取 name 属性
                String name = element.element("name").getText();
                //获取 age 属性
                String age = element.element("age").getText();
                //获取 image 属性
                String image = element.element("image").getText();
                //获取 gender 属性
                String gender = element.element("gender").getText();
                //获取 job 属性
                String job = element.element("job").getText();

                //组装数据
                Constructor<T> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class, String.class, String.class, String.class);
                constructor.setAccessible(true);
                T object = constructor.newInstance(name, Integer.parseInt(age), image, gender, job);

                list.add(object);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

}

3.4.4 引入实体类 Emp

java 复制代码
package com.runa.pojo;

public class Emp {
    private String name;
    private Integer age;
    private String image;
    private String gender;
    private String job;

    public Emp() {
    }

    public Emp(String name, Integer age, String image, String gender, String job) {
        this.name = name;
        this.age = age;
        this.image = image;
        this.gender = gender;
        this.job = job;
    }

    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;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", image='" + image + '\'' +
                ", gender='" + gender + '\'' +
                ", job='" + job + '\'' +
                '}';
    }
}

3.4.5 引入emp.xml文件

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<emps>
    <emp>
        <name>金毛狮王</name>
        <age>55</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg</image>
        <!-- 1: 男, 2: 女 -->
        <gender>1</gender>
        <!-- 1: 讲师, 2: 班主任 , 3: 就业指导 -->
        <job>1</job>
    </emp>

    <emp>
        <name>白眉鹰王</name>
        <age>65</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/2.jpg</image>
        <gender>1</gender>
        <job>1</job>
    </emp>

    <emp>
        <name>青翼蝠王</name>
        <age>45</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/3.jpg</image>
        <gender>1</gender>
        <job>2</job>
    </emp>

    <emp>
        <name>紫衫龙王</name>
        <age>38</age>
        <image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/4.jpg</image>
        <gender>2</gender>
        <job>3</job>
    </emp>
</emps>

3.4.6 引入前端页面

3.4.7 新增EmpController类

java 复制代码
package com.runa.controller;

import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class EmpController {
    @RequestMapping("/listEmp")
    public Result list(){
        // 1 加载并解析XML 文件

        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);

        // 2 对数据进行转换处理  gender job
        empList.stream().forEach(emp ->{
            // 处理gender 1  男  2  女
            String gender = emp.getGender();
            if("1".equals(gender)){
                emp.setGender("男");
            } else if ("2".equals(gender)) {
                emp.setGender("女");

            }

            // 处理 job  1 讲师 2 班主任  3 就业指导
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            } else if ("2".equals(job)) {
                emp.setJob("班主任");}
            else if ("3".equals(job)) {
                emp.setJob("就业指导");
            }
        });


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

3.4.8 访问

浏览器

XML 复制代码
http://localhost:8080/emp.html

3.4.9 思考

四 分层解耦

4.1 三层架构

4.1.1 概述

4.1.2 Dao层

4.1.2.1 新增EmpDao接口

java 复制代码
package com.runa.dao;

import com.runa.pojo.Emp;

import java.util.List;

public interface EmpDao {
    // 获取员工列表数据
    public List<Emp> listEmap();
}

4.1.2.2 新增EmpDaoA实现类

java 复制代码
package com.runa.dao.impl;

import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;

import java.util.List;

public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmap() {
        // 1 加载并解析XML 文件
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
        return emplist;
    }
}

4.1.3 Service层

4.1.3.1 新增EmpService接口

java 复制代码
package com.runa.service;

import com.runa.pojo.Emp;

import java.util.List;

public interface EmpService {
    // 获取员工列表
    public List<Emp> listEmp();
}

4.1.3.2 新增EmpServiceA实现类

java 复制代码
package com.runa.service.impl;

import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;

import java.util.List;

public class EmpServiceA implements EmpService {
    private EmpDao empDao = new EmpDaoA();
    @Override
    public List<Emp> listEmp() {

        //1 调用dao, 获取数据
        List<Emp> empList = empDao.listEmap();

        // 2 对数据进行转换处理  gender job
        empList.stream().forEach(emp ->{
            // 处理gender 1  男  2  女
            String gender = emp.getGender();
            if("1".equals(gender)){
                emp.setGender("男");
            } else if ("2".equals(gender)) {
                emp.setGender("女");

            }

            // 处理 job  1 讲师 2 班主任  3 就业指导
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            } else if ("2".equals(job)) {
                emp.setJob("班主任");}
            else if ("3".equals(job)) {
                emp.setJob("就业指导");
            }
        });

        return empList;
    }
}

4.1.3 Controller层

4.1.3.1 优化EmpController

java 复制代码
package com.runa.controller;

import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class EmpController {
    private EmpService empService = new EmpServiceA();
    @RequestMapping("/listEmp")
    public Result list(){

        // 1 调用service,获取数据
        List<Emp> empList = empService.listEmp();

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


}

启动

4.1.4 对比

4.2 分层解耦

4.2.1 解耦

4.3 IOC(控制反转) & DI(依赖注入)入门

4.3.1 优化EmpDaoA实现类

java 复制代码
package com.runa.dao.impl;

import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;
import org.springframework.stereotype.Component;

import java.util.List;

@Component  // 将当前类交给IOC容器管理,成为IOC容器的bean
public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmap() {
        // 1 加载并解析XML 文件
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
        return emplist;
    }
}

'4.3.2 优化EmpServiceA实现类

java 复制代码
package com.runa.service.impl;

import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component  // 将当前类交给IOC容器管理,成为IOC容器的bean
public class EmpServiceA implements EmpService {
//    private EmpDao empDao = new EmpDaoA();
    @Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
    private EmpDao empDao; //解耦
    @Override
    public List<Emp> listEmp() {

        //1 调用dao, 获取数据
        List<Emp> empList = empDao.listEmap();

        // 2 对数据进行转换处理  gender job
        empList.stream().forEach(emp ->{
            // 处理gender 1  男  2  女
            String gender = emp.getGender();
            if("1".equals(gender)){
                emp.setGender("男");
            } else if ("2".equals(gender)) {
                emp.setGender("女");

            }

            // 处理 job  1 讲师 2 班主任  3 就业指导
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            } else if ("2".equals(job)) {
                emp.setJob("班主任");}
            else if ("3".equals(job)) {
                emp.setJob("就业指导");
            }
        });

        return empList;
    }
}

4.3.3 优化EmpController类

java 复制代码
package com.runa.controller;

import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class EmpController {
//    private EmpService empService = new EmpServiceA();
    @Autowired   // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
    private EmpService empService; //解耦
    @RequestMapping("/listEmp")
    public Result list(){

        // 1 调用service,获取数据
        List<Emp> empList = empService.listEmp();

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


}

4.3.4 如何更改为:实现类EmpserviceB

如果要更换成新的实现类EmpserviceB,只需要将EmpserviceA 的注解@Component 去掉,实现类EmpserviceB加上注解@Component

4.3.5 总结

4.4 IOC详解

4.4.1 优化EmpDaoA实现类

java 复制代码
package com.runa.dao.impl;

import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;
import org.springframework.stereotype.Component;

import java.util.List;

//@Component  // 将当前类交给IOC容器管理,成为IOC容器的bean
@Repository
public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmap() {
        // 1 加载并解析XML 文件
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
        return emplist;
    }
}

'4.4.2 优化EmpServiceA实现类

java 复制代码
package com.runa.service.impl;

import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
//@Component  // 将当前类交给IOC容器管理,成为IOC容器的bean
@Service
public class EmpServiceA implements EmpService {
//    private EmpDao empDao = new EmpDaoA();
    @Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
    private EmpDao empDao; //解耦
    @Override
    public List<Emp> listEmp() {

        //1 调用dao, 获取数据
        List<Emp> empList = empDao.listEmap();

        // 2 对数据进行转换处理  gender job
        empList.stream().forEach(emp ->{
            // 处理gender 1  男  2  女
            String gender = emp.getGender();
            if("1".equals(gender)){
                emp.setGender("男");
            } else if ("2".equals(gender)) {
                emp.setGender("女");

            }

            // 处理 job  1 讲师 2 班主任  3 就业指导
            String job = emp.getJob();
            if("1".equals(job)){
                emp.setJob("讲师");
            } else if ("2".equals(job)) {
                emp.setJob("班主任");}
            else if ("3".equals(job)) {
                emp.setJob("就业指导");
            }
        });

        return empList;
    }
}

4.4.3 优化EmpController类

java 复制代码
package com.runa.controller;

import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController   //有@RestController就不需要使用 @Controller ,因为他包含了
public class EmpController {
//    private EmpService empService = new EmpServiceA();
    @Autowired   // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
    private EmpService empService; //解耦
    @RequestMapping("/listEmp")
    public Result list(){

        // 1 调用service,获取数据
        List<Emp> empList = empService.listEmp();

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


}

4.4.4 bean组件扫描

4.4.5 总结

4.5 DI详解

4.5.1 @Primary

4.5.2 @Qualifier

4.5.3 @Resource

4.5.3 总结

相关推荐
峰子201211 分钟前
Go语言实现守护进程的挑战
开发语言·后端·面试·架构·golang·go
m0_7482371514 分钟前
PHP实现登录和注册(附源码)
开发语言·php
tealcwu22 分钟前
【游戏设计原理】32 - 消费者剩余
java·开发语言·游戏
小马爱打代码31 分钟前
Spring Boot项目开发常见问题及解决方案(下)
java·spring boot·后端
潜意识起点33 分钟前
计算机专业文献检索期末论文
java·开发语言
Tiger Z41 分钟前
R 语言科研绘图第 11 期 --- 柱状图-基础
开发语言·程序人生·r语言·贴图
岁月如歌,青春不败43 分钟前
R语言森林生态系统结构、功能与稳定性分析与可视化
开发语言·人工智能·python·深度学习·r语言
Q_19284999061 小时前
基于Spring Boot的工商局商家管理系统
java·spring boot·后端
m0_748232641 小时前
[MySQL报错]关于发生net start mysql 服务无法启动,服务没有报告任何错误的五种解决方案。
java
Godlovesea1 小时前
ubuntu控制器多网口配置
开发语言·php