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查出來,再把對象刪除),一個是直接對象刪除(減少查的過程,用于刪除分類時,直接傳遞對象)
實現類:
為何保存訂單會有一個返回值,兄弟呀,我是使用的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(); }
實現類
首頁沒有做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项目之自己想的购物网站的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机无法使用本地搜索,电脑资源管理器搜
- 下一篇: 揭阳学计算机的好学校,揭阳中学排名前十名