【JavaWeb基础】三层架构

news2024/11/24 15:26:51

一、知识点整理

三层架构的含义

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

二、代码实现

原EmpController.java文件中的代码:

package com.example.controller;

import com.example.pojo.Emp;
import com.example.pojo.Result;
import com.example.service.EmpService;
import com.example.service.impl.EmpServiceA;
import com.example.utils.XmlParserUtils;
import com.fasterxml.jackson.annotation.JsonTypeId;
import jdk.jshell.spi.ExecutionControl;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class EmpController {


    @RequestMapping("/listEmp")
    public Result list(){

        //1、加载并解析emp.xml
        String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList= XmlParserUtils.parse(file,Emp.class);

        //2、对数据进行转换处理
        empList.stream().forEach(emp->{
            //book 1:十二钗正册,2:十二钗副册,3:十二钗又副册
            String book=emp.getBook();
            if("1".equals(book)){
                emp.setBook("十二钗正册");
            }
            else if("2".equals(book)){
                emp.setBook("十二钗副册");
            }
            else if("3".equals(book)){
                emp.setBook("十二钗又副册");
            }

            String job=emp.getJob();
            if("1".equals(job)){
                emp.setJob("夫人");
            }
            else if("2".equals(job)){
                emp.setJob("小姐");
            }
            else if("3".equals(job)){
                emp.setJob("丫鬟");
            }
        });

        //3、响应数据
        return Result.success(empList);
    }

}

将其进行分层处理:

 

1、Dao数据访问

package com.example.dao;

import com.example.pojo.Emp;

import java.util.List;

public interface EmpDao {
    //获取员工列表数据
    public List<Emp> listEmp();
}
package com.example.dao.impl;

import com.example.dao.EmpDao;
import com.example.pojo.Emp;
import com.example.utils.XmlParserUtils;

import java.util.List;

public class EmpDaoA implements EmpDao {
    @Override
    public List<Emp> listEmp() {
        //1、加载并解析emp.xml
        String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
        System.out.println(file);
        List<Emp> empList= XmlParserUtils.parse(file,Emp.class);
        return empList;
    }
}

2、Service逻辑处理

package com.example.service;

import com.example.pojo.Emp;

import java.util.List;

public interface EmpService {
    //获取员工列表
    public List<Emp> listEmp();
}
package com.example.service.impl;

import com.example.dao.EmpDao;
import com.example.dao.impl.EmpDaoA;
import com.example.pojo.Emp;
import com.example.service.EmpService;

import java.util.List;

public class EmpServiceA implements EmpService {
    //在service中调用dao
    private EmpDao empdao=new EmpDaoA();
    @Override
    public List<Emp> listEmp() {
        //1、调用dao,获取数据
        List<Emp> empList=empdao.listEmp();
        //2、对数据进行转换处理
        empList.stream().forEach(emp->{
            //book 1:十二钗正册,2:十二钗副册,3:十二钗又副册
            String book=emp.getBook();
            if("1".equals(book)){
                emp.setBook("十二钗正册");
            }
            else if("2".equals(book)){
                emp.setBook("十二钗副册");
            }
            else if("3".equals(book)){
                emp.setBook("十二钗又副册");
            }

            String job=emp.getJob();
            if("1".equals(job)){
                emp.setJob("夫人");
            }
            else if("2".equals(job)){
                emp.setJob("小姐");
            }
            else if("3".equals(job)){
                emp.setJob("丫鬟");
            }
        });
        return empList;
    }

}

3、Controller接收请求,响应数据

package com.example.controller;

import com.example.pojo.Emp;
import com.example.pojo.Result;
import com.example.service.EmpService;
import com.example.service.impl.EmpServiceA;
import com.example.utils.XmlParserUtils;
import com.fasterxml.jackson.annotation.JsonTypeId;
import jdk.jshell.spi.ExecutionControl;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class EmpController {

    //定义面向service层的对象
    private EmpService empService=new EmpServiceA();
    @RequestMapping("/listEmp")
    public Result list(){
        //1、调用service,获取数据
        List<Emp> empList=empService.listEmp();

        //3、响应数据
        return Result.success(empList);
    }

}
package com.example.pojo;

