java:SpringBootWeb请求响应

news2024/11/18 9:23:45

Servlet

用java编写的服务器端程序

客户端发送请求至服务器

服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器

服务器将响应返回给客户端

javaweb的工作原理

在这里插入图片描述

在SpringBoot进行web程序开发时,内置了一个核心的Servlet程序DispatcherServlet,称之为核心控制器.

DispatcherServlet负责接收页面发送的请求,根据资源链接执行的规则,将请求再分发给部署在tomcat中的请求处理器Controller,请求处理器处理完请求之后,最终再由DispatcherServlet给浏览器响应数据.

浏览器发送请求到后端服务器tomcat后,tomcat会负责解析这些请求数据,将解析后数据传递到Servlet程序的HttpServletRequest对象,意味着HttpServletRequest对象可以获取到请求数据.同时传递了一个HttpServletResponse对象,来给浏览器设置响应数据.

请求:浏览器->HTTP->tomcat(内置servlet解析)->request对象->数据

响应:数据->response对象->servlet解析->HTTP->浏览器

请求

接收页面传递来的请求数据

后端接收前端传递的数据

底层依赖于getset方法进行取值(反射)

Postman

一款功能强大的网页调试和发送网页HTTP请求的Chrome插件

用于接口测试

接口测试:模拟前端发送请求,检验数据传输的正确性

界面功能如下所示

在这里插入图片描述

后端资源链接不能重复

简单参数

通过Servlet中提供的API HttpServletRequest可以获取请求的相关信息
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
	String name = request.getParameter("name");
	String age = request.getParameter("age");
	System.out.println(name+" : "+age);
	return "OK";
}
//request对象中包含请求数据,可以直接通过getParameter()方法进行获取
使用SpringBoot方式

在SpringBoot环境中,对原始的API进行了封装,接收参数形式更加简单.

可以直接定义同名参数接收数据.

@RequestMapping("/simpleParam")
	public String simpleParam(String name , Integer age ){
	System.out.println(name+" : "+age);
	return "OK";
}
使用postman进行测试

在这里插入图片描述

快速提交带参数的请求

参数名不一致

可以使用@RequestParam进行映射

用法如下

@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("username") String name ,Integer age){
	System.out.println(name+" : "+age);
	return "OK";
}
//在形参前加上注解完成映射

实体参数

如果参数数量比较多,可以通过封装到一个pojo对象的方式进行数据封装

参数名需与POJO属性名一致

简单实体对象

定义一个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 +
			'}';
 	}
}

在controller方法中传入pojo对象接受数据

@RequestMapping("/simplePojo")
public String simplePojo(User user){
	System.out.println(user);
	return "OK";
}
//pojo对象接受与其属性名相同的参数
复杂实体对象

在实体类中的一个或多个属性为其他实体类的对象

封装需要遵循如下规则:

请求参数名与形参对象的属性名相同,即接收属性中的实体类对象属性时,参数需要为对象.属格式.

在这里插入图片描述

数组集合参数

数组参数

请求参数名和形参对象属性名相同且请求参数为多个.

即接收多个同名参数

传递形式:

在这里插入图片描述

集合

集合参数

请求参数名和形参集合对象名字相同且请求参数为多个

使用@RequestParam绑定参数关系
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
	System.out.println(hobby);
	return "OK";
}

传递形式

在这里插入图片描述

日期参数

对日期类型的参数进行封装的时候,需要通过@DateTimeFormat注解,以及其中的pattern属性来设置日期格式

pattern属性中制定了前端传递参数时的规格.

@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
	System.out.println(updateTime);
	return "OK";
}

传递形式

在这里插入图片描述

JSON参数

比较复杂的参数可以通过JSON格式进行传输,JSON数据键名和形参对象属性名相同,定义POJO类型形参即可接收参数,controller方法需要使用@RequestBody注解

使用实体类对象接受
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
	System.out.println(user);
	return "OK";
}

传递形式

在这里插入图片描述

