大家好,我是小谭。 上周我更新了一篇文章,对判断前端和后端bug扫了个盲。有的小伙伴读完后意犹未尽,并且不太明白这块的内容。 于是,我就着一个实际的项目和实际的例子,再跟大家再盘一次——后端bug定位的基本流程。 发起请求顾客来到餐厅点餐(在页面操作,向后端发起请求)。 项目介绍:宠物医院。用户可使用预约医生、浏览文章、商城购物等功能。项目介绍:分享一份适合写进简历的软件测试项目 结果:访问/reservation/doctorCanReserve页面查看预约医生时,查询结果为空。 这是实际工作中很常见的一个例子,当页面没有数据或者数据有误(实际结果和期望结果不一致),我们需要判断它到底有没有问题。 浏览器中打开F12,刷新页面,拿到url路径 Controller层:处理前端请求Controller是服务员,顾客点什么菜(发起的哪个接口请求),菜上给几号桌(走到后端的哪个逻辑),都是ta的职责。 打开项目代码,在IDEA中全局搜索(Edit->Find->Find in Path)上一步复制的url路径 controller的代码一般较为简单,也容易理解。在本段代码中,Controller层做了一些统计(88行定义对象,90-94循环运算,95组装统计结果)和if判断(91行判断了数据状态)。 关键内容在代码的第89行,它调用了UserService去获取可预约的医生列表。
按住ctrl加鼠标左键,跳转到的Service层。 Service层:定义和实现业务
一般来说,service是逻辑处理的核心代码。如果业务复杂,会写很多代码,例如这样: 但在本例中,UserService没做多少逻辑处理,只是按照MVC的设计,走了这一步。 于是,我们继续向下扒拉,点击左边的图标,跳转到接口实现层 再按住ctrl加鼠标左键,跳转进入 ServiceImpl又是什么?: 有的项目只使用了service,即service层=service类;有的项目会使用service+serviceImpl,即service层=service类+serviceImpl实现类。 这里需要面向对象的思维去理解它们,但你仍旧可以简单的理解为:前者一步搞定,但不方便拓展;后者虽然多了一步,但拓展性更强。归根到底,它们做着同一件事情——实现接口的内部逻辑。 Mapper:数据库映射Dao是厨房的小工,和原材料打交道的事情全是ta管(数据的增删查改,比如取a=1,b=2)。 此时,你应该想到一个问题:上层代码会处理列表,而列表得有一些数据,而数据一般存放在数据库里面,通过Sql语句进行增删查改。 此处想通,这里便容易理解了,mapper是打通(映射)代码和数据库的关键。 要找到具体的sql语句,需要到resource文件夹下找同名文件:UserMapper.xml。 为了方便跳转,我们可以安装一个IDEA小插件,安装之后左边就会出现跳转的按钮,直接访问对应的xml文件。 mapper.xml:存储sql语句在mapper.xml里面,便能看到具体的sql语句——他做了一个嵌套查询。 复制sql语句,去数据库里面执行,结果确实没有数据。 然后再拆分sql语句,分别查询嵌套内外的数据。结果, 最后本文拆解了一个简单的案例,只要你按照上面的这种思路操作几次,便能稍微熟悉常见的MVC系统。然后,在你后续一次次的练习和总结中,你会发现,很多不怎么复杂的业务系统,也就是增删查改而已,不然为什么有的开发大哥总会调侃自己是CRUD工程师呢。 原理如此,收藏这张图,没事的时候就拿来捋一捋吧。 另外,本文配套项目链接在这里。价优质好,可按需拍单: |
|