当前位置: 首页 > backend >正文

【黑马JavaWeb+AI知识梳理】后端Web基础02 - Web基础

Web基础知识

  • 静态资源:服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。比如:HTML、CSS、JS、图片、视频等(负责页面展示)
  • 动态资源:服务器端根据用户请求和其他数据动态生成的,内容可能会在每次请求时都发生变化。比如:Servlet、JSP等(负责逻辑处理),上述两个已被淘汰,目前主流为Spring框架。
  • B/S架构:Browser/Server,浏览器/服务器架构模式。客户端只需浏览器,应用程序的逻辑和数据都存在服务器端。(维护方便,体验一般)
  • C/S架构:Client/Server,客户端/服务器架构模式。需要单独开发维护客户端。(体验不错 开发维护麻烦)

SprintBootWeb入门

Spring

[官方网站](Spring | Home)

Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能

Spring Boot可以帮助我们非常快速地构建应用程序、简化开发、提高效率。

入门程序

需求:基于SpringBoot开发一个Web应用,浏览器发起请求/hello之后,给浏览器返回一个字符串“Hello Xxx”

  • 创建springboot工程,并勾选web开发相关依赖。
  • 定义HelloController类,添加方法hello,并添加注解。
    • RestController
    • RequestMapping
  • 运行启动类,测试

Spring官方脚手架连接不上解决方案:start.aliyun.com

入门程序剖析

启步依赖:

  • spring-boot-starter-web:包含了Web应用开发所需要的常见依赖
    内嵌了tomcat

  • spring-boot-starter-test:单元测试所需要的常见依赖

HTTP协议

概述

Hyper Text Transfer Protocal,超文本传输协议,规定了浏览器(请求)和服务器(响应)之间数据传输的规则。

特点:

  • 基于TCP协议:面向连接,安全
  • 基于请求-响应模型的:一次请求对应一次响应
  • HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的
    • 缺点:多次请求间不能共享数据
    • 优点:速度快

请求协议

请求数据格式

请求方式-GET:请求参数在请求行中,没有请求体。GET请求大小在浏览器中是有限制的。

请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的。

  • 请求行:请求数据第一行(请求方式、资源路径、协议)

  • 请求头:第二行开始,格式key: value

    请求头含义
    Host请求的主机名
    User-Agent浏览器版本
    Accept表示浏览器能接受的资源类型,如text/*, image/*或者*/*表示所有
    Accept-Language表示浏览器偏好的语言,服务器可以据此返回不同语言的网页
    Accept-Encoding表示浏览器可以支持的压缩类型,例如gzip,deflate等
    Content-Type请求主体的数据类型
    Content-Length请求主体的大小(单位:字节)
  • 请求体:POST请求,存放请求参数

    和请求头有一行空行

请求数据获取

HTTP请求数据不需要程序员自己解析

HttpServletRequest对象里封装了所有的请求信息

Web服务器(Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServletRequest),在调用Controller方法的时候传递给了该方法。这样就使得程序员不必直接对协议进行操作,让Web开发更加便捷。

响应协议

响应数据格式
  • 响应行:响应数据第一行(协议、状态码、描述)

    重点关注200(客户端请求成功)、404(请求资源不存在,URL输入有误或者网站资源被删除)、500(服务器发生不可预期的错误)

    类别含义
    1xx响应中-临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。
    2xx成功-表示请求已经被成功接收,处理已完成。
    3xx重定向-重定向到其他地方,让客户端再发起一次请求以完成整个处理。
    4xx客户端错误:处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等。
    5xx服务器错误:处理发生错误,责任在服务器。如:程序抛出异常等。
    响应头含义
    Content-Type表示该响应内容的类型。
    Content-Length表示该响应内容的长度(字节数)。
    Content-Encoding表示该响应压缩算法,例如gzip。
    Cache-Control指示客户端应如何缓存,例如max-age=300表示最多缓存300秒。
    Set-Cookie告诉浏览器为当前页面所在的域设置cookie。
  • 响应头:第二行开始,格式key: value

  • 响应体:最后一部分,存放响应数据

    和响应头有一行空行

响应数据设置

响应状态码和响应头如没有特殊要求,通常不手动设定,服务器会根据请求处理的逻辑,自动设置响应状态码和响应头

Web服务器(Tomcat)对HTTP协议的响应数据进行了封装(HttpServletResponse),并在调用Controller方法的时候传递给了该方法。这样就使得程序员不必直接对协议进行操作,让Web开发更加便捷。

SpringBootWeb案例

静态资源文件存放位置:resources/static

