基于Springboot的web后端开发三层架构上手实操

引言

我们拿到了xml文件

我们要将将xml文件中的数据加载并解析

完成数据的处理

并且返回给前端页面(result格式)

1.将xml文件放在resources目录下

xml是我们需要解析的文件

 查看xml文件

2.在springboot中引入dom4j依赖

解析xml需要在springboot中引入dom4j依赖

这边我们在springboot工程中已经引入依赖并重新构建了maven

3.引入工具类XmlParserUtils

工具类放入java文件夹下的总包(公司域名反写)的util工具包下

这里引入的是一个解析xml文件的工具类XmlParserUtils

参数是xml文件路径和实例化的类的类型

返回值是list集合

package com.bigdate.threetier_architecture.util;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.lang.reflect.Constructor;
import java.util.*;
import java.io.File;
import java.util.ArrayList;public class XmlParserUtils{public static <T> List<T> parse(String file,Class<T> targetClass){ArrayList<T> list=new ArrayList<T>();try {//获取一个解析器对象SAXReader saxReader=new SAXReader();//利用解析器把xml文件加载到内存中 并且返回一个文档对象Document document=saxReader.read(new File(file));//获取到根标签Element rootElement =document.getRootElement();//通过根标签来获取user标签List <Element> elements=rootElement.elements("emp");//遍历集合,得到每一个user标签for(Element element:elements){//获得name属性String name=element.element("name").getText();//获得age属性String age=element.element("age").getText();//获得gender属性String gender=element.element("gender").getText();//获得job属性String job=element.element("job").getText();//组装数据Constructor<T>constructor=targetClass.getDeclaredConstructor(String.class,Integer.class,String.class,String.class);constructor.setAccessible(true);T object=constructor.newInstance(name,Integer.parseInt(age),gender,job);//把数据添加到集合里面去list.add(object);}} catch (Exception e) {e.printStackTrace();}return  list;}
}

4.编写实体类emp和统一响应结果类Result

不管是实体类还是统一响应结果类

我们都将其放在pojo包下

且都是用javabean封装的

实体类emp 标准的javabean 这样就能通过创建对象的方式封装emp的各属性

注意数据类型都是包装类

package com.bigdate.threetier_architecture.pojo;public class Emp {private  String name;private  Integer age;private String gender;private String job;public Emp() {}public Emp(String name, Integer age, String gender, String job) {this.name = name;this.age = age;this.gender = gender;this.job = job;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public Integer getAge() {return age;}/*** 设置* @param age*/public void setAge(Integer age) {this.age = age;}/*** 获取* @return gender*/public String getGender() {return gender;}/*** 设置* @param gender*/public void setGender(String gender) {this.gender = gender;}/*** 获取* @return job*/public String getJob() {return job;}/*** 设置* @param job*/public void setJob(String job) {this.job = job;}public String toString() {return "Emp{name = " + name + ", age = " + age + ", gender = " + gender + ", job = " + job + "}";}
}

统一响应结果result类

这个类主要是给前端页面一个统一响应的响应结果

统一后端返回对象

result类包含三个成员属性和三个静态方法

package com.bigdate.threetier_architecture.pojo;public class Result {private Integer code;//响应的状态码private String msg;//响应的信息 如successprivate Object data;//响应回的数据 数据类型为Objectpublic 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 String toString() {return "Result{code = " + code + ", msg = " + msg + ", data = " + data + "}";}//定义静态方法 帮助我们快速构建result对象//有数据时响应成功返回 会自动补齐其他参数public static Result success(Object data){return new Result(1,"success",data);}//没有任何数据返回 即使成功返回成员属性data也是null public static Result success(){return new Result(1,"success",null);}//响应的信息多种多样 仅仅返回响应信息 应该直接放到成员属性的位置public static Result success(String msg){return new Result(1,msg,null);}
}

 架构展示

5.数据 -- dao层

我们采用的面向接口的编程方式

先写规则接口 然后用实现类去填充

接口

package com.bigdata.dao;import com.bigdata.pojo.Emp;import java.util.List;/*
* 面向接口编程
* 接口的实现类必须重写接口里的所有方法
* 如应对以后我们从不同地方拿到数据 如xml 本地文件 数据库 服务器
* 所以我们先写接口 定义统一的规则 就是从哪里拿取数据
* 之后通过创建接口实现类的方式从指定地方拿取数据
* */public interface EmpDao {//获取员工列表数据public List<Emp> listEmp();
}

实现类实现了接口并重写了方法

加载了xml文件 调用工具类XmlParserUtils来解析

package com.bigdata.dao.impl;import com.bigdata.dao.EmpDao;
import com.bigdata.pojo.Emp;
import com.bigdata.util.XmlParserUtils;import java.util.List;//接口的实现类A
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmp() {//1.加载并解析xml文件String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> empList=XmlParserUtils.parse(file, Emp.class);return empList;}}

6.核心逻辑 -- service层

最主要的一层

接口 与刚刚一样 接口中只有一个属性 集合

说明我们在service层中的实现类中依然是要对 存储在list内的数据进行处理

package com.bigdata.service;import com.bigdata.pojo.Emp;import java.util.List;public interface EmpService {//获取员工列表数据public List<Emp>listEmp();
}

接口的实现类 处理代码的核心逻辑

其中我们的list集合从dao层获取

我们要获取的集合就是那个从service层接口的实现类已经处理好的集合

package com.bigdata.service.impl;import com.bigdata.dao.EmpDao;
import com.bigdata.dao.impl.EmpDaoA;
import com.bigdata.pojo.Emp;
import com.bigdata.service.EmpService;import java.util.List;public class EmpServiceA implements EmpService {//service层拿取集合要从dao层获取 调用dao获取数据private EmpDao empDao=new EmpDaoA();@Overridepublic List<Emp> listEmp() {//拿到dao对象List<Emp> empList=empDao.listEmp();//2.对数据进行转换处理empList.stream().forEach(emp ->{//处理genderString gender=emp.getGender();if(gender.equals("1")){emp.setGender("男");}else emp.setGender("女");//处理jobString job=emp.getJob();if(job.equals("1")){emp.setJob("学生");}else emp.setJob("老师");});return empList;}
}

7.控制器 -- controller层

不需要书写接口

我们将前dao层和service处理的数据已经放到集合里面去

我们要将集合返回 而这个集合去service层中去拿

service层的集合又是从dao层获取的并经过逻辑处理的

package com.bigdata.controller;import com.bigdata.pojo.Emp;
import com.bigdata.pojo.Result;
import com.bigdata.service.EmpService;
import com.bigdata.service.impl.EmpServiceA;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class Controller {private EmpService empService=new EmpServiceA();@RequestMapping("/listEmp")public Result list(){//调用service响应数据 再响应数据List<Emp> empList=empService.listEmp();//3.响应数据return Result.success(empList);}}

8.前端页面展示

启动spingboot

 访问本地网址 进行展示

总结

定义的每一个对外暴露的方法我们都称为功能接口

引号内的是功能接口的访问路径

如果用户从前端页面获取数据

先是给controller层发起响应

controller层向service层发起请求 

servece层向dao层拿取数据

dao层再去翻数据源

那我们的代码应该从这时候开始写

所以我们会选择先书写dao层的代码 

然后回调给service层 service再传递给controller层 

想了一晚上 所以我认为我们在实际后端开发中就是书写数据回调的代码

我们在书写三层架构的代码时是

先写接口 再写实现类

即面向接口编程 

接口的事项类必须重写接口中的所有方法

如我们以后从不同地方拿到数据 如数据库 云数据库 本地文件 服务器

所以我们先写接口定义统一的规则的 就是从哪里拿取数据 之后用实现类重写方法

三层架构分工明确利于书写

前一层的数据都是后一层获取的 而排在最最后的的是数据源 最前面的是前端页面

吐槽

草你爸 没有xml文件和工具类本多直接动手搓别让我再见类引入三字 累死了!

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

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

相关文章

Thread类的基本用法

1.线程创建 这里介绍线程创建常用的五种方法 1.继承Thread&#xff0c;重写run class MyThread extends Thread{public void run(){//这里写的代码就是线程要完成的任务while (true){System.out.println("hello thread");try {Thread.sleep(1000);//线程会休眠一秒…

二维码门楼牌管理应用平台建设:取保候审人员管理的新模式

文章目录 前言一、取保候审人员管理的新挑战二、二维码门楼牌管理应用平台的引入三、平台的功能与应用四、优势与挑战五、结论 前言 随着科技的不断进步&#xff0c;二维码门楼牌管理应用平台已成为城市管理的创新手段。特别是在取保候审人员管理领域&#xff0c;这一技术的应…

电视盒子哪款好?实体店主盘点畅销电视盒子排名

电视盒子功能丰富&#xff0c;是升级电视机最具性价比的方案。我本人做实体数码店多年来&#xff0c;电视盒子是店内销量最好的产品之一&#xff0c;最近很多网友在讨论电视盒子哪款好&#xff0c;我整理了店内销量最好的电视盒子排名&#xff0c;想买电视盒子可以看看下面这几…

海外盲盒App开发:探索全球惊喜,开启无限可能

一、前言 随着全球化的深入发展&#xff0c;人们对于不同文化、不同地域的商品充满了好奇与向往。盲盒文化&#xff0c;作为一种充满神秘与惊喜的消费方式&#xff0c;正逐渐在全球范围内受到热烈追捧。为了满足海外用户对于盲盒的需求&#xff0c;我们团队精心策划并开发了一…

读写锁ReentrantReadWriteLockStampLock详解

现实中有这样一种场景&#xff1a;对共享资源有读和写的操作&#xff0c;且写操作没有读操作那么频繁&#xff08;读多写少&#xff09;。在没有写操作的时候&#xff0c;多个线程同时读一个资源没有任何问题&#xff0c;所以应该允许多个线程同时读取共享资源&#xff08;读读…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者&#xff0c;我长期关注特殊群体的生活现状与科技助力下的改善举措。今天&#xff0c;我要讲述的是盲人朋友在独立出行&#xff0c;尤其是过马路时面临的挑战&#xff0c;以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能&#xff0c;显著提…

深入解读Dubbo:微服务RPC框架的佼佼者

在微服务盛行的今天&#xff0c;RPC&#xff08;远程过程调用&#xff09;框架的重要性日益凸显。Dubbo&#xff0c;作为阿里巴巴公司开源的一款高性能、轻量级的Java RPC框架&#xff0c;已经成为众多企业构建微服务架构的首选。作为一名资深的架构师&#xff0c;我深知Dubbo在…

IntelliJ IDEA 如何启用 JDK 预览特性

IntelliJ IDEA 也可以启用 JDK 的预览特性。 针对项目&#xff0c;选择项目结构。 配置是在语言结构上。 单击语言结构上的 SDK 默认&#xff0c;往下拉&#xff0c;就可以看到针对新版本的选项。 同时还可以看到那些版本是支持新特性预览的&#xff0c;那些版本是不支持新特…

Vue报错 Cannot read properties of undefined (reading ‘websiteDomains‘) 解决办法

浏览器控制台如下报错&#xff1a; Unchecked runtime.lastError: The message port closed before a response was received. Uncaught (in promise) TypeError: Cannot read properties of undefined (reading websiteDomains) at xl-content.js:1:100558 此问题困扰了…

多目标粒子群算法及其MATLAB实现

多目标粒子群优化&#xff08;Multi-Objective Particle Swarm Optimization, MOPSO&#xff09;算法是一种基于种群的优化算法&#xff0c;它结合了粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;和多目标优化的思想。多目标粒子群&#xff08;MOPSO&am…

PCL:投影滤波器

1.介绍 在点云处理中,投影滤波器是一种常用的工具,它可以将点云投影到给定的模型上,并保留投影后的点云数据。 投影滤波器主要应用于以下场景: 平面投影:将点云投影到一个已知的平面上,以获取平面上的点云数据。几何模型投影:将点云投影到已知的几何模型上,如圆柱体、…

IP地址信息——IP地址、子网掩码、默认网关和DNS

IP地址信息 通常来说&#xff0c;一个完整的IP地址信息应该包括IP地址、子网掩码、默认网关和DNS等4部分内容&#xff0c;只有当它们各司其职、协同工作时&#xff0c;我们才可以访问Internet&#xff0c;并被Internet中的计算机所访问。需要注意的是&#xff0c;采用静态IP地…

开发工具-pycharm的代码自动部署服务器以及服务端python配置、项目开发环境一键启动服务

文章目录 一、pycharm的ssh配置1.本地生成ssh密钥2.密钥配置到远端服务器(1-1) 有权限ssh访问到服务器(1-2) 无权限ssh访问到服务器(1-3) 没有办法通过以上形式上传到服务器(2) 配置到authorized_keys自动访问 3.pycharm中配置ssh(1) 选择File中的settings(1) 选择Tools中的SSH…

在 React Router v5 中,写子路由,父级路由如果加了exact属性,就显示不了子组件

在 React Router v5 中&#xff0c;当你在父级路由上使用 exact 属性时&#xff0c;它意味着该路由只有在其 path 完全匹配当前 URL 时才会被激活。这意味着&#xff0c;如果父级路由精确匹配了&#xff0c;React Router 就不会继续向下查找子路由&#xff0c;因为 exact 限制了…

js的算法-插入排序(折半插入排序)

直接插入排序的步骤 1. 从前面的有序子表中查找出待插入元素应该被插入的位置 2. 给插入位置腾空间 3. 将待插入元素复制到表中的插入位置。 直接插入排序&#xff1a;边比较边移动&#xff1b; 折半插入排序 先折半查找出元素的待插入位置&#xff0c;然后统一地移动待插…

上位机图像处理和嵌入式模块部署(树莓派4b之远程vnc桌面访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多嵌入式开发比较精通的同学来说&#xff0c;使用命令行和开发板之间进行沟通是他们完全能够接受的一种开发方式。但是对于更多的朋友来说&a…

AI编码prompt编写及内在逻辑

最近在做一个项目&#xff0c;涉及AI编码表和标准码表。那么什么AI编码表&#xff0c;什么是标准码表&#xff0c;AI编码表生成的逻辑是什么呢&#xff1f; 文章目录 1. 什么是AI编码表&#xff0c;什么是标准码表&#xff1f;2. AI编码码表的生成逻辑是怎么样的&#xff1f;3.…

0425DormAJAX项目

0425DormAJAX项目包-CSDN博客 数据库字段 添加界面&#xff1a; 初始状态&#xff1a; 点击性别&#xff0c;宿舍号使用ajax动态添加&#xff1a; 学生主界面&#xff1a; 实现分页查询&#xff1a; 点击修改学生宿舍&#xff0c;查看换寝记录&#xff0c;ajax动态显示列表&…

【设计模式】发布订阅模式,构建可以接收历史消息的观察者类

什么是发布订阅模式&#xff1f; 发布订阅模式也被称为观察者模式&#xff0c;这个模式中有两种角色&#xff1a;发布者&#xff08;被观察者&#xff09; 和 订阅者&#xff08;观察者&#xff09;。 通常的操作是&#xff1a;订阅者订阅发布者的某一个事件&#xff0c;发布…

C语言例题29:在屏幕上显示一个等腰三角形

#include <stdio.h>void main() {int i, j;int x;printf("输入等腰三角形行数&#xff1a;");scanf("%d", &x);for (i 1; i < x; i) {for (j i; j < x; j) {printf(" "); //输出空格占位}for (j 1; j < 2 * i; j) {printf…