SSH实战 · 唯唯乐购项目(中)

用户模块
三:一级分类的查询
  1. 创建一级分类表并导入基本数据
CREATE TABLE `category` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`cname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
  1. 建包及相应的类:
    • com.weiwei.shopping.category
      • action :CategoryAction
      • service :CategoryService:业务层对象 
      • dao :CategoryDao:持久层对象 
      • vo :Category:实体对象 ;Category.hbm.xml:映射文件 
  1. 对Service和DAO进行配置:
    • 在DAO中注入sessionFactory
    • 在Service中注入DAO
  1. 需要在IndexAction中注入一级分类的Service.
    • IndexAction   调用   CategoryService   调用   CategoryDao
    • 将一级分类的数据显示到页面
    • 将一级分类的数据存入到session中:因为之后很多页面都会用到。
五:首页上热门商品的显示
  1. 建表:
创建二级分类的表:
CREATE TABLE `categorysecond` (
`csid` int(11) NOT NULL AUTO_INCREMENT,
`csname` varchar(255) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`csid`),
KEY `FK936FCAF21DB1FD15` (`cid`),
CONSTRAINT `FK936FCAF21DB1FD15` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8;
创建商品表:
CREATE TABLE `product` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(255) DEFAULT NULL,
`market_price` double DEFAULT NULL,
`shop_price` double DEFAULT NULL,
`image` varchar(255) DEFAULT NULL,
`pdesc` varchar(255) DEFAULT NULL,
`is_hot` int(11) DEFAULT NULL,
`pdate` datetime DEFAULT NULL,
`csid` int(11) DEFAULT NULL,
PRIMARY KEY (`pid`),
KEY `FKED8DCCEFB9B74E02` (`csid`),
CONSTRAINT `FKED8DCCEFB9B74E02` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`)
) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8;
  1. 建包及相应的类:
    • com.weiwei.shopping.product
      • action :ProductAction
      • service :ProductService:业务层对象 
      • dao :ProductDao:持久层对象 
      • vo :Product:实体对象 ;Product.hbm.xml:映射文件 
  1. 对Service和DAO进行配置:
    • 在DAO中注入sessionFactory
    • 在Service中注入DAO
  1. 需要在IndexAction中注入商品的Service.
  • IndexAction  调用  ProductService  调用  ProductDao
  • 查询热门商品
  • is_hot: 0:不是热门商品  1:是热门商品;
  • 查询带有个数
  • 分页查询
  • 将查询到的数据保存到值栈中
六:首页上最新商品的显示
  1. IndexAction  调用   ProductService  调用   ProductDao
  • 查询最新商品:
  • 按商品上传日期倒序进行排序 只显示10个.
  • 将查询到记录保存到值栈中:
七:首页上点击商品显示商品详情
  1. 点击商品链接:
* 传递商品id.
  1. 编写Action:
* 编写Action类,继承ActionSupport实现模型驱动接口.
* 编写一个执行的方法.
  1. 配置Action:
* 在applicationContext.xml中配置Action
* 在struts.xml中配置Action
  1. 在Action中调用Service完成根据ID进行查询的方法:
* 注入ProductService.
* 完成查询
  1. 在页面上显示相应数据 :
* 页面转向
* 修改页面
* 显示数据
显示数据时可以直接通过模型驱动的model对象拿数据。例如:
src="${pageContext.request.contextPath}/<s:property value="model.image"/>"
<s:property value="model.shop_price"/>
八:首页上点击一级分类,查询商品列表:(左侧一级分类和二级分类关联查询)
  1. 创建二级分类的包及类:
    • com.weiwei.shopping.categorysecond
      • action :CategorySecondAction 
      • service :CategorySecondService 
      • dao :CategorySecondDao 
      • vo :CategorySecond 
      • CategorySecond.hbm.xml
  1. 配置一级分类和二级分类的关联关系:
    • Category.xml
 <!-- 配置一个二级分类的集合   按照编号进行排序  懒加载默认是true,为了不延迟改为false-->
          <set order-by="csid" name="categorySeconds" lazy="false">
              <key column="cid"></key>
              <one-to-many class="com.weiwei.shopping.categorysecond.vo.CategorySecond"/>
          </set>
    • CategorySecond.hbm.xml
           <!--
            相对于一级分类,二级分类是many的一端 :在二级分类中配置many-to-one
            name:实体类中的属性
            column:表中的外键字段
           -->
           <many-to-one name="category" class="com.weiwei.shopping.category.vo.Category" column="cid"></many-to-one>
  1. 点击一级分类的链接:
    • 传递一级分类的cid,根据cid查询所有商品.
  1. 编写Action:
    • 接收cid:
    • 编写一个执行的方法:因为再ProductService中已经做了FindAll()方法,所以在这里直接注入ProductService 调用方法,然后返回字符串进行页面跳转。
    • 在页面上用迭代标签迭代显示左侧分类 ;
    • 关联查找:直接从session中获得一级分类的数据,需要在映射文件中配置一级分类上二级分类的集合(lazy="false" );并且为了数据顺序不变,按二级分类的遍号排序显示(order-by="csid" )。