public class Result {
    private Integer code;//1:成功,0:失败
    private String msg;//提示信息
    private Object data;//数据
    public Result(){

    }
    public Result(Integer code,String msg,Object data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }
    public Integer getCode(){return code;}
    public void setCode(Integer code){this.code=code;}
    public String getMsg() {return msg;}
    public void setMsg(String msg) {this.msg = msg;}
    public Object getData() {return data;}
    public void setData(Object data) {this.data = data;}

    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    public static Result success(){
        return new Result(0,"success",null);
    }
    public static Result error(String msg){
        return new Result(0,msg,null);
    }

    @Override
    public String toString(){
        return "Result{"+
                "code="+code+
                ",msg="+msg+'\''+
                ",data="+data+
                "}";
    }
}

4、运行效果

三、总结

 三层架构优点:
1、复用性强
2、便于维护
3、利于拓展

四、学习教程

分层解耦https://www.bilibili.com/video/BV1m84y1w7Tb?p=76&spm_id_from=pageDriver&vd_source=841fee104972680a6cac4dbdbf144b50

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

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

相关文章

spring整合logBack日志框架:

1. SLF4J简介 SLF4J&#xff08;Simple Logging Facade for Java&#xff09;是一种日志规范&#xff0c;类似于JDBC&#xff0c;我们常用的日志log4j、logback等都实现了这个规范&#xff0c;所以我们可以直接使用SLF4J的规范来使用日志。 2. logback和log4j 它们是同一个作…

【hadoop】大数据的几个基本概念

大数据的几个基本概念 数据仓库的基本概念数据仓库与大数据OLTP与OLAP 数据仓库的基本概念 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。 本…

堆排序算法及其稳定性分析

堆排序算法及其稳定性分析 什么是堆排序&#xff1f; 堆排序是利用数据结构堆而设计的一种排序算法。 堆分为两种&#xff0c;大顶堆和小顶堆。 所谓大顶堆就是每个节点的值都大于或者等于其左右孩子节点的值。 小顶堆则是相反的&#xff0c;每个节点的值都小于或者等于其…

超全整理,接口测试实战详细(实例)一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、接口测试范围 …

Git无法上传删除 Commit里面有大文件

1.Bug描述 因为在一次提交中不小心把一个打包的aab文件弄到commit文件里了&#xff0c;于是在上传的时候push rejected 了。 因为GitHub的文件上限是100M&#xff0c;但是打的包太大了&#xff0c;有170M&#xff0c;所以是不能上传的&#xff0c;但是又是已经在Commit历史中了…

rsync增量备份工具

目录 一、概述 二、配置 rsync 源服务器 1.查看rsync配置文件位置 2.修改 /etc/rsync.conf 配置文件 3.为备份账户创建数据文件 4.保证所有用户对源目录都有读取权限 5.启动 rsync 服务 三、发起端 1.rsync命令 2.将指定的资源远程同步到本地/opt 目录下进行备份。 3.将…

【Docker】docker安装nginx及端口映射相关配置

前言&#xff1a; 最近&#xff0c;在一台新服务器上准备运行一个前端vue项目&#xff0c;服务器上安装了docker&#xff0c;想要尝试试通过docker安装nginx的并运行项目&#xff0c;以下是操作步骤 操作步骤&#xff1a; 一、安装nginx 1、拉取镜像 从docker仓库里拉取最…

unaipp打包app启动界面配置

1、配置代码 2、IOS端启动界面demo参考 iOS平台自定义storyboard启动界面 - DCloud问答

面试官当面夸奖了我,反手却把我挂了,这是什么套路?

最近几个朋友找我聊天&#xff0c;给我讲述了面试过程中遇到的一些不太理解的事情。我有个朋友作为一个技术面试官&#xff0c;今天来分享 10 个面试相关的套路。 1.自我介绍 自我介绍是一个重要的开始&#xff0c;好的开始是成功的一半。不需要太多花里胡哨的东西&#xff0…

