JavaWeb学习路线(4)——请求响应与分层解耦

news2024/12/19 23:56:06

一、概述
在这里插入图片描述

二、请求

(一)概念: 全名为HttpServletRequest,其目标是获取请求数据。

(二)简单请求: web端发送基本数据类型数据到服务器进行处理。

1、获取方式

(1)原始方法: 通过参数HttpServletRequest获取请求数据

** 1、服务端代码**

    @RequestMapping("/hello")
    public Map<String, String[]> hello(HttpServletRequest request){
        return request.getParameterMap();
    }

** 2、请求端**

在这里插入图片描述

(2)SpringBoot接收参数:形参名与请求数据名相同,即可获取对应值 或 添加@RequestParam注解映射参数

** 1、服务端代码**

    /**
    * 使用@RequestParam(name = "xxxx",required = true) String name 表示请求端的名称与接口的参数映射并且参数必须传递,name和required属性都默认为参数名和true,当我们需要做出改变时才使用。
    * 注解的意思是“请求端发送的请求数据 xxxx 映射到 服务端的 name 参数,并且这个参数必须在请求体中”
	*/
    @RequestMapping("/hello")
    public int hello(@RequestParam(name="name",required=true) String name,Integer age){
        System.out.println(name + " " +age);
        return 200;
    }

2、请求端

在这里插入图片描述
(三)实体参数: web端发送数据,且符合实体对象属性,则使用实体参数接收

** 1、服务端代码**

@RestController
public class UserController {
    @RequestMapping("/regist")
    public int regist(User user){
        System.out.println(user);
        return 200;
    }
}

class User{
    private String name;
    private String age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public User() {
    }

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

** 2、请求端**
在这里插入图片描述

注意事项:
1、简单参数可以使用 @RequestParam(name,required) 注解规定接收的参数名和传递必须性。
2、实体参数在请求端中必须与服务端的实体对象的属性名相同。
3、多实体参数在请求端中必须使用“ 实体名.属性名=属性值 ”的结构传递。

(四)集合参数传递

** 1、服务端代码**

@RestController
public class UserController {
    //数组接收参数
    @RequestMapping("/arrayParam")
    public int arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return 200;
    }

    //集合接收参数
    @RequestMapping("/collectionParam")
    public int collectionParam(@RequestParam List<String> hobby){
        System.out.println(Arrays.toString(hobby.toArray()));
        return 200;
    }
}

/*打印结果*/
[,, Rap, 篮球]
[,, Rap, 篮球]

** 2、请求端**
在这里插入图片描述
在这里插入图片描述

(五)日期参数传递

1、服务端代码

@RestController
public class DateController {
    @RequestMapping("/dateParam")
    public int dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date){
        System.out.println(date.toString());
        return 200;
    }
}

/*打印输出*/
2023-06-14T15:47:30

2、请求端
在这里插入图片描述

(六)JSON参数传递

1、服务端代码

@RestController
public class JsonController {
    @RequestMapping("/JsonParam")
    public int JsonParam(@RequestBody User user){
        System.out.println(user);
        return 200;
    }
}

class User{
    private String name;
    private String age;

    private Address address;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", address=" + address +
                '}';
    }

    public Address getAddress() {
        return address;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

class Address{
    private String province;
    private String city;

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + 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;
    }
}

/*打印输出*/
User{name='惊喜', age='23', address=Address{province='浙江', city='杭州'}}

2、请求端

在这里插入图片描述

(七)路径参数传递

1、服务器端代码

@RestController
public class PathController {
    @RequestMapping("/pathParam/{id}")
    public int pathParam(@PathVariable Integer id){
        System.out.println(id);
        return 200;
    }
}

/*打印输出*/
1024

2、请求端

在这里插入图片描述

三、响应

(一)概念: 全名为HttpServletResponse,其目标是设置响应数据。

(二)设置响应数据

1、关键注解:@ResponseBody

  • 类型: 方法注解、类注解
  • 位置: Controller方法或类上
  • 作用: 将方法返回值直接响应,如果返回值类型是 实体对象或集合,将转为JSON格式响应
  • 说明: @RestController = @Controller + @ResponseBody

2、封装响应数据

public class Result {
    //状态码
    private int code;
    //返回描述
    private String msg;
    //返回数据
    private Object data;

    public Result() {
    }

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

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
    
    public static Result success(int code,String msg,Object data){
        return new Result(code,msg,data);
    }
    
    public static Result success(){
        return success(200,"success",null);
    }
    
    public static Result error(){
        return new Result(400,"客户端出现错误",null);
    }

    public int getCode() {
        return code;
    }

    public void setCode(int 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;
    }
}

3、返回响应数据

@RestController
public class NewController {
    @RequestMapping("/testParam")
    public Result testParam(){
        String data = "这里有返回数据";
        return Result.success(200,"成功接收",data);
    }
}

4、请求端接收数据
在这里插入图片描述

四、分层解耦

(一)三层架构

