Struts+Hibernate实现shopcart

Struts+Hibernate实现shopcart

 

最近做毕设,将自己以前写的一个购物车的模块重构了一遍,将一些bug进行了修复。实现了对hashmap容器的基本CRUD功能。在这里和大家一起分享下,希望大家提出更好意见和想法。

原理:利用session会话保持用户一次购物操作的购买记录,当用户点击“结帐”后将保存在session中的hashmap容器中的信息insert到DB中,完成一次购物操作。

模块所需要配置文件:hibernate.cfg.xml  ,TableGoods.hbm.xml  ,struts-config.xml 

模块对应的jsp有:index.jsp(商品信息一览页面),buy.jsp(购买操作后的商品清单页面)

模块对应的action有:IndexAction (实现对DB中的商品表信息结果集的遍历,并转向对应的index.jsp) 
                                     ListAction (将JSP上的商品信息存入hashmap容器,并转向对应的buy.jsp)
                                     UpdateAction (对buy.jsp页面上的商品数量修改的业务逻辑处理)
                                     DeleteAction (对buy.jsp页面上的商品列表信息的业务逻辑处理)

模块所需的相关Java容器选择:存储商品id,sum,price,name,allprices信息用hashmap,主要是考虑到其key重复后可以覆盖上次的value记录。存储点击商品后的商品id用list容器,主要考虑到list是有序并可以重复的特点,用其可以跟踪用户多次点击相同商品的操作,并对商品的数量进行相应的增加。

模块主要Action类如下:

  /** */ /** 
  * 陈列商品
  
*/


IndexAction:

public   class  IndexAction  extends  Action  {

 
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
  
  
//查找商品表中的所有商品信息
     GoodsDAO dao = new GoodsDAO();
  List list 
= dao.find();
  request.setAttribute(
"lister",list);
  
  
return mapping.findForward("a");
 }

}



/** */ /** 
  * 点击购买信息
  
*/


ListAction:

public   class  ListAction  extends  Action  {

 
// 将hashmap中value转到list中
 public static List getList(HashMap hs) {
  List list 
= new ArrayList();
  Iterator itr 
= hs.keySet().iterator();
  
while (itr.hasNext()) {
   list.add(hs.get(itr.next()));
   }

  
return list;
 }

//优化后的getList方法
 public static List getList(HashMap hs) {
  
return new ArrayList(hs.values());
 }



 
// 将点击的商品id和已经点击过的商品id数组中去比较,看是否有重复,真为有重复
 public static boolean isCheck_on(int[] ids, int _id) {
  
boolean flag = false;
  
for (int i = 0; i < ids.length; i++{
   
if (ids[i] == _id) {
    flag 
= true;
   }

  }

  
return flag;
 }


 
// 将新点击商品的id和list(存放在session中的allIdSumList容器)中元素的id属性比较
 public static void test_ListCheck(List list, int check_id, float _p,String _n) {
  
for (int i = 0; i < list.size(); i++{
   
int j = ((IdSumPriceNameDTO) list.get(i)).getId();
   
// 将list_sumId的第i个元素++
   int k = ((IdSumPriceNameDTO) list.get(i)).getSum();
   
if (j == check_id) {
   
//相等条件则将k(商品数量)++
    k++;
   
//session中的"allIdSumList"也随之更新,引用传参原理
    ((IdSumPriceNameDTO) list.get(i)).setSum(k);
    
//list.remove(i);
    
//IdSumPriceNameDTO idSumDTO = new IdSumPriceNameDTO(j, k, _p,_n);
    
//将更新后的idSumDTO重新add到list中,session中的"allIdSumList"也随之更新,引用传参原理
    
//list.add(i, idSumDTO);
   }

  }

 }

 
 
// 将点击商品id和allIdSumList(session中)比较,并返回比较后的list_sumId
 public static List getCounter_List(List _list_check, int id, HttpSession sess,
   
float price,String _name) {

  List list_sumId 
= null;
  String flag 
= (String) sess.getAttribute("flags");
  
// 执行了修改操作的条件
  if (flag != null{
   
// 从session中获得已经修改过商品的id的数组
   int[] ider = (int[]) sess.getAttribute("ider");
   
// 在修改操作后,在已修改商品上继续购物操作
   if (isCheck_on(ider, id)) {
     list_sumId 
= (List) sess.getAttribute("allIdSumList");
   
// 调用test_ListCheck方法
     test_ListCheck(list_sumId,id,price,_name);
    }
 
   
// 修改操作后,点击没有被修改数量过的商品
   else {
   
// 标志位
    boolean flag_c = true;
    
// 新点击商品id和list中历史点击记录比较
    for (int i = 0; i < _list_check.size() - 1; i++{
     
if (_list_check.get(i).equals(id)) {
      flag_c 
= false;
     }

    }

     
// session中获得"allIdSumList"
    list_sumId = (List) sess.getAttribute("allIdSumList");
     
// 新点击操作
    if(flag_c){
     IdSumPriceNameDTO idSumDTO 
= new IdSumPriceNameDTO(id, 1, price,_name);
    
// session中的"allIdSumList"也随之更新,引用copy
     list_sumId.add(idSumDTO);
     }

     
// 重复点击操作
    else{
     
// 调用test_ListCheck方法
     test_ListCheck(list_sumId,id,price,_name);
    }

   }

  }

     
// 未点击修改的操作条件
  else {
   
// session中获得"allIdSumList"
   list_sumId = (List) sess.getAttribute("allIdSumList");
   
// 标志位
   boolean flag_c = true;
   
// 新点击商品id和list中历史点击记录比较
   for (int i = 0; i < _list_check.size() - 1; i++{
    
if (_list_check.get(i).equals(id)) {
     flag_c 
= false;
    }

   }

   
// 新点击操作
   if (flag_c) {
    IdSumPriceNameDTO idSumDTO 
= new IdSumPriceNameDTO(id, 1, price,_name);
   
// session中的"allIdSumList"也随之更新,引用copy
    list_sumId.add(idSumDTO);
   }

   
// 重复点击操作
   else {
     
// 调用test_ListCheck方法
     test_ListCheck(list_sumId,id,price,_name);
   }

  }

  
return list_sumId;
 }



 
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   
throws Exception {
  
// 商品编号
  int id = Integer.parseInt(request.getParameter("id"));
  GoodsDAO dao 
= new GoodsDAO();
  
int goodsid = dao.findbyId(id).getId();
  String goodsName 
= dao.findbyId(id).getGoodsName();
  
float goodsPrice = (float) dao.findbyId(id).getGoodsPrice();
  
//set进idSumDTO 
  IdSumPriceNameDTO idSumDTO = new IdSumPriceNameDTO();
  idSumDTO.setId(goodsid);
  idSumDTO.setGoodsName(goodsName);
  idSumDTO.setGoodsPrice(goodsPrice);
  
// idSumDTO中的sum属性缺省为1
  idSumDTO.setAllPrices(goodsPrice);
  System.out.println(idSumDTO.getAllPrices());
  
  
// hid做为hashmap中的key
  Integer hid = Integer.valueOf(idSumDTO.getId());
  
  HttpSession sess 
= request.getSession();
  HashMap hs 
= (HashMap) sess.getAttribute("shops");

  
/** *//** *//** *//**
   * 客户第一次访问
   
*/

  
if (hs == null{
   
//将商品id放入list中
   List list = new ArrayList();
   list.add(hid);
   hs 
= new HashMap();
   hs.put(hid, idSumDTO);
   
// jsp显示
   sess.setAttribute("shop", getList(hs));
   
// 将hs放到session中,删除修改用
   sess.setAttribute("shops", hs);
   
// 将list(商品id)放入session中
   sess.setAttribute("ids_go", list);
   
// 将商品id,sum,price,name放入idSumDTO_1并置于idSum_list中
   IdSumPriceNameDTO idSumDTO_1 = new IdSumPriceNameDTO(idSumDTO.getId(), idSumDTO
     .getSum(), idSumDTO.getGoodsPrice(),idSumDTO.getGoodsName());
   List idSum_list 
= new ArrayList();
   idSum_list.add(idSumDTO_1);
   
// 将idSum_list对象至于sess中,和updateAction中的"allIdSumList"对应
   sess.setAttribute("allIdSumList", idSum_list);
  }

  
/** *//** *//** *//**
   * 客户第二次以后的访问
   
*/

  
else {
   List list_check 
= (List) sess.getAttribute("ids_go");
   list_check.add(hid);
   
// list_sumId包含id,sum,price,name
    List list_sumId = getCounter_List(list_check, hid, sess, goodsPrice,goodsName);
   
for (int i = 0; i < list_sumId.size(); i++{
    IdSumPriceNameDTO isp 
= new IdSumPriceNameDTO();
    
int a = ((IdSumPriceNameDTO) list_sumId.get(i)).getId();
    isp.setId(a);
    
int b = ((IdSumPriceNameDTO) list_sumId.get(i)).getSum();
    isp.setSum(b);
    
float c = ((IdSumPriceNameDTO) list_sumId.get(i)).getGoodsPrice();
    isp.setGoodsPrice(c);
    isp.setAllPrices(c);
    String d  
=((IdSumPriceNameDTO) list_sumId.get(i)).getGoodsName();
    isp.setGoodsName(d);
    
//session中的shops也随之更新,引用copy
    hs.put(a, isp);
    
//引用赋null
    isp = null;
   }

   
// jsp显示
   sess.setAttribute("shop", getList(hs));
  }

  
//转向buy.jsp
  return mapping.findForward("b");
 }


}



UpdateAction:

  
/** */ /** 
  * 修改商品信息
  
*/


public   class  UpdateAction  extends  Action  {

 
//优化后的getList方法
 public static List getList(HashMap hs) {
  
return new ArrayList(hs.values());
 }


 
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   
throws Exception {
  GoodsForm gs 
= (GoodsForm)form;
  
int[] ids = gs.getId();
  
int[] sums = gs.getSum();
  
float[] goodsPrices = gs.getGoodsPrice();
  String[] goodsName 
= gs.getGoodsName();
  
//从session获得hs
  HashMap hs = (HashMap)request.getSession().getAttribute("shops");
  
//从session中获得allIdSumList容器
  List idSum_list = (List)request.getSession().getAttribute("allIdSumList");
  
//清空上次idSum_list容器中更新后的记录
  if(idSum_list!=null){
   idSum_list.clear();
  }

  
for(int i = 0;i<ids.length;i++){
   
//循环将 ids[i]和idSumPriceNameDTO put到hs容器中
   IdSumPriceNameDTO idSumPriceNameDTO = new IdSumPriceNameDTO();
   idSumPriceNameDTO.setId(ids[i]);
   idSumPriceNameDTO.setGoodsName(goodsName[i]);
   idSumPriceNameDTO.setGoodsPrice(goodsPrices[i]);
   idSumPriceNameDTO.setSum(sums[i]);
   idSumPriceNameDTO.setAllPrices(goodsPrices[i]);
   
// session中的"shops"也随之更新,引用copy
   hs.put(ids[i], idSumPriceNameDTO);
   
//每次循环后将idSumPriceNameDTO 的引用设null
   idSumPriceNameDTO = null;

   
//idSum_list
   IdSumPriceNameDTO idSumDTO = new IdSumPriceNameDTO(ids[i],sums[i],goodsPrices[i],goodsName[i]);
   
if(idSum_list == null){
    idSum_list 
= new ArrayList();
   }

   
// session中的"allIdSumList"也随之更新,引用copy
   idSum_list.add(idSumDTO);
  }

  request.getSession().setAttribute(
"shop", getList(hs));
  
     
// 将过到updateAction中的商品id数组放入session中对修改操作完成后用户继续点击操作时和ider数组记录比较
     request.getSession().setAttribute("ider", ids);
     
// 设置一个标志位,标志是经过修改数量的操作
     String flag = "update";
     request.getSession().setAttribute(
"flags", flag);
  
//转向buy.jsp
  return mapping.findForward("b");
 }


}



DeleteAction:

  
/** */ /** 
  * 删除商品信息
  
*/


public   class  DeleteAction  extends  Action  {


//优化后的getList方法
 public static List getList(HashMap hs) {
  
return new ArrayList(hs.values());
 }


 
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   
throws Exception {

  Integer id 
= Integer.parseInt(request.getParameter("id"));

  
// 将ids_go中点击Id的历史记录中与页面传来的id比较,将相同的元素全delete掉
  List list_check = (List) request.getSession().getAttribute("ids_go");
  
int size = list_check.size();
  
int h = 0;
  
for (int i = 0; i < size; i++{
   
int j = (Integer)list_check.get(h);
   
if (j == id) {
    
//session中的"ids_go"也随之更新,引用copy
    list_check.remove(h);
   }
else{
    h
++;
   }

  }

   
// remove容器allIdSumList中和id相等的整个元素,保持delete后继续购物操作的正确性
  List list = (List) request.getSession().getAttribute("allIdSumList");
  
for (int i = 0; i < list.size(); i++{
   
int j = ((IdSumPriceNameDTO) list.get(i)).getId();
   
if (j == id) {
   
//session中的"allIdSumList"也随之更新,引用copy
    list.remove(i);
   }

  }

  
// 从session中取出购物的hashmap容器
  HashMap hashmap = (HashMap) request.getSession().getAttribute("shops");
  
//session中的shops也随之更新,引用copy
  hashmap.remove(id);
  
//jsp显示
  request.getSession().setAttribute("shop", getList(hashmap));
  
  
//执行了delete操作后,将updateAction中的标记flag设置为null
  
//delete后,将修改信息的标记去除,还原为无修改操作状态
  String flag = null;
  request.getSession().setAttribute(
"flags", flag);
  
//转向buy.jsp
  return mapping.findForward("b");
 }


}



IdSumPriceNameDTO :

public   class  IdSumPriceNameDTO  {

 
private int id;

 
private int sum = 1;

 
private float goodsPrice;
 
 
private float allPrices;
 
 
private String goodsName;

 
public IdSumPriceNameDTO() {
  
super();
 }

 
//id,sum,goodsPrice,goodsName
 public IdSumPriceNameDTO(int id, int sum, float goodsPrice, String goodsName) {
  
super();
  
this.id = id;
  
this.sum = sum;
  
this.goodsPrice = goodsPrice;
  
this.goodsName = goodsName;
 }


 
public String getGoodsName() {
  
return goodsName;
 }


 
public void setGoodsName(String goodsName) {
  
this.goodsName = goodsName;
 }



 
public float getAllPrices() {
  
return allPrices;
 }

 
//注意javabean中set 只有一个参数,定义多个时到jsp页面会出现无法找到getProperty异常
 public void setAllPrices(float goodsPrice) {
  
this.allPrices = (float)(this.sum * goodsPrice);
 }

 

 
public float getGoodsPrice() {
  
return goodsPrice;
 }


 
public void setGoodsPrice(float goodsPrice) {
  
this.goodsPrice = goodsPrice;
 }


 
public int getId() {
  
return id;
 }


 
public void setId(int id) {
  
this.id = id;
 }


 
public int getSum() {
  
return sum;
 }


 
public void setSum(int sum) {
  
this.sum = sum;
 }


}



GoodsForm :

public   class  GoodsForm  extends  ActionForm  {

    
//商品名称数组
    private String[] goodsName;
    
    
//商品id数组
    private int[] id;    
    
    
//数量数组
    private int[] sum;
    
        
//价格数组
    private float[] goodsPrice;
            
    
public float[] getGoodsPrice() {
        
return goodsPrice;
    }


    
public void setGoodsPrice(float[] goodsPrice) {
        
this.goodsPrice = goodsPrice;
    }


    
public int[] getId() {
        
return id;
    }


    
public void setId(int[] id) {
        
this.id = id;
    }


    
public int[] getSum() {
        
return sum;
    }


    
public void setSum(int[] sum) {
        
this.sum = sum;
    }


    
public String[] getGoodsName() {
        
return goodsName;
    }


    
public void setGoodsName(String[] goodsName) {
        
this.goodsName = goodsName;
    }


    
    
}



buy.jsp:

<% @ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding
="UTF-8"
%>
<% @ taglib uri="WEB-INF/struts-bean.tld" prefix="bean" %>
<% @ taglib uri="WEB-INF/struts-html.tld" prefix="html" %>
<% @ taglib uri="WEB-INF/struts-logic.tld" prefix="logic" %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html:html >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" >
< title ></ title >
</ head >
< body  bgcolor ="#CCCCCC" >
< html:form  action ="/update" >
< html:submit  value ="update"   />
< table  width ="302"  height ="55"  border ="1" >
 
< tr >
     
< td  width ="59" > DELETE </ td >
  
< td  width ="68" > NAME </ td >
  
< td  width ="77" > PRICE </ td >
  
< td  width ="77" > NUM </ td >
  
< td  width ="77" > ALLPRICE </ td >
 
</ tr >
 
< logic:iterate  id ="sh"  name ="shop" >
 
< tr >
    
< html:hidden   name ="sh"   property ="id"   />
    
< html:hidden   name ="sh"   property ="goodsPrice"   />
    
< html:hidden   name ="sh"   property ="goodsName"   />
    
< td >< html:link   page ="/delete.do"  paramId ="id"  paramName ="sh"  paramProperty ="id"   > delete </ html:link ></ td >
    
< td >< bean:write  name ="sh"  property ="goodsName"   /></ td >
    
< td >< bean:write  name ="sh"  property ="goodsPrice"   /></ td >
    
< td >< html:text   name ="sh"   property ="sum"   /></ td >
    
< td >< bean:write  name ="sh"  property ="allPrices"   /></ td >
 
</ tr >    
 
</ logic:iterate >
</ table >
</ html:form >
< html:link  page ="/shop.do" > 去收银台 </ html:link >< html:link  page ="/index.do" > 继续购物 </ html:link >

</ body >
</ html:html >


index.jsp:

<% @ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
="UTF-8"
%>
<% @ taglib uri="WEB-INF/struts-bean.tld" prefix="bean" %>
<% @ taglib uri="WEB-INF/struts-html.tld" prefix="html" %>
<% @ taglib uri="WEB-INF/struts-logic.tld" prefix="logic" %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html:html >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=UTF-8" >
< title ></ title >
</ head >
< body   bgcolor ="#CCCCCC" >
< table  width ="315"  border ="1" >
  
< tr >
     
< td  colspan ="2" >< img  src ="1140438022_min.jpg"  width ="160"  height ="120" ></ td >
     
< td  colspan ="2" >< img  src ="1140437663_min.jpg"  width ="160"  height ="120" ></ td >
     
< td  colspan ="2" >< img  src ="1140438022_min.jpg"  width ="160"  height ="120" ></ td >
  
</ tr >
  
< logic:iterate  id ="list"  name ="lister" >
    
< tr >
      
< td >< bean:write  name ="list"  property ="id"   /></ td >
      
< td  width ="85" >< html:link  page ="/list.do"  paramId ="id"  paramName ="list"  paramProperty ="id"   > 在线订购 </ html:link ></ td >
    
</ tr >
  
</ logic:iterate >
</ table >

</ body >
</ html:html >


模块主要是围绕hashmap容器和list容器编程,并用session会话保持整个操作的记录,其中需要注意的一些问题总结如下:
       
        (1)用户没有进行修改操作时,点击一件商品后,继续购物,点击相同商品时sum++控制。 

        (2)用户没有进行修改操作时,点击一件商品后,继续购物,点击新商品时sum=1控制。

        (3)用户没有进行修改操作时,delete某件商品信息清单时,注意将allIdSumList容器(在session范围内)中元素的id属性对应的整个元素删除操作,并将“ids_go”(session范围内)中和此次delete操作带的商品id比较,将相同的id在“ids_go”(list容器)中全部删除,保证用户成功执行delete操作,返回继续购物时还原为初始状态。

        (4)用户进行修改操作时,将allIdSumList容器中的元素属性sum和allprices保持同步更新,并设置一个标志位flag="update",标志是经过修改数量的操作,同时当修改操作后继续在进行修改操作时将idSum_list中的数据clear(),保证下次修改时是全新的数据,主要原因是考虑到list对于重复的元素没有覆盖功能。

        (5)用户进行删除操作后,将updateAction中的标记flag设置为null(flag用来标记用户是否有过update操作,session范围内有效)


你可能感兴趣的:(Struts+Hibernate实现shopcart)