通用WEB应用系统(Struts2.0+Hibernate+Ajax)(上).doc

来源:互联网 发布:手机淘宝联系卖家 编辑:程序博客网 时间:2024/05/29 07:57

通用WEB应用系统

目录结构

一、功能描述

 购物车管理、我的订单、用户管理、商品管理

二、系统架构

开发流程、系统框架、 代码的目录结构

三、表、关系和基础类

(基础配置文件、Hibernate拦截器)

四、逻辑视图

AuthorizeCategoryCartOrder

五、重点难点与要点

购物车的设计、购买相关逻辑、更改数量、自动填充地址信息、分页技术、地址和订单的保存

六、收获体会

AJAX模板、例子,常用jQuery方法(ID选择器、元素时间、AJAX方法说明),数据库存取编码等

七、核心示范代码

购物车模块相关代码: CartService类、CartAction类、 cart_list.jspstruts-cart.xml

 

一、功能描述

通用 WEB应用系统,包括交易系统和管理系统两个独立的子系统,主要包括:商品展示、

购物车管理、我的订单、用户管理、商品管理五个功能模块。

..交易系统功能描述

..商品展示:实现商品预览、商品明细、分类检索功能。

..购物车:实现添加商品、删除列表、恢复列表、数量修改、清空购物车、结算功能。

..我的订单:实现订单确认、订单列表、删除订单、查询明细功能。

..用户管理:实现登入/登出、用户注册、信息修改功能。

..管理系统管理描述

..用户管理:对于系统管理员提供用户删除、用户查询功能。

..商品管理:实现商品列表、商品发布、商品删除、商品修改功能。

 二、系统架构:

 该系统是采用MVC架构模式(模拟当当网),通过Web层的Action调用业务逻辑层的具体的业务方 法,来实现具体的功能;并采用Hibernate持久化框架与数据库交互。在开发中充分利用了Filter来加强整个系统的灵活性及健壮性;在前台 ViewJSP开发中充分利用了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>();并提供gettersetter方法

c DItem类中,添加private Order order;

Hibernate 映射:

DItem.hbm.xml:

<!-- itemorder的多对一映射 -->

<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 :

<!-- orderitem的一对多映射 -->

<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;
 }

}