在这里插入图片描述

  • 第一层:Contoller: 控制层,负责接收客户端发送的请求,对请求进行处理,并响应数据。
  • 第二次:Service: 业务逻辑层,负责处理具体的业务逻辑
  • 第三层:Dao 数据访问层(Data Access Object)(持久层),负责数据访问操作。

(二)分层解耦

1、两个概念

  • 内聚: 软件各个功能模块内部的功能联系。(只调用不改变)
  • 耦合: 衡量软件中各个层/模块之间的依赖、关联程度。(模块改变不影响其它模块使用)

2、软件设计原则: 高内聚,低耦合

3、Spring如何实现解耦?

(1)相关概念

  • 控制反转 IOC(Inversion Of Control): 对象的创建控制权由程序自身转移到外部(容器)。
  • DI依赖注入(Dependency Injection): 容器为应用程序提供运行时,所依赖的资源。
  • Bean对象: IOC容器中创建、管理的对象。

(2)改写三层架构

  • 步骤一: Service层及Dao层实现类交给IOC容器管理。(类上添加注解@Component)
  • 步骤二: 为Controller及Service注入运行时,依赖的对象。(引用对象上添加注解@Autowired)
  • 步骤三: 运行测试。

(三) IOC

1、Bean对象的管理注解

注解说明位置
@Component声明bean的基础注解除以下几类注解位置的位置
@Controller声明为控制层,@Component衍生注解标注于控制器类
@Service声明为服务层,@Component衍生注解标注于业务实现类
@Repository声明为数据访问层,@Component衍生注解标注于数据访问实现类

注意:

  • 声明bean时,可通过value属性指定bean的名字,默认为类名首字母小写。
  • 使用以上四个注解都可以声明bean,但在Springboot集成开发中,声明控制器bean只能用@Controller。

2、Bean对象的组件扫描

(1)使用原因: Bean对象的四大注解并未生效。
(2)使用方法: 启动类上添加@ComponentScan注解,并添加扫描的具体包名集合。

@ComponentScan({xxx.dao,xxx.service....})
@SpringBootApplication
public class SpringbootWebRegRespApplicaiton{
	public static void main(String[] args){
		SpringApplication.run(SpringbootWebRegRespApplicaiton.class,args);
	}
}

注意: 启动类上 @SpringBootApplication 注解已经默认添加了注解扫描,其范围为启动类所在包

(四) DI

1、作用: 当IOC容器中的引用对象冲突(比如有多个实现同个接口的实现类,那么控制器调用接口时会发生错误),@Autowired就会发生异常,为明确引用对象,则通过明确的注解进行声明。

2、DI的解决方案

注解说明
@Primary强制注解注入
@Qualifier注入指定名称的注解,需要配合@Autowired注解
@Resource按照Bean名称进行注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32学习之JSON,和接入心知天气

注意&#xff1a;手机热点或者网络不能开5.0GHz频段和WIFI6&#xff0c;不然ESP32连不上 心知天气账号&#xff08;免费版即可&#xff09;&#xff0c;网站&#xff1a;心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案 (seniverse.com) V3的用户手册-天气实…

【业务功能篇29】Assert断言

业务场景&#xff1a; 当我们需要对一个接口方法验证是&#xff0c;在单元测试中&#xff0c;主要用于程序代码的调试或测试阶段 基本的使用就是assert condition&#xff0c;当 condition 为 true&#xff0c;就继续往下运行&#xff1b;当 condition 为 false&#xff0c;就抛…

MySQL - 第2节 - MySQL库的操作

1.创建数据库 创建数据库的SQL如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name];说明&#xff1a; • SQL中大写的表示关键字&#xff0c;[ ]中代表的是可选项。 • CHARSET用于指定数据库所采用…

「实在RPA·证券数字员工」革新证券数字化现状

2022年1月《金融科技发展规划&#xff08;2022——2025年&#xff09;》提出“十四五”时期金融科技发展愿景&#xff0c;明确了金融科技发展的指导思想和4个基本原则、6个发展目标&#xff0c;确定了8项重点任务和5项保障措施&#xff0c;进一步明确金融科技发展方向。近年来&…

ADB WIFI 链接

ADB WiFi链接手机 必须在同一网络下&#xff08;本人用的台式机网线手机连路由器WIFI&#xff09; 1.先确认USB数据线是否成功链接了手机 adb devices不管前面设备是什么名字&#xff0c;但是后面必须为device状态才算链接成功了&#xff0c;offline状态是不行的 有些没开启…

Linux Debian Jenkins快速搭建配置并运行

Jenkins安装 参考Debian Jenkins Packageshttps://pkg.origin.jenkins.io/debian-stable/ 加Key curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \/usr/share/keyrings/jenkins-keyring.asc > /dev/null 加仓库 echo deb [signed-by/u…

什么是远程工具,远程工具推荐

