自定义框架(ORM框架),持久层框架(mybatis,hibernate)
MVC框架(springmvc,struts2)
目标:完成自定义springmvc框架
项目流程:
1.首页
加载出最新的前四个商品(按更新时间降序排列)
异步请求:按时间排序选到前四个
热销商品:在订单明细表中找出前三个卖的最好商品信息(按照productId进行分组,统计数量,按照数量降序排序,取出符合条件的产品id降序排列,再根据id取到数据库信息)
分类:暂时不需要parentId进行递归,直接查询出所有分类信息进行显示;显示一个div,里面是分类名称,要求都是超链接,点击进去根据分类id进行商品列表展示
购物车(悬浮div,显示有多少件商品)
搜索:根据搜索的信息来查询指定的商品,过多的话要分页;右面的更多商品要显示所有商品
首页点击购物车,进入购物车;点击去结算,进入结算页面
首页右上角登录信息,如果用户已登录,显示用户名字,并显示安全退出按钮,不显示登录注册按钮;没登录,不显示安全退出,显示登陆注册
个人中心,我的订单要实现页面跳转
一、表设计
基本五个表:用户表,订单表,订单明细表,商品表,商品分类表
订单表(最麻烦的就是查订单)
里面要存详细地址,而不是要存主键,因为用户如果要改地址,应该查的是以前真实的地址,存主键查的就是现在的地址,真实地址会消失;同理,订单明细表里的单价总价也不能少,因为要保留当时的价格信息,这都不是冗余,必须要有。
订单和订单条目表,一个订单对应多个订单条目表
二、页面
页面复用
用ajax复用页面
把list3页面直接放到div中,可以不要head和body什么的,布局好直接放进去
2.1 首页布局
使用页面复用
用target控制iframe的位置,否则是在左侧显示,插在哪就在哪显示
2.2 只能响应一次
后面不能再写转发或重定向
同理或者字符流或者字节流,不能又字符又字节
2.3 静态包含(只能在jsp中使用)
jsp中以@开头的标签,叫做指令
jsp中只有三个指令page;taglib;include(静态包含)
用一个标签也可以引入页面
iframe和ajax复用页面在任何页面都能使用
2.3 frameset(框架集)
建议后台管理时用,门户网站不推荐,iframe更灵活,用iframe也可以实现这种布局
三个页面在一起,点一个链接显示在其他两个页面中
子框架,在内容中嵌入页面
framset不能有页面内容,只能引入页面,把屏幕分成几块网页
上面是出不来的,它和body是冲突的,要去掉body
布局
左边25,中间50,剩下的给右边
上下分成两个部分,上面25,剩下给下面,下面再嵌套一个frameset,分成左右两块,左边25,剩下给右边
三、 用户退出
3.1 域
Cookie
在网页
Session
也在服务器,每个用户只能访问自己的信息
浏览器运行一次期间所有的操作对应一个sessionId,只要session还在,你操作存储的数据都在,都能找到,你只能找到你的数据
如果在期间登录n个账号,也是对应一个sessionId
但是不同浏览器对应不同的session
Application
共享数据
Web数据都是键值对格式key-value
四、 购物车
Cookie: 不可以存对象,要用json存对象
失效时间:默认浏览器关闭(换个浏览器就没有了)
Session:可以存对象
同一浏览器同一浏览器
失效时间:默认30分钟
关闭浏览器,cookie没了,虽然数据在服务器保存30分钟,但是sessionId没了,找不到数据
数据库:
永久保存
登录才能使用购物车
京东
没有登陆,有购物车(登录后要合并购物车)
拦截器
多放一层来拦截
没有session信息,购物车拦截成功去登陆页面
既要拦截页面,也要拦servlet,以后框架都只是拦截处理器,拦截后端才是最核心要的
默认拦请求,转发不拦截,自己要配置
拦住右边的是核心
添加购物车(session做法,区别于ajax数据库操作,别搞混)
session取值不写成员变量也可以,它只认get方法
钱用科学计数
不能直接传小数,一定先把小数变成字符串,再传数
否则计算之前保存数据的时候就存错了,已经不准确了
购物车中的一条记录
购物车:一个购物车有多个购物条目
商品建map集合,可以根据key去重,有了cartitem,cart建不建都可以,建cart只是为了去重,实体和表不必一一对应,不是有实体就要建一个表,只要能实现相关关系就可以,不建cart建一个map集合道理是一样的
同一商品添加多次,应该是一个条目key:商品id
遍历的时候还用list的形式
有表应该在dao层去操作数据
不能直接这么添加,同key的商品会覆盖
要进行判断
写不写都行,引用数据用的是同一个地址,改了就跟着改了
例
删除购物车:删除key
用session的时候没有数据库,所以没有购物车,有数据库直接显示就可以了;所以在登录的时候给session一个购物车
和上面同理,引用类型不用再次存储,改了就是改了
在el里判断cart里cartitems的长度,ajax判断json是否为空
导入jstl里封装的函数库标签
页面:
cart表设计
一张表
两张表,其实购物车表完全没必要
五、订单
5.1 事务的控制
1.原生方法
添加订单是否失败要用事务来控制,事务控制在业务层,要保证是同一个链接(用同一个collection来操作数据库)
实例
第一:要用同一个连接,下面两个连接控制不住
第二:要设置自动提交为假
第三、手动控制
没异常提交,有异常就在catch里回滚
2.封装的方法
可以控制一张表的两个数据,也可以控制多张表的一个数据
封装写的不好的地方
5.2 批处理
一次添加多条数据,
循环调用也可以做到,但每次都要创建链接和关闭连接,就不太好
1.原生方法:只创建了一个连接,一组一组的set进去
2.封装方法
把参数打包成二维数组传进去
5.3 添加订单
添加订单表和订单条目表时要同时添加,需要事务的控制,而添加订单条目表的时候要进行批处理添加
dao
service
页面
servlet
过滤器
注意:提交订单后要清空这个用户的购物车
5.4 一对多,不要连表
一个订单对应多个订单条目,连表会造成很多重复的订单
5.5
5.4 支付
调用第三方接口
银行