day20_day23课堂笔记

day20_day23课堂笔记

一、概述

  做一个项目:bookStore图书商城   目的:将前期学过的知识进行整合。

    1. 商城首页 index.jsp

    2. 在首页上点击类别链接时会跳转到 product_list.jsp 页面展示相关商品信息

    3. 新用户注册页面

    4. 当我们点击我的帐户

        如果用户没有登陆,则跳转到 login.jsp 页面

        如果用户登陆了,角色是普通用户,则跳转到 myAccount.jsp 页面

        如果用户已经登陆,并且它的角色是管理员,则跳转到 /admin/login/home.jsp 页面

    5. 点击购物车,跳转到 cart.jsp 页面展示出购物车中商品信息

    6.搜索操作

        会对输入的信息与商品的名称进行 模糊匹配 ,将查询出的数据在 product_list.jsp 页面展示出来

二、分述

1.  关于用户的操作(普通注册的用户)

    1.1 用户信息的修改操作     1.2 用户订单查询的操作     1.3 用户退出(注销)的操作

        用户信息的修改操作:

            对于普通注册用户,它可以修改除了 会员邮箱 与 会员名 之外其它信息

        用户订单查询的操作

            用户可以查询出自己的订单,可以查看订单详情,可以删除已支付的订单

        用户退出

            本质就是将存储到 session 中的 User对象 invalidate(); 销毁掉

    1.4 关于商品查看         查看所有商品信息         查看类别商品信息         查看类似名称的商品信息         查看某个商品的详细信息     1.5 关于购物车         将商品添加到购物车         查看购物车中商品信息         对购物车中商品信息修改及删除     1.6 关于订单操作         生成订单         当前用户所有订单的查看         查看订单的详细信息         删除订单         如果订单为支付,我们可以点击进行支付操作     1.7 支付操作         支付页面是 pay.jsp

2.  关于后台商城管理的操作

    2.1 商品管理         商品查看    a) 查看所有商品信息    b) 多条件查询         商品编辑    对商品信息修改(上传操作)         商品删除    a) 删除一件商品           b) 批量删除         商品添加     (上传操作)         下载销售榜单

    2.2 订单管理         查看所有的订单         多条件查询订单         查看订单详细信息         订单删除

3.  数据库设计

    通过ER图来描述(实体关系图)

    只画了简单的实体关系图(属性没有添上)

    数据库的架构设计图如下:

三、功能具体实现(部分功能)

1.  注册用户

        register.jsp ——> RegistServlet ——> UserService ——> UserDao

        注册成功后,需要发送一封激活邮件。

        在UserService中调用dao中addUser方法扣,执行下面代码:

        我们需要创建一个 ActiveUserServlet 这样一个 servlet。

        注意:在激活时,需要考虑激活码的时间限制。

2.  登陆用户

        login.jsp ——> LoginServlet ——> UserService ——> UserDao

        在登陆时,需要考虑用户的状态是否激活,如果没有激活,用户名与密码正确,也不能登陆。

3.  关于点击在 product_list.jsp 页面上点击“我的帐户”的操作

        注意:在其他页面上的点击“我的帐户”没有做,目前只做了这一个页面的。

        注意:如果用户没有登陆,则 session 中就不会有User对象,那么会跳转到 login.jsp。

                  如果用户已经登陆了,则 session 中就会有User对象,会根据用户的角色跳转。

        1. 在 head.jsp 中将我们的帐户的链接:

            <a href="login.jsp">我的帐户</a>

            修改成访问

            <a href="${pageContext.request.contextPath}/myAccount">我的帐户</a>

        2. 创建一个 MyAccountServlet

4.  关于注册用户登陆后的操作

用户信息修改操作

            从数据库中将用户信息查询出来,回显

            <a href="${pageContext.request.contextPath}/findUserById?id=${user.id}">用户信息修改</a>

            创建一个 FindUserByIdServlet  完成用户查找回显功能。

            对数据进行修改操作

            创建 ModifyUserServlet 完成修改操作。

            注意:修改后,要将user从session中销毁,重新登陆。

用户退出操作

            <a href="${pageContext.request.contextPath}/logout">用戶退出</a>

            在LogOutServlet完成退出操作

