从0开始学习Java+AI知识点总结-16.web基础知识

一、SpringBoot Web 入门开发

SpringBoot 简化了传统 Spring 应用的配置流程,通过 "约定大于配置" 的理念实现快速开发。以下是入门核心要点:

1. 工程创建与依赖配置

  • 工程初始化:通过 Spring Initializr 创建工程,选择Spring Web依赖(内置 Tomcat 服务器和 Spring MVC 核心组件)。
  • 核心依赖:在pom.xml中引入 SpringBoot 父工程和 Web 起步依赖,自动管理版本兼容:

<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>3.5.0</version>

</parent>

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

</dependencies>

  • 依赖作用spring-boot-starter-web包含 Spring MVC、嵌入式 Tomcat、JSON 解析等 Web 开发必需组件,无需手动配置。

2. 核心注解与启动机制

  • @RestController:组合@Controller@ResponseBody,标识类为请求处理控制器,方法返回值直接作为响应体(对象会自动转为 JSON)。
  • @RequestMapping:映射请求路径,指定方法处理的 URL(如@RequestMapping("/hello")处理/hello请求)。
  • @SpringBootApplication:启动类核心注解,包含组件扫描(@ComponentScan)、自动配置等功能,需放在项目根包下以确保注解扫描生效。
  • 启动流程:通过SpringApplication.run(启动类.class, args)启动内置 Tomcat,自动部署应用并监听默认端口(8080)。

3. 基础请求处理示例

// 控制器类

@RestController

public class HelloController {

    // 处理GET请求:/hello?name=xxx

    @RequestMapping("/hello")

    public String hello(String name) {

        return "Hello " + name + " ~";

    }

}

// 启动类

@SpringBootApplication

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

启动后访问http://localhost:8080/hello?name=Java,将返回Hello Java ~

二、HTTP 协议核心解析

HTTP(超文本传输协议)是 Web 通信的基础,规范了浏览器与服务器的数据交互格式。

1. 请求数据格式

HTTP 请求由请求行、请求头、请求体三部分组成:

  • 请求行:包含请求方法、资源路径、协议版本(如GET /hello?name=Java HTTP/1.1)。
  • 请求头:键值对格式,描述请求附加信息(如Host: localhost:8080User-Agent: 浏览器标识)。
  • 请求体:仅 POST 请求包含,存放请求参数(如 JSON 字符串)。
常见请求方法区别:

方法

特点

适用场景

GET

参数在 URL 中,无请求体,大小有限制(1-18KB)

数据查询

POST

参数在请求体中,无大小限制

数据提交(如表单、新增数据)

2. 响应数据格式

HTTP 响应由响应行、响应头、响应体三部分组成:

  • 响应行:包含协议版本、状态码、描述(如HTTP/1.1 200 OK)。
  • 响应头:键值对格式,描述响应附加信息(如Content-Type: application/json)。
  • 响应体:服务器返回的实际数据(如 HTML、JSON)。
状态码分类:
  • 1xx:临时响应(如 100 Continue)。
  • 2xx:成功(如 200 OK)。
  • 3xx:重定向(如 302 Found)。
  • 4xx:客户端错误(如 404 Not Found、401 Unauthorized)。
  • 5xx:服务器错误(如 500 Internal Server Error)。

3. 请求与响应数据处理

  • 获取请求数据:通过HttpServletRequest对象获取请求行、头、体数据:

@RequestMapping("/request")

public String handleRequest(HttpServletRequest request) {

    String method = request.getMethod(); // 请求方法(GET/POST)

    String uri = request.getRequestURI(); // 资源路径(/request)

    String userAgent = request.getHeader("User-Agent"); // 请求头

    String name = request.getParameter("name"); // 请求参数

    return "Method: " + method + ", URI: " + uri;

}

  • 设置响应数据:两种常用方式:
    1. 基于HttpServletResponse

@RequestMapping("/response1")