在当今数字化时代&#xff0c;远程工作正在变得越来越普遍。这种趋势不仅使企业管理更加便利&#xff0c;节省了时间和资源&#xff0c;同时也使员工更加自由和灵活。许多远程工作都需要使用到远程工具。本文将对远程工具进行简介和阐述。 什么是远程工具 远程工具是一种数字…

类与对象知识总结+封闭类+const+this指针 C++程序设计与算法笔记总结(三) 北京大学 郭炜

//C程序到C程序的翻译 class CCar { public: int price; void SetPrice(int p); }; void CCar::SetPrice(int p) { price p; } int main() { CCar car; car.SetPrice(20000); return 0; }struct CCar { int price; }; void SetPrice(struct CCar * this, int p) { this-&g…

【ROS】URDF:统一机器人描述格式(XML)

1、简述 统一机器人描述格式&#xff08;URDF&#xff09;是描述机器人模型的 XML 文件&#xff0c;支持Xacro&#xff08;XML宏&#xff09;&#xff0c;使用Xacro来引用已经存在的XML块&#xff0c;创建更短且可读的XML文件。 2、初始URDF描述文件 URDF描述文件为XML格式&…

测试左移-快速玩转Debug

目录 背 景 学习的意义 玩 转 Debug 一、基本介绍 二、断点设置 三、启动调试 四、调试技巧 定 位 问 题 总 结 背 景 一段代码的问题产生阶段可以分为&#xff1a;编译期和运行时 编译期的代码可以由工具&#xff08;idea、eclipse&#xff09;在程序编码过程中提示错误…

面对对象。

1.类&#xff1a; 类&#xff1a;是对象共同特征的描述。 对象&#xff1a;是真实存在的具体实例。 先设计类&#xff0c;才能创建对象并使用。 pulic class 类名{1.成员变量&#xff08;代表属性&#xff0c;一般是名词&#xff09;2.成员方法&#xff08;代表行为&#x…

达梦主备守护集群相关概念和基本原理介绍

DM数据守护一主一备或一主多备是一种集成化的高可用、高性能数据库解决方案&#xff0c;是数据库异地容灾的首选方案。通过部署 DM 数据守护&#xff0c;可以在硬件故障&#xff08;如磁盘损坏&#xff09;、自然灾害&#xff08;地震、火灾&#xff09;等极端情况下&#xff0…

思科交换机与路由器基础命令(一)

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、Cisco交换机的命令行模式&#xff1a; 1、用户模式 2、 特权模式 3、 全局配置模式 4、 接口模式 5、退回命令 二、帮助机制 …

20. 算法之回溯算法

1. 概念 回溯算法实际上一个类似枚举的深度优先搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff08;也就是递归返回&#xff09;&#xff0c;尝试别的路径。 回溯的处理思想&#xff0c…

必备:音乐的魅力,一边听歌一边练习英语!

音乐是一种跨越语言和文化的艺术形式&#xff0c;能够带给我们无限的感动和快乐。下面是我推荐的一些好听的英文歌曲&#xff0c;希望大家喜欢。 这首歌是英国歌手Ed Sheeran的代表作之一&#xff0c;曲调轻快&#xff0c;旋律优美&#xff0c;歌词简单易懂&#xff0c;非常容…

搞懂mysql事物隔离级别

事物是为交易而生 事物的英文单词 TRANSACTION,就是交易的意思. 交易和事物是一个东西. mysql的事物的4种隔离级别 mysql的事物隔离级设计的一点也不高级 隔离级别只是一个很烧脑的概念,并不是什么高大上的技术. RU,全称read-uncommitted, 中文翻译:读未提交,能够读到未提交…

static关键字在C语言中的作用

static关键字有三个主要作用&#xff1a; 1.修饰全局变量 2.修饰函数 3.修饰局部变量 (1)首先是修饰全局变量&#xff0c;就是变量只能在本文件中使用&#xff0c;不能在其他文件中使用 代码示例&#xff1a;vi 1.c vi 2.c 编译&#xff1a;gcc 1.c 2.c -o main ./main …

指定数组的维度,返回由随机数构成的数组numpy.random.ranf()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定数组的维度&#xff0c; 返回由随机数构成的数组 numpy.random.ranf() 选择题 以下说法错误的是? import numpy as np print("【执行1】np.random.ranf()") print(np.random.ra…

Redis整合jedis 学习

前言 redis简单来讲是内存数据库&#xff0c;因为是将数据存放到内存&#xff0c;因此读写速率高快(传统数据库&#xff0c;不是先从内存转到硬存&#xff0c;慢) 1.jedis连接Redis redis是java操作redis的客户端&#xff0c;通过他我们能通过java语句操控redis。 jedis对于…

Vue使用Echarts折线图,实现点击播放、暂停、选择播放倍数;实现数据直播功能

文章目录 &#x1f31f;前言&#x1f31f;先看效果&#x1f31f;整体代码&#xff08;详细注释&#xff09;&#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;最近公司有个小需求&#xff0c;就是基于Echarts的折线图&#xff0c;做一个数据直播的功能&#…