日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ssh2项目之自己想的购物网站

發布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ssh2项目之自己想的购物网站 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

想著把零碎的整理一下,合成一個完整的,雖然做完還是很簡陋的項目

哎呀,這樣一個小練手的項目,我居然做了七天,天哪,先大概回想一下有哪些需求

工具:tomcat /weblogic ?myeclipse ?mysql

數據庫里有用戶表,用戶權限表,商品表,商品分類表,留言表,訂單表,訂單明細表,還應該在加一個購物車的表,偷懶,購物車信息就放在session里了

大概要實現的功能:

用戶:查詢商品,分類查詢商品(菜單欄上的頂級分類),根據商品的名字模糊查詢商品,注冊(默認用戶等級),登陸后添加購物車,批量添加到購物車,購物車里的商品選中全部或部分提交訂單,下訂單,模擬付款,催店家發貨,取消訂單,批量刪除自己的訂單,對商品留言(評價),刪除自己的留言

管理員:新增用戶(指定用戶的等級),刪除用戶,修改用戶的信息;;新增用戶的權限信息,刪除用戶的權限(刪除之前必須先刪掉具有該權限的用戶),增加商品(商品的圖片上傳,可以選擇分類),修改商品,刪除商品,增加商品的分類,刪除商品的分類(刪除之前必須先刪掉該分類下的所有的商品),對用戶的留言管理(刪除),對商品的訂單管理(發貨,刪除訂單)

使用攔截器,未登錄不可以進行下面的操作,轉到登陸頁面(管理員去管理員的登陸界面,用戶去用戶的登陸界面)

先在做完了,但是離一個真正的產品 還有很遠的距離,只是自己練手用的

一開始使用weblogic 做服務器,哎呀,服務器配好數據源,爽的不行,但是啟動太慢,加之自己不太會使用,不適合調試使用,所以又配了tomcat ,

ssh2的框架的搭建參考:http://blog.csdn.net/i_do_can/article/details/50378275

搭好框架就可以開始了我是先寫后臺,上面的那些需要實現的功能也是我邊寫邊修改的,目錄結構


先設計實體類


其中pagebean 是為了分頁顯示使用的 get/set方法都要有,我只貼出數據字段間的關系,比如主鍵啦,一對多啦