public void setResponse(HttpServletResponse response) throws IOException {

    response.setStatus(401); // 状态码:未授权

    response.setHeader("Custom-Header", "value"); // 响应头

    response.getWriter().write("<h1>Hello Response</h1>"); // 响应体

}

    1. 基于ResponseEntity(更优雅的响应封装):

@RequestMapping("/response2")

public ResponseEntity<String> setResponse() {

    return ResponseEntity.status(401)

            .header("Custom-Header", "value")

            .body("<h1>Hello Response</h1>");

}

三、SpringBoot Web 案例实践

以 "用户列表展示" 为例,掌握数据读取、解析、响应的完整流程。

1. 工程结构与依赖

  • 核心依赖:除 Web 依赖外,添加 Lombok(简化实体类)和 Hutool(工具类库):

<dependencies>

    <!-- Lombok -->

    <dependency>

        <groupId>org.projectlombok</groupId>

        <artifactId>lombok</artifactId>

    </dependency>

    <!-- Hutool工具类 -->

    <dependency>

        <groupId>cn.hutool</groupId>

        <artifactId>hutool-all</artifactId>

        <version>5.8.28</version>

    </dependency>

</dependencies>

  • 静态资源存放:前端页面(如 HTML、JS)需放在src/main/resources/static目录下,SpringBoot 会自动映射访问。

2. 实体类定义

使用 Lombok 注解简化 get/set、构造方法等代码:

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.AllArgsConstructor;

import java.time.LocalDateTime;

@Data // 生成get/set/toString等方法

@NoArgsConstructor // 无参构造

@AllArgsConstructor // 全参构造

public class User {

    private Integer id;

    private String username;

    private String password;

    private String name;

    private Integer age;

    private LocalDateTime updateTime;

}

3. 数据读取与响应

从文件读取用户数据并解析为 JSON 响应:

@RestController

public class UserController {

    @RequestMapping("/list")

