Java三层框架的解析

引言:欢迎各位点击收看本篇博客,在历经很多的艰辛,我也是成功由小白浅浅进入了入门行列,也是收货到很多的知识,每次看黑马的JavaWeb课程视频,才使一个小菜鸡见识到了Java前后端是如何进行交互访问的,话不多说,进入正题。


目录

一.三层框架:

二.前后端交互过程:

 三.如何进行接口测试:

 四.三层架构的设计模式:

五.正式入门三层框架:

1.首先要写controller层:

2.service层的写法:

3.dao层的写法:


 

一.三层框架:

我们在进行程序开发时,应该遵守单一职责原则,意思就是尽可能让每个接口、类、方法的职责更单一,如果我们将整个后端代码放在一个包一个类中,不仅仅是代码的可阅读性差,而且代码冗杂,耦合度很高。

1. controller:控制层,负责接受前端发送来的请求,对请求进行处理,并相应数据。

2. service:业务逻辑层,处理具体实现的业务逻辑。

3. dao:数据访问层(持久层),负责数据访问操作,包括数据的增删改查。

二.前后端交互过程:

首先通过浏览器发起请求,经过DispatcherServlet(称为核心控制器或者前端控制器)将请求信息封装到HttpServletRequest这个对象内,然后再将这个请求转给后面的每个Controller程序,由Controller程序对其进行处理(Controller程序通过调用Service程序,然后再Service程序中调用Mapper程序,最后Mapper程序处理完返回给Service然后再返回给Controller),随后Controller程序将处理完的响应信息返回给DispatcherServlet的HttpServletResponse对象中,然后DispatcherServlet再给浏览器响应数据。这也就是BS架构,浏览器/服务器架构模式。

 三.如何进行接口测试:

我们在写完后端程序肯定需要进行测试来判断代码的准确性,但是如果我们没有前端页面进行测试,我们如何进行接口测试呢?这个时候就需要使用Postman或者Apifox来进行接口测试。

 四.三层架构的设计模式:

根据第一与第二点,我们初步理解了三层框架的进行顺序,那么三层框架该是什么样的创建形式呢?

根据上图,我们可以看到这个是基于Springboot来开发的,在java.com.itheima包下创建了四个包以及运行类,而这四个包分别装有其分别对应的类与接口。 

我们都知道接口是Java程序对类定义其规则,所以一般我们在开发的时候会现在接口内写入想要实现的方法名,然后再实现类中写出实现方法。 

五.正式入门三层框架:

在学习三层框架,我们都知道三层框架有controller,service,dao三层,所以咱们在写接口的过程要按照其实现顺序依次写入。

我们先在pom.xml导入依赖以及在application.properties中写入MySQL的驱动以及配置文件的相关信息,,然后在tlias数据库下创建一个Dept部门类和一个Emp员工类。

pom.xml文件导入依赖:1.Springboot 2.MySQL 3.Lombok 4.pagehelper(分页插件)

application.properties配置文件写法:

spring.application.name=tliasspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/tliasspring.datasource.username=rootspring.datasource.password=lxs15241690479mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImplmybatis.configuration.map-underscore-to-camel-case=true

1.首先要写controller层:

我们在写controller层之前要知道SpringBoot对注解的使用:

1. @ResponseBody:放在开头代表每个方法的返回值都会作为响应数据,如果是对象或者集合会先转为json格式然后再来响应。

2. @Controller:控制器组件

3. @RestController:主要由ResponseBody+Controller两个注解组成,也就会有这两个注解的作用。

4. @RequestMapping("url"):一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。

5. @***Mapping:这***是代表其有很多的样式,也就是要填入请求方式,如:Get,Post,Delete等。跟@RequestMapping差不多,但是使用这个注解就要跟随该注解前的请求方式才能够请求。

6. @RequestParam:

 用于将指定的请求参数赋值给方法中的形参。

有三个属性:
(1)value:请求参数名(必须配置)

(2)required:是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置)

(3)defaultValue:设置默认值,如果设置了该值,required 将自动设为 false,无论你是否配置了required,配置了什么值,都是 false(可选配置)