路径参数

通过请求URL传递参数,使用{}进行标识,需要使用@PathVariable注解获取路径参数

参数尽量使用包装类
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
	System.out.println(id);
	return "OK";
}

@RequestMapping("/path/{id}/{name}")
public String pathParam2(@PathVariable Integer id, @PathVariable
String name){
	System.out.println(id+ " : " +name);
	return "OK";
}

传递形式

在这里插入图片描述

响应

@RestController注解

包含@Controller注解和@ResponseBody注解

Controller注解声明类为控制器

ResponseBody将返回值解析为JSON或者XML格式

可以在controller类中响应一个实体对象或者集合

eg:

响应一个实体类对象

@RequestMapping("/simpleParam")
public String simpleParam( String name , Integer age){
	User user = new User();
    user.setName();
    user.setAge();
    return user;
}

响应一个集合

@RequestMapping("/list")
public ArrayList<String> simpleParam( String name , Integer age){
	ArrayList<String> list = new ArrayList<>();
    return list;
}
无论响应数据形式是什么,都应该以Result形式返回(统一规范)
Result
{
	Integer code//1:成功 0:失败
	String msg//响应码 描述字符串
	Object data//使用Object类型可以接收任意数据
    static Result success(data){
        //返回成功时的result
    }
    static Result error(msg){
        //返回失败时的result
    }
}

综合案例(解析xml文件传递到前端页面)

前端

页面绑定js数据,数据绑定钩子函数请求的数据

钩子函数:

mounted() {
       axios.get("/User").then(result=>(
            this.tableData=result.data.data
       ))
},

在组件加载阶段使用axios异步请求数据

后端

读取解析xml文件

String file = 
类名.class//获取字节码文件
.getClassLoader()//获取类加载器
.getResource()//获得资源
.File()//文件路径
XmlParserUtils.parse(file)对xml进行解析,得到一个对象集合

调用result里的success方法

返回成功对象

 return Result.success(list);

分层解耦

三层架构

数据访问->逻辑访问->请求处理

数据访问:

负责业务数据的维护操作,包括增,删,改,查等操作

逻辑处理:

负责业务逻辑处理的代码

请求处理,响应数据:

负责,接收页面的请求,给页面响应数据

按照三个组成部分,将代码分为三层
Controller(控制层)

接收前端发送的请求,对请求进行处理,并响应数据

Service(业务层)

处理具体的业务逻辑,对数据进行处理

Dao/Mapper(数据访问层/持久层)

负责数据的访问操作,包含数据的增删改查操作

分层解耦

内聚:软件中各个功能模块内部的功能联系

耦合:软件中各个层(模块)之间的依赖关联程度

IOC/DI技术(inversion of control/dependency injection)

IOC容器中管理的对象称为bean

@Component(加在实现类上)

@Primary有多个实现类对象时优先用被primary注解标注的

把实现类对象直接放入IOC容器中(控制反转)

@Autowired(加在声明对象语句上)

把IOC容器中的对象拿出来(依赖注入)

解决创建对象时产生的耦合

UserService a = new UserService();
//左侧通过实现接口实现多态进行解耦
//右侧通过IOC/DI思想解决
Bean的声明

把对象交给IOC容器管理,需要以如下注解代替@Component

Dao层->@Repository(自定义名字(默认类名小写))

Service层->@Service(自定义名字(默认类名小写))

Controller层->@Controller(自定义名字(默认类名小写))

其他类对象->@Componet(自定义名字(默认类名小写))

以上四大注解生效需要被组件扫描注解@ComponentScan扫描

默认扫描范围为引导类所在包以及其子包

Bean注入

@Primary优先使用本类对象

@Qualifier(“str”)选择名字为str的bean对象进行使用

由SpringBoot框架提供

@Resource(name=“str”)选择名字为str的bean对象使用

由java提供

rvice();
//左侧通过实现接口实现多态进行解耦
//右侧通过IOC/DI思想解决






#### Bean的声明

