jpetstore为博主 大二下 软件开发架构平台技术 的一项实验内容。
下面是基于MVC的jpetstore项目分析:jpetstore:
github地址:https://github.com/SwordHarry/Jpetstore
使用环境:IntelliJ IDEA
开发架构:MVC
数据库连接:JDBC
一、准备工作
创建项目,选择为java web项目
输入项目名和项目路径
二、项目构建和分析
首先要编写该项目需要对Jpetstore的业务流程有非常充分的了解。
Jpetstore的业务大致分为三大块:
商品展示模块,用户登录和注册模块,订单生成模块
一个基于MVC的java web项目的目录结构如下
下面将从图片目录结构从上到下分析。
后端src:
src包下存放后端java的源代码。web文件夹下存放前端代码(html+css+js)。
src包下首先建立一个项目包,org表示非盈利机构,csu为博主在读大学英文简称(中南大学)。项目包下的内容有domain 领域对象,persistence 持久化,service 服务层,sql 里面是sql文件,web 里面存放过滤器和servlet。
Model 层:domain,persistence,service
Controller层:src/web
View层:web
(1)首先看domain包,即领域对象:
Account类保存了用户的全部信息。
Cart类为购物车,CartItem为购物车中的商品项,Cart的成员变量有CartItem类,他们之间是聚合关系。Cart类中有关于CartItem的成员变量:
private final Map itemMap = Collections.synchronizedMap(new HashMap());
private final List itemList = new ArrayList();
Category 种类,为商品展示的大类,该项目将商品展示分为三层,Category为大类,如猫,狗等,product为中类,又指猫中的哪一种类别,item为小类,具体到哪一只动物。页面展示的时候也分这三类逐层展示。他们之间的关联关系通过各自的ID属性关联起来,即小类的成员变量中有大类的ID。
Order为订单,LineItem为订单中的商品项,与购物车类似,他们之间是组合关系。Order类中有关于LineItem的成员变量:
private List lineItems = new ArrayList();
Sequence 序列,功能为模拟数据库中的自增列,即在数据库中订单表中OrderId一列是自增的,通过Sequence实现,即Order类中的orderId属性实际上由Sequence决定。
Item,CartItem,LineItem三者也有联系。只是博主在这里有个疑问(?),CartItem和LineItem理应可以直接继承Item类,但是在jpetstore源码中,CartItem和LineItem成员变量中都有一个Item对象,并没有直接继承Item类。
(2)第二个包是persistence持久化包,即和数据库交互的包:
DBUtil类为创建数据库连接的类。
persistence 层使用了面向接口编程,针对每个domain包里的对象都有一个DAO接口与之对应,DAO接口直接定义了项目的详细业务,即需要在项目里实现的功能,如用户的增删改查,impl包里是所有DAO类的实现。
(3)第三个包是service服务包,该包就三个类,也是直接反应了该项目的三个模块:
service层负责调用DAO层的方法。
(4)最后一个包是web包,即过滤器和servlet:
项目中几乎每个页面跳转都配有一个servlet,过滤器CodeFilter类为指定编码格式(UTF-8)
对于每个servlet和过滤器,在项目/WEB-INF文件夹下有web.xml配置文件,该文件是对所有serlvet和过滤器的配置信息。
对于servlet,一个配置项格式为:
MainServlet
org.csu.mypetstore.web.servlet.MainServlet
MainServlet
/main
servlet/servlet-name为一个servlet的类名,servlet/servlet-class为该servlet的完整包名。
servlet-mapping/url-pattern为对应servlet的url请求地址,前端界面访问servlet提交请求通过该url。
对于filter,一个配置格式为:
CodeFilter
org.csu.mypetstore.web.filter.CodeFilter
CodeFilter
/*
REQUEST
与servlet同理,其中filter-mapping/url-pattern为对于指定的url,每当客户端发出该请求,将先被过滤器接收,经过处理后才转交给对应servlet,而dispatcher的属性详细参照https://www.cnblogs.com/xrq730/p/4929029.html,此处不做详细说明,REQUEST指一般有几次请求就会走几次指定过滤器
注意
接下来是前端。
web文件夹下存放css,js,images,WEB-INF等文件夹。WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
现我们只关心WEB-INF目录下的内容。
WEB-INF下有web.xml配置文件和jsp文件夹,jsp文件夹里面根据展示内容又分为不同的文件夹。下面介绍一下页面关联关系中的一种:页面包含
common文件夹下存放其他jsp都包含的头部jsp和尾部jsp。
jsp包含头部jsp:
<%@include file="../common/IncludeTop.jsp"%>
这样就相当于将IncludeTop.jsp中的所有代码嵌入到当前位置。这么做能实现前端的组件化开发和省略大部分相同代码。
以上,这是一个对Jpetstore的粗略分析MVC架构的博客。