web的服务器资源:

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

SpringBoot Web入门

spring:官网spring.io

spring全家桶:

Spring Framework:spring框架,为依赖注入,事务管理,Web应用程序,数据访问等等提供核心支持。

Spring Boot:轻量化构建Spring应用程序,并尽可能地快速启动和运行。
Spring Data:为数据访问(关系,非关系,map-reduce)提供方法

Spring Cloud:为分布式系统的公共模式提供一组工具。对构建和部署微服务非常有用。
Spring Security:spring安全,通过全面且可扩展的身份验证和授权支持来保护应用程序。

spring全家桶是以Spring Framework(spring框架)为核心。

Spring Framework:配置繁琐,入门难度大。

Spring Boot:简化配置,快速开发。

Spring  Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率。(官方推荐,企业主流)

入门程序

入门程序
        需求:基于SpringBoot开发一个Web应用,浏览器发起请求/hello之后,给浏览器返回一个字符串”Hello XX“
        发起:http://localhost:8080/hello?name=zyx

        返回:Hello zyx

SpringBootP1Application是启动项
HelloController是运行的代码

package com.cyyweb.springbootp1;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController //标识当前是一个请求处理类
public class HelloController {@RequestMapping("/hello")public String hello(String name){System.out.println("Hello Controller ... hello : " + name);return "Hello " + name + "~";}}

运行结果:

入门程序剖析

依赖:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

 

spring-boot-starter-web用于web开发

spring-boot-starter-test用于单元测试


HTTP协议

HTTP协议,超文本传输协议,规定了浏览器和服务器之间数据传输的规范。

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

HTTP的请求数据

HTTP的请求数据格式

HTTP请求数据的三部分

请求行(请求数据的第一行)
请求头(key:value)
请求体(与请求头之间隔了一个空行)

HTTP的请求数据获取

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

HTTP的响应数据

HTTP响应数据格式

示例1:

        当访问http://www.baidu.com时,响应307,进行重定向。访问https://www.baidu.com。

示例2:

        当访问网站时,响应404,表示客户端不存在,或请求不存在的网站,或禁止访问。

示例3:

        当访问网站时,响应500,表示网站代码报错。

HTTP响应数据设置

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

SpringBoot Web案例

准备:

1.创建一个SpringBoot工程,并勾选web依赖、lombok

2.引入准备好的用户数据文件(user.txt),及前端静态页面(user.html)

3.定义一个实体类,用来封装用户信息

开发服务端程序,接受请求,读取文本数据并响应。

具体代码:

//controller包负责接受,请求,响应数据。
@RestController//@RestController=@Controller+@ResponseBody
public class UserController {//http://localhost:8080/user.html@RequestMapping("/list")public List<User> list()throws Exception{//1.加载并读取数据//InputStream in=new FileInputStream("C:\\ANzhuang\\JAVAP\\JavaWeb\\SpringBootWeb01\\src\\main\\resources\\user.txt");InputStream in=this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines=IoUtil.readLines(in,  "UTF-8", new ArrayList<>());//2.解析用户数据,封装成对象User->list集合List<User> userList=lines.stream().map(line->{String[] split=line.split(",");Integer id=Integer.parseInt(split[0]);String username=split[1];String password=split[2];String name=split[3];Integer age=Integer.parseInt(split[4]);LocalDateTime updateTime = LocalDateTime.parse(split[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id,username,password,name,age,updateTime);//return new User(Integer.parseInt(split[0]),split[1],split[2],split[3],Integer.parseInt(split[4]),null);}).toList();//3返回数据jsonreturn userList;}}

定义实体类:

运行启动项:

运行结果:

ResponseBody注解的作用

@ResponseBody->作用:将controller返回值直接作为响应体的数据直接响应;返回值是对象/集合->json->响应
1.将controler方法的返回值直接写入HTTP响应体
2.如果是对象或集合,会先转为json,再响应
3.@RestControler =@Controller + @ResponseBody

三次架构

三次架构:

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

pojo封装数据

controller:控制层

service:业务逻辑层

dao:数据访问层

过程:

pojo封装数据
controller接受请求,响应数据,调用service
service对数据进行逻辑处理,需要获取数据调用dao
dao数据的访问操作(增删改查),获取原始数据

运行结果:

 


分层解耦

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

软件设计原则:高内聚低耦合。

controler<-->service<-->dao

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

package com.cyyweb.service.impl;import com.cyyweb.dao.impl.UserDaoImpl;
import com.cyyweb.pojo.User;
import com.cyyweb.dao.UserDao;
import com.cyyweb.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;@Service//service层,逻辑处理层
//@Component //将当前类交给IOC容器管理
public class UserServiceImpl implements UserService {@Autowired//应用程序运行时,会自动的查询该类型的bean对象,并且赋值给该成员变量private UserDao userDao;@Overridepublic List<User> findAll() {//1。调用Dao,获取数据List<String> lines=userDao.findALl();//2.解析用户数据,封装成对象User->list集合List<User> userList=lines.stream().map(line->{String[] split=line.split(",");Integer id=Integer.parseInt(split[0]);String username=split[1];String password=split[2];String name=split[3];Integer age=Integer.parseInt(split[4]);LocalDateTime updateTime = LocalDateTime.parse(split[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id,username,password,name,age,updateTime);//return new User(Integer.parseInt(split[0]),split[1],split[2],split[3],Integer.parseInt(split[4]),null);}).toList();//3.返回数据return userList;}
}