5. 关于首页上的商品类别查询的操作

        根据类别查询后的数据最终要在product_list.jsp页面展示,并且是分页显示:

            select * from products limimt m,n where category=?

        如果点击的是全部商品目录就是查询所有:

            select * from products limimt m,n

        代码实现:

            在menu_seacher.jsp页面上类别连接

            <a href="${pageContext.request.contextPath}/pageServlet?category=文学">文学</a>

        需要创建一个pageServlet

            这个servlet中与我们之前写的分页的servlet唯一的区别就是需要再获取一个类别属性

            String category=request.getParameter(“category”);

        再调用service,dao查询出数据返回 PageBean

6. 关于订单的操作

前台-订单操作

        a) 生成订单

        b) 查看订单(查看当前用户所有订单)

        c) 查看订单详情(查看某一个订单的信息)

        d) 删除订单

后台-订单操作

        a) 查看订单(查看所有用户的订单)

        b) 按条件查询订单(1. 收货人查询   2. 订单号查询)

        c) 删除订单


a) 生成订单 

        将订单数据 insert 到 orders 表中(批处理)

        将订单相关数据 insert 到 orderitem 表中(批处理)

        update修改 products 表中的 pnum

    在 order.jsp 页面上

    点击提交订单,就应该创建一个订单。

    订单生成思路图:

    创建一个 CreateOrderServlet ,它是用于接收 order.jsp 页面的请求的。

    在CreateOrderServlet中完成什么操作?

        1. 收集订单相关数据封装成一个 Order 对象

        2. 调用 OrderService 完成订单生成操作。

            注意:在 OrderService 中完成订单的生成需要事务控制。


b) 查看订单(查看当前用户所有订单) 

    查询订单详情

    可以有两种写法:

        1.  写一条sql语句,得到信息

        2.  写n条sql语句,得到信息

    代码如下图所示:


7. 在线支付操作

    方式一:直接与各个银行做接口

        优点:快捷。

        缺点:需要针对于不同银行做实现,并且银行接口变动,你也需要变动。 维护工作量极大。

    方式二:使用第三方支付

        优点:不需要考虑银行,只与第三方支付进行交互。开发工作量极低。

        缺点:第三方支付需要一定的时间,并且会收取一定的费用。

    常见第三方支付公司

    易宝支付开发所需工具

    本次案例我们使用第三方支付

         我们使用的是易宝支付http://www.yeepay.com/

         前提条件:

            1. 必须申请一个商家用户商家帐户: 10001126856

            2. 需要网上银行

            3. 真实ip地址

        支付流程:

        pay.jsp提交时会访问一个PayOnlineServlet,在这个PayOnlineServlet中我们需要将传递给第三方支付公司的信息获取到封装成表格,并发送给第三方支付公司。

            问题1:发送信息有哪些?

                查看接口文档。

            问题2:信息向哪发送? 

                正式请求地址:https://www.yeepay.com/app-merchant-proxy/node

            问题3:第三方支付公司反馈信息怎样处理?

                按照接口文档来处理。

        第三方支付公司反馈信息为:

        http://localhost:8080/product/callBackServlet?p1_MerId=10001126856&r0_Cmd=Buy&r1_Code=1&r2_TrxId=914221214141971I&r3_Amt=0.01

        &r4_Cur=RMB&r5_Pid=&r6_Order=2cab9734-e148-44c8-a167-eed72e4abca0&r7_Uid=&r8_MP=&r9_BType=1&ru_Trxtime=20150531161117

        &ro_BankOrderId=2767595753150531&rb_BankId=BOC-NET&rp_PayDate=20150531161116&rq_CardNo=&rq_SourceFee=0.0&rq_TargetFee=0.0

        &hmac=7f60261451a3f8f51cacaa1bcd5592c4


8. 权限控制

    1. url级别的控制,使用Filter,来拦截指定的路径,控制资源访问。 粗粒度权限控制。

    2. 自定义标签。

            后续会更新。。。

    3. Annotation(注解)+动态代理+工厂模式(扩展)。细粒度权限控制。      

        我们可以对行为拦截(拦截service行为)。

        使用 动态代理 与 Annotation 来完成。

        原理:我们在Userservice中使用自定义注解,这个自定义注解是用于定义当前行为访问需要的权限。(注意:我们这个项目把接口省略了,直接写的实现类,虽不规范,但是简洁!)

        步骤:

            1. 我们先自定义一个注解类(注意:自定义注解不是类,本质上是一个接口,但是叫法上我们以类相称,虽不正确,但是亲切!)

            2. 我们在Userservice中使用自定义注解

            3. 后面不知道该怎么做了。。。


