电商开发爱好者 - zzj项目的回顾

1)不同的事务策略

A

注解式事务策略

B

配置式事务策略

2) 更底层的properties文件的导入(对于pyg,dao都是被service继承的,所以service会读取applicationContext-dao.xml文件,而applicationContext-dao.xml又包含了db / mybatis / mapper文件)

zzj的配置方法


pyg的配置方法

3)SqlSessionFactory以及mapper location的配置

pyg没有单独配置mapper.xml的位置,而是直接mapper扫描(com.samemart.mapper实际上是一个位置)

pyg

zzj单独给mapper.xml弄了一个地方

mapper.xml与mapper.java不同位置
配置了别名

4)mapper.xml文件的不同

A

pyg是自动生成的

same_content

B

zzj自己手写

same_content

5)Mybatis配置文件的不同

A pyg配置很简单

B zzj配置了通用mapper

分页助手是一样的

6)使用通用Mapper和不使用通用mapper的区别

几点区别:

A

如果使用easyUI, 提交的数据比如page, rows都是easyUI传过来,注入Mapper虽然是接口,但自动扫描以及实例化到了内存就可以直接注入了,接着可以使用@RequestParam注解接收参数了

实际上他们是同样的流程,从前端传数据,controller接到数据,只不过zzj用的是同步的,直接call相应的url, pyg的angular用的是异步ajax

(get是查询(向一个url发起请求),post是提交,get可以附带参数,直接可以被接收;post就是表格提交)

PageHelper的使用:

B
为什么要用Restful?(就是想decent)

Web Service就是用来查询数据库的。提供间接的方式让别的项目有查询数据库的可能性...


C

业务状态码 和 响应状态码 ...

D

何谓轻量级?

耦合比较少的,少继承的就是轻量级;

E

dubbo与Restful

controller调用service就别用Restful Remoting了,多此一举,性能还下降了(https://www.infoq.cn/article/2014/10/dubbox-open-source/?utm_source=infoq&utm_medium=popular_links_homepage#theCommentsSection);

支持 REST 风格远程调用(HTTP + JSON/XML)也使得 Dubbo 可以对当今特别流行的“微服务”架构提供基础性支持。

但比如minicart提供的接口还是可以是Restful的(这种情况下就是处理rest请求)

spring mvc既可以做好正常的web页面请求也可以同时处理rest请求。但总的来说这个restful服务是在展现层或者叫web层之类实现的;而jax-rs相对更适合纯粹的服务化应用,也就是传统Java EE中所说的中间层服务

而jax-rs相对更适合纯粹的服务化应用,也就是传统Java EE中所说的中间层服务

F

二进制序列化和文本序列化的区别(https://my.oschina.net/andot/blog/784235)

XML 和 JSON 是大家最常见的两种文本序列化格式。

Protocol Buffers,Msgpack,BSON,Hessian 等格式是二进制序列化格式的代表。

Hprose,PHP 序列化格式是半文本序列化的代表。


G

现在我们再来看看最流行的REST风格远程调用(文本序列化 + http协议)和dubbo RPC(二进制序列化 + tcp协议)之间怎么选?

首先要知道,凡是有JSON文本序列化的地方都可以用Restful,所以pyg可以做成两者的混合体;

其实Spring Cloud微服务是另外一种技术栈而已(就是http+json,内在的restful风格?);我会选择dubbo

其实在zzj的项目中已经讲得很清除了,如果不是web service不要勉强别人;项目与项目之间的调用可以是dubbo也可以是restful api

H

在pojo中添加JPA注解依赖:

对list的判断:null=list || list.isEmtpy()

set方法没用,只需要get方法,javaBean的技术特点:和方法名有关系,和属性名没关系:

因为方法名是我们的客户端需要的东西;返回的值都要以客户端为准;


insertSelective执行对应的sql语句的时候,只插入对应的name字段;(主键是自动添加的,默认插入为空)

这个字段是指你传入的字段,而不是表格里的字段;

保证刚插入时创建时间和更新时间是一个时间

a逻辑删除用update就行

b批量删除最后用in操作


点进来看看,这个是abel533提供的操作方法(通用mapper提供的方法,好像插入的id也可以得到...)

Mybatis 通用 Mapper 3.5.0 已发布。MyBatis 通用 Mapper 极其方便的使用 MyBatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询。通用 Mapper 可以极大的方便开发人员。


泛型注入:自动注入父接口的实现接口

eval:确定类型;

序列化以作为json数据传输...

angular的post提交是不是也有响应状态码?

jQuery有status:200, 400

7)商品提交和商品描述提交的区别

zzj的项目把商品和商品描述都同步到了表格form

a防止页面html注入(就是在html里加一段代码,比如id);

b这个item.getId()是肯定拿到了,因为前面的save了

POST请求也可以通过@RequestParam("desc")拿到

zzj是在controller里调用不同的service, 后来改成从service里调用service

controller里调用2个services

pyg是调用同一service,不同的mapper

同一service能保证事务一致性


不同mapper

zzj还可以做到在ItemService中调用ItemDescService... 在这2个事务中能保证一致行吗?能,后来的service会加入原来的事务

service里调用service,加入事务

service嵌套,加入事务


这个就是$.messager.alert()插件

通用mapper将item_id指定为id

8)