SpringBoot05:自动配置原理

一、自动配置原理 SpringBoot官网 1、分析自动配置原理 以HttpEncodingAutoConfiguration&#xff08;Http编码自动配置&#xff09;为例解释自动配置原理 //表示这是一个配置类&#xff0c;和以前编写的配置文件一样&#xff0c;也可以给容器中添加组件 Configuration(prox…

解决阿里qiankun微应用资源无法加载

公司老项目多了&#xff0c;却想用新版本的框架&#xff0c;最好的解决办法就是用微前端。 本文说下我们在用阿里微前端框架qiankun&#xff0c;遇到的一些问题&#xff0c;以及一些巧妙的解决办法。 背景 因为接入微前端很长时间了&#xff0c;导致现在的微应用变成了实际意…

Python接口自动化测试之UnitTest详解

基本概念 UnitTest单元测试框架是受到JUnit的启发&#xff0c;与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化&#xff0c;配置共享和关机代码测试。支持将测试样例聚合到测试集中&#xff0c;并将测试与报告框架独立。 它分为四个部分test fixture、TestC…

【LeetCode】149. 直线上最多的点数

149. 直线上最多的点数&#xff08;困难&#xff09; 枚举直线 哈希表统计 思路 遍历每两个点之间的连线&#xff0c;然后计算这条连线上有多少个点。 具体步骤如下&#xff1a; 初始化最大点数为 0。遍历每个点&#xff0c;用它和其他点计算斜率。如果两个点的x坐标相同&…

7月大概率加息25bp!美股螺旋式下跌,加密市场“迎难而上”!

今年6月&#xff0c;美股标普500指数走出了自1948年以来最长的熊市&#xff0c;进入新的牛市&#xff0c;美联储暂停加息给全球资本市场一个喘息的机会。尽管如此&#xff0c;美国目前经济基本面的情况仍不及预期&#xff0c;股市其上涨态势恐怕将会迎来一轮调整。 以Solita Ma…

资深开发竟然不清楚int(1)和int(10)的区别

一、困惑 最近遇到个问题&#xff0c;有个表的要加个user_id字段&#xff0c;user_id字段可能很大&#xff0c;于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单&#xff0c;于是说&#xff1a;这int(1)怕是不够用吧&#xff0c;接下来是一通解释。…

做一个小程序需要多少钱

做一个小程序要多少钱&#xff0c;这种分2种类型 定制版 定制版就是按着客户的需求来做了。首先是聊需求&#xff0c;然后画思维导图&#xff0c;做原型图&#xff0c;做完原型图&#xff0c;就是做UI设计&#xff0c;然后做前端&#xff0c;后端。这个费用下来大概几千元到几…

Rust 第五天—代码组织管理

通过之前的内容介绍,对Rust或多或少有了一些了解.也许现在还不能写出“像样子”的项目,但是把大量代码堆积写在一个文件中依旧是不可取的.今天的内容相对轻松一些,聊聊Rust的包和模块 Rust的模块系统可以划分为Package,Crate,Module,具体可以总结如下: Package:整个项目Crate…

【hadoop】Linux安装和配置

安装 RedHat Linux 7.4 创建新的虚拟机 选择“自定义&#xff08;高级&#xff09;” 选择“下一步” 选择“稍后安装操作系统” 选择操作系统的类型 设置虚拟机名称和保存路径 下一步 下一步 设置网络类型&#xff0c;选择“使用仅主机模式网络” 下一步 下一步 下一步 设置硬…

pytorch笔记:归一化

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN layer normalization 是针对单个样本&#xff0c;训练和测试的时候行为一致LN 相对于 BN 更适合 RNN&#xff0c;可以降低训练时间LN 中不同样本有不同的归一化参数&#xff0c;以层计算 a 是输入&#xff0c;f 是每层具…