把对象交给IOC容器管理,需要以如下注解代替@Component

Dao层->@Repository(自定义名字(默认类名小写))

Service层->@Service(自定义名字(默认类名小写))

Controller层->@Controller(自定义名字(默认类名小写))

其他类对象->@Componet(自定义名字(默认类名小写))

以上四大注解生效需要被组件扫描注解@ComponentScan扫描

默认扫描范围为引导类所在包以及其子包



#### Bean注入

@Primary优先使用本类对象

@Qualifier("str")选择名字为str的bean对象进行使用

由SpringBoot框架提供

@Resource(name="str")选择名字为str的bean对象使用

由java提供



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

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

相关文章

前端用a标签实现静态资源文件(excel/word/pdf)下载

接上文实现的 前端实现将二进制文件流&#xff0c;并下载为excel文件后&#xff0c; 实际项目中一般都会有一个模版下载的功能&#xff0c;一般都由服务端提供一个下载接口&#xff0c;返回文件流或url地址&#xff0c;然后前端再处理成对应需要的类型的文件。 但是&#xff…

从3秒飞降至25毫秒:揭秘惊艳的接口优化策略!

大家好&#xff0c;最近看到京东云的一位大佬分享的接口优化方案&#xff0c;感觉挺不错的&#xff0c;拿来即用。建议收藏一波或者整理到自己的笔记本中&#xff0c;随时查阅&#xff01; 下面是正文。 一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xf…

如何学习思考能力?如何训练思考能力?思考不一样?问到底 对新敏感 主动 不怕试错 预测 独特一套

简单易行的方法&#xff1a;问到底 一个简单而有效的方法是使用"五个为什么"技术。当面临问题时&#xff0c;反复问自己为什么&#xff0c;至少问五次&#xff0c;以深入了解问题的根本原因。这有助于培养深入思考和分析问题的能力。 对新敏感 学习思考能力的关键…

PotatoPie 4.0 实验教程(23) —— FPGA实现摄像头图像伽马(Gamma)变换

为什么要进行Gamma校正 图像的 gamma 校正是一种图像处理技术&#xff0c;用于调整图像的亮度和对比度&#xff0c;让显示设备显示的亮度和对比度更符合人眼的感知。Gamma 校正主要用于修正显示设备的非线性响应&#xff0c;以及在图像处理中进行色彩校正和图像增强。 以前&am…

JAVA 中间件之 Mycat2

Mycat2应用与实战教程 1.Mycat2概述 1.1 什么是MyCat 官网&#xff1a; http://mycatone.top/ Mycat 是基于 java 语言编写的数据库中间件&#xff0c;是一个实现了 MySQL 协议的服务器&#xff0c;前端用户可以把它看作是一个数据库代理&#xff0c;用 MySQL 客户端工具和…

1. 房屋租赁管理系统(基于springboot/vue的Java项目)

1.此系统的受众 1.1 在校学习的学生&#xff0c;可用于日常学习使用或是毕业设计使用 1.2 毕业一到两年的开发人员&#xff0c;用于锻炼自己的独立功能模块设计能力&#xff0c;增强代码编写能力。 1.3 亦可以部署为商化项目使用。 2. 技术栈 jdk8springbootvue2mysq5.7&8…

C++ 动态链接库DLL创建及使用

一、动态链接库DLL创建 使用VS2022 创建 1、创建新解决方案 创建即可 2、创建动态链接库新项目 右键解决方案 语言选择C&#xff0c;选择动态链接库 填入项目名称&#xff0c;勾选&#xff1a;将解决方案和项目放在同一目录中 点击创建 3、创建后&#xff0c;显示dllmai…

西湖大学赵世钰老师【强化学习的数学原理】学习笔记2节

强化学习的数学原理是由西湖大学赵世钰老师带来的关于RL理论方面的详细课程&#xff0c;本课程深入浅出地介绍了RL的基础原理&#xff0c;前置技能只需要基础的编程能力、概率论以及一部分的高等数学&#xff0c;你听完之后会在大脑里面清晰的勾勒出RL公式推导链条中的每一个部…