9. 代码重构(优化Servlet)

  • 对servlet进行重构,在实际开发中,一般情况下是一个功能模块对应一个servlet,简单说,就是UserServlet、ProductServlet、OrderServlet、CartServlet。

    步骤:

    1. 创建一个 UserServlet,配置 web.xml

        <url-pattern>/user</url-pattern>

    2. 获得发送请求的参数URI

            URL: 统一资源定位符(俗称:网址)

            URI: 统一资源标识符

http://localhost:8080/day07_03_myApp1/1.html

            URL= 协议 主机IP(端口号) URI(当前应用的资源路径)

        例如:http://localhost:8080/product/user?method=register

    优化一:

    以UserServlet为例

        RegisterServlet、LoginServlet、 ActiveUserServlet、LogOutServlet、ModifyUserServlet、MyAccountServlet、FindUserServlet

        在UserServlet中完成以下方法对应以上的Servlet完成的功能,把之前的Servlet中的代码粘过来放到每个功能下即可,如下图所示:

        问题:这些方法怎样被调用呢?反过来说,当我们点击页面上的登陆或注册或……怎样找到这些方法呢?如下图所示:

            1. 先删除之前的web.xml中配置的servlet映射,添加新的servlet映射:

            2. 修改其他页面的跳转链接,例如:

            3. 在UserServlet中完成下列代码:

            同理:可以按照这种方式完成OrderServlet、ProductServlet、CartServlet功能。

            注意:添加商品操作不抽取,因为它是文件上传,也就是说,关于商品添加或修改操作的,只要涉及到上传就不抽取。   

        经过这样抽取(封装)后,Servlet变少了,代码简洁了,但问题又来了,添加功能后,UserServlet就需要修改,这样不好,不够健壮,那就继续封装!

优化二:

反射思想:

    UserServlet.java中,不就是变量(字段)和方法吗?UserServlet.java编译后,生成UserServlet.class文件,

    UserServlet.java里面的变量(字段)和方法在内存中就有了相应的位置,我们把这些“位置”看成对象,而整个.class文件我们看成Class对象,直接从内存的高度去获取和使用它们。示例如下:  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

基于spring-boot的rest微服务框架

周末在家研究spring-boot,参考github上的一些开源项目,整了一个rest微服务框架,取之于民,用之于民,在github上开源了,地址如下:

17610
来自专栏FreeBuf

基于Tor网络的钓鱼邮件分析

五月十一日,我们的蜜罐系统捕获到来自xxxxxxxxx@uscourtsgov.com邮箱的钓鱼邮件。其中uscourtsgov就已经是一个很唬人的服务器名称了...

14400
来自专栏轮子工厂

Windows和Ubuntu系统如何远程连接Linux服务器

因为很多实验都要在工作站上面运行,为了避免拿着装着数据的硬盘在自己电脑和工作站之间来回跑,我简单总结一下在windows和Ubuntu系统下远程访问Linux服...

49540
来自专栏FreeBuf

Ubuntu安装Kali工具集:Katoolin

在真实渗透环境下往往需要一个稳定、安全、可随时操作的环境,家中的电脑不能一直开着,而且还有解决公网IP的问题,这时候我们往往需要一台vps,但是市面上的vps往...

60160
来自专栏c#开发者

Windows 2008 is activated

Windows 2008 is activated 网上有很多类似的文章但式过好多次都没有成功;这次下载了一个新的vista sp1激活工具,总算成功了;分享...

38560
来自专栏刺客博客

PHP获取域名备案信息的API接口

1.2K50
来自专栏FreeBuf

Mquery:一款带有Web前端的YARA恶意软件查询加速器

搜索特定恶意软件样本很困难?不用怕,今天给大家介绍一款名叫Mquery的工具,它带有友好的Web前端界面,可帮助大家迅速寻找到自己想要的恶意软件样本。多亏了我们...

11430
来自专栏云计算教程系列

如何在CentOS 7上使用OTRS设置帮助台系统

OTRS是一个开源的票证请求系统。它为用户,客户,IT人员,IT服务和任何外部组织提供单点联系。该程序是用Perl编写的,支持各种数据库(MySQL,Postg...

1K40
来自专栏Python攻城狮

Django教程(一)- Django视图与网址1.简介2.环境搭建3.安装pycharm4.Ubuntu下 正确安装VMware Tools5.Django主要模块6.Django基本命令7. Dj

Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!

16320
来自专栏影子

Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)

470130

扫码关注云+社区

领取腾讯云代金券