7.@PathVariable:

    @PathVariable是Rest风格衍生出的占位符,只支持一个属性value,类型是为String,代表绑定的属性名称。默认不传递时,绑定为同名的形参。 用来便捷地提取URL中的动态参数。应用时,在@RequestMapping请求路径中,将需要传递的参数用花括号{}括起来,然后,通过@PathVariable("参数名称")获取URL中对应的参数值。如果@PathVariable标明参数名称,则参数名称必须和URL中参数名称一致。

8. @Autowired:自动注入,上一篇Mybatis讲过,这里不细说。有需要了解请跳转:

Mybatis不明白?就这一篇带你轻松入门_mapper 新建一张表在哪里配置-CSDN博客

下面将@RequestBody放在前面的目的是为了简化写法,因为下面的@***Mapping()内都需要加上某url所以我们可以将/depts提前来简化写法,所以下面那个@GetMapping后面不是没有接口地址而是因为简化写法省略。

@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {@Autowiredprivate DeptService deptService;@GetMappingpublic Result list(){log.info("查询全部部门数据");List<Dept> deptList = deptService.list();return Result.success(deptList);}@DeleteMapping("/{id}")  //动态接收数据public Result delete(@PathVariable Integer id){log.info("根据id删除部门:{}" + id);deptService.delete(id);return Result.success();}@PostMappingpublic Result add(@RequestBody Dept dept){//json格式使用实体类接受log.info("新增部门:{}" , dept);deptService.add(dept);return Result.success();}}

有时我们为了接受大量的数据也会定义一个实体类然后使用@RequestBody注解进行接收。

然后我们在这些Controller程序的方法看见其内部紧跟随调用其对应的Service方法来操作所接收的数据,随后return返回一个Result类success方法。下面的是Result类->

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private Integer code;//响应码,1 代表成功; 0 代表失败private String msg;  //响应信息 描述字符串private Object data; //返回的数据//增删改 成功响应public static Result success(){return new Result(1,"success",null);}//查询 成功响应public static Result success(Object data){return new Result(1,"success",data);}//失败响应public static Result error(String msg){return new Result(0,msg,null);}
}

上面的三个注解不懂的可以看我上篇文章,里面详细写出了Mybatis的相关内容。

 既然我们会调用service进行操作,所以接下来我们就进行service的操作。

2.service层的写法:

@Service:Spring Framework 中的一种注解,它标识了这个类是一个业务逻辑层的服务 Bean。这意味着当 Spring 应用启动时,该 Bean 会被自动创建并加入到 Spring 应用上下文中。简而言之,@Service 注解是一种用于标记服务层 Bean 的注解,是在 Spring Boot 应用中实现业务逻辑复用的重要方法之一。

业务逻辑层,处理具体实现的业务逻辑(处理数据),我们需要再其内部加上很多的操作方法所以先写接口后写类。

接口内写入规则:

public interface DeptService {List<Dept> list();void delete(Integer id);void add(Dept dept);
}

然后创建其实体类:

@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Overridepublic List<Dept> list() {return deptMapper.list();}@Overridepublic void delete(Integer id) {deptMapper.deleteById(id);}@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}
}

我们发现这层的方法体内代码非常的少,是不是可以直接与Mapper合并一层?

nonono,绝对不行的,这样会破坏原本三层架构的完整与独立性,而且三层架构低耦合,并且其注解的独立使用也无法让你变成两层架构,其实这个只是当前的代码不用写很多代码,如果咱们以后写大程序就可以看出service层的重要,每一层都是不可缺少的。

3.dao层的写法:

对于dao层,主要通过注解或者xml来操作数据,这里需要用到Mybatis的基础,详情请看下面链接,有我码一万四千多字的博客:Mybatis不明白?就这一篇带你轻松入门_mapper 新建一张表在哪里配置-CSDN博客

@Mapper
public interface DeptMapper {@Select("select * from dept")List<Dept> list();@Delete("delete from dept where id = #{id}")void deleteById(Integer id);@Insert("insert into dept(name, create_time, update_time) value (#{name} , #{createTime} , #{updateTime})")void insert(Dept dept);
}

