rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1.EF1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /> rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1.EF1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso" />
通用WEB应用系统
目录结构
一、功能描述
购物车管理、我的订单、用户管理、商品管理
二、系统架构
开发流程、系统框架、 代码的目录结构
三、表、关系和基础类
(基础配置文件、Hibernate拦截器)
四、逻辑视图
Authorize、Category、Cart、Order
五、重点难点与要点
购物车的设计、购买相关逻辑、更改数量、自动填充地址信息、分页技术、地址和订单的保存
六、收获体会
AJAX模板、例子,常用jQuery方法(ID选择器、元素时间、AJAX方法说明),数据库存取编码等
七、核心示范代码
购物车模块相关代码: CartService类、CartAction类、 cart_list.jsp、struts-cart.xml
一、功能描述
通用 WEB应用系统,包括交易系统和管理系统两个独立的子系统,主要包括:商品展示、
购物车管理、我的订单、用户管理、商品管理五个功能模块。
..交易系统功能描述
..商品展示:实现商品预览、商品明细、分类检索功能。
..购物车:实现添加商品、删除列表、恢复列表、数量修改、清空购物车、结算功能。
..我的订单:实现订单确认、订单列表、删除订单、查询明细功能。
..用户管理:实现登入/登出、用户注册、信息修改功能。
..管理系统管理描述
..用户管理:对于系统管理员提供用户删除、用户查询功能。
..商品管理:实现商品列表、商品发布、商品删除、商品修改功能。
二、系统架构:
该系统是采用MVC架构模式(模拟当当网),通过Web层的Action调用业务逻辑层的具体的业务方 法,来实现具体的功能;并采用Hibernate持久化框架与数据库交互。在开发中充分利用了Filter来加强整个系统的灵活性及健壮性;在前台 View即JSP开发中充分利用了JSTL标签、EL(表达式语言) ,使JSP代码更加简洁灵活。
1)WEB系统开发流程(图和表见下):建立工程的目录结构 -->在数据库中建立表-->反向生成实体类和映射文件 -->添加关系以及映射-->写JSP页面-->写Action类(需要有与jsp页面对应的属性和一些方法以准备页面显示所需的数 据)--> 添加配置文件。
其中:写Action类,包括 Action类--->调用Service的业务逻辑方法--> 调用DAO访问数据库-->访问数据库。
2)MVC
模型:actions(封装)、services(封装业务逻辑、 dao(封装数据访问)、 domain(封装实体类)、 mapping (封装Hibernate映射文件)等。
视图:分为authorize(用户管理)/category(商品目录)/cart(购物车) /order(订单管理)
配置文件:分为五个.在struts.xml中定义和启用特定拦截器和拦截器栈,并将四个模块对应 的配置文件以include形式包含过来。其中启用的拦截器栈包含开启提交回滚关闭事务的Hibernate拦截器和Struts2提供的默认拦截器栈。
3)系统框架:--VERY IMPORTANT---
商品product:包含产品id,产品名称productName,价格等。
商品条目cartItem:包含商品product,数量number.
购物车map:包含(商品ID)id,商品条目cartItem.
总流程:将购物车(Map<Integer,CartItem))map和所有购物车相关功能都放入CartService(购物车 及其服务),再将CartService放入Session中.通过ServiceFacotry的 getCartService()方法去取cartService,以保证购物车的唯一。
购买流程:用户点击购买----->通过产品ID找到产品 ------>去购物车map中找相应的商品条目cartItem(CartItem cartItem=map.get(id))------>如果cartItem为空,新建cartItem,并将该ID对应的商品添加到 cartItem中,再将cartItem加到购物车中------>如果cartItem不为空,则用户已经购买了该商品,只需将 cartItem中的数量加一:cartItem.setNumber(cartItem.getNumber()+1)。
总流程的代码(ServiceFactory类):
//先到session中取cartService.如果取不到则新建cartService,并放入session中;
//否则直接返回cartService.
public class ServiceFactory {
public static ICartService getCartService() {
ICartService service;
// 先到session中取cartService.如果取不到则新建cartService,并放入session中;
// 否则直接返回cartService.
Map session = ActionContext.getContext().getSession();
if (session.get("cartService") == null) {
service = new CartService();
session.put("cartService", service);
// session.put("user", user);
} else {
service = (CartService) session.get("cartService");
}
return service;
}
}
1)数据库结构
d_product:产品表
d_book:图书表
d_category:栏目表
d_category_product:栏目产品表
d_order:订单表
d_item:订单明细表
d_receive_address:订单接收地址表
d_user:用户表
2)表间关系
(映射原理:表对类、属性对字段)
1)d_order ---一对多--- d_item
为了在 hibernate中使用,需要在表和类中添加关系:
a、 Alter table d_item add foreign key order_id references d_order(id);
b、 在DOrder类中,添加关联属性items
prvate Set<CartItem> items=new HashSet<CartItem>();并提供getter和setter方法
c、 DItem类中,添加private Order order;
Hibernate 映射:
DItem.hbm.xml中:
<!-- item到order的多对一映射 -->
<many-to-one name="order" class="tarena.dangdang.domain.DOrder" fetch="select">
<column name="order_id" not-null="true" unique="true" />
</many-to-one>
DOrder.hbm.xml 中:
<!-- order到item的一对多映射 -->
<set name="items" inverse="true">
<key>
<column name="order_id" not-null="true" unique="true" />
</key>
<one-to-many class="DItem" />
</set>
d_category ---多对多--- d_product
d_book ---继承--- d_product
d_order ---compenent组件--- d_receive_address
3) 基础配置和类:基础配置文件和Hibernate拦截器
struts默 认需要的配置文件:struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<include file="struts-authorize.xml"/>
<include file="struts-cart.xml"/>
<include file="struts-category.xml"/>
<include file="struts-order.xml"/>
<package name="dang-default" extends="json-default">
<!-- 定义Hibernate事务的拦截器和拦截器栈 -->
<interceptors>
<interceptor name="hibernateTrasaction" class="tarena.dangdang.interceptor.HibernateInterceptor"></interceptor>
<interceptor-stack name="hibernateTrasactionStack">
<interceptor-ref name="hibernateTrasaction"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 定义默认启用的拦截器 -->
<default-interceptor-ref name="hibernateTrasactionStack"/>
</package>
</struts>
Hibernate拦 截器
public class HibernateInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
String view = "fail";
//打开事务
Session session = HibernateSessionFactory.getSession();
Transaction txt = session.beginTransaction();
System.out.println("interceptor session:"+session);
System.out.println("打开事务");
try{
view = arg0.invoke();
//提交事务
txt.commit();
System.out.println("提交事务");
}catch(Exception e){
e.printStackTrace();
//回滚事务
txt.rollback();
System.out.println("回滚事务");
}finally{
//回收Session资源
HibernateSessionFactory.closeSession();
System.out.println("回收Session资源");
}
return view;
}
}