        在容器中进行对象的创建,称为控制反转。

        当用户需要时,通过容器来进行对象的创建,称为依赖注入。

        在容器中创建的对象叫Bean

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

如何将一个类交给IOC容器管理?
Component(注意:是加在实现类上,而非接口上)
 

如何从IOC容器中找到该类型的bean,然后完成依赖注入?
@Autowired

IOC详解

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

        前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
        该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@springBootApplication中,默认扫描的范围是启动类所在包及其子包。

总结:

1,声明bean的注解有哪几个
@Controer
@Service
@Repository
@Component
2,注意事项
在Springboot集成web开发中,声明控制器bean只能用Controler。
声明bean的注解要想生效,需要被扫描到,启动类默认扫描当前包及其子包。

DI详解

基于@Autowired进行依赖注入的常见方式有如下三种:

1.属性注入

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

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

@RestController
public class UserController {@Autowiredprivate final UserService userService;}

2.构造函数注入

优点:能清晰地看到类的依赖关系、提高了代码的安全性。

缺点:代码繁项、如果构造参数过多,可能会导致构造函臃肿。

注意:如果只有一个构造函数,@Autowired注解可以省略。

@RestController
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService =userService;}
}

3.setter注入

优点:保持了类的封装性,依赖关系更清晰。

缺点:需要额外编写setter方法,增加了代码量。

@Restcontroller
public class Usercontroller {private UserService userService;@Autowiredpublic void setuserService(UserService userService) {this.userService = userService;}
}

Autowired注解,默认是按照类型进行注入的。
如果存在多个相同类型的bean,将会报错。

解决方法:

注:

@Resource与@Autowired区别
@Autowired是Spring框架提供的注解,而Resource是JavaEE规范提供的
@Autowired默认是按照类型注入,而@Resource默认是按照名称注入

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS通过urdf_to_graphiz对urdf和xacro文件进行结构可视化

对机器人的urdf文件进行结构可视化&#xff1a; 举例命令如下&#xff1a; urdf_to_graphiz go2_description.urdf 输出 .gv 和 .pdf文件&#xff0c;打开 pdf文件如图&#xff1a;

基于Uniapp+PHP的教育培训系统开发指南:网校源码实战剖析

在线教育日益普及的今天&#xff0c;如何快速搭建一个功能完善、体验良好的教育培训系统&#xff0c;成为众多教育机构、培训企业、个体讲师关注的焦点。与其从零开发&#xff0c;不如基于成熟框架快速部署。而UniappPHP正是当前“低成本高效率”开发网校系统的黄金组合。 本文…

键盘 AK35I Pro V2 分析

文章目录 AK35I Pro V21. MCU SN32F299SN32F299 内存映射 2. Bootloader3. TFT 135x240 1.14inch4. 键盘5. Flash PY25Q128HA6. 蓝牙 CH582F7. 扩展板8. 电池 606090 3.7V 4000mAh AK35I Pro V2 AK35I Pro V2 测评视频 键盘外壳使用卡扣固定, 外壳没有螺丝, 将外框向外翘起, 用…

11. TypeScript 工具类型

TypeScript 提供了一系列内置的“工具类型”&#xff08;Utility Types&#xff09;&#xff0c;它们是对已有类型进行变换的便捷方式。通过这些工具类型&#xff0c;开发者可以更灵活、可维护地进行类型设计&#xff0c;避免重复定义类型逻辑。 工具类型的作用主要有&#xf…

Kafka性能调优全攻略:从JVM参数到系统优化

前言 在大数据处理领域&#xff0c;Kafka以其高吞吐、高并发的特性成为消息队列的首选。然而&#xff0c;随着业务规模的扩大和数据量的激增&#xff0c;若配置不当&#xff0c;Kafka的性能和稳定性会受到严重影响。其中&#xff0c;JVM参数的调整是优化Kafka性能的关键一环&a…

HarmonyOS 5 NPU支持哪些AI框架?

以下是HarmonyOS 5 NPU支持的AI框架及适配方案&#xff0c;结合关键技术和实测数据&#xff1a; 一、原生支持框架 MindSpore Lite‌ ‌核心特性‌&#xff1a; 原生适配昇腾达芬奇架构&#xff0c;支持INT8/FP16混合量化自动算子融合优化&#xff08;实测推理速度提升3.2倍…

鸿蒙uvc预览

简单查看流程&#xff0c;如有错误请指出。 CameraNativePreview.ets--> 这里开始进入uvc_camera库 (CameraDevice.ets/CameraManager.ets) --> CameraUtils.ets--> -->CameraNativeMethods(index.d.ts文件&#xff0c;路径: uvc_camera\src\main\cpp\types\…

PHP的打印语句