    public List<User> getUserList() {

        // 1. 读取文件(user.txt放在resources目录下)

        InputStream in = UserController.class.getClassLoader().getResourceAsStream("user.txt");

        List<String> lines = IoUtil.readUtf8Lines(in, new ArrayList<>()); // Hutool工具类

        

        // 2. 解析数据为User对象

        List<User> userList = new ArrayList<>();

        for (String line : lines) {

            String[] parts = line.split(",");

            User user = new User();

            user.setId(Integer.valueOf(parts[0]));

            user.setUsername(parts[1]);

            user.setPassword(parts[2]);

            user.setName(parts[3]);

            user.setAge(Integer.valueOf(parts[4]));

            // 字符串转LocalDateTime

            user.setUpdateTime(LocalDateTime.parse(parts[5],

                DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

            userList.add(user);

        }

        return userList; // 自动转为JSON数组响应

    }

}

访问http://localhost:8080/list将返回用户列表 JSON 数据,前端页面可通过 AJAX 请求渲染。

四、分层架构与解耦设计

为提高代码复用性和可维护性,采用三层架构设计,遵循 "高内聚、低耦合" 原则。

1. 三层架构职责划分

  • Controller(控制层):接收前端请求,调用 Service 层处理业务,响应数据(专注请求 / 响应)。
  • Service(业务逻辑层):实现核心业务逻辑,协调 Dao 层数据操作(专注逻辑处理)。
  • Dao(数据访问层):负责数据读写操作(如文件、数据库),提供数据接口(专注数据访问)。

2. 分层实现示例

(1)Dao 层:数据访问接口与实现

// 接口

public interface UserDao {

    List<String> readUserLines(); // 读取原始数据行

}

// 实现类

public class UserDaoImpl implements UserDao {

    @Override

    public List<String> readUserLines() {

        InputStream in = UserDaoImpl.class.getClassLoader().getResourceAsStream("user.txt");

        return IoUtil.readUtf8Lines(in, new ArrayList<>());

    }

}

(2)Service 层:业务逻辑处理

// 接口

public interface UserService {

    List<User> getUserList(); // 获取用户列表

}

// 实现类

public class UserServiceImpl implements UserService {

    private UserDao userDao = new UserDaoImpl(); // 依赖Dao层

    

    @Override

    public List<User> getUserList() {

        List<String> lines = userDao.readUserLines(); // 调用Dao获取数据

        // 解析逻辑(同之前的解析过程)

        List<User> userList = new ArrayList<>();

        // ... 解析代码 ...

        return userList;

    }

}

(3)Controller 层:请求处理

@RestController

public class UserController {

    private UserService userService = new UserServiceImpl(); // 依赖Service层

    

    @RequestMapping("/list")

    public List<User> list() {

        return userService.getUserList(); // 调用Service获取数据

    }

}

3. 分层优势

  • 单一职责:每层专注自身职责,降低代码复杂度。
  • 复用性高:Service 和 Dao 层逻辑可被多个 Controller 复用。
  • 便于维护:需求变更时只需修改对应层代码(如数据来源从文件改为数据库,仅需修改 Dao 层)。

五、IOC 与 DI:控制反转与依赖注入

Spring 的核心思想是控制反转(IOC) 和依赖注入(DI),解决层间高耦合问题。

1. 核心概念

  • IOC(控制反转):对象的创建权从代码转移到 Spring 容器,由容器统一管理对象生命周期。
  • DI(依赖注入):容器在运行时自动将依赖对象注入到需要的类中,无需手动new对象。
  • Bean:被 IOC 容器管理的对象称为 Bean。

2. IOC 注解:将对象交给容器管理

使用注解声明 Bean,容器自动创建并管理:

注解

作用

适用场景

@Component

基础注解,声明 Bean

通用类

@Controller

@Component 衍生注解

控制层类

@Service

@Component 衍生注解

业务层类

@Repository

@Component 衍生注解

数据访问层类

示例:

@Repository // Dao层Bean

public class UserDaoImpl implements UserDao { ... }

@Service // Service层Bean

public class UserServiceImpl implements UserService { ... }

@RestController // Controller层Bean(组合@Controller和@ResponseBody)

public class UserController { ... }

3. DI 注解:依赖注入实现

通过注解让容器自动注入依赖对象,消除手动new的耦合:

  • @Autowired:默认按类型注入,容器自动查找对应类型的 Bean。

@Service

public class UserServiceImpl implements UserService {

    @Autowired // 注入UserDao类型的Bean

    private UserDao userDao; // 无需手动new

}

  • 多 Bean 冲突解决:当同一类型有多个 Bean 时,需指定注入目标:
    1. @Primary:在 Bean 上标记优先注入。

@Primary // 优先注入该Bean

@Service

public class UserServiceImpl implements UserService { ... }

    1. @Autowired + @Qualifier:按 Bean 名称注入。

@Service("userServiceA") // 指定Bean名称

public class UserServiceImpl implements UserService { ... }

@RestController

public class UserController {

    @Autowired

    @Qualifier("userServiceA") // 按名称注入

    private UserService userService;

}

    1. @Resource:JavaEE 规范注解,默认按名称注入,支持指定名称。

@RestController

public class UserController {

    @Resource(name = "userServiceA") // 按名称注入

    private UserService userService;

}

4. 组件扫描

  • @ComponentScan:指定容器扫描 Bean 的包路径,默认扫描启动类所在包及其子包。
  • @SpringBootApplication:已包含@ComponentScan,无需额外配置。

六、总结与最佳实践

  1. SpringBoot Web 开发:通过起步依赖和核心注解快速搭建应用,内置 Tomcat 简化部署。
  2. HTTP 协议:掌握请求 / 响应格式、状态码和方法区别,正确处理数据交互。
  3. 分层架构:按 Controller→Service→Dao 划分职责,提升代码复用性和可维护性。
  4. IOC/DI:使用注解声明 Bean 和注入依赖,消除硬编码耦合,降低维护成本。

通过本文系统学习,可夯实 Java Web 开发基础,掌握从入门到架构设计的核心技能。建议收藏本文,后续开发中遇到相关问题可随时查阅,关注作者获取更多技术干货!

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

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

相关文章

代码随想录Day51:图论(岛屿数量 深搜广搜、岛屿的最大面积)

一、实战 99岛屿数量 深搜 99. 岛屿数量 本题中每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成&#xff0c;也就是说斜角度链接是不算的。思路是用遇到一个没有遍历过的节点陆地&#xff0c;计数器就加一&#xff0c;然后把该节点陆地所能遍历到的陆地都标记上。在…

读取数据excel

import pandas as pd from datetime import datetimedef generate_questions():excel_path df pd.read_excel(excel_path)theme []time_list []tag1 []tag2 []tag3 []word_count 800questions []for index, row in df.iterrows():if isinstance(row[时间], datetime):…

前端环境安装

1.vsCode 下载链接&#xff1a;Visual Studio Code - Code Editing. Redefined 添加一个wiz code扩展&#xff08;提示你需要升级的依赖&#xff09; wiz code 使用方法 效果 2.git 下载链接&#xff1a;Git - Downloads 先下载 Homebrew&#xff08;https://brew.sh/ &a…

零基础学Java第十八讲---抽象类和接口(3)

续接上一讲 目录 一、内部类 1、内部类的分类 2、静态内部类 3、实例内部类---未被static修饰的成员内部类 4、局部内部类 5、匿名内部类 二、Object类 1、获取对象信息 2、equals方法 3、hashcode方法 一、内部类 当⼀个事物的内部&#xff0c;还有⼀个部分需要⼀个…

字节数据流

记录 干货&#xff5c;8000字长文&#xff0c;深度介绍Flink在字节跳动数据流的实践 字节跳动基于Flink的MQ-Hive实时数据集成

Vision Master的C#脚本与opencv联合编程

需要在VM的C#脚本设置string类型Out变量和float类型OutF变量&#xff0c;python的输出信息会在Out变量显示 using System; using System.IO; using Script.Methods; using System.Diagnostics; using System.Net.Sockets; using System.Text; using System.Threading;public pa…

运维工作架构流程搭建

前言 在解决了运维是干什么的&#xff0c;运维的工作的意义后&#xff0c;这一章我们系统性的讲讲运维工作流程搭建&#xff0c;希望大家能通过我的分享有所收获&#xff0c;这一章干货满满。 一、网络服务器架构 按照一般的访问方式&#xff0c;按照我自己的理解画了一个网络服…

安全存储之 SAES+HUK 使用技巧和常见问题 LAT1543

关键字&#xff1a;AES&#xff0c;SAES, HUK, DHUK, 安全存储 引言 近年来&#xff0c;嵌入式设备信息安全被越来越多地提及&#xff0c;从智能穿戴产品、智能工业设备到物联网产品都对设备信息安全提出了要求&#xff0c;比如基础的安全启动&#xff0c;安全升级&#xff0…

ubuntu 20.04 搭建多用户远程桌面共享及同时在线使用

使用效果: 物理机: 远程桌面用户: 实现过程: 1.使用脚本安装xrdp并修改配置及启动服务 setup_xrdp.sh sudo apt update sudo apt install xrdp -ysudo systemctl enable xrdp sudo systemctl start xrdp#sudo vim /etc/xrdp/startwm.sh #unset DBUS_SESSION_BUS_ADDRES…

[激光原理与应用-287]:理论 - 波动光学 - 电磁波既能承载能量,又能承载信息?

电磁波既能承载能量&#xff0c;又能承载信息&#xff0c;这一特性源于其物理本质和调制技术的结合。以下从能量承载和信息承载两方面进行详细解析&#xff1a;一、电磁波如何承载能量&#xff1f;电磁波的能量承载源于其电场和磁场的周期性振荡&#xff0c;具体机制如下&#…

哪里找最新AI工具官网?如何快速对比ChatGPT替代品?AI工具导航指南 - AIbase

你是否曾有这样的经历&#xff1a; 听闻某款新AI工具爆火&#xff0c;翻遍网络却找不到可靠官网或真实评测&#xff1f; 面对功能相似的ChatGPT替代品&#xff0c;参数对比表格散落各处&#xff0c;决策耗时耗力&#xff1f; 想紧跟AI领域突破&#xff0c;却淹没在海量资讯碎…

第一阶段C#基础-15:面向对象梳理

面向对象对象三&#xff08;四&#xff09;大特征&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;&#xff08;抽象&#xff09;1_封装&#xff08;1&#xff09;封装是指将数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;组合在一个类中&…

中国星网发展情况全面分析

中国星网作为我国卫星互联网领域的"国家队"先锋,自2021年4月成立以来已取得显著进展。截至2025年8月,中国星网主导的GW星座已累计发射73颗卫星,形成"四天两发"的高频发射节奏,标志着我国低轨卫星互联网建设进入加速期。在战略定位上,中国星网不仅承担…

C++ Qt 成员对象初始化与 TCP 长连接问题深度解析

文章目录C Qt 成员对象初始化与 TCP 长连接问题深度解析1. 栈对象、堆对象与类成员对象的区别1.1 栈对象&#xff08;局部变量&#xff09;1.2 堆对象&#xff08;动态分配&#xff09;1.3 类成员对象1.4 栈对象 vs 成员对象 vs 堆对象对比表2. 为什么初始化列表必须用2.1 构造…

深度学习周报(8.11~8.17)

目录 摘要 Abstract 1 CNN--卷积神经网络简介 2 CNN核心操作 2.1 卷积 2.2 池化 3 总结 摘要 本周主要学习了卷积神经网络&#xff08;CNN&#xff09;的相关知识&#xff0c;包括概念、基本架构与应用领域等知识&#xff0c;了解了CNN利用其结构高效地从图像等网格化数…

oracle dg duplicate限速

一些客户在搭建dg的时候需要进行限速&#xff0c;不然对生产库的影响比较大&#xff0c;例如将速度限制到200M每秒&#xff0c;语法如下&#xff1a;rman target sys/XXXX auxiliary sys/XXXXdg <<EOF run{ allocate channel d1 type disk rate 200M; allocate auxiliar…

飞算JavaAI智慧校园场景实践:从校园管理到师生服务的全链路技术革新

目录一、智慧校园核心场景的技术突破1.1 智能校园综合管理系统1.2 智慧教学资源共享系统1.3 校园生活服务集成系统二、智慧校园系统效能升级实践结语&#xff1a;重新定义智慧校园技术边界在校园管理领域&#xff0c;“规模化运营”与“个性化服务”的矛盾、“管理效率”与“服…

PTPX分析中,如何处理fsdb文件过大的问题?

PTPX分析中&#xff0c;如何处理fsdb文件过大的问题&#xff1f;摘要&#xff1a;下面将基于Synopsys工具链&#xff08;PrimeTime PX&#xff0c;即PTPX&#xff0c;用于功耗分析&#xff1b;Verdi&#xff0c;用于波形查看&#xff09;逐一解答每个部分。这些工具在SoC功耗验…

004.Redis 数据持久化概述及实战

文章目录Redis持久化说明Redis持久化RDB持久化AOF持久化混合持久化save与bgsaveRedis RDB持久化Redis 安装Redis RDB配置手动触发RDB持久化模拟写入测试数据模拟进程异常RDB的优缺点优势劣势Redis AOF持久化Redis 安装Redis AOF配置AOF持久化模拟写入测试数据模拟进程异常AOF的…

Kubernetes(K8s)常用命令全解析:从基础到进阶

Kubernetes&#xff08;K8s&#xff09;常用命令全解析&#xff1a;从基础到进阶 引言&#xff1a;为什么掌握K8s命令是云原生时代的必备技能&#xff1f; Kubernetes&#xff08;简称K8s&#xff09;作为容器编排的事实标准&#xff0c;已成为云原生应用部署、扩展和管理的核…