JavaWeb项目详解系列2-4(基于How2j天猫J2EE项目:前台业务逻辑)

0 项目来源与阅读建议

项目来源

http://how2j.cn/k/tmall-j2ee/tmall-j2ee-894/894.html?p=66748
注册的时候用这个链接,谢谢啦!

价格

92 * 0.8

阅读建议

  1. 本教程与站长的官方教程互为补充,并不是取而代之,也做不到取而代之。站长是以老师的身份告诉你怎么写,我是以课代表的身份告诉你,我是怎么学的。
  2. 本教程应当在你做完站长相对应部分的内容之后,再来看。也就是说,在看本教程之前,你应当对站长对应章节的内容有了一定的了解和基础,不然某些词语你可能听不懂。
  3. 我在How2j的ID名叫HuangTY,我喜欢分享大家存在的问题,所以也希望大家能够在评论区多多留言,共同进步。

1概念厘清:前台与前端

前端指的是JS+CSS+HTML那一套,主要负责展示和交互。当然因为本人前端接触的很少,这只是我的一点看法。那你问我JSP是前端还是后端呢?JSP是前端和后端杂糅在一起的产物,因为JSP本质上就是HTML+Servlet的合体嘛。在MVC开发模式中,JSP主要用于显示数据,那么JSP在这个模式里的作用就是前端。
现在流行的开发模式是前后端分离,本来嘛,前端程序员干前端的事情,后端干后端的事情,术业有专攻。只要你们约定好接口,这样能大幅度的提高效率,也不至于相互扯皮。
那前台又是什么呢?于一个网站,分为普通用户和管理员。普通用户登录查看的就是前台,管理员操作的就是后台,他们之间只有业务或者说功能不同,但没有技术的差异。本质上都是一个网站,只不过对不同的权限的人开放了不同的功能罢了。
如果你用过WordPress之类的东西,就会更加明白这个区别。总而言之,前端与后端开发的主要区别在于技术栈,前台与后台的区别主要在于业务与功能。

2首页

首页是用来展示分类及部分商品信息的,前台需要显示的内容有:

  1. 商品分类。
  2. 商品分类中的部分属性展示。
  3. 图片轮播。
  4. 分类中的部分产品展示。
    前台功能均不涉及分页。

这边只要看foreServlet中的home()方法和home文件下的jsp即可。
那么考虑一下,我们需要给前台传哪些数据呢?

  1. foreServlet中的home()方法中,将Category对象:cs,传给了categoryAndcarouse.jsp。前端有了cs就可以遍历获取名称并显示,可以在超链接标签中写超链接。
  2. homepageCategoryProducts.jsp用于显示首页下半部分各个分类汇总的商品介绍及缩略图,仍然接收Category对象cs。还记得Bean中Category类中存在list<Product>对象吗?cs.products即可获得当前cs下的商品,然后你就可以把它们显示出来了。
  3. productsAsideCategorys.jsp用于当你鼠标滑过左侧分类信息之后,会在右侧显示一些相关信息,这些相关信息并不是分类的属性,而是cs的productbyRow这个list中product的subtitle。简单而言,只要你穿了category对象cs到前台,并且这个cs是使用过fill()方法的,那么就可以实现上述功能。
    其它:
    carousel.jsp:前端知识,显示静态资源。

3无需登录的前台操作

假如你上了天猫,但是没有账号,那你能做什么或者说向做什么呢?

  1. 浏览。包括看看分类,看看具体商品,随便点击看看有哪些东西。
  2. 注册。万一觉得这个网站还不错,就要注册一个账号,便于以后剁手。
  3. 登录。注册完了总得登录吧。而且当然,在你做登录这个操作的时候,你一定是还没登陆的。嘿,这不是废话吗。
    那么我们就一个一个来说

3.1浏览

浏览主要分为1.看商品整合页,2.看具体商品页
1. 商品整合页
什么叫商品整合页呢?首页就是最明显的,是把不同的产品展示出来。还有当你搜索某个关键词的时候,出来的也是商品整合页。或者当你电机某个分类的时候,出现的也是商品整合页。

1.1 分类页
业务功能:点击首页左边栏分类栏中的某个具体名录,可以展示出选中分类下具体商品。
Servlet:foreServlet中的category()方法。
方法实现:选中的分类主键为cid,在product表中查询所有外键cid与之相等的,并显示出来。采用重写比较器的方式实现排序。注意,这里也体现了两种排序方式的区别(一种:继承Comparable,另一种实现Comparator)。继承因为是单继承,因此排序只能进行单一排序,但是实现接口的方式可以实现多个比较器,从而达到利用多个比较器比较的效果,这是设计模式中的策略设计模式。
Jsp:为了实现业务功能,前端必须要告诉后端cid是什么,这个操作是通过点击分类标签所引发的超链接传递参数的。为了实现比较功能,前端必须告诉后端以什么样的形式排序,这是通过sortBar.jsp实现的,点击对应的排序标签就发送对应参数到servlet中。productsByCategory.jsp中主要用来展示商品信息,这里不再赘述。