事务处理方式的不同;

我们的事务都是放在service,不管是pyg, 还是zzj

maven导入3原则:全部导入,在使用的最底层导入,运行时在web导入

9)

指定响应类型:文本类型的json数据

指定响应类型:文本类型的json数据

文本类型的json数据

10)

父子容器,子容器要在自己当前的配置文件找值,如果值在父容器是不行的,所以可以借助propertyService...

隐私原则:子容器能注入父容器,比如controller中能注入service(容器是谁开启的,监听器listener)

父子容器:父容器的参数不能访问子容器

11)

itemDesc也是查询出来的:

遇到技术瓶颈要从业务角度去考虑;

12)

接到返回参数后的几种处理:

下面这是update之后的处理

还有删除后的处理:提示删除成功,然后reload; 添加也是一样的;

编辑:应该打开一个窗口;

查询:直接给出一个查询结果就行;

13)

类目的规格参数:一个类目一个规格... 电视一个模板,洗衣机一个模板;

mongo: 每一行的数据由我本身的数据来决定;来决定有几个字段;

这个表也非常简单,就是类目id跟数据

模拟点击了一下:用click()事件;

click() 方法触发 click 事件,或规定当发生 click 事件时运行的函数。

clone() & append()

浏览器的内置对象:JSON.stringify,id通过val()获得,数据通过表单form获得:

拼接json, 怎么看懂?

push一个对象:

保存为json对象

把这个对象放到隐藏表单里,然后通过js得到

这里也是js提交到我们后台RESTful,而且保存的时候也是根据响应状态码作为回应(是不是很像PHP?)

14)

直接JDBC是无法加缓存的;

人家会直接让你注入service吗?还是你直接call别人的接口比较好;如果是dubbo当然注入service,或者访问dubbo所在的系统的API


i的类型不确定,所以泛型为?

15)

跨域的3个关键词:

浏览器限制

必须是ajax请求

script的src有跨域请求资源的能力,但是 但是 它拿到的东西都会当作js解析

script标签有跨域请求资源的能力

这里不是用jQuery jsonp来解决问题,而是靠script的src来解决问题的,这是因为后台返回的是json数据,这就是原始状态的jsonp

src只能解析js脚本

如果你使用isEmpty则空串不是空

16)

消息转换器:override 原来的消息转换器,并加上支持jsonp

前端还是采用JSONP的方式调用 #并不是直接访问

URL_Serv: "http://console.samemart.com:10081/rest/api/item/cat?callback=category.getDataService",

$.getJSONP(this.URL_Serv, category.getDataService)  #category.getDataService还有逻辑去执行

用户提交订单,请求先提交到我们前台系统的controller,再去访问订单系统的服务去提交订单;

这个是访问web service接口,都是通过发起get,post请求

直接访问web service接口拿到数据

通过dubbo不就是直接注入service吗? 通过dubbo协议调用dubbo发布的service实现类来达到自己的目的。后面一段不是通过get/post请求

dubbo自动完成序列化

17)

监听器启动Spring容器:

18)

提供接口哪些事

zzj这里即使用dubbo,它也只是用来代替httpclient,然后还是对外提供接口(dubbo不能对外提供接口,只能对外提供服务...),他说他师兄是汲取了JD的教训,只是对外提供API, 而不是让每个dubbo系统都去查询数据库(因为你用mapper那就是直接去查询数据库...)


zzj的做法:controller和service写在一起,interface和bean抽取出来供其它工程继承(其实把bean放到common,把interface和service写一起是一样的效果 );

zzj的做法

pyg的做法:controller和service分开写

两种不同的接口查询:

.html, 也是组件式开发的一部分:

这才是组件式开发:

看看人家success后的处理方式

*** 不仅是提供接口服务(通过controller),而且把服务注册到了zookeeper中(通过dubbo)

dubbo用的就是spring的容器,而不是单独自己使用一个容器;

19)

httpclient的两种方式:

一种自己写的,还有一种是封装的;

20)

我们在做一些项目的思路:

以下大广告必然是我们自然而然的思路:但可以改变下,如果我们把广告数据都看作是内容呢?这适应于每个页面的广告;

21)

save也可以返回整个对象:

22)

接收参数的两种方式:

A通过对象接收;

B通过参数一个一个接收;

下面这个,你怎么接收呢?cues, notes, summary

一个一个接收更安全,但你还是要去创建一个新对象去更新:

23)

我们开发的web service,也就是对外提供的接口(从这个项目中学到很多知识,但我们要扩展到更多知识)

下面这2个controller的代码是一样的,但如果你单独拉一个api的包也没关系:

24)

为什么我们要使用httpclient?

想象下面这个场景:jsp页面需要一组数据 - controller要model这组数据到jsp页面(这个不像jsp直接去访问接口,而是先把数据组装到了jsp页面) - controller怎么拿到这组数据??(通过httpclient发起http请求,去访问其它工程提供的接口)

为什么百度要放弃糯米,因为维持这项业务的开销也非常大;

25)

bean的封装示范:

26)

单例模式和多例模式(多例就是每次调用就会创建一个新对象),且多例把管理交给了调用地方法;

单例获取多例,只能通过getBean()的方式获得:每次都到容器中去获取新创建的httpclient对象

27)

通信协议 - 通信的规则(TCP/IP互联网协议),邮寄包裹规则 寻址啥的...

5G - 高速公路 (有可能5G以后不会用TCP/IP协议)

IPV4前几年,ip就已经分配完了;IPV6是128位的IP地址,所以很有扩展空间;

28)

你看,这个数据的封装还是挺难的:

反序列化成一个对象 JsonNode,

取其中的数组 ArrayNode,

遍历数组得到想要的对象

asText();
 

用内容替代smc中的内容...

29)

到目前为止,我们做个总结:2019-07-17

A

我们去访问别人的接口有4种方式:

a通过ajax call, 访问的是其它项目的controller,同b可以缓存username到redis

b通过httpclient去访问, 访问的是其它项目的controller,可以加缓存比如username, 可以缓存到redis

c通过dubbo访问别人注册到zookeeper的服务(依赖interface然后像注入本地的服务一样),访问的是其它项目的service,实际上还是走的mapper/db

d直接开放db的访问权限,让丫自己去玩(这里有过经验教训...)


B

angularJS能直接用RESTful api来访问吗?

angularJS的controller得到的数据应该是跟jQuery Ajax返回的数据一样,待验证

response应该是你在后台传过来的类对象, MyClass.result,在前端就是 response.result

C

组件式开发和获取数据以及返回数据

如果我们规范了获取数据和返回数据的方式,我们就能追求组件式开发;

增删改查有不同的返回数据,可以触发不同的组件去响应

比如自己的alert()或一些框架的alert()


D

log的接入,只需引入slf, 然后引入如下的方式,至于秒杀的那种(另外一种方式可以借鉴)

private static final Logger LOGGER = LoggerFactory.getLogger(CartMergeHandler.class);

if(LOGGER.isInfoEnabled()) { LOGGER.info("Received message:{}", msg); }


E

几个关键知识:

a)注入Mapper虽然是接口,但自动扫描以及实例化到了内存就可以直接注入了;

b)httpclient必须是多例,但怎么用单例对接多例?通过配置bean的方式;

c)安装字面意思理解,get就是查询,post是提交,跟带不带参数怎么带参数没多大关系,post也可以在url带参数;

d)webservice就是间接获取查数据库的能力,如果不能直接用其它项目的数据库,那只能用别人的web service

e)何谓轻量级?

f)什么时候改接收对象,什么时候改一个一个接收?

g)数据封装的技能?大技能...

h)监听器启动spring容器

i)Maven导入3原则

j)父子容器:父容器的参数不能访问子容器

k)返回结果与组件式开发的结合

l)根据返回结果得出反应跟PHP如出一辙

m)isEmpty和isBlank的区别

n)//getInstance()是单例方式,new Object()是多例,每部分调用都是一个新的对象

o)一个Page, 一个PageInfo


F

能用搜索引擎解决的问题,都不是问题;

用于保存向前,哪怕有阻碍,哪怕有解决不了的问题(可以先跳过去)


30)

我知道购物车我们也能倒腾出来,order的展示也是一样的;

order, orderItem里面的2个表都要展示出来:

以orderId为连接

我需要这样一个对象,以username为基准查询,然后根据orderId去查询orderItem

order的生成规则是:一个卖家一个orderId,方便投递...

以下这个将是模板:

entity.order和entity.orderItem,虽然一个customer有很多order

我们可以改成entity.order in entity.orderList                      order和order.orderItemList,只是包裹在外面的还是一层循环

可以单独创建一个方法查询orderItem, queryOrderItemByOrderId(orderId)

我们需要一个对象来接收这一切,这就是我们说的面向对象

你可能感兴趣的:(电商开发爱好者 - zzj项目的回顾)