@RestController(@Controller+@ResponseBody)封装了ResponseBody -> 作用:将controller返回值直接作为HTTP响应体的数据直接响应;返回值是对象/集合 -> json ->响应

  • 准备工作:
    • 创建一个SpringBoot工程,并勾选web依赖、lombok
    • 引入资料中的用户数据文件(user.txt),及前端静态页
    • 定义一个实体类,用来封装用户信息
  • 开发服务端程序,接收请求,读取文本数据并响应
  • 问题及解决
    • 实际参数列表和形式参数列表长度不同:pom.xml中给Lombok出现的三个位置指定<version>

分层解耦

**为什么要对代码进行拆分?**复用性差、难以维护

三层架构

数据访问、逻辑处理、接收请求&响应数据 --> 遵循单一职责原则,便于复用、后期维护

  • controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
  • service:业务逻辑层,处理具体的业务逻辑。
  • dao:数据访问层(Data Acces Object)(持久层),负责数据访问操作,包括数据的增删改查。

分层解耦

  • 耦合:衡量软件中各个层/各个模块的依赖关联程度。
  • 内聚:软件中各个功能模块内部的功能联系
  • 软件设计原则:高内聚低耦合

控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

Bean对象:IOC容器中创建、管理的对象,称之为Bean

实现分层解耦的思路:

  • 将项目中的类交给IOC容器管理(IOC,控制反转)
  • 应用程序运行时需要什么对象,直接依赖容器为其提供(DI,依赖注入)

IOC与DI入门

  1. 将Dao及Service层的实现类,交给IOC容器管理。

    实现类加@Component注解

  2. 为Controller及Service注入运行时所依赖的对象。

    成员变量加@Autowired注解

IOC&DI详解

IOC详解

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

声明bean的时候,可以通过注解的value属性指定bean的名字,如果没有指定,默认为类名首字母小写。

注解说明位置
@Component声明bean的基础注解不属于以下三类时,用此注解
@Controller@Component的衍生注解标注在控制层类上
@Service@Component的衍生注解标注在业务层类上
@Repository@Component的衍生注解标注在数据访问层类上(用于与mybatis整合,用得少)
  • 在Springboot集成web开发中,声明控制器bean只能用@Controller
  • 声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  • 该注解虽然没有显式配置,但实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描范围是启动类所在包及其子包
DI详解
  • 基于@Autowired进行依赖注入的常见方式:

    • 属性注入(实际应用多)

      • 优点:代码简洁、方便快速开发

      • 缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性

      • 构造函数注入(Spring官网推荐)

        • 优点:能清晰地看到类的依赖关系、提高了代码的安全性。
        • 缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。
        • 如果只有一个构造函数,@Autowired注解可以省略
    • setter注入

      • 优点:保持了类的封装性,依赖关系更清晰。
        • 缺点:需要额外编写setter方法,增加了代码量
  • @Autowired注解,默认是按照类型进行注入的。

  • 如果存在多个相同类型的bean,将会报错。

    • 方法一:@Primary

    • 方法二:@Qualifier

      和@Autowired搭配

    • 方法三:@Resource

  • Resource和Autowired区别:

    • @Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的
    • @Autowired默认是按照类型注入,而@Resource默认是按照名称注入
http://www.xdnf.cn/news/3675.html

相关文章:

  • 街景主观感知全流程(自建数据集+两两对比程序+Trueskill计算评分代码+训练模型+大规模预测)20
  • Winform(8.常用控件1)
  • 电商平台的订单状态设计流程
  • QT中的QSS---界面美化
  • 时间给了我们什么?
  • 本地服务验证-仙盟创梦IDE-智能编程,编程自动备份+编程审计
  • C++开发指南
  • MyBatis 参数处理全解析
  • AI大模型-RAG到底能做些什么?
  • 变色龙-第16届蓝桥第5次STEMA测评Scratch真题第1题
  • 52、【OS】【Nuttx】【OSTest】setvbuf 测试
  • 正态分布全景解析:理论、推导与应用
  • Linux-sysctl工具解析
  • 《AI大模型应知应会100篇》第44篇:大模型API调用最佳实践(附完整代码模板)
  • GC9D01 和 GC9A01两种TFT 液晶显示驱动芯片
  • Set的局限性
  • C#将Mat或Byte快速转换为Bitmap格式
  • 组件通信-provide、inject
  • maven install时报错:【无效的目标发行版: 17】
  • 多模态大模型轻量化探索-视觉大模型SAM(Segment Anything Model)
  • C++11新特性_标准库_智能指针_std::weak_ptr
  • MATLAB技巧——norm和vecnorm两个函数讲解与辨析
  • Linux的环境变量
  • “会话技术”——Cookie_(2/2)原理与使用细节
  • [更新完毕]2025五一杯C题五一杯数学建模思路代码文章教学:社交媒体平台用户分析问题
  • Linux 信号
  • 反射机制补充
  • 滥用绑定变量导致Oracle实例宕机
  • Python数据结构与算法
  • [面试]SoC验证工程师面试常见问题(一)