1.2 搜索页
业务功能:在搜索栏中输入关键词,可以显示出包含该关键词的对应商品。
Servlet:foreServlet中的search()方法。在product表中利用sql语句中的like进行模糊查询,查询的标准是搜索的关键词中包含于产品的名称中。
方法实现:查询出的所有product放于List容器中,通过域对象传参到前端。这个List<Product>需要设置评论数以及销量,因为前端需要展示这些数据。
Jsp:search.jsp与simpleSearch.jsp都可以理解为是一个输入空间,用于向后台提交关键字信息。searchPage.jsp包含文件productsBySearch.jsp。这个jsp中利用servlet中传来的域对象进行数据的展示,至于怎么展示就是前端的工作,不做介绍。

2 具体商品页
什么叫具体商品页呢?我们之前查询的结果都是一堆产品,可以理解为要么我们是通过cid(分类主键)获取商品s,要么是通过商品关键字来获取商品s。商品s表示获取到的数据通常为一堆商品。接下来,我们往往会点进去一个商品查看详细内容,这个就叫做具体商品页。
业务功能:展示具体的商品信息。
Servlet:foreServlet中的product()方法。将相关商品的属性,关联的图片,图片,商品属性等都传递到前端。
方法实现:获取一系列的前端想要展示出的数据,并通过域对象传到前端。
Jsp:主要用于商品展示,拿到数据后基本就是前端的工作了。

3.2注册

registerPage.jsp里通过form提交数据,通过register()方法进行处理,并添加到数据库中。唯一可说的就是——

name = HtmlUtils.htmlEscape(name);

将html标识符转义。具体内容可以看这个链接:https://www.xuebuyuan.com/2100005.html

3.3登录

登录和注册代码基本类似,区别是:注册是对数据库进行add操作,登录是对数据库进行select操作。
登出:只要把域对象中的user删除即可。在其他用到user的地方都要做为空判断,如果不存在user这个域对象,那么就说明没有没有登录,逻辑就那么简单直接。
servlet中对应的方法分别是login(),logout()。
值得一提的在模态登录中,前端采用了Ajax的技术与后台进行异步通信。
业务功能:在具体商品页面,点击购买或加入购物车。
Servlet:在imgAndInfo.jsp中当点击加入购物车或者立即购买时,采用ajax方式调用servlet中的checkLogin()方法,如果返回值不是success则打开模态登录。
方法实现:checkLogin()负责返回success或者fail。但是问题来了,我们明明看到返回值是“%success”,但是前端里的判断却是“result==success”,请问那个%去哪里了呢?在BaseForeServlet中我们写过如下的代码——

else if(redirect.startsWith("%"))
    response.getWriter().print(redirect.substring(1));

这边给你的启示就是,前端ajax获得的result并不是从域对象中获取,而是从response中后获取。所以异步通讯,简单理解就是当你点下立即购买的按键之后,启动了一个小线程,这个小线程发送了1个request进了servlet中,调用了checkLogin()方法,此时返回值为“%success”,然后response向浏览器写数据的时候用了substring(1)。因此变成了success。
至于登录的方法为loginAjax()非常简单,不在赘述。
Jsp:modal.jsp与imgAndInfo.jsp中都运用到了前端的不少知识,但是你只要知道我上述说的ajax内容就好。如果之后有时间,我再单独把前端及JSP的知识点拿出来。还是那句话,我现在的教程只针对后端,目前只需要了解后端需要给前端发什么数据,后端需要前端发来什么数据即可。

4需要登录的前台操作

总流程分别是,加入购物车/直接购买,结算页面,订单页操作。这边主要都是对表的操作,代码不复杂,但是业务逻辑要搞清楚。
在这里插入图片描述
我并不准备按照站长的思路(按照购物顺序)来介绍,我认为,应该以Order和OrderIteam为核心进行分别介绍。

4.1针对OrderItem的操作

