news 2026/5/11 15:35:11

简单认识JavaWeb的三层架构与分层解耦

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单认识JavaWeb的三层架构与分层解耦

1.示例

public class UserController { @RequestMapping("/list") public List<User> list() throws FileNotFoundException { //1.获取数据 InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt"); ArrayList<String> list = IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList<>()); //2.解析用户信息,封装为user对象 -> list集合 List<User> userList =list.stream().map(line -> { String[] items = line.split(","); Integer id = Integer.parseInt(items[0]); String username = items[1]; String password = items[2]; String name = items[3]; Integer age = Integer.parseInt(items[4]); LocalDateTime updateTime = LocalDateTime.parse(items[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); return new User(id,username,password,name,age,updateTime); }).toList(); // 3.返回数据 return userList; } }

缺点:功能不单一,复用性差,无法分层解耦,维护难等等

2. JavaWeb三层架构的核心组成(将示例代码分层解耦)

  • 表现层(Presentation Layer)
    • 职责:用户交互与请求处理(如Servlet、Controller)
    • 技术实现:Spring MVC、JSP/Thymeleaf等

示例:

package com.itheima.springbpptweb01.controller; import com.itheima.springbpptweb01.pojo.User; import com.itheima.springbpptweb01.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.FileNotFoundException; import java.util.List; @RestController // 包装了Conroller public class UserController { @Autowired private UserService userService; @RequestMapping("/list") public List<User> list() throws FileNotFoundException { // 1.调用service,获取数据 List<User> userList = userService.findAll(); //3.返回数据(josn) return userList; } }
  • 业务逻辑层(Service Layer)
    • 职责:核心业务规则与流程控制
    • 技术实现:Spring Service组件、事务管理

示例:

package com.itheima.springbpptweb01.service; import com.itheima.springbpptweb01.dao.UserDao; import com.itheima.springbpptweb01.dao.UserDaoImpl; import com.itheima.springbpptweb01.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @Service //@Component public class UserServiceImpl implements UserService{ @Autowired // 用多态创建UserDao private UserDao userDao; @Override public List<User> findAll() { // 1.调用dao层方法获取 数据 List<String> list = userDao.findAll(); //2.解析用户信息,封装为user对象 -> list集合 List<User> userList =list.stream().map(line -> { String[] items = line.split(","); Integer id = Integer.parseInt(items[0]); String username = items[1]; String password = items[2]; String name = items[3]; Integer age = Integer.parseInt(items[4]); LocalDateTime updateTime = LocalDateTime.parse(items[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); return new User(id,username,password,name,age,updateTime); }).toList(); return userList; } }
  • 数据访问层(DAO/Repository Layer)
    • 职责:数据持久化与数据库交互
    • 技术实现:JDBC、MyBatis、JPA/Hibernate

示例:

package com.itheima.springbpptweb01.dao; import cn.hutool.core.io.IoUtil; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @Repository // @Repository("userDao") 这是指定Bean的名字,IOC容器的,通常不用 //@Component public class UserDaoImpl implements UserDao{ @Override public List<String> findAll() { // InputStream in = new FileInputStream(new File("D:\\Java代码放置地\\JAVA_WEB\\web-ai-pj01\\maven-projectDemo1\\springbppt-web-01\\src\\main\\resources\\user.txt")) InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt"); ArrayList<String> list = IoUtil.readLines(in, StandardCharsets.UTF_8,new ArrayList<>()); return list; } }

通过三层架构便可达成高内聚低耦合的编程思想

3. 分层解耦的实现方法

  • 依赖注入(DI)与控制反转(IOC也称呼为Spring容器)
    • 通过Spring框架管理对象生命周期与依赖关系
    • 示例代码:@Autowired注解的使用

(1)Dao层注解(需要加@Repository注解)

(2) Service层注解(Service)

@Service

  • 用于标注业务逻辑层组件
  • 也是@Component的特化版本
  • 表示服务层业务逻辑

(3) Controller层注解

@Controller

  • 用于标注控制层组件
  • 处理HTTP请求
  • 通常与@RequestMapping配合使用

@Autowired 的作用

@Autowired是 Spring 框架提供的一个注解,用于实现依赖注入(Dependency Injection, DI)。它允许 Spring 容器自动将所需的依赖对象注入到目标组件中,无需手动编写代码来创建或查找依赖。

4. 分层架构的优势与挑战

  • 优势
    • 代码复用性高,各层职责单一
    • 便于团队协作与单元测试
    • 系统扩展性增强(如替换DAO实现不影响业务逻辑)
  • 挑战
    • 过度分层可能导致性能损耗
    • 层间调用规范需严格设计(如DTO传递)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 1:06:56

5分钟搞定!PPTTimer悬浮计时器:演讲时间管理的终极解决方案

5分钟搞定&#xff01;PPTTimer悬浮计时器&#xff1a;演讲时间管理的终极解决方案 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 还在为演讲超时焦虑不安&#xff1f;每次演示都像在和时间赛跑&#xff1f;P…

作者头像 李华
网站建设 2026/5/10 12:28:09

CH340芯片USB转串口驱动安装:新手教程(零基础必看)

CH340驱动安装全攻略&#xff1a;从零开始搞定USB转串口&#xff08;新手也能一次成功&#xff09; 你有没有遇到过这种情况&#xff1a;手里的开发板插上电脑&#xff0c;结果“设备管理器”里冒出来一个带黄色感叹号的“未知设备”&#xff1f;或者明明连上了&#xff0c;串口…

作者头像 李华
网站建设 2026/5/10 14:54:52

NCM解密终极指南:从加密困境到自由播放的全流程解决方案

NCM解密终极指南&#xff1a;从加密困境到自由播放的全流程解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经在网易云音乐购买了心爱的歌曲&…

作者头像 李华
网站建设 2026/5/10 11:18:58

cp2102 usb to uart bridge controller入门必看:手把手配置教程

手把手带你玩转 CP2102&#xff1a;从零开始配置 USB 转串口通信 你有没有遇到过这样的情况——手里的开发板、传感器或单片机项目需要通过串口调试&#xff0c;但笔记本却连一个 RS-232 接口都没有&#xff1f;别担心&#xff0c;这几乎是每个嵌入式工程师和电子爱好者的“入…

作者头像 李华
网站建设 2026/5/11 9:47:34

SMUDebugTool终极指南:5步掌握AMD Ryzen处理器硬件调试

SMUDebugTool终极指南&#xff1a;5步掌握AMD Ryzen处理器硬件调试 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…

作者头像 李华
网站建设 2026/5/9 12:25:15

AMD Ryzen系统调试终极指南:SMUDebugTool完全操作手册

AMD Ryzen系统调试终极指南&#xff1a;SMUDebugTool完全操作手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

作者头像 李华