estore简版商城思路
遵循多表设计的原则,进行设计:
1.一对一, 可以合并到一张表
2. 一对多, 可以在多的一方添加一方的主键作为外键约束
3. 多对多, 需要引入第三张关系表, 会有最基本的两个字段, 分别来自于 两张主体表的主键. 这两个字段同时就是两个外键约束.
设计表,一共有四个表。
用户表:user,商品表:product,订单表:order,订单项表(订单和商品的关系表):orderitem
备注:购物车,没有单独设计成一个表,而是将购物车中的东西放到session中进行存储
index.jsp(主页)--> regist.jsp--> RegistServlet-->UserService
--> DaoFactory--> UserDaoImpl(注册流程)
(1)验证码(未实现)
(2)过滤器解决全站请求乱码问题
(3)javabean封装注册时,提交过来的数据(BeanUtils)
(4)解耦合:Dao接口 ,DaoFactory工厂,DaoImpl实现类
(5)dbutils工具类,在java操作数据库时使用
(6)5秒后跳转到页面,(js书写)页面加载时
思路:
1、判断密码和确认密码是否相同,如果不同,则提示两次输入密码不同,请重新输入;相同,则进入2;
2、如果邮箱确认用户是否注册过,如果已经数据库中存在该邮箱号,则说明用户已经注册过,则提示当前邮箱已经注册过,注册失败;如果不存在,则进行注册
(1)index.jsp(主页)-->login.jsp--> LoginServlet--> UserService--> UserDao--> DaoFactory--> UserDaoImpl(登录流程)
(2)afterLoginMessage.jsp(登录成功页面)
(3)AutoLoginFilter(登录过滤器)
(1)基本登录
(2)自动登录(cookie实现+过滤器)
【1】对一些资源进行限制,某些资源,不用走自动登录的逻辑
【2】注销不掉的问题:
解决:在删除session的同时,删除cookie中的信息
【3】没有勾选,清空cookie(保证用户安全)
【4】cookie信息被篡改,清空cookie(保证用户安全)
1. 在注销的时候,要将cookie 给清空
因为,如果没有清空,就会出现注销不掉的情况。原因:系统注销后会重定向到index.jsp页面,而过滤器在过滤资源的时候,发现这个页面不属于过滤的范畴,此时系统会走自动登录的逻辑,因此,此时系统又实现了登录。最终,系统无法实现注销。 所以,当把cookie中的信息清除时,才可以避免这个问题的发生
2. 在没有勾选自动登录的时候也要将cookie 清空
如图所示,当多人登录用同一个浏览器登录这个系统,而且登录的前者:小丽勾选了自动登录的选项,这是cookie中会保存他的信息到浏览器中;而当下一个人:柯泉,使用这个浏览器,进行登录系统,他没有勾选自动登录的选项,所以浏览器没有保存他(柯泉)的登录信息到cookie中。至此,浏览器中仍旧记录的是小丽的cookie信息。当柯泉关掉浏览器走开后,然后再回来访问网站的页面时,这时候因为浏览器中还保留着小丽的cookie信息,因此可以实现自动登录,此时,系统中看到的是小丽的信息。这样,就会出现安全隐患。
所以,为了出现这样的安全隐患。当用户没有自动登录时,将cookie信息清空。(因为当用户自动登录时,浏览器会只保存这一个cookie信息)
3. 在发现cookie中信息被篡改的时候也要清空.
cookie中存储的用户名和密码信息出现错误时,说明cookie中信息被篡改,此时,说明cookie中存储的信息是无效的,且不安全,所以,为了安全起见,应该清楚cookie中的信息
afterLoginMessage.jsp(登录成功页面)-->LogoutServlet(注销流程)
session的两种方式可以注销
支持正向的加密,不支持解密的(单向)
采用md5 加密算法将 密码加密后保存到数据库中
(1)md5工具类实现(MD5Utils)
(2)在注册,登录保存到数据时,将加密后的数据进行保存。
额外说明:
加密都 可以分为如下这两大种 :
第一种: 支持加密, 也支持解密的
Base64
第二种: 支持正向的加密,不支持解密的.
MD5 加密, 支持加密, 不支持解
Md5加密算法 java中已经 集成 进来 .算法是固定, 很多很多 软件 也都集成了 md5 加密.
例如: java, c,c++,c#, mysql,oracle
管理员登录成功后(afterLoginMessage.jsp) --> addproduct.jsp--> AddProductServlet--> ProductService----> DaoFactory--> ProductDaoImpl(商品添加流程)
message2.jsp(添加商品成功页面)
(1)涉及文件上传的知识,这里主要是上传商品的图片问题
使用上传控件:commons-fileupload
(2)BeanUtils封装,提交过来的数据
(3)图片保存路径:不在WEB-INF下保存,因为商品图片,用户要浏览
(4)商品的添加涉及到 文件的上传, 所以这里首先要有一个文件上传的表单,表单要注意如下三点:
第一点:Input 输入项的type=”file”
第二点:表单的 enctype=”multipart/form-data”
第三点:请求的提交方式是post
点击添加后去访问一个servlet ,完成商品的添加
登录成功后:afterLoginMessage.jsp --> ListProductServlet--> ProductService--> DaoFactory--> ProductDaoImpl(商品显示流程)
listproduct.jsp(商品显示页面)
商品的显示 逻辑很简单, 只需要在 点击 查看商品 后, 去找一个serlvet, 将所有的商品查找后, 返回一个list, 然后 将这个list存到 request域中,然后转发到 jsp 页面去显示即可。
在显示商品的 页面 ,图片 有的大,有的小, 不好看, 所以可以 对图片进行 缩放处理下。
(1)如何显示图片?
思考:使用image标签完成!
(2)图片显示的统一大小问题?
缩放处理
【1】设置image标签的宽,高的规格
【2】使用java的api实现:制作图片缩略图
在存放商品图片的同一存放目录下,生成一个小图
因此,修改的地方,就是在商品添加的时候,生成一个小图,使用工具(PicUtils);因此,在商品类中添加一个字段imageurl_s表示小图存放地址(imageurl是商品原图存放地址)
商品显示页面listproduct.jsp--> AddToCartServlet-->(1)(2)(3)
(1)【ProductService -->DaoFactory--> ProductDaoImpl (获取当前商品的全部信息)】
(2)购物车信息保存到map容器中,最终保存到session域中
(3)message2.jsp(添加购物车成功信息页面)
(1)js实现 ,在页面点击进行“添加到购物车”事件触发
(2)购物车,保存到session中,名字为:cart
(3)购物车,里面的内容实际上,保存在一个map容器中,并且map的泛型时这样的:Map
(4)在保存到map容器是,首先要进行选择,因为保证有序,所以选择LinkedHashMap< Product,Integer >,而为了保证存入的 map中的元素唯一,需要在Product类中覆盖hashCode和equas方法,通过Product的id来确保元素的唯一。
(1)添加一个过滤器PrivilegeFilter
(2)配置文件user.text 用户有权限访问的资源
配置文件admin.txt 管理员有权限访问的资源
(1)user表中添加role(角色),这个role有两个取值:一个是user(普通用户),另外一个是admin(管理员)
(2)权限认证:先认证,后权限
认证:我是谁?
权限:我能做什么?
(3)谁有什么权限?可以访问什么?不能访问什么?
(4)过滤器PrivilegeFilter+配置文件user.text,admin.txt(书写权限资源,即:有权限访问的资源)
[1]读文件,获取权限(类加载器或者ServletContext去获取)
[2]用list容器进行保存这些权限
[3]目标资源的路径获取问题(当前请求资源)
[4]判断逻辑
1、当前资源是否需要权限访问,如果不需要,直接放行;如果需要,则进入2,3
2、没有登录
只能注册,登录 ,和查看商品 (提醒登录)
3、 登录
看看登录角色是user还是admin
1)角色是user:
<1>能: 添加购物车,显示购物车, 注销 【 放进有权限的list列表中:userlist】
<2>不能:添加商品
2)角色是admin:
<1>能:添加商品,注销 【 放进有权限的list列表中:adminlist】
<2>不能:添加购物车,显示购物车
登录成功后:afterLoginMessage.jsp --> listcart.jsp(显示购物车)
【修改购物车中商品数量】
listcart.jsp --> UpdateProductServlet--> ProductService--> DaoFactory--> ProductDaoImpl(查找当前商品数量)
修改session域中的cart(购物车)【购物车中的某种商品的数量】
listcart.jsp(修改购物车中的商品数量后,跳转到购物车显示页面)
(1)全选,全不选之js代码(未实现)
(2)遍历map集合之EL表达式(购物车cart的遍历问题)
(3)session使用?(范围,时间)
(4)cart的信息获取,存储时就是全面,前面添加商品到购物车是已经做好了
(5)所有商品总价问题,即:如何使用
(6)购物车中商品数量的动态增加,减少问题?js的使用和servlet使用的结合,调用UpdateProductServlet实现修改
(7)文本框的动态改变问题,onblur的使用,实时更新商品数量
(8)文本框的判断数字问题(js实现)
listcart.jsp(购物车页面)-->confirmInfo.jsp(确认订单信息页面)-->GenerateOrderServlet-->OrderService-->(1)(2)(3)
(1)--> DaoFactory -->OrderDaoImpl【生成订单表】
(2)--> DaoFactory--> OrderitemDaoImpl【生成订单项表】
(3)--> DaoFactory--> ProductDaoImpl【修改商品数量】
message2.jsp(生成订单成功页面)
注意:生成订单的前一个逻辑是:确认订单信息,订单信息里包括订单金额:money,此外要求用户,填写订单收货人的地址信息:receiveinfo
(1)显示的信息是购物车cart的信息
(2)当前拥有的信息
[1]生成订单的表单中有的信息:订单金额:money,订单收货地址信息:receiveinfo
[2]当前用户的信息,session中loginUser可获得
[3]购物车的信息:session中的cart可获得
(3)订单(orders)与订单中的订单项(orderitem)关联?
用容器来维护!
使用list容器,即:在orders表的bean:Orders类中添加一个字段:List
从而,可以在传递参数:一个订单时,把相应的订单项的信息传递过去。
(4)维护多张表中的数据
关系表:orderitem(订单项表),product:商品表,订单表
设计三张表的操作时,需要进行事务管理。注意:在进行事务管理时,是抛出异常,而不是捕获异常;因为出现异常后,要进行事务回滚!
一个问题:进行事务管理,Service层就会出现Connection类,就会出现耦合现象,为了解决这个问题?
所以使用ThreadLocal(本地线程类),实现解耦合!
TransactionUtil工具类的使用
(5)表的级联工作
[1]生成订单表[2]生成订单项表[3]商品表:修改商品数量
登录成功后:afterLoginMessage.jsp --> ListOrderServlet--> OrderService
--> DaoFactory -->OrderDaoImpl(查看订单信息)
listorder.jsp(订单信息显示页面)
(1)用户,管理员。角色不同,查询信息不同
(2)多表查询 【1】用户表,订单表
【2】订单项表(订单和商品之间的关系表),商品表
(3)
订单查询的所有信息:【查询四个表】
订单号 ,下单时间,总价(orders表)商品价格商品名(product表),
购买数量(orderitem表),下单人(user表)
为了查询便利,
在Orders类中添加 了 字段: private String username;//下单人名字
在Orderitem类中添加了字段:private int price;//商品价格
private String name;//商品名
添加字段后,查询的表变为:【查询两个表】
订单号 ,下单时间,总价,下单人(orders表)
商品价格,商品名,购买数量(orderitem表)
(4)取出查询信息
OrderList(所有订单)--> Order(其中的一个订单)--> OrderitemList(一个订单下的所有订单项)-->orderitem(一个订单项)
listorder.jsp(订单信息显示页面)--> PayServlet--> OrderService
--> DaoFactory -->OrderDaoImpl(支付订单)
message2(支付订单成功的信息页面)
修改订单的支付状态即可