使用frp实现内网穿透教程

文章目录 简介frp 是什么&#xff1f;为什么选择 frp&#xff1f; 概念工作原理代理类型 内网穿透教程服务端安装和配置本地Windows&#xff08;客户端&#xff09;安装和配置本地Linux虚拟机&#xff08;客户端&#xff09;安装和配置使用 systemd 管理服务端注意事项 简介 f…

Odoo:全球排名第一的免费开源PLM管理系统介绍

概述 利用开源智造OdooPLM产品生命周期管理应用&#xff0c;重塑创新 实现产品生命周期管理数字化&#xff0c;高效定义、开发、交付和管理创新的可持续产品&#xff0c;拥抱数字化供应链。 通过开源智造基于Odoo开源技术平台打造数字化的产品生命周期管理&#xff08;PLM&am…

MongoDB的安装(Linux环境)

登录到Linux服务器执行 lsb_release -a &#xff0c;即可得知服务器的版本信息为&#xff1a;CentOS 7。 # CentOS安装lsb_release包 [rootlinux100 ~]# sudo yum install redhat-lsb# 查看Linux版本 [rootlinux100 ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-…

redis7 for windows的安装教程

本篇博客主要介绍redis7的windows版本下的安装教程 1.redis介绍 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的&#xff0c;基于内存的数据结构存储系统&#xff0c;可用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串、哈希表、列…

Django中的事务

1 开启全局的事务 DATABASES {default: {ENGINE: django.db.backends.mysql, # 使用mysql数据库NAME: tracerbackend, # 要连接的数据库USER: root, # 链接数据库的用于名PASSWORD: 123456, # 链接数据库的用于名HOST: 192.168.1.200, # mysql服务监听的ipPORT: 3306, …

四、OSPF域间路由

注&#xff1a;区域&#xff08;area&#xff09;是以接口进行划分的 描述&#xff1a; R1的g0/0/1接口属于area 0 √ R1属于区域0和区域1 1.设计原则 1、OSPF区域的设计原则&#xff1a; 骨干区域有且只能存在一个 非骨干区域必须和骨干区域相连 多区域时&#…

【Linux实践室】Linux文件打包和解压缩实战指南:tar打包命令操作详解(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;打包2.1.1 &#x1f47b;知识点讲解2.1.2 &…

CTFHub Web 信息泄漏(一)

目录遍历 打开题目 点击开始寻找flag 发现在flag_in_here页面中有四个文件夹 点击打开第一个文件夹 发现里面还有四个文件夹 再次点击打开第一个文件夹 里面什么都没有 尝试对所有文件夹依次都点击打开 在2/4中发现flag.txt 点击打开即可得到flag 不太懂这题的难点&#…

碎碎念,最近做了几款小产品...

极简番茄时钟 一款 Mac 版「极简番茄时钟」软件。 知识卡片制作工具 主打简单&#xff0c;同时支持 Markdown 语法。 智能微信助手 让管理变得轻松&#xff0c;沟通更加高效。 感兴趣&#xff0c;欢迎来这里一起交流&#xff0c;限时免费 ~

揭示C++设计模式中的实现结构及应用——行为型设计模式

简介 行为型模式&#xff08;Behavioral Pattern&#xff09;是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 通过行为型模式&#xff0c;可以更加清晰地划分类与对象的职责&#xff0c;并…

(学习日记)2024.04.29:UCOSIII第五十三节:User文件夹函数概览(uC-LIB文件夹)第三部分

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

python升级打怪(3)

条件语句&#xff0c;如果if否则else还有一个elif 另外一个搭配是if if else&#xff0c;在Python当中缩进很重要&#xff0c;4个空格或者一个tab。看到缩进你就能知道他跟谁是同一级别的&#xff0c;然后这个:表示的是条件结束。在Python中负数%2它是大于等于1的&#xff0c;…