很多学编程的同学都有类似的感觉:编程代码一看都明白,但让你独自开放软件项目或以团队方式开发软件项目时,却无从下手,代码也不知道怎么写。产生这种情况的主要原因是缺乏实战项目开发经验,没有真正自己主导开发过软件项目。
电子图书在线阅读系统就是一个以自己为主导的实战项目,项目涵盖Java WEB前端和后端、移动APP开发、第三方支付、接口等技术。
系统的架构设计是在业务需求已经清晰的前提下进行的,假定在系统需求分析阶段已经确定了系统的功能和业务范围,也明确了系统运营需求。在上述需求还没有确定的情况下,不适宜开展系统的架构设计,需要回到需求分析阶段完善上述需求后再开展系统的架构设计。
系统架构就是一些模型图,模型图是人们用来理解系统和沟通的工具。这些模型图需要提供给系统相关干系人来理解系统,系统相关干系人有项目经理、产品经理、开发人员、系统运营维护人员、客户、项目投资人等。这些干系人有不同的知识背景,对同一架构模型图也会有不同的认知和理解:如果把开发架构模型图给产品经理或客户看,他们定然看不懂也不能理解;同样的道理,如果只把逻辑架构图给开发人员看,就不能正确地指导开发人员构建开发环境。
因此在进行系统架构设计时,需要从系统的不同维度进行设计,以满足系统相关干系人理解系统架构的需求。架构设计模型主要有逻辑架构、开发架构、数据架构、物理架构和运行架构五种模型图。一般来说需要设计的系统架构模型有逻辑架构、开发架构和物理架构三种架构模型图。数据架构模型一般放在数据库中进行设计,运行架构和物理架构基本相近,只是在物理架构中加了数据的流向,因此一些系统设计使用物理架构代替了运行架构。
系统逻辑架构
图 3-1 系统逻辑架构
图3-1为系统逻辑架构,系统从逻辑上划分为客户端、服务端、数据库三部分。客户端由安卓APP和JSP页面构成,客户端发送请求到服务端,服务端处理请求并回送数据到客户端,客户端也可以直接调用服务端接口获取数据;服务端由控制器类(或接口类)、业务类和实体类构成,完成系统业务处理,响应客户端请求和接口调用;数据库为服务端提供数据存取服务。
系统开发架构
系统开发架构采用Spring MVC框架,MVC是Model(模型,也称为数据模型)、View(视图)、Controll(控制器)三个英文单词首字母的缩写。从MVC组合的三个单词也可以看出,MVC是一种设计模型,它使用控制器将数据模型和视图进行分离,也就是将视图和数据解耦。这样的好处是后端处理的数据模型和前端视图显示的数据格式无关,实现一个数据模型可以对应多个视图以不同的方式来展现数据,当数据模型或视图发生变化时,相互之间的影响也会降低到最低。如图3-1所示。
图 3-2 MVC视图、模型、控制器交互图
MVC中最重要的核心就是控制器,控制器与视图和模型相对独立,它起到一个负责分发请求和返回处理结果的作用,对请求和数据模型的处理一般由JavaBean负责。
图 3-3 系统开发架构
图3-3为系统开发架构,图3-1分为两部分:虚线框外的是WEB程序的浏览器部分,实际还应包括APP客户端,用户通过浏览器和APP客户端与系统进行交互,同时浏览器也负责解析JSP页面;虚线框内的是WEB程序的后台部分,这部分包括控制器(Controller类)、业务逻辑(Service类)、数据模型(实体类)、数据持久层(Mybatis框架)和MySQL数据库管理系统。
JSP页面就是视图,用户通过JSP页面发出请求后,Spring MVC会根据请求路径,将请求发给与请求路径对应的Controller类,Controller类调用Service类对请求进行处理,Service类会调用数据持久层MyBatis完成对实体类的存取和查询工作,并将处理结果返回到Controller类,Controller类将处理结果转换为ModelAndView对象,JSP接收ModelAndView对象并进行渲染。
Controller类是在普通Java类的头部加入@Controller注解,使其变为Controller类,在Controller类中使用@RequestMapping注解标记在Controller类方法的头部,使该方法可以响应一个WEB请求地址,当JSP页面向这个地址发送请求时,该方法会被调用。
下面的代码是Controller类的样例。
@Controller
@RequestMapping(value = "Admin")
public class UserController {
@RequestMapping(value="/login.do",method={RequestMethod.GET})
@ResponseBody
Public ModelAndView loginUser(HttpServletRequest request)
ModelAndView view = new ModelAndView();
return view;
}
}
Service类为业务逻辑处理类,在类的头部使用注解@Service标注,被注解@Service标注的类会被Spring框架自动注入到Controller类。下面的代码是Service类的样例。
@Service
public class UserServiceImpl implements UserService {
@Override
public InnerResult loginUser(String name, String psw) {
}
}
实体类也是POJO类,也就是MVC的数据模型,实体类仅有属性以及获取和设置属性的get和set方法,没有事务处理方法。下面的代码是实体类的样例。
public class TSUser {
private String id;
private String userName;
private String loginName;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
物理架构模型
物理架构模型是给系统部署人员和运营维护人员看的,主要给出系统的部署环境模型,包括网络环境、硬件环境和软件环境。图3-2是系统部署网络环境模型图。
图 3-4 系统部署网络环境模型
从上面网络环境模型图中可以看出,系统部署只需要一台主机,要求支持HTTP协议和远程桌面协议。系统可以考虑部署到阿里云或腾讯云。