文章目录 环境总结打印语句换行符括号数组&#xff08;对象&#xff09;和字符串之间的相互转换 打印语句echoprint括号print_rvar_dump 数组&#xff08;对象&#xff09;和字符串之间的转换json_encodejson_decodeimplodeexplode 环境 PHP 8.4.5 总结 如果不想看详细介绍&…

功率MOSFET的SOA曲线

功率MOSFET的SOA曲线 SOA区指的是MOSFET的安全工作区&#xff0c;英文表示为Safe Operating Area&#xff0c;是指MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09;的安全操作范围。在线性模式运行的情况下&#xff0c;SOA特别有用。但开关模式下&#xff0c;一般…

Stacking集成BP神经网络/RF/SVM和遗传算法的煤炭配比优化

一、煤炭配比优化的问题本质与技术路线 煤炭配比需同时满足煤质指标&#xff08;灰分、挥发分、热值&#xff09;、燃烧特性&#xff08;着火温度、燃尽指数&#xff09;、经济成本等多目标优化。传统方法依赖经验公式&#xff0c;难以处理非线性关系&#xff1a; 核心难点&a…

Unity Shader开发-着色器变体(2)-定义着色器变体

一.定义着色器变体 定义一个着色器变体&#xff08;Shader Variant&#xff09;从概念和实现上讲&#xff0c;主要包括以下几个核心部分 1.使用预编译指令来声明变体关键字 关键字是驱动变体生成的“开关”。它们是简单的字符串标识符&#xff0c;用于在 Shader 代码中标记不…

sql server耗时模拟

REATE PROCEDURE SimulateDelay AS BEGINPRINT 开始耗时操作...;-- 模拟等待 5 秒WAITFOR DELAY 00:00:05;PRINT 耗时操作完成。; END 方法二&#xff1a;使用忙循环(不推荐&#xff0c;CPU 占用高) CREATE PROCEDURE SimulateBusyLoop AS BEGINDECLARE start DATETIME GETDAT…

Zookeeper的典型应用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper的典型应用场景?】面试题。希望对大家有帮助&#xff1b; Zookeeper的典型应用场景? 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; Zookeeper 是一个分布式协调服务&#xff0c;广泛应用于需要高可用性、分…

STM32F103_LL库+寄存器学习笔记12.3 - 串口DMA高效收发实战3:支持多实例化的版本

导言 《STM32F103_LL库寄存器学习笔记12.2 - 串口DMA高效收发实战2&#xff1a;进一步提高串口接收的效率》基于上一个版本&#xff0c;进一步提升代码的模块化水平&#xff0c;支持多实例化。 如上所示&#xff0c;收发大量的数据&#xff0c;没有丢包。 项目地址&#xff1a…

跨平台的重构版Notepad++文本编辑器

跨平台 Notepad 替代方案 Notepad 是 Windows 平台上的流行文本编辑器&#xff0c;但其原生版本不支持跨平台。以下是功能相似且支持多平台的替代工具&#xff1a; Notepadqq&#xff08;Linux/macOS/Windows&#xff09; Notepadqq 是 Notepad 的开源跨平台版本&#xff0c…

意法STM32F103C8T6 单片机ARM Cortex-M3 国民MCU 电机控制到物联网专用

STM32F103C8T6 单片机全面解析 1. 产品定位 STM32F103C8T6 是意法半导体&#xff08;ST&#xff09;推出的 经典ARM Cortex-M3内核单片机&#xff0c;采用 LQFP48封装&#xff0c;以 高性能、丰富外设和超高性价比 成为嵌入式开发领域的"国民MCU"。 2. 核心功能特…

Sui 技术如何助力 Claynosaurz 成功推出 Popkins NFT

像 Claynosaurz 这样的品牌利用 Sui 推动链上创新的边界&#xff0c;展示了 Web3 如何结合互动娱乐并带来独特全新的体验。Claynosaurz 最近在 Sui 上推出的 Popkins NFT 系列及其大型抽奖活动&#xff0c;不仅在社区参与度上取得了成功&#xff0c;也有力地展示了 Sui 独特的技…

OpenCV CUDA模块设备层-----反正弦运算函数asin()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对一个 uchar 类型的像素值&#xff08;范围 [0, 255]&#xff09;&#xff0c;先归一化到浮点范围 [0.0, 1.0]&#xff0c;然后计算其反正弦值 …

PixiJS 中 HTMLText 富文本渲染问题探究与优化思考​

起因 在使用 PixiJS 进行富文本渲染开发过程中&#xff0c;遭遇 HTMLText 组件处理中文字体加载时出现显著卡顿现象。针对此问题&#xff0c;在开源社区提交 issue 并附上相关技术细节与运行表现&#xff0c;期望获得解决方案。 提issues 从 issue 反馈内容来看&#xff0c;项目…

五、Redis的IO模型

简介 在谈及Redis为什么快的时候&#xff0c;很多人都只能回答redis是基于内存&#xff0c;所以快。但他们往往不知道&#xff0c;决定redis快的因素&#xff0c;还有它的IO模型-Reactor模型。谈及Redis的IO模型之前&#xff0c;先补充一下IO模型的基础知识。 IO模型演化 1.堵塞…