九:首页上点击一级分类,查询商品列表:(显示商品列表)
  1. 查询商品,带有分页显示商品
    • 回到商品列表页面
    • 需要查询:商品集合,当前页数,总页数(总记录数),每页显示记录数.( 将后台的这些数据带到页面上,首选:值栈 )
    • 将这些数据封装到一个分页类中。(最后将分页类保存到值栈中就OK)。
  1. 在工具包中封装一个PageBean。
  2. 完成查询:
    • 传递当前页数到ProductAction中,提供set方法;
    • 调用ProductService的FindByPageCid()方法完成查询;参数:Cid,page;
方法返回的是PageBean;
  1. 配置二级分类和商品关联关系——类似于一级分类月二级分类的配置。
注意:在页面上从值栈中、模型驱动取PageBean不用加#;从session中取值需要加#.
:商品分类页面根据二级分类ID查询商品
  1. 点击二级分类链接:
    • 传递csid
    • 传递page=1
  1. 编写Action :
    • 接收csid:
    • 接收page
  1. 调用Service完成查询:
    • 封装成PageBean
  1. 在页面中进行显示
购物车模块
一:创建表、包结构及映射文件。
二:将商品添加进购物车
  1. 封装购物车对象
  • Cart:购物车对象
    • CartItem的集合
    • total:总计 = 小计相加
    • 功能:
      • 将购物项添加到购物车
      • 从购物车中移出购物项
      • 清空购物车
     /*功能1:将购物项添加到购物车*/
     public void addCart(CartItem cartItem){
          /*判断购物车中是否已经存在该购物项
           *   存在:
           *        数量增加
           *        总计 = 总计 + 购物项小计
           * 不存在:
           *        向map中添加购物项
           *        总计 = 总计 + 购物项小计
           * */
          //获得商品id
          Integer pid = cartItem.getProduct().getPid();
          //判断购物车中是否存在该购物项:
          if(map.containsKey(pid)){
              //存在
              //获取原来的购物项
              CartItem OcartItem = map.get(pid);
              OcartItem.setCount(OcartItem.getCount() + cartItem.getCount());
          } else {
              //不存在
              map.put(pid, cartItem);
          }
          //设置总计的值
          total += cartItem.getSubtotal();
     }
  • CartItem:购物项
    • Product:商品信息
    • count:购买某种商品的数量
    • subtotal:购买某种商品的小计=单价*数量(Product.shop_price*count)
 提示:(1)set集合每添加一个顺序就会变化:所以购物车中不用set;若只为显示购物车,则用list集合就足够了,但是为了能够删除商品,我们选择用map集合,通过key可以删除选中商品。
(2)通过JS提交表单:document.getElementById("表单ID").submit();
(3)在购物车中显示商品:${pageContext.request.contextPath}/<s:property value="#cartItem.product.image"在页面上从值栈中取PageBean不用加#;从session中取值需要加#.
三:清空购物车
    • 在CartAction中:
      • 获得购物车
      • 调用clearCart()方法
    • 在页面上:
      • 用struts迭代标签判断
        • 若购物车为空则不显示相关按钮、表单
        • 若不为空则显示表单、相关商品
四:移出购物项
    • 点击页面的移出链接,传入pid
    • 在CartAction中:
      • 获得购物车
      • 调用removeCart()方法
注意:
session序列化的异常。
session销毁三种情况:
(1)服务器超时:30分钟;
(2)服务器非正常关闭:如从控制台直接关tomcat(点stop是正常关闭,启动会抛序列化异常)
(3)手动调用session的销毁方法(如本项目中的退出功能);
所以让实体类实现序列化接口就解决了:
/*实现序列化的接口,以免服务器抛序列化异常*/
public class Cart implements Serializable{···}
订单模块
一:建表:数据库设计模块已完成;
二:创建订单模块的包、类:
  • com.weiwei.shopping.order
    • action :OrderAction 
    • service :OrderService 
    • dao :OrderDao 
    • vo :
      • Order 
      • Order.hbm.xml
      • OrderItem
      • OrderItem.hbm.xml
