http://how2j.cn/k/tmall-j2ee/tmall-j2ee-894/894.html?p=66748
注册的时候用这个链接,谢谢啦!
92 * 0.8
前端指的是JS+CSS+HTML那一套,主要负责展示和交互。当然因为本人前端接触的很少,这只是我的一点看法。那你问我JSP是前端还是后端呢?JSP是前端和后端杂糅在一起的产物,因为JSP本质上就是HTML+Servlet的合体嘛。在MVC开发模式中,JSP主要用于显示数据,那么JSP在这个模式里的作用就是前端。
现在流行的开发模式是前后端分离,本来嘛,前端程序员干前端的事情,后端干后端的事情,术业有专攻。只要你们约定好接口,这样能大幅度的提高效率,也不至于相互扯皮。
那前台又是什么呢?于一个网站,分为普通用户和管理员。普通用户登录查看的就是前台,管理员操作的就是后台,他们之间只有业务或者说功能不同,但没有技术的差异。本质上都是一个网站,只不过对不同的权限的人开放了不同的功能罢了。
如果你用过WordPress之类的东西,就会更加明白这个区别。总而言之,前端与后端开发的主要区别在于技术栈,前台与后台的区别主要在于业务与功能。
首页是用来展示分类及部分商品信息的,前台需要显示的内容有:
这边只要看foreServlet中的home()方法和home文件下的jsp即可。
那么考虑一下,我们需要给前台传哪些数据呢?
假如你上了天猫,但是没有账号,那你能做什么或者说向做什么呢?
浏览主要分为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
Jsp:search.jsp与simpleSearch.jsp都可以理解为是一个输入空间,用于向后台提交关键字信息。searchPage.jsp包含文件productsBySearch.jsp。这个jsp中利用servlet中传来的域对象进行数据的展示,至于怎么展示就是前端的工作,不做介绍。
2 具体商品页
什么叫具体商品页呢?我们之前查询的结果都是一堆产品,可以理解为要么我们是通过cid(分类主键)获取商品s,要么是通过商品关键字来获取商品s。商品s表示获取到的数据通常为一堆商品。接下来,我们往往会点进去一个商品查看详细内容,这个就叫做具体商品页。
业务功能:展示具体的商品信息。
Servlet:foreServlet中的product()方法。将相关商品的属性,关联的图片,图片,商品属性等都传递到前端。
方法实现:获取一系列的前端想要展示出的数据,并通过域对象传到前端。
Jsp:主要用于商品展示,拿到数据后基本就是前端的工作了。
registerPage.jsp里通过form提交数据,通过register()方法进行处理,并添加到数据库中。唯一可说的就是——
name = HtmlUtils.htmlEscape(name);
将html标识符转义。具体内容可以看这个链接:https://www.xuebuyuan.com/2100005.html
登录和注册代码基本类似,区别是:注册是对数据库进行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的知识点拿出来。还是那句话,我现在的教程只针对后端,目前只需要了解后端需要给前端发什么数据,后端需要前端发来什么数据即可。
总流程分别是,加入购物车/直接购买,结算页面,订单页操作。这边主要都是对表的操作,代码不复杂,但是业务逻辑要搞清楚。
我并不准备按照站长的思路(按照购物顺序)来介绍,我认为,应该以Order和OrderIteam为核心进行分别介绍。
首先必须厘清,OrderItem到底是什么。OrderItem并不是Order中的元素,它表示了有可能要放入或者已经放入订单中的元素,在本文的业务场景中,可以认为,订单项不是在购物车中,就是在订单中。因为订单项只会由于增加购物车或者操作订单而产生。
因此,所有所有购物的流程都是先操作OrderItem,再操作Order的。
搞清楚这个基本逻辑之后,我们看看,购物的时候哪些是要对OrderItem进行操作的:
写这篇文章的时候,我才发现,后端程序servlet其实核心思想非常重要,那就是派发。你要很清楚,servlet写的那些方法,本质上都是controller层,是控制器,做的是派发的工作。
什么叫派发?
预告
下一章讲解后台业务逻辑,至于JSP讲不讲,看我有没有空学习JSP。