随后我们点击执行类运行程序,然后使用Postman或者Apifox进行测试接口,同时也要注意请求方式的使用以及路径的正确书写,我们一般写成localhost:8080/depts/......,剩下的就由你来完成了。


最后,我们可以看出三层框架很简单,但是内部用到了很多知识点,这就需要咱们多学多练多观察,别忘了点个关注,多多支持,记得三连哈,有问题欢迎在评论区里留言。

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

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

相关文章

项目实训-vue(十二)

项目实训-vue&#xff08;十二&#xff09; 文章目录 项目实训-vue&#xff08;十二&#xff09;1.概述2.处理进度可视化 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.处理进度可视化 除了导航栏之外&#xff0c;我们还需要对上传图片以及图片处理的过程以及流程进行…

数据结构-----【链表:刷题】

-------------------------------------------基础题参照leetcode---------------------------------------------------------------------------------------------------------- 【2】两数相加 /*** Definition for singly-linked list.* struct ListNode {* int val;…

浦语·灵笔2 模型部署图片理解实战

效果图镇楼 1、使用 huggingface_hub 下载模型中的部分文件&#xff08;演示练习与模型实战无关&#xff09; 使用 Hugging Face 官方提供的 huggingface-cli 命令行工具。安装依赖: pip install -U huggingface_hub 然后新建 python 文件&#xff0c;填入以下代码&#xf…

upload-labs第14关

upload-labs第14关 第十四关一、源代码分析代码审计 二、绕过分析a. 制作图片码首先需要一个照片&#xff0c;然后其次需要一个eval.php。 b.上传图片码上传成功 c.结合文件包含漏洞进行访问访问&#xff1a;http://192.168.1.110/upload-labs-master/include.php?filehttp://…

封装了一个iOS联动滚动效果

效果图 实现逻辑和原理 就是在 didEndDisplayingCell 方法中通过indexPathsForVisibleItems 接口获取当前可见的cell对应的indexPath&#xff0c; 然后获取到item最小的那一个&#xff0c;即可&#xff0c;同时&#xff0c;还要在 willDisplayCell 方法中直接设置标题的选中属…

cropperjs 裁剪/框选图片

1.效果 2.使用组件 <!-- 父级 --><Cropper ref"cropperRef" :imgUrl"url" searchImg"searchImg"></Cropper>3.封装组件 <template><el-dialog :title"title" :visible.sync"dialogVisible" wi…

Steam怎么卸载DLC Steam怎么只卸载DLC不卸载游戏教程

我们玩家在steam中玩游戏&#xff0c;有一个功能特别重要&#xff0c;那就是DLC&#xff0c;其实也就是一款游戏的扩展&#xff0c;很多游戏都有DLC&#xff0c;让游戏玩法特别丰富&#xff0c;比如都市天际线的DLC&#xff0c;给城市中就增加了很多建筑&#xff0c;或者更便捷…

web前端——CSS

目录 一、css概述 二、基本语法 1.行内样式表 2.内嵌样式表 3.外部样式表 4.三者对比 三、选择器 1.常用的选择器 2. 选择器优先级 3.由高到低优先级排序 四、文本,背景,列表,伪类,透明 1.文本 2.背景 3.列表 4.伪类 5.透明 五、块级,行级,行级块标签, dis…

Redis集群-计算key的插槽值等命令

文章目录 1、集群方式登录主机63792、计算key应该保存在那个插槽3、计算某个插槽中保存的key的数量4、返回指定槽中的键5、查看redis的版本5.1、Redis集群的自动故障转移5.2、主节点下线&#xff0c;从节点自动升为主节点5.2.1、杀死主节点63795.2.2、登录从机6383&#xff0c;…

AI大模型企业应用实战-Prompt让LLM理解知识

1 Prompt Prompt 可理解为指导AI模型生成特定类型、主题或格式内容的文本。 NLP中&#xff0c;Prompt 通常由一个问题或任务描述组成&#xff0c;如“给我写一篇有关RAG的文章”&#xff0c;这句话就是Prompt。 Prompt赋予LLM小样本甚至零样本学习的能力&#xff1a; LLM能力…

【网络安全学习】漏洞扫描:-03- Nikito与Wapiti漏洞扫描的使用

1️⃣ Nikto漏洞扫描 Nikto是一个开源的Web扫描评估程序&#xff0c;它可以对目标Web服务器进行快速而全面的检查&#xff0c;以发现各种潜在的安全问题和漏洞。 &#x1f170;️ 如何使用 ❓ nikto -Display 1234ep -h [域名或IP地址] -o nikto.html # -h参数&#xff1a;指…

南昌服务器托管让数据存储更安全

南昌&#xff0c;作为长江中游地区的重要中心城市&#xff0c;近年来经济发展迅速&#xff0c;产业结构不断优化。随着大数据、云计算、人工智能等新一代信息技术的快速发展&#xff0c;南昌的信息化建设步伐不断加快&#xff0c;为企业提供了良好的发展环境。在这样的背景下&a…

通过迭代器删除容器中的元素

通过之前的介绍我们知道通过迭代器来遍历单例集合的操作仍然需要借助于循环结构。而且我们知道在单例集合中调用iterator方法返回的Iterator对象中还有一个remove方法我们没有介绍&#xff0c;它的作用是删除容器中的元素。说道这里应该有人会发现一个很明显的问题&#xff0c;…

[MySql]两阶段提交

文章目录 什么是binlog使用binlog进行恢复的流程 什么是redolog缓冲池redologredolog结构 两阶段提交 什么是binlog binlog是二进制格式的文件&#xff0c;用于记录用户对数据库的修改&#xff0c;可以作用于主从复制过程中数据同步以及基于时间点的恢复&#xff08;PITR&…

Webpack: 借助 Babel+TS+ESLint 构建现代 JS 工程环境

概述 Webpack 场景下处理 JavaScript 的三种常用工具&#xff1a;Babel、TypeScript、ESLint 的历史背景、功能以及接入 Webpack 的步骤借助这些工具&#xff0c;我们能构建出更健壮、优雅的 JavaScript 应用 使用 Babel ECMAScript 6.0(简称 ES6) 版本补充了大量提升 JavaSc…

互联网应用主流框架整合之Spring Boot运维体系

先准备个简单的系统&#xff0c;配置和代码如下 # 服务器配置 server:# 服务器端口port: 8001# Spring Boot 配置 spring:# MVC 配置mvc:# Servlet 配置servlet:# Servlet 的访问路径path: /sbd# 应用程序配置application:# 应用程序名称name: SpringBootDeployment# 配置数据…

第 133 场 LeetCode 双周赛题解

A 使所有元素都可以被 3 整除的最少操作数 遍历 n u m s nums nums &#xff0c;每有一个不被 3 3 3 整除的数&#xff0c;则操作数加 1 1 1 class Solution {public:int minimumOperations(vector<int>& nums) {int res 0;for (auto x : nums)if (x % 3 ! 0)res…

杂记 | 搭建反向代理防止OpenAI API被封禁(对于此次收到邮件提示7月9日后将被屏蔽的解决参考)

文章目录 重要声明&#xff08;免责&#xff09;01 OpenAI封禁API的情况02 解决方案及原理2.1 原因分析2.2 解决方案2.3 步骤概述 03 操作步骤3.1 购买一个海外服务器3.2 申请一个域名3.3 将域名指向代理服务器3.4 在代理服务器上安装nginx3.5 配置反向代理 重要声明&#xff0…

网工内推 | 深圳网工,国企,最高20k,六险一金,NA以上认证

01 沛顿科技&#xff08;深圳&#xff09;有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1、负责网络设备管理及维护&#xff0c;确保网络系统的稳定运行&#xff1b; 2、负责有效规划及实施网络布线系统&#xff1b; 3、负责服务…

LV、古驰奢侈品跌落神坛!2024消费风向彻底变天!2024创业新风口!2024创业小成本项目!

LV下滑6%、古驰暴跌28%&#xff0c;奢侈品在华越来越卖不动&#xff0c;外媒开始着急了&#xff01;就在前段时间&#xff0c;美媒罕见发声&#xff0c;表示今年1季度特别困难&#xff0c;有奢侈品公司在华负增长高达30%。还说如何提升销量&#xff0c;是当下奢侈品牌在华的头等…