一、案例分析和设计
1. 案例介绍
这是一个前后端分离的小项目,该案例包含的JavaWeb知识点如下:
涉及web知识点 |
---|
基于MVC的三层架构的实现(项目搭建) |
数据库连接(通过JDBC) |
JavaWeb程序通过AJAX与前端交互的过程(Servlet+AJAX+JSON) |
模拟前后端通过接口文档对接(简化版)以及使用postman模拟前端请求 |
跨域问题的解决(Filter) |
(1) 案例背景
手工测量枝芽长度费时费力。。。。,因此我们编写一个基于视觉的测量系统。本文只简单涉及基本的web组件以及一点算法实现思路,暂未涉及物联网相关。
(2)实现功能
共有两个页面,使用流程如下:
实现功能如下:
- 验证产区名和摄像头编号是否都正确
- 保存图片并测量枝芽长度
- 测量信息存入数据库
效果图:
1)上传图片及相关信息,返回1/0
2)展示测量结果
MySQL数据:
2. 案例设计
(1) 数据库设计
数据库只简单涉及两个表: 产区与摄像头表和测量结果表。
两表所含字段如下:
产区与摄像头表 | 测量结果表 |
---|---|
placename | c_id |
cameraid | placename |
measure_date | |
neasure_result |
其中,产区与摄像头表的数据是在创建表的时候就插入的,作用就是在测量首页输入产区名和摄像头编号后,服务端会去此表中验证是否一致,一致即保存图片数据并测量枝芽长度;否则,不保存图片,向前端返回0。
建表SQL语句如下:
产区与摄像头表
#创建产区与摄像头表
CREATE TABLE place_cam (
placename VARCHAR(20) NOT NULL, #产区名
cameraid BIGINT(20) UNSIGNED NOT NULL, #摄像头编号
PRIMARY KEY (cameraid), #摄像头编号为主键
UNIQUE KEY placename (placename) #产区名唯一
)
#插入产区名和摄像头编号
INSERT INTO place_cam
VALUES('zhifu',001),('kaifa',002),('laishan',003);
测量结果表
#创建测量结果表
CREATE TABLE measure_results(
c_id BIGINT UNIQUE, #摄像头编号
#placename VARCHAR(20) NOT NULL, #产区名
#measure_date DATE DEFAULT NULL, #测量日期
#measure_time TIME DEFAULT NULL, #测量时间
measure_result FLOAT DEFAULT NULL,
PRIMARY KEY(c_id) #主键
)
(2)后端设计—基于MVC的软件三层架构的实现
1)MVC就是Model(模型)、View(视图)、Controller(控制器)的缩写,它将软件系统分为三个部分。
- Model(模型):接受视图层传递的数据,实现业务逻辑,访问数据库。比如,在本案例中,验证摄像头编号等信息和测量的功能就是由Model来实现。Model主要由JavaBean来实现。
JavaBean即一个Java类,有以下特点: ①public修饰的类,提供public 无参构造方法② 所有属性都是private③ 提供get和set方法。(关系型书库)JavaBean往往对应于数据库中的一张表,如本案例中数据库中有两个表,place_cam表 和 measure_result表,则项目中就有会PlaceCam类和MeasurResultt类,这两个类中的属性即为数据库表中的字段,我们可将这两个类称为实体类。很好的体现了ORM的思想。 - View(视图):主要负责的就是,①页面展示②与用户进行交互(用户点击按钮、填写各种数据等) ③收集数据,向Model层传递用户填写的数据。在本案例中,实现了前后端分离,故视图层均由前端实现,后端只负责接收前端传递的数据,以及向前端发送数据。
- Controller(控制器):负责将View与Model一一对应起来,即View(前端)发送了一个请求时,这个请求会被Controller接收,然后Controller会将接收到的数据转到Model中对应的部分,Model处理完毕后,会将结果返回到Controller,之后再由Controller返回给View。这也意味着,View和Model的交互,都需要经过Controller。在JavaWeb中,Controller一般由servlet实现。
2)软件的三层架构
通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)再加上一个用于封装数据的实体类库(JavaBean)。该实体类库不属于以上三层的任何一层,它是用于三层之间的通信的。
三层架构是一种自上而下的依赖方式,上层与下层无关,上层不需要考虑下层的操作,对下层的改变也不会影响上层。
UI(表现层)
通俗来讲就是展现给用户使用的界面,用于显示数据和接收用户输入的数据。
一般来说,前端页面,以及后端的Servlet就属于表现层,因为两者的功能符合表现层的定义。
BLL(业务逻辑层)
主要负责的就是处理涉及业务逻辑相关的问题,比如在调用访问数据库之前,先处理数据、判断数据。
DAL(数据访问层)
该层主要负责就是直接访问数据库,并对数据库进行一系列操作,比如增删改查等。
3)两者对应关系
(3) 基于MVC和三层架构项目搭建(后面再加maven支持)
- beans:存放的是JavaBean。即实体类包,负责封装数据。
- controller:存放的是servlet,即负责控制器的内容。
- service:存放的是与业务逻辑相关的类,负责业务处理,实现核心需求
- dao:存放与数据库连接相关的类,负责连接数据库
- utils:存放的是连接数据库的工具类,是用来连接数据库的工具
- 前端部分
由上面的几个包,我们可以得到以下的层次关系:
①前端通过AJAX发送请求
②controller层接收请求,调用service层
③service层进行处理后,调用dao层
④dao层使用工具类utils进行数据库的访问
⑤调用数据库完成后,dao层不做任何处理,直接返回数据给service层,service层进行业务处理后,返回给controller控制器,最后由控制器返回结果给前端。
⑥过程中,beans里的JavaBean承担着封装数据以使各层能够正常使用的角色。
基本的调用关系如下:
前段 ------->controller------>service------>dao----->数据库
每一层访问下一层都是通过接口来进行的,上一层与下一层无关。同时不允许跨层调用。
层与层调用关系:
从MVC模式的角度看:
本案例中的前端部分即属于View(视图部分),controller则属于Controller(控制器部分),而service层和dao层以及JavaBean则属于Model(模型部分)。
在一般的MVC模式下,Model层也会分为业务层(service)和数据访问层(dao),而不是直接把业务和数据访问写在同一个包或者同一个类下。
从软件三层架构的角度看:
本案例的前端部分和controller即为UI(表现层),而service层则为BLL(业务逻辑层),dao层则为DAL(数据访问层)。beans和utils虽然不属于三层,但是其是为了更好的实现三层而存在的,故是符合三层规范的。
以上可以得到其实MVC设计模式和三层架构是可以一起使用的。
3. 开发与简单测试
接口文档链接
3.1 前端
ajax发起请求,数据传输格式为form-date或json
3.2后端
(1)项目搭建
时用到的工具:
- 数据库:MySQL 5.7.2
- 数据库图形工具:Navicat
- 编译器:IDEA 2020.2
- 服务器软件:Tomcat 9.0.38
涉及的Jar包:
①mysql-connector ---------JDBC连接MySQL数据库的驱动
②druid --------阿里巴巴的数据库连接池,能够重复利用数据库连接,提高对请求的响应时间和服务器的性能。
③commons-dbutils ---------Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
④fastjson --------阿里巴巴开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。
。。。。
(2)功能实现
(3)跨域问题的解决
Access-Control-Allow-Origin是HTML5中定义的一种解决资源跨域的策略。在filter类中实现。
3.3 算法
(1)软件库:opencv 3.42
(2)测量实现:灰度化,FLD算法获取直线,简单的筛选聚类,点的自动获取
(3)生成动态链接库:jni
3.4测试
(1)单元测试
工具包:Junit 4.12
测试类:
(2)接口测试:postman模拟前端
未完待续