三:配置:
  • applicationContext.xml
  • 配置映射
  • OrderAction   调用   OrderService   调用   OrderDao
  • 实现提交订单时页面的跳转:修改我的购物车页面的提交按钮链接,再编写OrderAction、配置struts.xml
四:订单页面数据生成并显示
  • 生成订单
    • 保存订单的数据
    • 在页面中显示订单数据
    • 通过模型驱动的对象将数据传递到页面.(原理还是值栈)
  • 我的订单
    • 根据用户的uid查询当前用户的所有的订单
五:付款
  • 在线付款原理图:
本项目采用第二种方式。
  • 在线付款流程分析
  • 本项目付款功能流程
    • 跳转到页面:根据订单的oid查询订单.
    • 在页面中对其进行付款
  • 付款功能的实现
    • 在线支付的方式
    • 在线支付
    • 与第三方支付公司对接:(易宝)
    • 在线支付的流程
    • 付款功能代码实现
    • 修改订单数据:(收货人,地址,电话)
    • 完成付款的功能

转载于:https://www.cnblogs.com/panweiwei/p/6245743.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android的IPC机制(一)——AIDL的使用

综述 IPC(interprocess communication)是指进程间通信&#xff0c;也就是在两个进程间进行数据交互。不同的操作系统都有他们自己的一套IPC机制。例如在Linux操作系统中可以通过管道、信号量、消息队列、内存共享、套接字等进行进程间通信。那么在Android系统中我们可以通过Bin…

Netty:透明地使用SPDY和HTTP

大多数人已经从谷歌那里听说过SPDY&#xff0c;该协议被提议作为老化的HTTP协议的替代品。 Web服务器是浏览器正在缓慢地实现该协议&#xff0c;并且支持正在增长。 在最近的文章中&#xff0c;我已经写过SPDY的工作方式以及如何在Jetty中启用SPDY支持。 由于Netty&#xff08;…

selenium 等待页面加载完成

一、隐形加载等待&#xff1a; file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head><title>Set Timeout</title><style>.red_box {background-color: red; width 20%; height:100px; border: none;}</style&…

linux nfsnobody用户,处理CentOS 5.5 x64 配置NFS服务过程中nfsnobody用户造成的问题

4、我们编译一下这个NFS的配置文件。[rootNFS /]# vi /etc/exports/share 192.168.60.0/24(rw,sync,all_squash,root_squash) (我们允许这个共享对192.168.60.0/24网段可读可写&#xff0c;且将所有访问者包括root的身份都改为nfsnobody)[rootNFS /]# /etc/init.d/nfs resta…

c语言空格有什么作用,空格在c语言中怎么表示 C语言中的空格字符怎么表示

c语言中表示空格的是什么代码&#xff1f;分析如下&#xff1a; 不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。 空格没有转义字符。合法转义字符如下&#xff1a;\a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回…

StringMVC 中如何做数据校验

步骤一&#xff1a;引入四个jar包 步骤二&#xff1a;注册类型转换器 <context:component-scan base-package"cn.happy.controller"></context:component-scan><!-- 配置验证器 --><bean id"myvalidator" class"org.springframe…

ibm+x3650+m4+linux+raid驱动,IBM X3650M4阵列卡驱动下载

ibm X3650M4raid阵列卡驱动适合安装windowsserver2008,windowsserver2008R2,系统问题&#xff0c;服务器问题&#xff0c;可以联系我们也可以到5分享论坛发帖求助。IBM System x3650 M4服务器是一款应用最为广泛的2U机架服务器&#xff0c;支持Xeon E5-2600机架服务器的所有产品…

UML类图与类的关系详解

在画类图的时候&#xff0c;理清类和类之间的关系是重点。类的关系有泛化(Generalization)、实现&#xff08;Realization&#xff09;、依赖(Dependency)和关联(Association)。其中关联又分为一般关联关系和聚合关系(Aggregation)&#xff0c;合成关系(Composition)。下面我们…

python之路-SQLAlchemy

SQLAchemy SQLAlchemy是Python编程语言下的一款ORM框架&#xff0c;该框架建立在数据库API之上&#xff0c;使用关系对象映射进行数据库操作&#xff0c;简言之便是&#xff1a;将对象转换成SQL&#xff0c;然后使用数据API执行SQL并获取执行结果。 安装&#xff1a; pip3 inst…

