实施步骤:
1. 项目简要分析和设计
- 分析项目中各模块功能,例如用户模块、商品模块等。
- 采用常用的MVC模式构建项目
2. 设计数据库实体关系
图中未给出的实体还有
- 购物车Cart
- 购物车项CartItem
一个Session中对应一个购物车Cart,一个购物车Cart含有多个购物车项CartItem
我并未对这两项设计数据库表,因为购物车项CartItem字段和订单项OrderItem类似,并且由于登录机制设置,本商城不需要登录也可使用购物车,所以购物车是和Session绑定的,用户将商品加到购物车,即在session中创建购物车并加商品。
3. 准备工作
- 配置Java 运行环境
- 安装Eclipse,设置好编码
- 安装配置Mysql数据库
- 导入需要各种的工具包,编写各种配置文件。
4. 编码之前
- 寸琪琪和曹泽慧负责编写前端页面,根据预先设想的功能,例如:首页、用户登录、注册等,先编写出静态的html页面,后期再调整布局、样式。
- 我主要负责后台代码的编写。
- 为了更好的合作,我们小组约定,前端页面自由发挥就行。只需要注意交互数据的地方,例如表单中输入框的name属性和后端Java Bean属性命名一致。这样可以分工合作提高效率,不会出现前后端互相等待对方工作的情况。
5. 开始编码
商城web项目虽然听上去很普遍,但手动实现起来代码量还是很大。
而且因为时间问题,我没来得及学完框架,基本上整个项目全用的底层技术手写实现的功能。
项目结构:
虽然没有用MVC框架,但是借鉴了一下MVC的编程思想来设计项目结构。
如包名所示,主要分为dao层、web层、service层。
为了减少耦合,dao包和service包只定义了接口,实现类放在子目录impl中。
通用Servlet的设计:
思想:编写父类BaseServlet并重写Service方法,接受method参数,返回请求转发路径。
作用:使得web层根据请求路径来选择调用相应的子类Servlet,这样可有效减少Servlet的个数,结构清晰。
例如:注册用户后,在数据库中添加该用户。点击注册提交按钮,发送请求到路径 “项目名/user?method=add” 。
BaseServlet会调用子类UserServlet中的add方法,来调用该功能。
在开发中,也只需要在对应的Servlet中编写相关方法,并按照以上规则配置路径。本项目中,各请求路径都按照此规则编写,并按照此方法编写web层代码。
工厂模式:
思想:通过配置文件+工具类的方式创建实例对象,减少接口和实现类的耦合。
作用:更换实现类时,只需要修改配置文件即可。
例如:这里以商品模块Product举例
// 原本创建实例时,需要每次都new出来
ProductService ps = new ProductServiceImpl();
ProductDao pd = new ProductDaoImpl();
可是项目中,每个功能至少需要调用一次service、一次dao,甚至更多。
如果实现类更换了,则需要在每个创建实例的地方修改,工作量巨大。
所以根据工厂模式的思想:
// 1. 首先编写配置文件:
<beans>
<bean id="ProductService" class="com.itheima.service.impl.ProductServiceImpl"></bean>
<bean id="ProductDao" class="com.itheima.dao.impl.ProductDaoImpl"></bean>
<beans>
// 2. 创建对象时,调用工具类
ProductService ps = BeanFactory.getBean("ProductService");
这样一来,如果后期项目重构,只需要修改配置文件中的实例路径就行了。不需要对代码进行任何修改。
采用工厂模式本来是想着后期学会了框架,对代码进行重构时会很方便,结果我并没来得及学完框架,但工厂模式的思想依然很有用。
ehcache缓存框架
思想:访问页面时,将局部放入缓存中,用户下次访问直接从缓存中用,减少服务器压力。
例如:页面顶部导航栏,在第一次访问时会请求数据库,查找到最新的分类信息,展示到页面上,这里使用缓存可减少数据库请求次数。
模块功能的实现:
前面已经将项目中比较重要的设计模式说了,按照开发规范,功能实现的编码就简单很多了。这里我不贴代码,因为每个功能的实现代码量都不少,具体可在源码中查看。但是每个功能都采用MVC的思想,所以并不复杂。