public class PageBean {private List<?> list; //通過hql從數據庫分頁查詢出來的list集合private int allRows; //總記錄數private int totalPage; //總頁數private int currentPage; //當前頁 }

user里的字段

package com.cl.shopping.bean;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table;@Entity @Table(name="tbl_user") public class User {private Integer id;private String username;private String password;private UserRole role;private String realname;private String tel;private String email;private String address;@Id@GeneratedValuepublic Integer getId() {return id;}@ManyToOne@JoinColumn(name="role")public UserRole getRole() {return role;}} 商品里的字段 package com.cl.shopping.bean;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table;@Entity @Table(name = "tbl_goods") public class Goods{private Integer id;private String goodsname;private GoodTypes goodtypes;private Integer count;private Float price;private String goodspic;private String goodsdesc;@Id@GeneratedValuepublic Integer getId() {return this.id;}//商品對商品種類:多個商品對一個分類@ManyToOne@JoinColumn(name="goodstype")public GoodTypes getGoodtypes() {return goodtypes;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());return result;} //只比較 id 在com.cl.shopping.action.OrderAction.ordersubmitformsession() 里可能會使用@Overridepublic boolean equals(Object obj) {Goods other = (Goods) obj;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;return true;}} 商品分類 package com.cl.shopping.bean;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table;@Entity @Table(name = "tbl_goods_type") public class GoodTypes {private Integer id;private Integer pid;private String typename;private String note;@Id@GeneratedValuepublic Integer getId() {return this.id;}} 用戶對商品留言類

package com.cl.shopping.bean;import java.util.Date;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table;/*商品留言列表*/ @Entity @Table(name="tbl_goods_board") public class GoodBoards {private int id;private User user;private Goods good;private String message;private Date date;@Id@GeneratedValuepublic int getId() {return id;}//一條留言只可以由一個用戶發表,一個用戶可以發表多條留言//現在是相對留言而言,多個留言對應于一個用戶@ManyToOne@JoinColumn(name="userId")public User getUser() {return user;}//一個留言對應一個商品,一個商品可以有多個留言//現在是相對留言而言,多個留言對應于一個商品@ManyToOne@JoinColumn(name="goodsId")public Goods getGood() {return good;}} 訂單類 package com.cl.shopping.bean;import java.util.Date;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table;@Entity @Table(name = "tbl_order") public class Order {/** 這幾個參數的關系:如果用戶取消了訂單,頁面顯示已取消* 如果用戶未付款,顯示 付款,取消訂單* 如果用戶已付款,但是還沒有發貨,顯示,已付款,等待發貨,提醒發貨* 如果用戶已付款,但是還沒有發貨,顯示 訂單已發貨* */private Integer id;//費用private Float cost;//下訂單的用戶private User userid;//訂單的生成時間private Date createtime;//訂單對否有效 ,用戶可以取消訂單,不是刪除, 0有效 1 無效 未付款直接取消,已付款的涉及退款問題private int valid; //是否付款 : 0 未付款 1:已付款private int pay;//是否發貨 : 0 未發貨 1:已發貨private int deliver;//訂單的發貨時間private Date delivertime;@Id@GeneratedValuepublic Integer getId() {return id;}//對訂單而言,多個訂單由一個用戶產生@ManyToOne@JoinColumn(name="userid")public User getUserid() {return userid;} } 訂單明細類 package com.cl.shopping.bean;import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table;@Entity @Table(name = "tbl_order_detail") public class OrderDetail {private Integer id;//對應哪個訂單private Order orderid;//對應哪個商品private Goods goodsid;private String goodsname;//單價private Float baseprice;private Integer num;@Id@GeneratedValuepublic Integer getId() {return id;}//一條訂單詳情 對應一個訂單@OneToOne@JoinColumn(name="orderid")public Order getOrderid() {return orderid;}//一條訂單詳情 對應一個商品@OneToOne@JoinColumn(name="goodsid")public Goods getGoodsid() {return goodsid;}} 以及購物車類 package com.cl.shopping.bean;public class Cart {private Integer goodsid;private String goodsName;//單價private Float baseprice;//數量private Integer count;//小計private Float amount;}

然后寫dao層,我大概分了幾個模塊,由于每個界面都想做分頁,所有就把分頁單獨寫在一個dao里

BaseDao extends HibernateDaoSupport ? ,以后每個dao直接繼承就好了,這樣我在spring里配數據源時也更加方面一些,里面就兩個方法:一個獲取要查詢的語句的結果的總記錄數,一個進行分頁,分頁就是使用hibernate里提供好的

package com.cl.shopping.dao;import java.util.List;import org.hibernate.Query; import org.hibernate.Transaction; import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class BaseDao extends HibernateDaoSupport {public int getAllRowCount(String hql){int allRows = 0;List<?> list = getHibernateTemplate().find(hql);allRows = list.size();return allRows;}//通過名字模糊查詢public int getAllRowCount(String hql,String name){int allRows = 0;List<?> list = getHibernateTemplate().find(hql,name);allRows = list.size();return allRows;}/*** 使用hibernate提供的分頁功能,得到分頁顯示的數據* */public List<?> queryByPage(String hql, int offset, int pageSize){Query query = getSession().createQuery(hql).setFirstResult(offset).setMaxResults(pageSize);List<?> list = query.list();return list;}} 關于分頁很多人有不同的做法,我偷懶,就直接使用?

getSession().createQuery(hql).setFirstResult(offset).setMaxResults(pageSize);

接著寫關于用戶的dao,我寫成了接口

package com.cl.shopping.dao;import java.util.List;import com.cl.shopping.bean.User; import com.cl.shopping.bean.UserRole;public interface UserDao {void saveUser(User user);void deleteUser(int id);//根據對象直接刪除void deleteUser(User user);List<?> findUserByName(String name);//找到所有是該權限的用戶List<?> findUserByRoleId(int roleid);User findUserById(int id);//roleList<?> findAllRole();void saveRole(UserRole role);void deleteRole(int id);}

實現類:

package com.cl.shopping.dao.impl;import java.util.List;import com.cl.shopping.bean.User; import com.cl.shopping.bean.UserRole; import com.cl.shopping.dao.BaseDao; import com.cl.shopping.dao.UserDao;public class UserDaoImpl extends BaseDao implements UserDao{public void deleteUser(int id) {//先加載特定實例Object p = getHibernateTemplate().get(User.class, new Integer(id));//刪除特定實例getHibernateTemplate().delete(p);}public void deleteUser(User user) {getHibernateTemplate().delete(user);}public List<?> findUserByRoleId(int roleid) {List<?> list = null;list = this.getHibernateTemplate().findByNamedParam("from User u where u.role.id=:roleid","roleid",roleid);return list;}public void saveUser(User user) {getHibernateTemplate().saveOrUpdate(user);}//這里不是做的搜索,是確定知道名字的, 所以沒有做模糊查詢public List<?> findUserByName(String name) {// Query query = getSession().createQuery("from User u where u.username = :username"); // query.setParameter("username", name); // List<?> list = query.list(); // User user = null; // if(list.size() > 0){ // user = (User) list.get(0); // } // return user;// http://blog.csdn.net/yaorongzhen123/article/details/8556484List<?> list = null;list = this.getHibernateTemplate().findByNamedParam("from User u where u.username=:name","name",name);return list;}public List<?> findAllUser() { // //以前的寫法 // Query query = getSession().createQuery("from User"); // return query.list();return this.getHibernateTemplate().find("from User");}public List<?> findAllRole() {return this.getHibernateTemplate().find("from UserRole order by id");}public void saveRole(UserRole role) {getHibernateTemplate().saveOrUpdate(role);}public void deleteRole(int id) {Object p = getHibernateTemplate().get(UserRole.class, new Integer(id));//刪除特定實例getHibernateTemplate().delete(p);}public User findUserById(int id) {//先加載特定實例User p = getHibernateTemplate().get(User.class, new Integer(id));return p;}}

關于商品的?

package com.cl.shopping.dao;import java.util.List;import com.cl.shopping.bean.GoodTypes; import com.cl.shopping.bean.Goods;public interface GoodsDao {/*Goods*/void saveGoods(Goods goods);void deleteGoods(int id);void deleteGoods(Goods goods);List<?> findGoodsByTypeId(int typeid);List<?> findGoodsByName(String name);Goods findGoodsById(int id);/*GoodTypes*/void saveGoodTypes(GoodTypes goodTypes);void deleteGoodTypes(int id);List<?> findAllGoodTypes();}

商品的刪除寫了兩個,一個是id 刪除(先根據id查出來,再把對象刪除),一個是直接對象刪除(減少查的過程,用于刪除分類時,直接傳遞對象)

實現類:

package com.cl.shopping.dao.impl;import java.util.List;import com.cl.shopping.bean.GoodTypes; import com.cl.shopping.bean.Goods; import com.cl.shopping.dao.BaseDao; import com.cl.shopping.dao.GoodsDao;public class GoodsDaoImpl extends BaseDao implements GoodsDao{public void saveGoods(Goods goods) {getHibernateTemplate().saveOrUpdate(goods);}//需要刪除實例的主鍵public void deleteGoods(int id) {//get()可以取空的數據集,但load()不行//先加載特定實例Object p = getHibernateTemplate().get(Goods.class, new Integer(id));//刪除特定實例getHibernateTemplate().delete(p);}public void deleteGoods(Goods goods) {// TODO Auto-generated method stubgetHibernateTemplate().delete(goods);}public List<?> findGoodsByTypeId(int typeid) {List<?> list = null;//list = this.getHibernateTemplate().find("from Goods g where g.goodtypes.id = ?",typeid);return list;}public Goods findGoodsById(int id) {Goods goods = getHibernateTemplate().get(Goods.class, new Integer(id));return goods;}public List<?> findGoodsByName(String name) {List<?> list = null;//list = this.getHibernateTemplate().find("from Goods g where g.goodsname like ?","%" + name + "%");return list;}public void saveGoodTypes(GoodTypes goodTypes) {getHibernateTemplate().saveOrUpdate(goodTypes);}public void deleteGoodTypes(int id) {Object p = getHibernateTemplate().get(GoodTypes.class, new Integer(id));//刪除特定實例getHibernateTemplate().delete(p);}public List<?> findAllGoodTypes() {// TODO Auto-generated method stubreturn this.getHibernateTemplate().find("from GoodTypes");}} 關于訂單的 package com.cl.shopping.dao;import java.util.List;import com.cl.shopping.bean.Order; import com.cl.shopping.bean.OrderDetail;public interface OrderDao {/*order*///增加訂單,返回最新增加的id int saveOrder(Order order);//管理員刪除 訂單void deleteOrder(int id);// //管理員發貨 // void deliverOrder(Order order); // // //用戶 取消 訂單 其實就是更新訂單,只是修改一個字段而已 // void removeOrder(Order order); // // //用戶 付款 其實就是更新訂單,只是修改一個字段而已 // void payOrder(Order order);//根據訂單id 查找訂單 顯示訂單詳情時,上面是訂單信息,下面是訂單詳細Order findOrderById(int id);//分頁的使用basedao 里的/*orderdetail*///增加訂單詳情void saveOrderdetail(OrderDetail orderdetail);//管理員,用戶刪除 void deleteOrderdetail(int id);//直接根據對象刪除 void deleteOrderdetail(OrderDetail orderdetail);List<OrderDetail> findAllOrderdetailByOrderId(int id);}

為何保存訂單會有一個返回值,兄弟呀,我是使用的mysql的逐漸自增,但是在保存訂單時,我需要獲取剛生成的訂單在數據庫的id作為訂單明細的外鍵,所以這里有個返回值,就是返回剛生成的id?

<span style="white-space:pre"> </span>getHibernateTemplate().saveOrUpdate(order);getHibernateTemplate().flush(); // 為何要返回呢,是因為有些主鍵類型是自增的,插入成功后才能得到該主鍵值,所以需要返回PO給調用者 ;int last_insert_id = order.getId();return last_insert_id;

實現類

package com.cl.shopping.dao.impl;import java.util.List;import com.cl.shopping.bean.Order; import com.cl.shopping.bean.OrderDetail; import com.cl.shopping.dao.BaseDao; import com.cl.shopping.dao.OrderDao;public class OrderDaoImpl extends BaseDao implements OrderDao{public int saveOrder(Order order) {getHibernateTemplate().saveOrUpdate(order);getHibernateTemplate().flush(); // 為何要返回呢,是因為有些主鍵類型是自增的,插入成功后才能得到該主鍵值,所以需要返回PO給調用者 ;int last_insert_id = order.getId();return last_insert_id;}public void deleteOrder(int id) {Object p = getHibernateTemplate().get(Order.class, new Integer(id));getHibernateTemplate().delete(p);}// public void deliverOrder(Order order) { // // getHibernateTemplate().saveOrUpdate(order); // // } // // public void removeOrder(Order order) { // // getHibernateTemplate().saveOrUpdate(order); // // } // // public void payOrder(Order order) { // // getHibernateTemplate().saveOrUpdate(order); // // }public Order findOrderById(int id) {Order order = getHibernateTemplate().get(Order.class, new Integer(id));return order;}public void saveOrderdetail(OrderDetail orderdetail) {getHibernateTemplate().saveOrUpdate(orderdetail);}public void deleteOrderdetail(int id) {OrderDetail p = getHibernateTemplate().get(OrderDetail.class, new Integer(id));getHibernateTemplate().delete(p);}public void deleteOrderdetail(OrderDetail orderdetail) {getHibernateTemplate().delete(orderdetail);}@SuppressWarnings("unchecked")public List<OrderDetail> findAllOrderdetailByOrderId(int id) {List<OrderDetail> list = null;list = this.getHibernateTemplate().findByNamedParam("from OrderDetail o where o.orderid.id=:orderid","orderid",id);return list;}} 關于用戶對商品的留言: package com.cl.shopping.dao;import com.cl.shopping.bean.GoodBoards;/*留言就做一個用戶新增的,然后分頁顯示,管理員刪除的功能,不可更改*/ public interface GoodBoardsDao {void saveGoodBoards(GoodBoards goodBoards);void deleteGoodBoards(int id);}

實現類

package com.cl.shopping.dao.impl;import com.cl.shopping.bean.GoodBoards; import com.cl.shopping.dao.BaseDao; import com.cl.shopping.dao.GoodBoardsDao;public class GoodBoardsDaoImpl extends BaseDao implements GoodBoardsDao{public void saveGoodBoards(GoodBoards goodBoards) {getHibernateTemplate().saveOrUpdate(goodBoards);}public void deleteGoodBoards(int id) {Object p = getHibernateTemplate().get(GoodBoards.class, new Integer(id));getHibernateTemplate().delete(p);}} 寫完dao 開始service層

抽象方法跟dao差不多,多個分頁查詢的

先是user相關的

package com.cl.shopping.service;import java.util.List;import com.cl.shopping.bean.PageBean; import com.cl.shopping.bean.User; import com.cl.shopping.bean.UserRole;public interface UserService {void saveUser(User user);void deleteUser(int id);//這個只是登陸是查新使用。User findUserByName(String name);User findUserById(int id);PageBean findUserBypage(int pageSize, int page);//roleList<?> findAllRole();void saveRole(UserRole role);void deleteRole(int id);}實現類 package com.cl.shopping.service.impl;import java.util.List;import com.cl.shopping.bean.PageBean; import com.cl.shopping.bean.User; import com.cl.shopping.bean.UserRole; import com.cl.shopping.dao.impl.UserDaoImpl; import com.cl.shopping.service.UserService;public class UserServiceImpl implements UserService{private UserDaoImpl userdao;public UserServiceImpl(){ // session = GetSession.getSession();userdao = new UserDaoImpl();}public void setUserdao(UserDaoImpl userdao) {this.userdao = userdao;}public void saveUser(User user) {userdao.saveUser(user);}public void deleteUser(int id) {userdao.deleteUser(id);}public User findUserByName(String name) {List<?> list = userdao.findUserByName(name);if(list.size() > 0){ return (User)list.get(0);}return null;}public List<?> findAllUser() {return userdao.findAllUser();}public User findUserById(int id) {// TODO Auto-generated method stubreturn userdao.findUserById(id);}public PageBean findUserBypage(int pageSize, int page) {PageBean pageBean = new PageBean();String hql = "from User";int allRows = userdao.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = userdao.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}public List<?> findAllRole() {return userdao.findAllRole();}public void saveRole(UserRole role) {userdao.saveRole(role);}//刪除權限時,要刪除所以是該權限的用戶public void deleteRole(int id) {List<User> list = (List<User>) userdao.findUserByRoleId(id);for(int i= 0;i<list.size();i++){userdao.deleteUser(list.get(i));}userdao.deleteRole(id);} } 關于商品的: package com.cl.shopping.service;import java.util.ArrayList; import java.util.List;import com.cl.shopping.bean.GoodTypes; import com.cl.shopping.bean.Goods; import com.cl.shopping.bean.PageBean;public interface GoodsService {/*Goods*/void saveGoods(Goods goods);void deleteGoods(int id);Goods findGoodsById(int id);List<?> findGoodsByName(String name);PageBean findGoodsByName(String name,int pageSize, int page);PageBean findGoodsBypage(int pageSize, int page);PageBean findGoodsBypage(int pageSize, int page,List<GoodTypes> lists);/*GoodTypes*/void saveGoodTypes(GoodTypes goodTypes);void deleteGoodTypes(int id);PageBean findGoodTypesByPage(int pageSize, int page);List<?> findAllGoodTypes(); }

實現類

package com.cl.shopping.service.impl;import java.util.List; import com.cl.shopping.bean.GoodTypes; import com.cl.shopping.bean.Goods; import com.cl.shopping.bean.PageBean; import com.cl.shopping.dao.impl.GoodsDaoImpl; import com.cl.shopping.service.GoodsService;public class GoodServiceImpl implements GoodsService {private GoodsDaoImpl goodsDaoImpl;public void saveGoods(Goods goods) {goodsDaoImpl.saveGoods(goods);}public void deleteGoods(int id) {goodsDaoImpl.deleteGoods(id);}public Goods findGoodsById(int id) {Goods goods = goodsDaoImpl.findGoodsById(id);return goods;}public List<?> findGoodsByName(String name) {List<?> list = goodsDaoImpl.findGoodsByName(name);return list;}public PageBean findGoodsByName(String name,int pageSize, int page) {PageBean pageBean = new PageBean();/* String hql = "from Goods g where g.goodsname like ?" ;int allRows = goodsDaoImpl.getAllRowCount(hql,"%" + name + "%");int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);hql = "from Goods g where g.goodsname like '%" + name + "%'";//這句話純測試看看 ,是可以使用的,原來就是 % 要加 ' 呀allRows = goodsDaoImpl.getAllRowCount(hql);*///原來就是 % 要加 ' 呀String hql = "from Goods g where g.goodsname like '%" + name + "%'";int allRows = goodsDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = goodsDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}/*** pageSize為每頁顯示的記錄數* page為當前顯示的網頁*/public PageBean findGoodsBypage(int pageSize, int page) {PageBean pageBean = new PageBean();String hql = "from Goods";int allRows = goodsDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = goodsDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}//分類查詢,lists里放的是需要查詢的分類的 id ,其實這里lists存的直接是分類對象public PageBean findGoodsBypage(int pageSize, int page,List<GoodTypes> lists) {PageBean pageBean = new PageBean();String hql = "from Goods g where g.goodtypes.id in (";for(int i = 0;i<lists.size();i++){hql = hql + lists.get(i).getId() + ",";}hql=hql.substring(0,(hql.length()-1));hql += ")";//數據庫 SELECT * FROM tbl_goods g where g.id in (10,6,7) int allRows = goodsDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = goodsDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}public void saveGoodTypes(GoodTypes goodTypes) {goodsDaoImpl.saveGoodTypes(goodTypes);}public void deleteGoodTypes(int id) {List<Goods> list = (List<Goods>) goodsDaoImpl.findGoodsByTypeId(id);for(int i = 0;i<list.size();i++){goodsDaoImpl.deleteGoods(list.get(i));}goodsDaoImpl.deleteGoodTypes(id);}public List<?> findAllGoodTypes() {// TODO Auto-generated method stubreturn goodsDaoImpl.findAllGoodTypes();}public PageBean findGoodTypesByPage(int pageSize, int page) {PageBean pageBean = new PageBean();String hql = "from GoodTypes";int allRows = goodsDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = goodsDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}public void setGoodsDaoImpl(GoodsDaoImpl goodsDaoImpl) {this.goodsDaoImpl = goodsDaoImpl;}} 這里有幾個要注意的就是,一個是使用“like”模糊查詢時,需要加上單引號,這個問題,困擾了好久說實話,

首頁沒有做js效果,類似那種鼠標一上去,二級菜單出現這種的,我雖界面沒有寫,但是我把查詢的代碼寫出來了,

public PageBean findGoodsBypage(int pageSize, int page,?List<GoodTypes> lists) ?看代碼完全可以看懂

還有刪除商品分類時,一般刪除我們都是傳一個 id 過來,這里需要先查詢出使用了此分類的商品,依次刪除,這里為了提高效率,直接是傳的對象過去

關于留言的:

package com.cl.shopping.service;import com.cl.shopping.bean.GoodBoards; import com.cl.shopping.bean.PageBean;public interface GoodBoardsService {void saveGoodBoards(GoodBoards goodBoards);void deleteGoodBoards(int id);PageBean findGoodsBypage(int pageSize, int page,int goodid); }

實現類

package com.cl.shopping.service.impl;import java.util.List;import com.cl.shopping.bean.GoodBoards; import com.cl.shopping.bean.PageBean; import com.cl.shopping.dao.GoodBoardsDao; import com.cl.shopping.dao.impl.GoodBoardsDaoImpl; import com.cl.shopping.service.GoodBoardsService;public class GoodBoardsServiceImpl implements GoodBoardsService {private GoodBoardsDaoImpl goodBoardsDaoImpl;public void saveGoodBoards(GoodBoards goodBoards) {goodBoardsDaoImpl.saveGoodBoards(goodBoards);}public void deleteGoodBoards(int id) {goodBoardsDaoImpl.deleteGoodBoards(id);}public PageBean findGoodsBypage(int pageSize, int page,int goodid) {PageBean pageBean = new PageBean();String hql ;if(goodid != 0){//用戶查該商品hql = "from GoodBoards g where g.good.id=" + goodid;}else{//管理員查全部hql = "from GoodBoards";}int allRows = goodBoardsDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = goodBoardsDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}public void setGoodBoardsDaoImpl(GoodBoardsDaoImpl goodBoardsDaoImpl) {this.goodBoardsDaoImpl = goodBoardsDaoImpl;}} 這里由于用戶的留言是針對單個商品的,即在單個商品里留言,所以在查詢時,寫了兩個方法,一個管理員分頁顯示所有的留言,一個是用戶的根據商品的id分頁顯示該商品的留言

關于訂單的

package com.cl.shopping.service;import java.util.List;import com.cl.shopping.bean.Order; import com.cl.shopping.bean.OrderDetail; import com.cl.shopping.bean.PageBean;public interface OrderService {/*order*///增加訂單,連訂單明細一起增加的void saveOrder(Order order,List<OrderDetail> orderdetaillist);//管理員刪除 訂單 ,連訂單明細一起刪除void deleteOrder(int id);//管理員發貨void deliverOrder(Order order);//用戶 取消 訂單 其實就是更新訂單,只是修改一個字段而已void removeOrder(Order order);//用戶 付款 其實就是更新訂單,只是修改一個字段而已void payOrder(Order order);//根據訂單id 查找訂單 顯示訂單詳情時,上面是訂單信息,下面是訂單詳細Order findOrderById(int id);//管理員查詢所有的訂單PageBean findAllOrderBypage(int pageSize, int page);//用戶查詢自己的所有的訂單 其他什么用戶根據時間啦,訂單編號啦,訂單里的某一個商品名來模糊查找訂單啦,就暫時先不做了PageBean userFindOrderBypage(int userid ,int pageSize, int page);//查詢訂單 的 明細 管理員和用戶都可以查詢PageBean findAllOrderDetailBypage(int orderid,int pageSize, int page);}

功能就見注釋吧,實現類

package com.cl.shopping.service.impl;import java.util.List;import com.cl.shopping.bean.Order; import com.cl.shopping.bean.OrderDetail; import com.cl.shopping.bean.PageBean; import com.cl.shopping.dao.impl.OrderDaoImpl; import com.cl.shopping.service.OrderService;public class OrderServiceImpl implements OrderService{private OrderDaoImpl orderDaoImpl;public void deleteOrder(int id) {// 先刪除訂單明細,再刪除訂單//根據商品的id找出所有的訂單明細List<OrderDetail> list = orderDaoImpl.findAllOrderdetailByOrderId(id);//這里根據 id 刪是可以的,但是效率不高,這里先查了一次,刪除前又要查一次,所以直接根據 對象刪for(int i =0; i < list.size(); i++){ // orderDaoImpl.deleteOrderdetail(list.get(i).getId());orderDaoImpl.deleteOrderdetail(list.get(i));} orderDaoImpl.deleteOrder(id);}public void deliverOrder(Order order) {// TODO Auto-generated method stuborderDaoImpl.saveOrder(order);}public void removeOrder(Order order) {// TODO Auto-generated method stuborderDaoImpl.saveOrder(order);}public void payOrder(Order order) {// TODO Auto-generated method stuborderDaoImpl.saveOrder(order);}public Order findOrderById(int id) {Order order = orderDaoImpl.findOrderById(id);return order;}public PageBean findAllOrderBypage(int pageSize, int page) {PageBean pageBean = new PageBean();String hql = "from Order";int allRows = orderDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = orderDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}public PageBean userFindOrderBypage(int userid, int pageSize, int page) {PageBean pageBean = new PageBean();String hql = "from Order o where o.userid.id = " + userid;int allRows = orderDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = orderDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}public PageBean findAllOrderDetailBypage(int orderid, int pageSize, int page) {PageBean pageBean = new PageBean();String hql = "from OrderDetail o where o.orderid.id = " + orderid;int allRows = orderDaoImpl.getAllRowCount(hql);int totalPage = pageBean.getTotalPages(pageSize, allRows);int currentPage = pageBean.getCurPage(page);int offset = pageBean.getCurrentPageOffset(pageSize, currentPage);List<?> list = orderDaoImpl.queryByPage(hql, offset, pageSize);pageBean.setList(list);pageBean.setAllRows(allRows);pageBean.setCurrentPage(currentPage);pageBean.setTotalPage(totalPage);return pageBean;}public void setOrderDaoImpl(OrderDaoImpl orderDaoImpl) {this.orderDaoImpl = orderDaoImpl;}public void saveOrder(Order order, List<OrderDetail> orderdetaillist) {int id = orderDaoImpl.saveOrder(order);//上一次被插入的 id order.setId(id);for(int i = 0 ; i < orderdetaillist.size(); i++){OrderDetail orderdetail = orderdetaillist.get(i);//設置訂單id orderdetail.setOrderid(order);orderDaoImpl.saveOrderdetail(orderdetail);}}} 保存訂單明細時,使用了剛剛生成的訂單id 作為外鍵,其他查詢什么的比如根據訂單id查詢訂單明細,就看具體方法吧

剩下的就是開始寫action 里,不過在這之前,先搞定幾個問題,一個是登陸是的驗證碼

我一開始使用的用不了,說是struts2的緣故,參考?http://blog.csdn.net/shiyuezhong/article/details/8246958

然后在管理員進行商品添加時,我需要獲得商品的分類列表,還有就是在用戶進行分類查詢時,我要根據用戶查到那個分類,找到所有的子孫類,然后分頁顯示,哈哈,查詢的代碼是上面說的分類查詢里

com.cl.shopping.service.impl.GoodServiceImpl.findGoodsBypage(int, int, List<GoodTypes>)

hql 語句的處理

<span style="white-space:pre"> </span>String hql = "from Goods g where g.goodtypes.id in (";for(int i = 0;i<lists.size();i++){hql = hql + lists.get(i).getId() + ",";}hql=hql.substring(0,(hql.length()-1));hql += ")";上面都有,查詢子分類使用了遞歸,對了先看一下我的分類數據庫怎么存的吧


實現的遞歸方法,一個顯示時很明顯,一個沒有做處理,其實是一樣,看代碼啦

//遍歷數據庫的type 無級菜單 遞歸 原數據 遍歷的父id 填充物 處理后的數據public static void parse(List<GoodTypes> list,int pid,String s,List<GoodTypes> lists){//對list進行一次循環遍歷for(int i = 0; i <list.size();i++){GoodTypes types = (GoodTypes) list.get(i);//如果該商品分類的父id == 當前遍歷的商品分類的id -->該商品分類是當前遍歷商品分類的下一級目錄if(types.getPid() == pid){ // System.out.println(s+types.getTypename());//把空格填充進去types.setTypename(s+types.getTypename());lists.add(types);//繼續找該商品分類的下一級目錄parse(list,types.getId(),s+"——",lists);}}}//這個只是分類,但是不加任何字符public static void parse(List<GoodTypes> list,int pid,List<GoodTypes> lists){//對list進行一次循環遍歷for(int i = 0; i <list.size();i++){GoodTypes types = (GoodTypes) list.get(i);//如果該商品分類的父id == 當前遍歷的商品分類的id -->該商品分類是當前遍歷商品分類的下一級目錄if(types.getPid() == pid){ // System.out.println(s+types.getTypename());//把空格填充進去types.setTypename(types.getTypename());lists.add(types);//繼續找該商品分類的下一級目錄parse(list,types.getId(),lists);}}}框架的架子配好后,直接在上面修改就好,看看spring文件注冊的bean,算了,全部貼上吧

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"><!-- weblogic 數據源 參考 http://blog.csdn.net/jacklee_6297/article/details/5347439 --><!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>mysql</value></property> </bean> --><!-- spring proxool --><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName"><value>org.logicalcobwebs.proxool.ProxoolDriver</value></property><property name="url"><value>proxool.shopping</value></property></bean> <!-- spring hibernate --><bean id="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSource" /><!-- 注解類 bean 需要連數據庫的 --><property name="annotatedClasses"><list><value>com.cl.shopping.bean.User</value><value>com.cl.shopping.bean.UserRole</value><value>com.cl.shopping.bean.Goods</value><value>com.cl.shopping.bean.GoodTypes</value><value>com.cl.shopping.bean.GoodBoards</value><value>com.cl.shopping.bean.Order</value><value>com.cl.shopping.bean.OrderDetail</value></list></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><!-- <property name="schemaUpdate"> <value>true</value> </property> --></bean><!-- DAO --><bean id="baseDao" class="com.cl.shopping.dao.BaseDao"><property name="sessionFactory" ref="sessionFactory"></property></bean><bean id="UserDaoImpl" class="com.cl.shopping.dao.impl.UserDaoImpl" parent="baseDao"></bean><bean id="GoodsDaoImpl" class="com.cl.shopping.dao.impl.GoodsDaoImpl" parent="baseDao"></bean><bean id="GoodBoardsDaoImpl" class="com.cl.shopping.dao.impl.GoodBoardsDaoImpl" parent="baseDao"></bean><bean id="OrderDaoImpl" class="com.cl.shopping.dao.impl.OrderDaoImpl" parent="baseDao"></bean><!-- Service --><bean id="UserServiceImpl" class="com.cl.shopping.service.impl.UserServiceImpl"><property name="userdao" ref="UserDaoImpl"></property></bean><bean id="GoodServiceImpl" class="com.cl.shopping.service.impl.GoodServiceImpl"><property name="goodsDaoImpl" ref="GoodsDaoImpl"></property></bean><bean id="GoodBoardsServiceImpl" class="com.cl.shopping.service.impl.GoodBoardsServiceImpl"><property name="goodBoardsDaoImpl" ref="GoodBoardsDaoImpl"></property></bean><bean id="OrderServiceImpl" class="com.cl.shopping.service.impl.OrderServiceImpl"><property name="orderDaoImpl" ref="OrderDaoImpl"></property></bean><!-- Action --><!-- 生成驗證碼 --><bean id="securityCodeImageAction" name="securityCodeImageAction" class="com.cl.shopping.action.SecurityCodeImageAction"></bean><!-- struts2 對應ben的 name 名 --><bean id="UserAction" name="userAction" class="com.cl.shopping.action.UserAction"><property name="userservice" ref="UserServiceImpl"></property> </bean><bean id="GoodsAction" name="goodsAction" class="com.cl.shopping.action.GoodsAction"><property name="goodService" ref="GoodServiceImpl"></property> </bean><bean id="GoodTypesAction" name="goodTypesAction" class="com.cl.shopping.action.GoodTypesAction"><property name="goodService" ref="GoodServiceImpl"></property> </bean><!-- 菜單的分類查詢 --><bean name="classificGoodsAction" class="com.cl.shopping.action.ClassificGoodsAction"><property name="goodsService" ref="GoodServiceImpl"></property></bean><!-- 添加商品:圖片上傳 --><bean name="addgoodsAction" class="com.cl.shopping.action.AddgoodsAction"><property name="goodsService" ref="GoodServiceImpl"></property></bean><!-- 用戶權限 --><bean name="roleAction" class="com.cl.shopping.action.RoleAction"><property name="userservice" ref="UserServiceImpl"></property> </bean><!-- 用戶查詢商品--><bean name="userGoodsAction" class="com.cl.shopping.action.UserGoodsAction"><property name="goodService" ref="GoodServiceImpl"></property><property name="goodBoardsService" ref="GoodBoardsServiceImpl"></property></bean><!-- 用戶的留言--><bean name="goodBoardsAction" class="com.cl.shopping.action.GoodBoardsAction"><property name="goodBoardsService" ref="GoodBoardsServiceImpl"></property></bean><!-- 購物車--><bean name="carAction" class="com.cl.shopping.action.CarAction"><property name="goodService" ref="GoodServiceImpl"></property></bean><!-- 訂單 --><bean name="orderAction" class="com.cl.shopping.action.OrderAction"><property name="orderService" ref="OrderServiceImpl"></property><property name="goodService" ref="GoodServiceImpl"></property></bean><!-- 訂單明細 --><bean name="orderDetailAction" class="com.cl.shopping.action.OrderDetailAction"><property name="orderService" ref="OrderServiceImpl"></property></bean><!-- 聲明式事物配置 --><!-- 配置事務管理器 --><bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><ref bean="sessionFactory" /></property></bean><!-- 配置事務傳播特性 --><tx:advice id="TestAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" propagation="REQUIRED" /><tx:method name="del*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="add*" propagation="REQUIRED" /><tx:method name="find*" propagation="REQUIRED" /><tx:method name="get*" propagation="REQUIRED" /><tx:method name="apply*" propagation="REQUIRED" /><tx:method name="remove*" propagation="REQUIRED" /><tx:method name="insert*" propagation="REQUIRED" /></tx:attributes></tx:advice><!-- 配置參與事務的類 --><aop:config><!-- 正則表達式 com.cl.spring.service 下所有的類的所有的方法 --><aop:pointcut id="allTestServiceMethod"expression="execution(* com.cl.shopping.service.*.*(..))" /><aop:advisor pointcut-ref="allTestServiceMethod"advice-ref="TestAdvice" /></aop:config></beans>連接池的proxool.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE proxool-config> <proxool-config><proxool><alias>shopping</alias><driver-url>jdbc:mysql://localhost:3306/nxf_shopping?characterEncoding=UTF8</driver-url><driver-class>com.mysql.jdbc.Driver</driver-class><driver-properties><property name="user" value="root"/><property name="password" value=""/></driver-properties><maximum-connection-count>30</maximum-connection-count><minimum-connection-count>10</minimum-connection-count><house-keeping-sleep-time>90000</house-keeping-sleep-time><prototype-count>5</prototype-count><house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql></proxool> </proxool-config> struts 的配置文件主要是各種action

里面有些是跳轉,有些是重定向實現的,攔截器就把注釋去掉,把下一句配上就好了

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.i18n.encoding" value="UTF-8"/> <!-- 定義權限控制攔截器 --><package name="struts-shop" extends="struts-default"><interceptors><interceptor name="login" class="com.cl.shopping.intecepeter.intecepeter"/><interceptor-stack name="myStack"><interceptor-ref name="login"/><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors><!-- (這句是設置所有Action自動調用的攔截器堆棧) --><default-interceptor-ref name="myStack"/></package><constant name="struts.objectFactory" value="spring" /> <!-- <package name="default" namespace="/" extends="struts-shop"> --><package name="default" namespace="/" extends="struts-default"><!-- 定義全局處理結果 --><global-results><!-- 邏輯名為login的結果,映射到/login.jsp頁面 --><result name="login">/admin/login.jsp</result><result name="userlogin">/user/login.jsp</result></global-results><!-- user --><action name="checklogin" class="userAction" method="checklogin"><result name="admin">/admin/index.jsp</result><result name="user" >/user/index.jsp</result></action><!-- 退出登陸 --><action name="loginout" class="userAction" method="loginout"><result name="admin">admin/index.jsp</result><result name="user" >/user/index.jsp</result></action><!-- 管理員添加用戶之前,先獲取所有的權限信息 --><!-- 試試添加和修改使用同一個界面 ,發現修改玩用戶再點擊新增用戶時,是修改用戶界面,原因是action 里user是有值的,所以還是分開寫吧--><action name="preuseradd" class="roleAction"><result>usermanager/adduser.jsp</result></action><action name="preuseruptade" class="userAction" method="preuseradd"><result>usermanager/updateuser.jsp</result></action><action name="useradd" class="userAction" method="useradd"><result name="admin" type="redirectAction">userlist</result><result name="user">user/index.jsp</result></action><action name="userlist" class="userAction" method="userlist"><result>usermanager/userlist.jsp</result></action><action name="deluser" class="userAction" method="deluser"><result type="redirectAction">userlist</result></action><!-- role --><!-- 獲取所有的權限信息 --><action name="rolelist" class="roleAction"><result>usermanager/rolelist.jsp</result></action><action name="saverole" class="roleAction" method="saverole"><result type="redirectAction">rolelist</result></action><action name="delrole" class="roleAction" method="delrole"><result type="redirectAction">rolelist</result></action><!-- goods --><!-- 添加商品之前先獲取所有已有的商品分類 --><action name="pregoodsadd" class="goodTypesAction" method="goodtypesname"><result>/goods/addgoods.jsp</result></action><action name="goodslist" class="goodsAction" method="goodslist"><result>/goods/goodslist.jsp</result></action><!-- 新建一個action 處理商品 問題 圖片 --><action name="goodsadd" class="addgoodsAction" ><!-- <result type="redirectAction">goodslist</result> --><result type="redirectAction"><param name="actionName">goodslist</param> <param name="curPage">1</param> </result></action><action name="delgoods" class="goodsAction" method="delgoods"><result type="redirectAction">goodslist</result></action><action name="preupdategoods" class="goodsAction" method="preupdategoods"><result >/goods/updategoods.jsp</result></action><action name="updategoods" class="goodsAction" method="updategoods"><result type="redirectAction">goodslist</result></action><!-- goodtypes --><!-- 添加商品分類之前先獲取所有已有的商品分類 --><action name="pregoodtypesadd" class="goodTypesAction" method="goodtypesname"><result>/goods/addgoodtypes.jsp</result></action><!-- 添加分類完成后重定向到分類列表頁面--><action name="goodtypesadd" class="goodTypesAction" method="goodtypesadd"><result type="redirectAction"><param name="actionName">goodtypeslist</param> <param name="curPage">1</param> </result></action><!-- 商品的分類查詢 --><action name="usergoodsclassific" class="classificGoodsAction" method="usergoodsclassific"><result>user/classificgoodslist.jsp</result></action><action name="goodtypeslist" class="goodTypesAction" method="goodtypeslist"><result>/goods/goodtypeslist.jsp</result></action><action name="delgoodtypes" class="goodTypesAction" method="delgoodtypes"><result type="redirectAction">goodtypeslist</result></action><!-- 使用ajax異步更新,不需要返回值 --><action name="updategoodtypes" class="goodTypesAction" method="updategoodtypes"></action><!-- 管理員對商品的留言 查看與刪除 --><action name="goodboardslist" class="goodBoardsAction" method="goodboardslist"><result>/goods/goodboardslist.jsp</result></action><action name="delgoodboards" class="goodBoardsAction" method="delgoodboards"><result type="redirectAction">goodboardslist</result></action><!-- 用戶的操作 --><!-- 商品 --><action name="usergoodslist" class="userGoodsAction" method="usergoodslist"><result>/user/goodslist.jsp</result></action><!-- 用戶查看單個商品時可以查看其他用戶對于該商品的留言 --><action name="userviewgood" class="userGoodsAction" method="userviewgood"><result>/user/viewgood.jsp</result></action><!-- 用戶查詢商品 --><action name="usergoodlistbyname" class="userGoodsAction" method="usergoodlistbyname"><result>/user/goodslist.jsp</result></action><!-- 留言 --><!-- 用戶新增留言,跳回商品首頁好了,調到單個商品查詢頁面是需要數據的 --><action name="usergoodboardsadd" class="goodBoardsAction" method="usergoodboardsadd"><!-- <result type="redirectAction">usergoodslist</result> --><result type="redirectAction"><param name="actionName">userviewgood</param> <param name="goodid">${goodBoards.good.id}</param> </result></action><!-- 用戶只可以刪除自己的留言 ,在頁面里判斷當前登錄用戶的id與該條留言的id是否相同 --><action name="userdelgoodboards" class="goodBoardsAction" method="delgoodboards"><!-- <result type="redirectAction">usergoodslist</result> --><!-- 刪除留言后 重定向到單個商品查詢頁面 --><result type="redirectAction"><param name="actionName">userviewgood</param> <!-- ${goodBoards.good.id} 為 goodBoardsAction 里的數據 , goodid 是userGoodsAction里參數--> <param name="goodid">${goodBoards.good.id}</param> </result></action><!-- 購物車 --><action name="addcart" class="carAction" method="addcart"><result>/user/cart.jsp</result></action><action name="showcart" class="carAction" ><result>/user/cart.jsp</result></action><!-- 批量添加 購物車 --><action name="addcartlist" class="carAction" method="addcartlist"><result>/user/cart.jsp</result></action><action name="removeorclearcart" class="carAction" method="removeorclearcart"><result>/user/cart.jsp</result></action><action name="updatecart" class="carAction" method="updatecart"><result>/user/cart.jsp</result></action><!-- 訂單 --><!-- 管理員查詢所有的訂單 --><action name="orderlist" class="orderAction" method="orderlist"><result>/goods/orderlist.jsp</result></action><!-- 管理員發貨 --><action name="deliverorder" class="orderAction" method="deliverorder"><result type="redirectAction">orderlist</result></action> <!-- 用戶查詢自己的訂單 ,需要當前登錄用戶的id--><action name="userorderlist" class="orderAction" method="userorderlist"><result>user/orderlist.jsp</result></action><!-- 用戶查詢自己的訂單明細 ,一是訂單信息,二是訂單明細--><action name="uservieworder" class="orderDetailAction" method="uservieworder"><result>/user/vieworderdetail.jsp</result></action><!-- 從購物車提交訂單 ,不寫在商品查詢頁面直接購買了,用戶必須先加購物車在下訂單--><action name="ordersubmitformsession" class="orderAction" method="ordersubmitformsession"><result type="redirectAction">userorderlist</result></action><!-- 在單個商品詳情頁面直接購買單個商品 --><action name="orderinone" class="orderAction" method="orderinone"><result type="redirectAction">userorderlist</result></action> <!-- 刪除選中的訂單 --><action name="deleteorders" class="orderAction" method="deleteorders"><result type="redirectAction">userorderlist</result></action> <!-- 刪除單個訂單 --><action name="deleteorder" class="orderAction" method="deleteorder"><result type="redirectAction">userorderlist</result></action> <!-- 用戶付款 --><action name="userpayorder" class="orderAction" method="userpayorder"><result type="redirectAction">userorderlist</result></action> <!-- 用戶取消訂單 --><action name="usercancelorder" class="orderAction" method="usercancelorder"><result type="redirectAction">userorderlist</result></action><!-- 獲取驗證碼 --><action name="verifycode" class="securityCodeImageAction"><result name="success" type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">imageStream</param> <param name="bufferSize">2048</param> </result> </action></package></struts> 攔截器的主要代碼

// 取得請求相關的ActionContext實例 Map<String,Object> session = invocation.getInvocationContext().getSession();Object user = session.get("loginuser");// 如果沒有登陸,返回重新登陸 if(user != null ){invocation.invoke();}//獲取action名 此處action名為 struts2 文件里定義的名字 好機智用戶的操作都添加了user前綴String actionName = invocation.getInvocationContext().getName(); // System.err.println(actionName);//把驗證碼放行 checklogin也需要放行if("verifycode".equals(actionName) || "checklogin".equals(actionName)){invocation.invoke();}//管理員跳管理員登陸頁面,用戶條用戶登陸頁面if(actionName.indexOf("user") >= 0){ // System.err.println("userlogin");return "userlogin";}else{ // System.err.println("login");return "login";}其實代碼有很多要修改的地方,用戶的操作都加上user開始,這樣配攔截器就方便多了

最復雜的就是action 和jsp 里的邏輯了,需要各種邏輯判斷,其實說實話我現在一個都想不起來,只能慢慢回憶

就看著struts 文件回憶吧,攔截器說完了,全局的處理結果不需要說了,就是所有的 action 都可以使用,再就是用戶的登陸,沒有什么,看一下驗證碼是否正確,檢查一下數據庫是否存在,

/*用戶登陸*/public String checklogin(){//判斷驗證碼和用戶名以及密碼是否為空,放在js里判斷 errorif(session == null){session=(Map)ActionContext.getContext().getSession();}//Struts2中獲取request對象String s = session.get("VerifyCode").toString();if(!s.equalsIgnoreCase(verifyCode)){this.addFieldError("username", "VerifyCode is error");return "login";}if(checkUser(user)){if( loginuser.getRole().getRolename().equals("manager")){return "admin";}return "user";}addFieldError("username", "username or password is error");return "login";}/*查看數據庫是否存在該用戶*/public Boolean checkUser(User user){loginuser = userservice.findUserByName(user.getUsername());if(loginuser == null){return false;}session.put("loginuser", loginuser);return true;}登出嘛,由于當前登陸用戶的信息是存在session里的,清空就好了嘛 ?session.clear();

寫struts是發現這個框架好笨呀,有些action,尤其是用到同一個變量,需要從頁面取值或發送給頁面時,最好分開寫,要不會出現實體類被占用的情況,就像我在進行用戶修改時,第一次點總是空,后面的就好了,但是點其他的,有一定的幾率顯示上一個的信息,對這我也是無語了,不過你分開寫,多建幾個action就解決了

用戶增加之前需要獲取用戶的全部權限信息,用戶修改之前,除了要獲取數據庫里的權限信息已下拉菜單顯示,還需要獲得要修改的用戶的當前信息 看看jsp里struts提供的select

<!-- 使用這個時,value 里的值不可以是空。,如果為空,就會報錯,value里是選中的值 value="user1.role.id"這樣就沒問題啦 --><s:select list="rolelist" listValue="rolename" listKey="id" name="id" headerKey="0" headerValue="請選擇權限" value="user1.role.id" > </s:select>list里是要遍歷的數據,我是從數據庫獲取的。liatvalue是下拉菜單顯示的內容,顯示哪個屬性的內容,listkey是通過哪個屬性遍歷,headerkey是第一個顯示什么,headervalue是顯示的值,vuale里是默認顯示的數據

下面是用戶的增加,分兩個,一個是用戶注冊,一個是管理員新增用戶,再有就是管理員對所有的用戶的查詢以及刪除

接著是權限的的操作,管理員的:顯示所有的權限,新增權限,修改權限,刪除權限,沒有修改的是因為我是當管理員點擊要修改的信息時,顯示的信息變成輸入框,值還是原來的值,管理員直接在輸入框里修改,然后通過ajax傳到服務器,頁面我就沒有做刷新

jsp:

<span style="white-space:pre"> </span><s:iterator value="pageBean.list"><tr class="trtd"><td align="center"><font color="#DBDBDB"><s:property value="id"/></font></td><td align="center" class="edittext"><s:property value="pid"/></td><td align="center" class="edittext"><s:property value="typename"/></td><td align="center" class="edittext"><s:property value="note"/></td><td align="center"><!-- struts2 的支持真好,寫個id 就映射到goodtypes.id啦 --><a href="javascript:if( confirm('確實要刪除<--<s:property value="typename"/>-->嗎?'))location='delgoodtypes?id=<s:property value="id"/>' ">刪除</a>||編輯請直接點擊</td></tr></s:iterator>js:

$(function() { //獲取class為edittext的元素 $(".edittext").click(function() { var td = $(this); var txt = td.text(); var input = $("<input type='text'value='" + txt + "'/>"); td.html(input); input.click(function() { return false; }); //獲取焦點 input.trigger("focus"); //文本框失去焦點后提交內容,重新變為文本 input.blur(function() { var newtxt = $(this).val(); //判斷文本有沒有修改 if (newtxt != txt) { td.html(newtxt); //不需要使用數據庫的這段可以不需要 //ajax異步更改數據庫,加參數date是解決緩存問題 ,這里我要接收對象的全部屬性值,不會http://q.cnblogs.com/q/69488/var childs = td.parent().children();//去掉最后一個 “基本操作”var item_length = childs.length-1;var item_value = new Array(item_length);for(i = 0; i < item_length; i++){ // item_value[i] = childs[i].innerHTML;item_value[i] = childs[i].innerText;}// var url = "updategoodtypes?id=" + item_value[0]+"&pid="+item_value[1]+"&typename="+item_value[2]+"?e="+item_value[3]; //使用get()方法打開一個一般處理程序,data接受返回的參數(在一般處理程序中返回參數的方法 context.Response.Write("要返回的參數");) //數據庫的修改就在一般處理程序中完成 get 需要在服務器里編碼防止亂碼 // $.get(url, function(data) { if(data=="1") { alert("該類別已存在!"); td.html(txt); return; } // alert(data); td.html(newtxt); // }); //http://www.w3school.com.cn/jquery/ajax_post.asp$.post("updategoodtypes",{id:item_value[0], pid:item_value[1], typename:item_value[2], note:item_value[3] });} else { td.html(newtxt);} }); }); }); 使用post不需要修改編碼,如果是使用get方式,需要修改一下編碼

good.setGoodsname(new String(good.getGoodsname().getBytes("ISO-8859-1"),"UTF-8"));接著是商品的,商品添加之前,同樣的需要獲得商品的分類信息,顯示所有的商品,商品的添加時,我一開始就是全部放在一個action 里,可郁悶了,獲取的圖片的值是空,好無語呀,然后分開寫,就OK 了

public String execute(){//獲取服務器路徑 D:\ JavaWeb \ apache-tomcat-7.0.30 \ webapps \s sh2shoping \ uploadString path = ServletActionContext.getServletContext().getRealPath("/upload");//這個方式確實可以獲得 // HttpServletRequest request = ServletActionContext.getRequest(); // String roles = request.getParameter("goodtypes");//商品的分類還是獲取 null // goods.setGoodtypes();if(pic != null){String name = System.currentTimeMillis() + picFileName.substring(picFileName.lastIndexOf("."));File savefile = new File(path,name);try {FileUtils.copyFile(pic, savefile);goods.setGoodspic("upload/"+name);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else{//設置默認的圖片goods.setGoodspic("upload/0000.jpg");}goodsService.saveGoods(goods);return "success";}添加商品后重定向到商品查詢頁面,設置為顯示第一頁 <action name="goodsadd" class="addgoodsAction" ><!-- <result type="redirectAction">goodslist</result> --><result type="redirectAction"><param name="actionName">goodslist</param> <param name="curPage">1</param> </result></action>刪除商品,沒有什么好說的,更新商品,這里也是需要獲取商品分類的,我沒有再使用struts的,而是判斷,需要標簽

<%@taglib uri="/struts-tags" prefix="s" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <select name="goodtypes.id" ><s:iterator value="lists" var="g"><c:choose><c:when test="${g.typename == goods1.goodtypes.typename}"><option value="${g.id}" selected="selected"><s:property value="typename"/></option></c:when><c:otherwise> <option value="${g.id}" ><s:property value="typename"/></option></c:otherwise></c:choose> </s:iterator> </select>更新商品時如果沒有上傳新圖片,還要保存為原來的圖片,這個我是判斷上傳的圖片是需要預覽的
<!-- 如果沒有更新圖片,還是使用原來的 --><input type="hidden" name="goodspic" value="<s:property value="goods1.goodspic"/>">struts 自動轉型為對象的屬性了,上傳的預覽
jsp: <tr><td></td><td align="center" valign="middle" ><div><img id="preview" width="100px" height="100px" src="<s:property value="goods1.goodspic"/>" /></div></td></tr><tr><td align="center">商品圖片</td><td align="center"><!-- 如果沒有更新圖片,還是使用原來的 --><input type="hidden" name="goodspic" value="<s:property value="goods1.goodspic"/>"><input type="file" id="pic" name="pic" οnchange="javascript:setImagePreview();" /></td></tr>js: //下面用于圖片上傳預覽功能function setImagePreview(avalue) {var docObj=document.getElementById("pic");var imgObjPreview=document.getElementById("preview");var AllImgExt=".jpg|.jpeg|.gif|.bmp|.png|"//全部圖片格式類型var FileExt=docObj.value.substr(docObj.value.lastIndexOf(".")).toLowerCase(); //console.log(docObj.value.substr(docObj.value.indexOf(".") + 1));//console.log(FileExt);if(AllImgExt.indexOf(FileExt+"|")!=-1)//如果圖片文件,則進行圖片信息處理 {if(docObj.files &&docObj.files[0]){//火狐下,直接設img屬性imgObjPreview.style.display = 'block';imgObjPreview.style.width = '150px';imgObjPreview.style.height = '150px'; //imgObjPreview.src = docObj.files[0].getAsDataURL();//火狐7以上版本不能用上面的getAsDataURL()方式獲取,需要一下方式imgObjPreview.src = window.URL.createObjectURL(docObj.files[0]);}else{//IE下,使用濾鏡docObj.select();var imgSrc = document.selection.createRange().text;var localImagId = document.getElementById("localImag");//必須設置初始大小localImagId.style.width = "150px";localImagId.style.height = "150px";//圖片異常的捕捉,防止用戶修改后綴來偽造圖片try{localImagId.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";localImagId.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = imgSrc;}catch(e){alert("您上傳的圖片格式不正確,請重新選擇!");return false;}imgObjPreview.style.display = 'none';document.selection.empty();}}else{alert("上傳'.jpg、.jpeg、.gif、.bmp、.png'格式的圖片,請重新選擇!");docObj.value="";return false;}return true;}然后是商品的分類,新增,刪除 ,更新(ajax異步更新)啦,查詢啦,然后是一個分類顯示商品,jsp: <a href="usergoodsclassific?typeid=1">服裝類</a>???<a href="usergoodsclassific?typeid=2">電子類</a>???<a href="usergoodsclassific?typeid=3">家具類</a>???<a href="usergoodsclassific?typeid=4">食品類</a>???action:

<span style="white-space:pre"> </span>public String usergoodsclassific(){List<GoodTypes> list = (List<GoodTypes>) goodsService.findAllGoodTypes();ArrayList<GoodTypes> lists = new ArrayList<GoodTypes>();TypeMenue.parse(list, typeid, lists);//把當前的父級id也添加到lists里GoodTypes goodtype = new GoodTypes();goodtype.setId(typeid);lists.add(goodtype);//根據列表里的id查詢商品pageBean = goodsService.findGoodsBypage(pagesize, curPage,lists);return "success";}接著就是留言了,管理員對所有的留言查看與刪除

哈哈,到用戶的操作啦

用戶查看商品,分類查看商品,點擊某個商品時,可以查看商品的詳細信息,還有其他用戶對該商品的留言,用戶可以自己留言,也可以刪除自己的留言,刪除自己的留言,我做了兩種,個人喜歡第二種(未注釋那個,判斷一下該用戶可以刪除,顯示刪除按鈕),而第一種是所有的留言后都有刪除按鈕,等用戶刪除時,再來判斷

<script type="text/javascript">function deleteboard(goodid,boardid,userid,loginuserid){if(loginuserid == userid){if( confirm("確實要刪除這條留言嗎?")){var uri = "userdelgoodboards?goodBoards.good.id=" + goodid + "&goodBoards.id=" + boardid;location.href = uri;}}else{alert("親,只可以刪除自己的留言哦");}}</script><fieldset><legend>商品留言列表</legend><div class="main" align="center"><table width="1000" cellpadding="1" border="0" cellspacing="1"><s:iterator value="pageBeanboard.list"><tr class="trtd"><td align="center"><s:property value="user.username"/></td><td align="center"><s:property value="user.role.rolename"/></td><td align="center"><s:property value="date"/></td><td align="center"><textarea name="goodsdesc" style="width:200px; color: #666464; height:50px; border:0; background-color:transparent;overflow : hidden ;resize:none " disabled="disabled"><s:property value="message"/></textarea></td><td align="center"><!-- struts2 的支持真好,寫個id 就映射到goodtypes.id啦 --><%-- <a href="javascript:void(0)" οnclick="deleteboard(<s:property value="good.id"/>,<s:property value="id"/>,<s:property value="user.id"/>,${loginuser.id})">刪除</a> --%><%-- ${loginuser.id} --%><!-- 用戶只可以刪除自己的留言, --><c:if test="${user.id == loginuser.id}"><a href="javascript:if( confirm('確實要刪除你的這條留言嗎?'))location='userdelgoodboards?goodBoards.good.id=<s:property value="good.id"/>&goodBoards.id=<s:property value="id"/>' ">刪除</a></c:if></tr></s:iterator></table>上面的代碼使用了?<fieldset> ,textarea也是處理過的,?textarea無邊框文本透明背景文本樣式, hidden:不顯示超過對象尺寸的內容 ? 取消chrome下textarea可拖動放大resize:none

點擊鏈接時,彈出confirm提示框

還做了一個搜索框,用戶可以根據商品名稱進行模糊查詢

用戶新增完留言后,要跳回原頁面,需要一個參數,就是商品的id,根據這個參數查詢商品的信息,用戶的留言信息,看看分頁的代碼,用戶刪除自己的留言情況是一樣的

<script type="text/javascript" src="js/selectall.js"></script><%@taglib uri="/struts-tags" prefix="s" %> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><script type="text/javascript">function validate(){var page = document.getElementsByName("curPage")[0].value;var rui = "usergoodslist"; if(page > <s:property value="pageBean.totalPage"/>){alert("你輸入的頁數大于最大頁數,頁面將跳轉到首頁!");rui += "?curPage=1";window.document.location.href = rui ;}rui += "?curPage=" + page;window.document.location.href = rui ;return true;}function pagesize(){var pagesize = document.getElementsByName("pagesize")[0].value;var rui = "usergoodslist?curPage=1&pagesize=" + pagesize; window.document.location.href = rui ;}//把選中的加入購物車function selectAddCar(){var allCheckBoxs = document.getElementsByName("checkall"); var selectOrUnselect = false; var mycars = new Array();console.log(mycars.length); var j = 0;for(var i = 0; i < allCheckBoxs.length; i ++ ) { if(allCheckBoxs[i].checked){ console.log(allCheckBoxs[i].value);mycars[j++] = allCheckBoxs[i].value; selectOrUnselect=true; } }//判斷一下,有選擇才提交 if(selectOrUnselect){if(confirm("確實添加購物車嗎?")){var url = "addcartlist?goodsidlist=" + mycars;location.href = url;}}else{alert("請先選擇商品");}}</script> /分頁顯示的內容///<center> 共<font color="red"><s:property value="pageBean.totalPage"/></font>頁 ??共<font color="red"><s:property value="pageBean.allRows"/></font>條記錄 ??<s:if test="pageBean.currentPage == 1">首頁?上一頁</s:if><s:else><a href="usergoodslist?curPage=1">首頁</a><a href="usergoodslist?curPage=<s:property value="pageBean.currentPage - 1"/>">上一頁</a></s:else><s:if test="pageBean.currentPage != pageBean.totalPage"><a href="usergoodslist?curPage=<s:property value="pageBean.currentPage + 1"/>">下一頁</a><a href="usergoodslist?curPage=<s:property value="pageBean.totalPage"/>">尾頁</a></s:if><s:else>下一頁??尾頁</s:else> 每頁顯示<input type="text" size="2" name="pagesize" οnblur="pagesize();" value="<s:property value="pagesize"/>">條??跳轉至<input type="text" size="2" name="curPage" οnblur="validate();" value="<s:property value="curPage"/>">頁</center>可以上一頁,下一頁,跳轉到哪一頁,每頁顯示幾條記錄

然后就到訂單這邊了,先是購物車,這些信息我都是放在sesion 里的,購物車里的操作都是對session的操作,

添加到購物車,顯示購物車,使用全選按鈕批量添加到購物車,修改購物車里商品的數量信息,刪除里面某個商品,

package com.cl.shopping.action;import java.util.ArrayList; import java.util.List; import java.util.Map;import com.cl.shopping.bean.Cart; import com.cl.shopping.bean.Goods; import com.cl.shopping.service.GoodsService; import com.opensymphony.xwork2.ActionContext;public class CarAction {private GoodsService goodService;/*購物車是對session操作*/private Map session;//商品數量,需要從頁面取值private int count;//在carlist里的序號 需要從頁面取值private int number = -1;//總價private Float sum = 0f;//商品的idprivate int goodsid;List<Cart> cartList ;//批量添加購物車 需要從頁面取值List goodsidlist;public String execute(){return "success";}public String addcart(){//查出貨品的信息Goods good = goodService.findGoodsById(goodsid);if(session == null){session = ActionContext.getContext().getSession();}//未登錄時,不可以操作購物車if(session.get("loginuser")==null) {return "userlogin";}else {cartList = (List<Cart>)session.get("cartList");Cart cart = new Cart();cart.setGoodsid(goodsid);cart.setGoodsName(good.getGoodsname());cart.setBaseprice(good.getPrice());//數量、總價if(cartList==null) {//購物車為空cart.setCount(1);cart.setAmount(cart.getBaseprice() * cart.getCount());cartList = new ArrayList<Cart>();cartList.add(cart);}else {//flag標記是否在購物車里出現boolean flag = true;for(int i=0;i<cartList.size();i++) {Cart c = cartList.get(i);//判斷商品是否在購物車里if(c.getGoodsid() == goodsid) {flag = false;//購物車里商品數量 +1c.setCount(c.getCount() + 1);c.setAmount(c.getBaseprice() * c.getCount());}}if(flag) {cart.setCount(1);cart.setAmount(cart.getBaseprice() * cart.getCount());cartList.add(cart);}}for(int i=0;i<cartList.size();i++) {Cart c = cartList.get(i);sum = sum + c.getAmount();}session.put("sum", sum);session.put("cartList", cartList);return "success";}}//批量添加購物車public String addcartlist(){if(session == null){session = ActionContext.getContext().getSession();}//未登錄時,不可以操作購物車if(session.get("loginuser")==null) {return "userlogin";}else {cartList = (List<Cart>)session.get("cartList");//goodsidlist 頁面傳過來的數組,只能使用list接收,直接使用數組接收不到String[] goodsids = goodsidlist.get(0).toString().split(",");for(int i = 0; i <goodsids.length ; i++){//查出貨品的信息Goods good = goodService.findGoodsById(Integer.parseInt(goodsids[i]));Cart cart = new Cart();cart.setGoodsid(good.getId());cart.setGoodsName(good.getGoodsname());cart.setBaseprice(good.getPrice());//數量、總價if(cartList==null) {//購物車為空cart.setCount(1);cart.setAmount(cart.getBaseprice() * cart.getCount());cartList = new ArrayList<Cart>();cartList.add(cart);}else {//flag標記是否在購物車里出現boolean flag = true;for(int j=0;j<cartList.size();j++) {Cart c = cartList.get(j);//判斷商品是否在購物車里if(c.getGoodsid() == Integer.parseInt(goodsids[i])) {flag = false;//購物車里商品數量 +1c.setCount(c.getCount() + 1);c.setAmount(c.getBaseprice() * c.getCount());}}if(flag) {cart.setCount(1);cart.setAmount(cart.getBaseprice() * cart.getCount());cartList.add(cart);}}}for(int j=0;j<cartList.size();j++) {Cart c = cartList.get(j);sum = sum + c.getAmount();}session.put("sum", sum);session.put("cartList", cartList);return "success";}}@SuppressWarnings("unchecked")public String updatecart(){List<Cart> cartList = (List<Cart>)session.get("cartList");Cart cart = cartList.get(number - 1);cart.setCount(count);cart.setAmount(cart.getBaseprice() * cart.getCount());double sum = 0;for(int i=0;i<cartList.size();i++) {Cart c = cartList.get(i);sum = sum + c.getAmount();}session.put("sum", sum);session.put("cartList", cartList);return "success";}public String removeorclearcart(){if(number != -1) {//count 為 該商品在list里的 id(序號)List<Cart> cartList = (List<Cart>) session.get("cartList");//從購物車中刪除 , 下標是從0 開始,但是 頁面計數是從1 開始cartList.remove(number - 1);double sum = 0;for(int i=0;i<cartList.size();i++) {Cart c = cartList.get(i);sum = sum + c.getAmount();}session.put("sum", sum);session.put("cartList", cartList);}else {//清空session.remove("cartList");session.remove("sum");}return "success";}public Map getSession() {return session;}public void setSession(Map session) {this.session = session;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public int getGoodsid() {return goodsid;}public void setGoodsid(int goodsid) {this.goodsid = goodsid;}public void setGoodService(GoodsService goodService) {this.goodService = goodService;}public List getGoodsidlist() {return goodsidlist;}public void setGoodsidlist(List goodsidlist) {this.goodsidlist = goodsidlist;}} 需要發送到頁面,從頁面獲取的變量需要get/set方法,由spring注入的service,只要用set方法就好,看代碼啦

全選的實現

jsp頁面

<td align="center"><input type="checkbox" name="checkall" value="<s:property value="id"/>"> </td> <!-- 全選按鈕 --><tr><td colspan="8"><input type="button" id="allChecked" value="全選/取消全選" onClick="selectAllDels()">??????<input type="button" id="checkedAddCar" value="選中的加入購物車" onClick="selectAddCar()"></td></tr>
js: //全選function selectAllDels() { var allCheckBoxs = document.getElementsByName("checkall"); var desc = document.getElementById("allChecked"); var selectOrUnselect = false; for(var i = 0; i < allCheckBoxs.length; i ++ ) { if(allCheckBoxs[i].checked){ selectOrUnselect=true; break; } } if (selectOrUnselect) { //只要有一個被選中,本次點擊按鈕就是取消全選_allUnchecked(allCheckBoxs); }else { // 當前一個都沒有被選中,則全部選中_allchecked(allCheckBoxs); } } function _allchecked(allCheckBoxs){ for(var i = 0; i < allCheckBoxs.length; i ++ ) { allCheckBoxs[i].checked = true; } } function _allUnchecked(allCheckBoxs){ for(var i = 0; i < allCheckBoxs.length; i ++ ) { allCheckBoxs[i].checked = false; } } 訂單啦:管理員查詢所有的訂單,管理員發貨(就是新增一個發貨時間,把狀態改為已發貨)

用戶可以查看自己的訂單信息,點擊某個訂單時查看兩個信息,一個訂單的信息,一個商品訂單的明細,在訂單明細里可以點擊名字鏈接到商品單個查詢頁面,用戶可以在單個商品查詢頁面里(有詳情有留言那個)購買單個商品,也可以在購物車里選中部分提交訂單

用戶可以選中刪除單個訂單,也可以批量刪除自己的訂單,還有就是用戶的付款與取消訂單


界面很丑,自己畫的,沒有使用界面,后臺使用了


附件:源碼:http://download.csdn.net/detail/i_do_can/9405881



























總結

以上是生活随笔為你收集整理的ssh2项目之自己想的购物网站的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲高清在线观看视频 | 在线观看中文字幕第一页 | 国产免费资源 | 碰碰影院 | 成人小视频在线观看免费 | 国产精品国产三级国产专区53 | 欧美日韩调教 | 欧美一级片播放 | 欧美在线观看禁18 | 在线精品视频免费播放 | 天天曰天天曰 | 久久久蜜桃一区二区 | 国产精品网红直播 | 韩日色视频 | 免费av片在线 | 欧美男同视频网站 | 高清美女视频 | 在线观看视频国产 | 91久久精品日日躁夜夜躁国产 | 久草视频视频在线播放 | 亚洲欧洲精品一区二区精品久久久 | 日韩欧美一区二区三区在线观看 | 激情丁香 | 玖玖视频在线 | 亚洲国产精品成人综合 | 天天干天天干天天干天天干天天干天天干 | 国产黄色片久久久 | 国产在线视频一区二区三区 | 97久久精品午夜一区二区 | 久草在线观看资源 | 亚洲狠狠婷婷综合久久久 | 国产精品成人久久久 | 欧美精品久久人人躁人人爽 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 美女视频又黄又免费 | 天天操操操操操 | 97色噜噜| 亚洲国产电影在线观看 | 久久成人毛片 | 国产亚洲一级高清 | 国产精品18久久久久白浆 | 黄色av观看 | 成人黄色毛片视频 | 欧美在一区| 五月激情丁香 | 欧美另类交在线观看 | 99精品视频免费全部在线 | 91在线看免费 | av高清一区二区三区 | 一级黄色在线视频 | 中中文字幕av | 日韩av片无码一区二区不卡电影 | 三级av在线| 精品国产乱码久久久久久久 | 国产尤物在线 | 91探花系列在线播放 | www.精选视频.com | 国产一级黄色免费看 | 久久亚洲综合国产精品99麻豆的功能介绍 | 久久五月激情 | 久草国产在线观看 | 99久久精品免费 | 午夜久久 | 国产精品久久av | 婷婷国产精品 | 在线观看国产日韩 | 2022久久国产露脸精品国产 | 国内精品在线看 | 偷拍视频一区 | 91九色porn在线资源 | 久久国内免费视频 | 99精品在线播放 | 色婷婷www | 日韩成人中文字幕 | 在线网站黄 | 久久国产精品99精国产 | 日韩网站视频 | 特级毛片爽www免费版 | 日韩欧美高清免费 | 亚洲 中文字幕av | 久久久久久影视 | 国产香蕉97碰碰碰视频在线观看 | 国产成人精品久 | 国产一级a毛片视频爆浆 | 又黄又刺激的网站 | 免费看麻豆| 亚洲欧洲日韩 | 日韩电影中文字幕在线 | 日韩高清在线观看 | 色婷婷激情四射 | 精品国产区在线 | 中文字幕在线播出 | 亚洲精品乱码白浆高清久久久久久 | 久久五月婷婷丁香 | 91视频久久久 | 黄网站污| 亚洲手机av| 久久精品牌麻豆国产大山 | 久青草视频在线观看 | 亚洲在线网址 | 日韩av高清 | av久久久久久 | 欧美激情视频在线免费观看 | 国偷自产中文字幕亚洲手机在线 | 麻豆视频免费在线观看 | 91在线精品视频 | 99久久日韩精品免费热麻豆美女 | 欧美久久影院 | 国产无限资源在线观看 | 色婷婷久久一区二区 | www欧美色 | 欧美专区亚洲专区 | 91传媒在线| 91亚洲精品在线 | 成人动漫一区二区 | av一区在线| 伊人激情网 | 91豆花在线| 激情婷婷综合网 | 五月婷香 | 最近中文字幕 | 久久综合九色综合久久久精品综合 | 美女黄频在线观看 | 国产精品免费一区二区三区在线观看 | 国产精品久久久久久久99 | 国产小视频在线免费观看视频 | 日韩av进入| 在线播放 日韩专区 | 国产精品久久久av久久久 | 久久福利在线 | 懂色av一区二区三区蜜臀 | 日本在线视频一区二区三区 | 精品久久久99 | 久久免费视频8 | 在线精品视频免费播放 | 狠狠操操操 | 久久久国产精品一区二区三区 | 97在线观看免费高清完整版在线观看 | 色婷婷综合久久久 | 在线看国产日韩 | 97国产精品久久 | 国产视频1区2区3区 久久夜视频 | 91亚洲精品久久久久图片蜜桃 | 国产午夜三级一区二区三 | 4p变态网欧美系列 | 久久久久久久久久久国产精品 | 日三级在线 | 99久久精品费精品 | 在线观看视频国产 | 24小时日本在线www免费的 | h动漫中文字幕 | 亚洲国产播放 | 亚洲免费激情 | 亚洲黄色软件 | 婷婷色影院 | 亚洲精品永久免费视频 | 精品色综合 | 日韩天堂在线观看 | 国产九九九九九 | 人人躁| 亚洲精品视频免费看 | 免费观看日韩av | 欧美精品久久久久久久久久 | 久草在在线视频 | 在线观看视频亚洲 | 久久人人爽人人爽人人片 | 美女福利视频网 | 97精品国产一二三产区 | 国产成人av电影在线 | 久久视频6 | 久久免费看| 国产区在线看 | 福利一区二区三区四区 | 久久视屏网 | 国产不卡免费视频 | 深夜免费网站 | 91在线免费公开视频 | 久操97 | 香蕉视频色 | 成人毛片a | 日韩电影在线观看一区二区 | 亚洲va欧美va人人爽春色影视 | 97色综合 | 福利网址在线观看 | 国产玖玖精品视频 | 中文字幕免费高清 | 欧美在线一二区 | 美女视频网站久久 | 亚洲区二区 | 亚洲免费视频观看 | 免费高清在线视频一区· | 黄a网站 | 国产精品久久久久aaaa九色 | 九九久久久久久久久激情 | 免费观看久久 | 欧美一区二视频在线免费观看 | 欧美一区二区三区特黄 | 狠狠狠色丁香综合久久天下网 | 六月天色婷婷 | 在线日韩av | 成年人黄色免费看 | 夜夜高潮夜夜爽国产伦精品 | 国产精品久久久99 | 欧美日本三级 | 99精品免费久久久久久久久 | 欧美日韩在线观看一区二区 | 久久视频在线免费观看 | 日韩av成人在线观看 | 色天天中文 | 一区二区视 | 三级黄色大片在线观看 | 亚洲,播放 | 欧美在一区 | 91桃色免费观看 | 毛片一区二区 | 日日干夜夜操视频 | 成人中文字幕av | 久操中文字幕在线观看 | 国产欧美日韩视频 | 中文字幕一区二区三区四区久久 | 91精品国产成人 | 亚洲一区美女视频在线观看免费 | 日本成人黄色片 | 国产成人综合在线观看 | 成人小视频在线 | 亚洲视频一级 | 国产成人黄色在线 | 97色婷婷成人综合在线观看 | 免费在线观看中文字幕 | 涩涩在线 | 91麻豆网| 人人爽人人香蕉 | 香蕉久草 | 亚洲伦理电影在线 | 狠狠色噜噜狠狠狠狠2022 | 丁香六月综合网 | 欧美色图30p | 国产精品一区二区果冻传媒 | 狠狠做深爱婷婷综合一区 | 国产123av| 精品视频免费 | 五月天婷婷丁香花 | 一区二区三区在线观看中文字幕 | 成人av电影免费观看 | 免费国产在线观看 | 中文字幕2021 | 中文字幕在线成人 | 国产成人一级电影 | 日本天天色 | 中文永久免费观看 | 欧美亚洲免费在线一区 | 久久久久麻豆v国产 | 狠狠干综合 | 日韩成人精品一区二区三区 | 国产成人高清av | 99在线看| 欧美大片aaa | av中文字幕亚洲 | 18av在线视频| 欧美另类69 | 欧美日韩一区二区在线 | 久久伦理电影网 | 视频一区二区国产 | 久久婷婷国产 | 亚洲久草在线 | 狠狠狠狠狠狠操 | 一区二区三区韩国免费中文网站 | 亚洲国产播放 | 国产精品久久久久久久久久尿 | 国产区网址| 国产成人免费观看久久久 | 一区av在线播放 | 久久免费视频在线观看 | 视频三区在线 | 激情综合亚洲 | 国产午夜三级 | 亚洲三级国产 | 国产三级视频在线 | 99久久婷婷国产精品综合 | 三日本三级少妇三级99 | 在线免费黄色av | 久久国产视屏 | 婷婷伊人综合亚洲综合网 | 国产在线资源 | 午夜久久久久久久久久影院 | 久草在线视频免费资源观看 | 日日夜夜精品免费 | 免费看污黄网站 | 美女网站视频色 | 亚洲欧美日韩国产一区二区 | 又色又爽又黄高潮的免费视频 | 中文在线8资源库 | 天天夜夜亚洲 | av片免费播放 | 97免费视频在线播放 | 91在线精品一区二区 | 欧美日韩在线播放一区 | 91在线视频播放 | 97色在线视频| 亚洲高清视频在线 | 婷婷久久网站 | 国产我不卡 | 国产免费一区二区三区最新 | 亚洲欧美日本国产 | 欧美日韩中字 | 麻豆视频在线免费看 | av在线成人 | 综合色中文 | 日日夜夜天天综合 | 中文字幕精品一区久久久久 | 午夜性色| 亚洲精品一区二区三区新线路 | 97人人澡人人添人人爽超碰 | 亚洲国产人午在线一二区 | 91黄色小网站 | 亚洲午夜精品福利 | 综合久久五月天 | 在线播放视频一区 | 欧美一区二区三区特黄 | 成人动漫一区二区三区 | 伊人五月婷 | 日韩色视频在线观看 | 网站在线观看你们懂的 | 中文字幕 在线 一 二 | 国产色妞影院wwwxxx | 日韩一区二区三区在线观看 | 国产精品久久久av久久久 | 久久五月天色综合 | 美女视频一区 | 中文字幕电影高清在线观看 | 亚州av成人 | 久久婷五月 | 狠狠婷婷 | 亚洲精品av中文字幕在线在线 | 国内精品视频一区二区三区八戒 | 亚洲男男gaygayxxxgv | 免费久久网站 | www欧美色 | 在线观看午夜av | 成人免费在线视频观看 | www.亚洲精品 | 国产精品毛片一区二区在线看 | 中文av在线免费观看 | 六月丁香在线视频 | 国产亚洲精品av | 久久久久免费电影 | 免费在线一区二区三区 | 色婷婷六月天 | 波多野结衣久久资源 | 91av大全 | 久久成人久久 | 中文字幕色在线视频 | 日本久久91 | 五月激情亚洲 | 久久久久久久久久电影 | 久久夜视频 | 色五月情 | 日韩欧美综合 | 色综合国产 | 免费欧美精品 | 激情xxxx| 久久www免费人成看片高清 | 91香蕉亚洲精品 | 激情视频二区 | 色偷偷网站视频 | 久久久久久久亚洲精品 | 五月婷婷导航 | 麻豆播放| 粉嫩一二三区 | 色av色av色av | 久久免费福利 | 精品一区二区三区四区在线 | 国产亚洲在线观看 | 在线中文字母电影观看 | 在线观看亚洲免费视频 | 黄网站app在线观看免费视频 | 久久69精品 | 国产精品区免费视频 | 久久久久激情电影 | 久久久私人影院 | 播五月婷婷 | 五月婷婷丁香网 | 97在线精品国自产拍中文 | 久久免费精品国产 | 99成人免费视频 | 久久成人国产精品 | 精品久久免费看 | 亚洲视频在线免费看 | 国产玖玖在线 | 日韩在线一二三区 | 色综合久久综合中文综合网 | 日韩高清一二区 | 九九免费观看视频 | 69绿帽绿奴3pvideos | 四虎国产精| bbb搡bbb爽爽爽 | 中国一级片在线 | 久久精品a | 特级a老妇做爰全过程 | 成人a在线观看高清电影 | av在线免费观看网站 | 成人免费影院 | 成人久久久久久久久 | 日日摸日日碰 | 久久97视频| 在线观看日韩国产 | 国产一区电影在线观看 | 国产探花视频在线播放 | 中文字幕一区2区3区 | 丁香六月婷婷开心婷婷网 | 黄色成人av在线 | 国产精品黄色av | 国产伦理久久精品久久久久_ | 日本精品一区二区三区在线观看 | 在线韩国电影免费观影完整版 | 在线观看黄av | 91精品欧美| 久久久久久久久久久免费视频 | 一区二区三区 亚洲 | 最近中文字幕大全中文字幕免费 | 黄色免费网战 | 久久你懂的 | 久久视频6 | 2018亚洲男人天堂 | 日本韩国欧美在线观看 | 久久久久久久久久久久久久电影 | 精品欧美一区二区精品久久 | 亚洲最新在线视频 | 国产成人不卡 | 婷婷伊人网 | 国产三级视频 | 69精品视频 | 毛片久久久 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 中日韩在线视频 | 黄色视屏av| 午夜久操 | 亚洲精品在线视频播放 | 国产精品视频久久久 | 国产美女免费观看 | 亚洲精品欧美专区 | 国产1区在线 | 久久免费黄色大片 | 特级西西www44高清大胆图片 | 久草视频在线播放 | 日韩av一区二区三区在线观看 | 久久久久9999亚洲精品 | 成人教育av| 高清av中文字幕 | 五月婷婷色 | 五月天堂色 | 午夜在线看 | 免费在线激情电影 | 看片一区二区三区 | 国产精品久久一 | 国产成人三级在线 | 色狠狠一区二区 | 国产精品高潮呻吟久久久久 | 三级av免费看| 在线观看免费av网 | 成人免费看片98欧美 | 久久久久国产精品一区二区 | 人人玩人人添人人 | 91麻豆精品国产91久久久久久 | 国产精品美女网站 | 国产片网站 | 久久免费观看少妇a级毛片 久久久久成人免费 | 成人精品一区二区三区中文字幕 | 日产中文字幕 | 色天天久久 | 一区二区三区中文字幕在线 | 亚洲经典中文字幕 | 一区二区三区在线免费观看视频 | av大片免费看 | 国产一区福利在线 | 欧美精品亚州精品 | 五月婷婷综合在线观看 | 国产专区在线视频 | 免费高清看电视网站 | 免费中文字幕视频 | 麻豆小视频在线观看 | 日韩欧美有码在线 | 黄色av网站在线观看免费 | 国产精品女主播一区二区三区 | 激情综合色综合久久综合 | 国产精品12 | 一区二区三区免费在线观看 | 国产精品第一 | 色91在线视频 | 日韩一级片观看 | 日本黄色免费网站 | av亚洲产国偷v产偷v自拍小说 | 日韩精品一区二区三区高清免费 | 国产尤物在线观看 | 亚洲一区精品二人人爽久久 | 亚洲无线视频 | a色视频 | 欧美日韩激情视频8区 | 天堂视频一区 | 精精国产xxxx视频在线播放 | 日本特黄一级片 | 国产福利专区 | 九九99| 久久草在线免费 | 伊人狠狠色丁香婷婷综合 | 波多野结衣久久资源 | 午夜美女网站 | wwwav视频 | 亚洲电影院 | 中文字幕一区二区三区视频 | 99免费精品 | 日韩av影视在线观看 | 亚洲国产片 | 欧亚久久| 黄色毛片观看 | 五月天国产 | 中文字幕第一页在线 | 亚洲国产视频网站 | 日韩免费高清 | 天天干人人干 | 69亚洲精品 | 9在线观看免费高清完整 | 日日操天天操夜夜操 | 婷婷综合久久 | 7777精品伊人久久久大香线蕉 | 日本少妇视频 | 国产精品你懂的在线观看 | 亚洲国产日韩欧美 | 亚洲精品久久在线 | 中文字幕制服丝袜av久久 | 黄色天堂在线观看 | 日韩精品在线视频免费观看 | 人人澡人人爽欧一区 | 欧美色综合 | 99久热在线精品视频 | 91高清在线 | 欧美精品首页 | 五月天六月丁香 | 久久最新网址 | 久久国产欧美日韩 | 综合网av| 国产精品视频99 | 日韩久久电影 | 日韩亚洲在线视频 | 久久久精品网 | 国产日本在线播放 | 中文字幕 国产 一区 | 欧洲av在线 | 亚洲爱av | 黄色录像av | av丁香| 国产精品短视频 | 国产视频精品免费播放 | 中文字幕免费在线看 | 97视频在线观看视频免费视频 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 久草久草在线 | 黄色一级大片在线观看 | 337p日本大胆噜噜噜噜 | 国产成人精品久久二区二区 | 天堂av免费| 免费看黄网站在线 | 日韩在线字幕 | 99视频偷窥在线精品国自产拍 | 国产91在线免费视频 | 干干操操 | 五月天天av| 丁香综合激情 | 亚洲精品视频免费在线观看 | 国产91亚洲精品 | 久久狠狠一本精品综合网 | 粉嫩aⅴ一区二区三区 | 99热在线看| 亚洲国产精品久久久久久 | 欧美精品第一 | 国产一区在线看 | 国产欧美久久久精品影院 | 欧美99久久 | 婷婷久久综合网 | 国产精品一区免费在线观看 | av在线影片 | 成人午夜剧场在线观看 | 国产精品99视频 | 国产精品va在线观看入 | 国产精品福利在线观看 | 免费看十八岁美女 | a精品视频 | 在线免费黄色av | 国产一区在线精品 | 亚洲精品h| 亚洲成aⅴ人在线观看 | 一区国产精品 | 久草在线视频首页 | 91 中文字幕 | 免费av网址在线观看 | 免费人成在线观看网站 | 激情 一区二区 | 免费91麻豆精品国产自产在线观看 | 在线а√天堂中文官网 | 超薄丝袜一二三区 | 九九色综合| 在线免费看黄网站 | 亚洲精品国产综合99久久夜夜嗨 | 日韩av有码在线 | 狠狠色噜噜狠狠狠合久 | 日韩亚洲国产中文字幕 | 日韩特黄一级欧美毛片特黄 | 一级黄毛片 | 99久久精品日本一区二区免费 | 又大又硬又黄又爽视频在线观看 | 97成人在线 | 免费av高清 | 久久影院一区 | 国产精品3 | 久久伊人精品一区二区三区 | 中文字幕在线观看的网站 | 99热免费在线 | 蜜臀久久99精品久久久无需会员 | 日韩av电影一区 | 欧美xxxxx在线视频 | 成人h动漫精品一区二 | 九九国产视频 | 视频99爱| 黄色免费网战 | 国产色在线,com | 成人av一区二区兰花在线播放 | 久99久精品| 91丨九色丨国产在线观看 | 免费在线国产精品 | 色婷婷播放| 日韩精品免费一区二区三区 | 欧美专区日韩专区 | www99精品| 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲精品国精品久久99热 | 久久久亚洲麻豆日韩精品一区三区 | 日韩成人在线免费观看 | 日韩在线视频观看免费 | 在线视频观看亚洲 | 欧美另类z0zx | 成人av一级片 | www.国产在线视频 | 免费91麻豆精品国产自产在线观看 | 操操操影院| 久久 地址 | 91九色在线观看视频 | 五月婷婷,六月丁香 | 99中文字幕视频 | avhd高清在线谜片 | 亚洲 欧美变态 另类 综合 | av在线在线 | 久久欧美综合 | 国产69精品久久久久久久久久 | 麻豆精品视频 | 色的网站在线观看 | 黄色av一区 | 日韩欧美视频免费看 | 去干成人网 | 午夜少妇一区二区三区 | 草莓视频在线观看免费观看 | 亚洲综合成人婷婷小说 | 狂野欧美激情性xxxx | 伊人久久av| 婷婷精品在线 | 欧美色图亚洲图片 | 五月天久久| 免费h在线观看 | 91九色蝌蚪视频 | 99久久精品国产系列 | 午夜黄色 | 久草在线视频免费资源观看 | 久久精品中文字幕少妇 | 超碰人人av | 国产精品成人免费精品自在线观看 | 在线精品视频在线观看高清 | 亚州精品在线视频 | 亚洲成人精品影院 | 国产精品久久久久久久久久免费看 | 九九免费精品视频 | 国产精品99久久99久久久二8 | 久久成人精品视频 | 亚洲精品在线免费观看视频 | 992tv又爽又黄的免费视频 | 免费在线观看午夜视频 | 久草视频在线资源 | 亚洲不卡123 | 精品国产免费人成在线观看 | 69国产盗摄一区二区三区五区 | 激情五月婷婷激情 | 天堂av高清| 久久精品麻豆 | av日韩精品| 久久久五月天 | 亚洲国产精品视频在线观看 | 五月婷婷婷婷婷 | 国产美女被啪进深处喷白浆视频 | 国产91影视 | 色www.| 成年人免费在线观看网站 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 久久99精品一区二区三区三区 | 97在线观看免费 | 免费看的国产视频网站 | 日本少妇高清做爰视频 | 色婷婷五| www.五月天色 | 日日操夜夜操狠狠操 | 亚洲精品免费在线 | 日韩精品专区在线影院重磅 | 欧美激情va永久在线播放 | 日韩高清在线不卡 | 五月婷婷色综合 | 国产精品免费观看国产网曝瓜 | 91香蕉视频黄色 | 国产成人精品在线观看 | 激情久久伊人 | 久久亚洲欧美 | 日韩三级视频在线看 | 中文字幕视频一区二区 | 日本三级久久久 | 精品国产成人在线影院 | 狠狠操狠狠干天天操 | 欧美日韩精品在线 | 国产在线一区二区三区播放 | 天天爽天天搞 | 欧美一二区在线 | 999视频网 | 国产精品毛片久久 | 国产精品久久久久免费观看 | 久久激情视频网 | 日韩理论影院 | 免费精品在线观看 | 色美女在线 | 99免费在线观看 | 久久免费的精品国产v∧ | 久久久久99999 | 欧美一级大片在线观看 | 日本久久不卡视频 | 97人人模人人爽人人少妇 | 91精品免费视频 | 国产精品精品国产婷婷这里av | 亚洲精品小区久久久久久 | 国产精品s色 | 涩涩色亚洲一区 | 久久不射影院 | 国产精品18久久久 | 九九久久成人 | 国产一区二区网址 | 日韩精品视频在线免费观看 | 国产日韩欧美在线看 | 精品在线小视频 | 久久精品久久精品久久39 | 国产一级在线视频 | 午夜精品久久一牛影视 | 中文字幕传媒 | 在线中文字幕一区二区 | 日韩高清在线一区 | 国产青草视频在线观看 | 日韩在线 一区二区 | 天天射射天天 | 99久久超碰中文字幕伊人 | 五月婷婷激情网 | 久久国产精品久久久久 | 欧美巨大 | 深爱五月激情网 | 色97在线| 欧美污在线观看 | 中文在线字幕免费观看 | 国产精品久久久久久久久久东京 | 人人射人人澡 | 亚洲国产免费看 | 欧美日韩视频在线观看一区二区 | 天天操夜夜做 | 国产伦精品一区二区三区无广告 | 欧美激情视频一二区 | 国产青青青| 91精品秘密在线观看 | 国产免费一区二区三区网站免费 | 正在播放一区 | 国产精品乱码一区二三区 | 中文字幕亚洲情99在线 | 狠狠干狠狠色 | 高清不卡一区二区三区 | 操高跟美女 | 99九九免费视频 | 国产免费大片 | 99久久这里有精品 | 干av在线| 国内精品久久久久影院男同志 | 亚洲91中文字幕无线码三区 | 综合色综合 | 91av小视频| 欧美精品二区 | 182午夜在线观看 | 香蕉视频在线视频 | 亚洲国产电影在线观看 | 欧美激情第一区 | 最新三级在线 | 黄网站app在线观看免费视频 | 一级国产视频 | 国产精品成人免费一区久久羞羞 | 99视频这里有精品 | 久久免费电影网 | 97看片| 亚洲最新av| 国产中出在线观看 | 欧美精品久久久久久久久老牛影院 | 91在线免费观看网站 | 色婷婷导航 | 黄色av免费电影 | 黄色一级片视频 | 国内精品久久久久久久影视麻豆 | 午夜精品一区二区国产 | 免费人做人爱www的视 | 国内精品久久久久久久久久 | 欧美国产精品一区二区 | 在线视频精品播放 | 99精品免费久久久久久久久日本 | 精品久久视频 | 成人在线观看影院 | 在线观看的a站 | 婷婷丁香在线观看 | 激情网五月天 | 五月婷婷香蕉 | 中文网丁香综合网 | 96国产精品视频 | 97人人澡人人添人人爽超碰 | 三级动图 | 最新国产精品视频 | 91精品国产成 | 91av网址| www操操| 在线观看aa | 久久超碰免费 | 久久久久9999亚洲精品 | 亚洲国产精品500在线观看 | 国产精品亚 | 色噜噜狠狠狠狠色综合久不 | 中文字幕在线一区观看 | 人成免费网站 | www免费视频com━ | 天天做天天爱天天综合网 | 激情五月婷婷网 | 亚洲网站在线 | 久久人人爽人人爽人人片av软件 | 色婷婷av国产精品 | 97精品一区 | 久久av伊人 | 久久久久久久久久久久影院 | 免费看一级一片 | 91黄色在线观看 | 综合久久久久 | 日韩在线免费小视频 | 欧美精品一二 | 在线高清 | 国产精品久久久久久久久久久久久久 | 亚洲视频第一页 | 99精品热| 又粗又长又大又爽又黄少妇毛片 | 免费看久久 | 欧美精品一区二区三区一线天视频 | 人人澡人人干 | 午夜av片| 国产精品久久久久久久久久尿 | 欧美日韩精品区 | 中文字幕在线观看第三页 | 91在线网址 | 亚洲成人精品在线观看 | 久久日本视频 | 国产视频一区在线播放 | 日本黄色a级大片 | 亚洲精品乱码久久久久久久久久 | 99re亚洲国产精品 | 美女视频免费一区二区 | 精品你懂的| 射九九 | 久久黄色小说视频 | 免费无遮挡动漫网站 | 婷婷丁香色| 免费看的黄网站 | 国产玖玖在线 | 在线日韩av | 国产黄大片| 亚洲欧洲一区二区在线观看 | 日韩在线国产精品 | 男女拍拍免费视频 | 中文字幕在线播放一区二区 | 国产精品人人做人人爽人人添 | 九九久久国产精品 | 日韩视频一区二区三区在线播放免费观看 | 精品少妇一区二区三区在线 | 免费在线观看av | 黄色亚洲免费 | 国产一区二区三区午夜 | 日本最新高清不卡中文字幕 | 亚洲成人精品久久久 | 日韩性色 | av超碰免费在线 | 丁香婷婷激情五月 | 成人免费观看a | 亚洲撸撸| 九九一级片 | 久久精品理论 | 成人av片在线观看 | 免费视频 你懂的 | 国产电影黄色av | 亚洲成av人影院 | 男女激情片在线观看 | 91视频在线免费看 | 2019中文最近的2019中文在线 | 国产成人久久精品77777综合 | 缴情综合网五月天 | 麻豆av一区二区三区在线观看 | 美女视频免费一区二区 | av中文电影 | 中文字幕在线观看三区 | 欧美一区二区免费在线观看 | 在线电影日韩 | 成人黄色影片在线 | 欧美性生交大片免网 | 国产精品夜夜夜一区二区三区尤 | 国产精品久久久久免费观看 | 国模一区二区三区四区 | 久久久久久国产精品久久 | 国产亚洲精品久久久久久无几年桃 | 可以免费看av | 三级av免费看 | 国产精品99视频 | 99热这里只有精品在线观看 | 狂野欧美激情性xxxx | 国产成人高清av | 综合色站 | 国产精品资源在线观看 | 亚洲精品日韩av | 国产又粗又猛又爽又黄的视频先 | 日韩高清网站 | 青青草国产精品 | 狠狠色丁香婷婷综合 | 欧美日韩国产一二 | 国产精品乱码在线 | 色wwwww| 国产综合精品一区二区三区 | 亚洲夜夜综合 | 色多多在线观看 | 亚洲另类交 | 亚洲精品一区二区网址 | 在线观看国产一区 | 网址你懂的在线观看 | 亚洲国产中文在线观看 | 婷婷亚洲五月色综合 | 日本高清dvd| 日韩亚洲欧美中文字幕 | 日本中文字幕高清 | 欧洲精品在线视频 | 97视频在线观看视频免费视频 | 欧美激情精品久久久 | 天堂在线一区二区 | 九九热精品视频在线观看 | 欧美日韩在线第一页 | 99这里都是精品 | 亚洲女人天堂成人av在线 | 999久久a精品合区久久久 | 一区二区三区精品久久久 | av资源在线观看 | 国产中文视频 | 欧美日韩精品免费观看视频 | 青青草华人在线视频 | 国产在线免费av | 99视| 久久精品79国产精品 | 黄色一级性片 | 91人网站| 99久久久久国产精品免费 | 四虎5151久久欧美毛片 | 九九精品无码 | 婷婷成人综合 | 色香蕉视频 | 欧美久久久久久久久久久 | 婷婷亚洲五月色综合 | 美女激情影院 | 亚洲最新视频在线 | 青青草视频精品 | 精品色999 | 国产日韩中文字幕 | 国产精品一区免费观看 | 久久手机视频 | 欧美日韩视频在线观看一区二区 | 激情校园亚洲 | 亚洲我射av | 久久高清免费观看 | 九色琪琪久久综合网天天 | 午夜性盈盈| 韩日精品在线 | 成人黄色电影免费观看 | 久久久999 | 91精品啪在线观看国产线免费 | 91自拍视频在线 | 亚洲精品在线观看网站 |