Linux中vim编辑器的缩进的功能键

vim编程时,经常需要对代码进行缩进处理,以增加程序的可读性和后期的代码维护. 可以采用多种方式达到缩进的目的: 1) 命令模式(command mode) 2) Visual模式&#xff08;visual mode&#xff09; 2) 输入模式(entry mode) 3) 末行模式(last-line mode) 4) 在/etc/vimrc有给予vim…

JSF 2,PrimeFaces 3,Spring 3和Hibernate 4集成项目

本文展示了如何集成JSF2&#xff0c;PrimeFaces3&#xff0c;Spring3和Hibernate4技术。 它为Java开发人员提供了一个通用的项目模板。 另外&#xff0c;如果Spring不用于业务和数据访问层&#xff0c;则可以提供JSF – PrimeFaces和Hibernate集成项目。 二手技术&#xff1a…

初识openstack

一、 什么是openstack&#xff1f; OpenStack是一个由NASA&#xff08;美国国家航空航天局&#xff09;和Rackspace合作研发并发起的&#xff0c;以Apache许可证授权的自由软件和开放源代码项目。 二、openstack前世今身 openstack是一个跟Eucalyptus,AWS(Amazon web Service)类…

Arquillian 1.0.0.Final正式发布! 准备使用GlassFish和WebLogic! 杀死所有虫子!

红帽公司和JBoss社区今天宣布的1.0.0.Final发布的Arquillian &#xff0c;其屡获殊荣的建在Java虚拟机&#xff08;JVM&#xff09;运行测试平台。 Arquillian大大减少了编写和执行Java中间件集成和功能测试所需的工作。 它甚至使测试工程师能够解决以前认为无法测试或测试成本…

qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用

九、 智能调频、空码检索、词序固定在QQ五笔中还有一些小亮点&#xff0c;比如它可以根据“最近输入”、“输入次数”对候选词排序。同时为了加快检索速度&#xff0c;默认只在常用字库(GB2312)中检索&#xff0c;只有出现空码后才会继续搜索容量更大的GBK字库&#xff0c;很好…

android 关闭蓝牙打电话功能,Android蓝牙开发【八】hfp接听、挂断电话

继续研究hfp相关功能。蓝牙耳机可以控制手机接听、拒接、挂断电话&#xff0c;拨打电话等功能。本文主要分析下起这些操作的大致流程。在系统应用Bluetooth中com_android_bluetooth.cpp提供了多个回调方法&#xff0c;由hardware、协议栈回调过来。蓝牙耳机的一些控制命令都会发…

将状态机模式实现为流处理器

在我的上一个博客中&#xff0c;我说我真的以为某些“四人行”&#xff08;GOF&#xff09;模式已经过时了&#xff0c;如果不是过时的话肯定不受欢迎。 特别是我说过StateMachine不是那么有用&#xff0c;因为您通常会想到另一种更简单的方式来执行您正在执行的事情&#xff0…

android 自定义actionbar,如何让android的actionbar浮动且透明

如上图所示&#xff0c;谷歌地图的actionbar是透明的&#xff0c;且浮动在整个布局之上&#xff0c;没有占用布局空间。其实要做到这样的效果&#xff0c;我们首先想到的是两个方面&#xff1a;1.将让actionbar浮动起来。2.给actionbar一个背景&#xff0c;可以为颜色也可以为图…

Ajax与CustomErrors的尴尬

在ASP.NET程序中&#xff0c;为了给用户显示友好的错误信息&#xff0c;通常在web.config中进行如下的设置&#xff1a; <customErrors mode"RemoteOnly" defaultRedirect"/error/error.htm"> </customErrors> 但如果是一个ajax请求在服务端发…

Java创建WebService服务及客户端实现

简介 WebService是一种服务的提供方式&#xff0c;通过WebService&#xff0c;不同应用间相互间调用变的很方便&#xff0c;网络上有很多常用的WebService服务&#xff0c;如&#xff1a;http://developer.51cto.com/art/200908/147125.htm&#xff0c;不同的语言平台对…

Java静态方法可能会产生代码异味

代码气味的定义 &#xff08;来自维基百科&#xff09;&#xff1a; “程序源代码中任何可能表明存在更深层问题的症状。” 在Java中&#xff0c; 静态方法允许您在“类范围”内执行代码&#xff0c;而不是像成员方法这样的实例范围。 这意味着&#xff0c;它们依赖于类级别的变…