首先必须厘清,OrderItem到底是什么。OrderItem并不是Order中的元素,它表示了有可能要放入或者已经放入订单中的元素,在本文的业务场景中,可以认为,订单项不是在购物车中,就是在订单中。因为订单项只会由于增加购物车或者操作订单而产生。
因此,所有所有购物的流程都是先操作OrderItem,再操作Order的
搞清楚这个基本逻辑之后,我们看看,购物的时候哪些是要对OrderItem进行操作的:

  1. 直接购买
    对应方法:buyone()。订单项的基本信息包括商品,用户,数量。这里的操作相当于添加了一个OrderItem记录,这个记录就好比说是吃火锅前准备的菜,下不下锅还不一定(是否成为Order还不一定)。
    这个是跳转到buy()方法中继续处理的。
  2. 加入购物车
    对应方法:addCart()。和buyone()类似,但是我自己做了个业务上的区别,我认为直接下单的行为并不需要考虑购物车中有没有同类商品,添加购物车的时候需要考虑。
    业务逻辑:这里的业务逻辑是核对当前用户购物车内有没有相同的产品,有的话就增加数量即可,没有的话就新增一个订单项记录。换而言之,存在相同商品则update,不存在则add。
    这个是response一个success,说明已经添加成功。为什么不跳转到其他的页面呢?你想想看你在天猫的购物场景,加入购物车之后,自己还在当前界面。
  3. 查看购物车
    对应方法:cart()。这个方法其实就是对OrderItem表进行查询操作,查询的条件是用户为当前用户。
  4. 操作购物车
    对应方法:changeOrderItem()和deleteOrderItem()。就是对OrderItem的改和删操作。这两个操作都要先判断用户是否登陆。其实我也不太明白这边为什么要判断,感觉按照业务逻辑,能到这里一定是登陆的用户。然后利用DAO的方法对相应的订单项进行修改或删除即可。
  5. 购买
    对应方法:buy()。这个方法无论针对购物车的下单行为还是针对1.直接购买的下单行为,都可以。这是因为如果前端用户是直接下单行为,那么传递来的参数就是一个oiid,如果是在购物车页面合并下单,那传递来的参数就是多个oiid。
    将这些oiid对应的OrderItem放置到一个List中,作为域对象发送到前端。当然,传过去的数据还要包括购物总金额之类前端需要显示的数据。跳转到buy.jsp,所展示的就是订单项和总价格,需要输入的就是一些订单的基本信息。
    从buy.jsp,就开始了从OrderItem到Order的华丽转身。

4.2针对Order的操作

  1. 创建订单。
    对应方法:createOrder()。将List<OrderItem>放入订单对象Order中,并且对表进行操作,从前端buy.jsp中获取对应的表单数据,通过set方法完善Order对象,并添加至数据库中。
    返回值为forealipay界面,跳转到支付界面。
  2. 支付完毕。
    对应方法:payed()。支付完毕会显示一个已经成功支付的页面,payed.jsp。我们需要传递给前端一些参数以供显示,除此之外,也是在这个函数里通过set方法设置了订单的付款时间以及订单状态。
    说到这个订单的标记信息,其实就是一堆枚举值,用来维护订单的状态值,比如说1代表未下单,2代表已发货等等。
  3. 查看订单。
    对应方法:bought()。Order表的查询方法,查询所有状态不为delete的。站长表示,订单是用户的重要信息,因此通常不删除记录,而是标记为删除,这个查询就是查询所有未标记为删除的订单。交给前台展示。
  4. 确认付款与确认订单。
    对应方法:confirmPay()。没什么好说的,前台要展示你确认收货了什么东西,因此要给一些域对象数据。
  5. 删除订单。OrderDAO的update(),如上文所说,把状态值改为delete即可。

4.3评价

  1. 跳转到评价页面。
    对应方法:review()。这个方法并不是让你写评价,而是为了在写评价的页面上展示一些东西。比如展示你买的是什么,花了多少钱,订单里面有哪些订单项,已经别人已经写得评价和评价数量。
  2. 在评价页面提交评价。
    对应方法:doreview()。提交评价后,要对数据库进行操作。

5小结(重要)与预告

写这篇文章的时候,我才发现,后端程序servlet其实核心思想非常重要,那就是派发。你要很清楚,servlet写的那些方法,本质上都是controller层,是控制器,做的是派发的工作。
什么叫派发?

  1. 前端需要显示的数据,后端需要通过servlet中service方法调用对应方法,在这个方法里调用Model层的东西(DAO或实体类),获取数据后,交给前端。从数据库的角度来说,这叫查询。从后端的角度来说,这叫写出。
  2. 前端需要提交的数据,后端一样的,获取数据并放入数据库。从数据库的角度来说,这是增删改。从后端的角度来说,这叫写入。
    这是从MVC整体框架的角度,高屋建瓴的看到这里的所有业务逻辑。
    或许有的业务逻辑只有1,就是显示,比如说上面分析过的不需要登录的功能,基本都是显示,因此只要从数据库里读,把数据写入域对象,前台把域对象拿出来即可,这种需求通常返回值为xxx.jsp。
    有的业务只有2,比如说添加购物车就是比较典型的,添加完之后,仍然停留在当前界面,不需要跳转到别的页面显示,这种一般返回值为%,表示不需要做跳转。
    有的业务既有2又有1,对数据库做完操作后,要跳转到另一个界面做显示。那在做2的方法返回值通常为一个servlet方法,而这个servlet方法中做的是1的操作,然后返回一个xxx.jsp。
    只有理解了我上面说的这些,我认为才真正从俯视图上了解了MVC,了解了servlet+jsp+Bean+DAO架构,以后自己写业务代码的时候才能做到知其所以然。

预告
下一章讲解后台业务逻辑,至于JSP讲不讲,看我有没有空学习JSP。

猜你喜欢

转载自blog.csdn.net/w8253497062015/article/details/85644287