热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JT项目1

DAY01学习京淘的意义1为什么选择电商项目作为java培优部分的重要项目· 火(用户量广)· 技术难点多,高(高并发,高可用)尤其是在中国谷歌是全球并发最高的网站· 学习成本低(
DAY01

学习京淘的意义

1 为什么选择电商项目作为java培优部分的重要项目

· (用户量广)

· 技术难点多,高(高并发,高可用)尤其是在中国

谷歌是全球并发最高的网站

· 学习成本低(无需精通业务部分)

2 学习完京淘项目对我们的就业有什么好处

· 代替1-2年工作经验

· 技术就业范围广,就业重心多(附录1-京淘项目的技术点)

电商架构

redis缓存

搜做+爬虫

· 高薪保证

3 如何学好京淘(建议和要求)

· 认真听讲

挑错字

· 当天内容当天消化

理论和代码,根据当天的问题,第二天早上第一节课会有知识回顾+遗留

问题;

· 利用好小组,集体资源,朋友的力量

· 预习的问题

当天结束后,我会告知第二天的技术点;可以根据这些技术点自行查看一些资料,带着目的看资料:

这是什么;在哪用;

京淘简介(过一下)

2017124

10:08

电商行业特点

1 分布式

数十台服务器,甚至百台、千台、万台,包括:Nigix负载均衡集群、Tomcat集群、Redis缓存集群、RabbitMQ消息队列集群、MySQL主从、Solr全文检索集群等。

分布式集群

集群:从任务为单位的角度区分,集群属于单个实例完成单个任务,集中单例群体完成整体功能的过程

分布式:单个任务拆分成众多的子任务,单个实例完成其中之一,众多实例合作完成一个任务的过程;

2 高并发

要面对高并发用户,大流量访问。Google日均PV数35亿,日均IP访问数3亿。腾讯QQ最大在线人数4亿。淘宝2015年“双十一”,活动交易额975亿,2016年第一天交易额超过千亿,活动开始第一分钟独立访问用户达1000万。

3 高可用

系统7X24小时不间断运行。大型互联网网站宕机事件通常会成为新闻焦点。如2010年百度域名被黑客劫持导致不能访问,带来不可估量的经济损失。

4 海量数据

B KB MB GB TB PB YB EB ZB BB NB DB

存储、管理海量数据,需要使用大量服务器。facebook每周上传的照片数量近10亿,百度收录的网页数量数百亿,Google有近百万台服务器为全球用户提供服务。

京淘简介

京淘网上商城是一个综合性的B2C(Busines-to-custmer)平台,<预言>C2C类似京东商城、天猫商城。会员可以在商城浏览商品、添加商品到购物车、下订单,以及参加各种活动。商家可以入驻京淘商城,在该平台上开店出售自己的商品,并且得到京淘商城提供的可靠服务。管理员、运营人员可以在后台管理系统中管理商品、订单、会员等。客服人员可以在后台管理系统中处理用户的询问和投诉。

开发工具

Windows7/CentOS 6.5/VMworkstation10

Power Designer 15.6

Eclipse neon

JDK 1.7以上 必须。一些高级应用需要高版本支持1.8

Maven 3.5

Tomcat 7.0.59

Nginx 1.9.9

Redis 3.2.11

MySQL 5.5.27(注意5.0导入jt.sql会报错必须升级) + Amoeba 3.0.4

 

 

 

 

京淘架构

2018110

9:57

传统架构是如何开发一个项目

不分功能不分模块不分任务的全都放到一个工程完成

 《JT项目-1》

优点:结构简单,开发过程不需要考虑分布式的难题,不需要考虑jar包的

依赖管理;

缺点:高可用能力低,一旦某一个模块失效,整体失效,团队开发的配合那难度大

 

京淘如此庞大的一个电商系统能否单人独立开发完成?

一个大型项目需要众多的工程团队配合完成,或者小组,单个的人相互配合,由不同

的团队开发不同的模块

京淘中我们引入多个工程系统;分为两部分

1 业务系统(启动的这些系统):

前台系统(jt-web):访问首页;登录连接,注册连接,购物车连接,订单连接

后台系统(jt-manage):商品增删改查(web前端技术EasyUI KindEditor)

购物车系统:选择商品,数量,支付金额;

订单系统:从购物车发起的连接,生成订单,收货人信息,付款方式,商品内容

登录系统:权限管理,用户信息的获取;

2 支撑系统:

父工程:管理所有依赖的jar包(maven继承);本质就是准备好pom文件

工具工程:管理所有工程的公用工具类(maven依赖);代码

以上的每一个工程系统都是一个单独的maven工程

<问题>如何按团队分功能分模块开发呢?

一个大型项目,业务划分成多个子系统的过程就是所谓的拆分过程中的业务

纵向拆分

 《JT项目-1》

 

<同理>

每一个子业务系统当功能非常复杂,结构烦琐,也很难由同一个团队或者小组

单独开发完成,引出二级拆分(横向拆分);本质就是三层架构的拆分工作

(持久层(pojo,mapper接口,mapper.xml),业务层(service),控制层(controller))

注意:parent和common是没有横向拆分的;主要负责提供资源

每一个横向拆分出来的部分也需要单独成立一个maven工程,但是本次版本的

京淘没有做横向拆分

如果进行拆分,以下图样貌展示

 《JT项目-1》

本次京淘以包的形式代替横向拆分中的子系统

 

 《JT项目-1》

京淘的整体布局结构

多个工程,根据项目的纵向拆分,分为不同功能的不同工程系统;

 

<问题>

一个业务系统manage,内部如何组成的后台系统

controller,service,mapper,pojo

 

对于支撑子系统(parent,common);只做资源的提供

 

解释业务系统需要具体的实时开发的代码问题;

对于某一个业务系统,三层架构包括:持久层,业务层,控制层;

可以从前向后的开发(页面分析-controller-service-mapper,pojo,mapper.xml),也可以从后向前(pojo,mapper&#8211;service&#8211;controller-页面解析)

 《JT项目-1》

 

 

 

京淘开发的环境基础

2018110

11:30

maven环境基础

1 配置eclipse和maven

eclipse的属性(preferences中)

 

 《JT项目-1》

《JT项目-1》《JT项目-1》

 

 

 

2 maven仓库的设置

maven下的set.xml的53

 《JT项目-1》

 

maven工程的继承

情景分析

在一个庞大的项目中,由于业务拆分给了多个工程团队开发不同的模块,每个团队有管理自己开发工程的权利;

导致一个问题,每个工程都有不同的自己依赖的jar包;如果各自为政;

例如mybatis包,jar包有不同版本,后台系统需要;登录系统;购物车系统,订单系统

版本不一致导致,当系统间需要相互调用和交互的时候,有可能会造成代码冲突的bug;这种bug很致命,也很难处理;

 

所以我们引入maven工程的继承特点来完成父类工程的创建,将所有的jar包管理交给parent

 

搭建父类maven工程和普通maven工程区别只有一个pom文件中的类型

不是jar也不是war而是pom

 

 《JT项目-1》

准备数据库的数据

资源文件:设计&#8211;jt.sql

1 创建一个叫jtdb的数据库

 《JT项目-1》

2 右键数据库将sql文件导入

 《JT项目-1》

浏览文件选中jt.sql

 《JT项目-1》

点击导入完成

 《JT项目-1》

如果导入时候出现错误,是由于数据库版本导致的问题

解决办法删除你当前的mysql,重新安装我给的版本

 

 

 

 

预习内容

2018110

11:49

 

1 pd中观察一下商品分类,商品列表,观察字段,主键,类型,和汇通比较一下

2 了解一下EASYUI

3 观察一下课程资料中的代码中

manage工程中的自工程jt-manage-web中的src文件夹下的resource文件中

的配置文件

4 观察代码中的parent里的pom文件

5 common工程中的工具类

DAY02

回顾+遗留问题

2018110

22:35

知识回顾

京淘的架构

1 大型项目根据业务和功能模块交给不同团队开发&#8211;纵向拆分

拆成2部分子系统

支撑子系统:parent和common;

业务子系统:前台后台订单等

2 每一个业务子系统在京淘的开发中也要有三层架构

mybatis:原来做类与表的对应是在xml文件中

在京淘中使用JPA注解,无需在sql语句中写表字段和类属性的对应关系

通用mapper:单表增删改查.无需写sql

controller返回给页面jsp的数据原来使用model返回一个map对象,list对象,到页面用el表达式处理

京淘中使用json和jsonp

3 二级拆分,本质就是三层开发模式的拆分;

 

maven继承

和创建普通maven工程非常类似jt-parent

pom文件引入后,所有公共依赖的jar包就存在于parent这个工程中;pom文件中的类型不能jar或者war;

 

遗留问题:

1 更换了maven库后,创建maven工程提示骨架错误,

原因就是因为maven库中的文件有损坏;或者maven库的文件版本不支持你的操作环境;

解决办法:开网,删除对应的骨架文件,重新创建;

 

2 当一个项目被拆分多个模块时,在真实企业中是如何管理的?CVS SVN;

涉及到的问题就是:软件的资源管理和版本管理;

 

常见的管理这些内容的软件:CVS(早期),SVN(用的多);GIT(软件版本管理比较强)

资源包括:静态页面css,html,img;系统对接的接口文件;开发需求书;jar包();工具类等

 《JT项目-1》

不同的开发团队下载对应的资源文件

在各自的环境中开发工程,最终将完成的任务以war包形式上传到SVN服务器上,或者setup或者update

当某一个版本的系统需要发布时,就把SVN上整合的一批war同时发布到不同的测试环境/生产环境/现场环境

 

 

创建父工程和工具工程

2018112

9:26

parent工程

maven工程的常用骨架quickstart和webapp

支撑的工程parent 和common都是使用quickstart

1 创建一个maven工程
 

 《JT项目-1》

2 选择qu

 《JT项目-1》

ickstart

3 命名

 《JT项目-1》

4 完成创建后修改3处

· java build path

· java complier

· workspaceencoding

 

回忆:

parent工程的作用是什么?

解决所有工程的jar包依赖

5 导入依赖的pom文件

资料位置:课前资料&#8211;常用配置文件&#8211;parent-pom.xml

不要一次性copy文件进行覆盖;全部copy有可能导致mvven库加载文件失败

 

在创建环境时注意的问题:

1 所有路径不能有空格和中文,编译出现%

2 validation关掉;因为当前的京淘中没有新编写的配置文件或jsp文件

3 eclipse视图模式中的2个package explorer和navigator

前者展示工程结构,后者展示资源结构

 

搭建common工程

1 maven选择quickstart

2 命名

3修改3处

4 导入准备好的common工具类资源

资源位置:课前资料&#8211;基础框架&#8211;工具类&#8211;jt-common&#8211;src文件

里面的main文件夹直接全部copy到工具类工程

main文件夹放到src下,点击yestoall

 《JT项目-1》

5 依赖父类

pom视图界面完成依赖的配置

 

 《JT项目-1》

 

 《JT项目-1》

 

 

后台工程

2018112

10:25

完成后台代码需要创建一个后台工程

 

1 创建maven工程(quickstart/webapp)

两个骨架的却别

一个是java工程

一个是web工程

在京淘中判断工程是否是web可以根据工程是否需要接收

前台请求来判断;有没有controller

例如:sso.jt.com;如果有请求地址:http://sso.jt.com/login

 

 2 修改属性(4处)

多了一个project facets

 《JT项目-1》

3 继承parent同时依赖common

 

 《JT项目-1》

《JT项目-1》 

4 发布当前创建的工程

右键工程,点击-run&#8211;maven install进行发布

有可能碰到问题是提示ERROR

你没有使用jdk可以在使用jre

解决办法:需要修改eclipse绑定的jdk环境

 

 

商品分类

2018112

10:43

开发的功能是根据什么东西来完成的?

企业中是根据严格的需求说明书来进行开发的,京淘暂时没有那么严谨;

 

完成需求一:

展示商品分类的所有数据到浏览器

前台需要后台传递json格式的数据

数据来源&#8211;数据库&#8211;商品分类表

 

查看数据库设计

资料位置:设计&#8211;pdm文件

 《JT项目-1》

分类id:

数据库id类型的三种选择

· int(int):优点,性能高;缺点,会重复

· long(bigint):优点,性能高;缺点,会重复;

· 数据存储量比int大,在同样情况下考虑量的问题时使用long

· string(varchar):在分布式环境中,多个数据库产生的问题就是,分开的数据自增int或者long会产生重复,这时使用string类型(uuid);

电商中的数据库是分布式的吗?

对于电商系统;数据库不是分布式的,而是中央集中(大量的查询已经被缓存所替代&#8211;京淘中的缓存是redis)

父类id

体现层级关系的字段

名称

状态

1 正常 2 删除(伪删除)

排序号

京淘项目中没有用

电商项目中有非常多的类似的字段

热度,销量,人气

是否父类

与分类树展现相关;如果不是父类,说明是末尾分类

创建和修改时间

商品分类根据修改时间排序

 

开发代码的过程

1 pojo

2 mapper.xml

3 mapper接口

4 service结合controller

5 controller页面分析

页面分析三元素

· 请求地址

· 请求参数

· 返回类型

 

pojo(ItemCat)

插入:序列化的意义

将内存中的对象数据在存储到磁盘或者传输时根据序列化id区分

对象同时获取对象数据

继承BasePojo

具体代码见课下资料

 

mapper.xml(itemCatMapper.xml)

使用通用mapper可以帮助完成单表增删改查

查询item-cat的所有数据,属于单表查询,所以无需编写sql

语句,ItemCatMapper.xml留作框架扩展

copy一个文件和文件目录结果过来;

资料位置:课前资料&#8211;基础框架&#8211;managewebresource&#8211;resources&#8211;

mybatis中的mapper.xml

 《JT项目-1》

 

mapper接口文件(ItemCatMapper)

需要继承通用mapper的使用,自定义SysMapper来

继承通用mapper的功能供后续mapper接口使用

通用mapper不支持批量删除,自定义SysMapper继承通用mapper后支持批量删除

 《JT项目-1》

创建一个mapper接口类,继承SysMapper即可

 

业务层(ItemCatService)

和以往的习惯不一样在于没有接口,直接实现类;

业务逻辑是什么?

查寻当前tb_item_cat中的所有数据;

List

需要继承一个父类的Service叫BaseService

自动注入了SysMapper同时封装了一些方法的调用

例如queryAll

引入BaseService

资料位置:课前资料&#8211;基础框架&#8211;BaseService,将其拷贝到

common的service包中供后续众多service继承使用

 

控制层(ItemCatController)

没有页面分析,自定义访问路径,不是从网页发起的访问请求地址

/item/cat

 

存在的问题:

1 通用mapper怎么知道isParent对应表格字段是

is_parent

2 还缺少三大框架的配置文件;

3 没有运行tomcat插件;

4 缺少静态资源;css,js等

5 缺少web.xml

 

解决第一个问题

不在xml文件里写对应关系,利用JPA注解

java提供的一套持久层注解,利用这套注解,持久层框架

就可以直接读取其中对应的属性名称与表中字段关联;

@Table(name=&#8221;表名&#8221;):把类和表对应

@Id:在主键属性上添加,对应表中的主键字段

@GeneratedValue(strategy=GenerationType.IDENTITY):对应自增字段

@Column(name=&#8221;parent_id&#8221;):把剩下的属性一一与表中字段对应

 

解决第二个问题

SSM(SPRING+SPRINGMVC+MYBATIS)

MYBATIS

资料位置:课前资料&#8211;基础框架&#8211;配置文件&#8211;managewebresources&#8211;mybatis

 《JT项目-1》

查看一下当中的配置信息

驼峰映射规则就是代替

JPAColumn注解的使用,这就是为什么column可以

省略

后期缓存有第三方技术redis

代替数据库二级缓存

 

//讲分页时候再说

 

//基于拦截器来实现,就是在查询时拦截查询语句,将sql进行整理拼接等操作

//包名与sysmapper不一致,需要修改

value=&#8221;com.jt.common.mapper.SysMapper&#8221; />

 

Spring配置文件

资料位置:课前资料&#8211;基础框架&#8211;配置文件&#8211;resources-spring

applicationContext.xml

 《JT项目-1》

将文件拷贝到对应的目录中

查看当前的文件内容

//写代码过程中如果有字符串出现,为了解耦进行属性替换

//Property,this.getclass.getclassloader.getresource.getpath

//最后调用prop.getProperty进行解耦

class=&#8221;com.jt.common.spring.exetend.ExtendedPropertyPlaceholderConfigurer&#8221;>

//不同jvm实力的参数覆盖;

classpath:jdbc.properties

classpath:env.properties

//以下三个配置文件可以删除,暂时用不到

classpath:redis.properties

classpath:httpclient.properties

classpath:rabbitmq.properties

 

 

 

需要将jdbc.properties和env.properties导入

资料位置:课前资料&#8211;基础框架&#8211;resources中找到

配置文件,copy到工程中的resources下

 《JT项目-1》

 

spring的实务管理文件

applicationContext-transaction.xml

资料位置:课前资料&#8211;基础框架&#8211;resources,copy到工程的spring文件夹下

 《JT项目-1》

查看内容

class=&#8221;org.springframework.jdbc.datasource.DataSourceTransactionManager&#8221;>//必须和applciationContext中的连接池配置id一致

 

//

增删改查 insert&#8211;sava,delete,update

注意在service业务层的方法名称,新增不能使用insert

 

//扫描的包名称要根据不同的工程修改

 

applicationContext-mybatis.xml与mybatis整合文件

copy到spring目录下

查看内容

//省略返回值的全路径名称

//扫描mapper的xml文件

classpath:mybatis/mappers/*.xml&#8220;/>

 

 

springmvc的框架配置文件

 

 

//返回index,最终根据试图解析器访问的具体资源

/WEB-INF/views/index.jsp

&#8220;/WEB-INF/jsp/test.jsp&#8221; &#8211;>

class=&#8221;org.springframework.web.servlet.view.InternalResourceViewResolver&#8221;>

 

//拦截器配置标签,manage暂时用不到

 

//新增商品时的图片上传类

class=&#8221;org.springframework.web.multipart.commons.CommonsMultipartResolver&#8221;>

 

三大框架整合完毕

启动maven工程需要

解决第三个问题

解决tomcat插件问题

manage工程的pom文件里引入tomcat的插件文本

 《JT项目-1》

配置configuration的运行或者debug

 《JT项目-1》

添加其他所有工程文件到source中

 《JT项目-1》

代码修改之后,需要将manage工程重新发布

 

解决第四个问题

资料位置:课前资料&#8211;基础框架&#8211;静态资源&#8211;后台系统

将所有资料copy到manage工程的src下的main下webapp中,覆盖所有

 

 《JT项目-1》

另外如果想打印启动的日志详情,可以在工程文件中的src&#8211;main&#8211;resources添加日志properties

 《JT项目-1》

重新发布,执行maven工程,在浏览器中输入访问地址,查看返回数据

利用responseBody注解将返回对象转化成json字符串

从前台浏览器查看到一片字符串,是否是json,可以调用json查看软件

 

 

后台的页面访问

2018112

15:43

动态页面跳转分析

后台页面包括首页,新增商品,修改商品的页面;

想做页面的访问工作,就是利用springmvc做视图的跳转拼接

访问index.jsp 实际资源位置/WEB-INF/views/index.jsp

访问item-add.jsp; 实际资源位置/WEB-INF/views/item-add.jsp

 

页面跳转的逻辑

做一个controller

做一个方法负责跳转到index

返回值String “index”;

 

做另外一个方法负责跳转到item-add

返回值String “item-add”;

 

以上的习惯性的方法有缺陷,页面越多,代码越多,但是逻辑都一样

所以需要一种方法能够动态的跳转页面

获取不同的参数来判断跳转页面,

http://localhost:8081/page/index 访问首页

http://localhost:8081/page/item-add 访问新增商品页面

以上两个请求地址,有相似路径page之前的都一直,只有最后的一个拼接不一样,可以作为参数传递给controller,只要把参数作为返回值,就可以形成动态的访问效果

 

这个参数要怎么传递,怎么接受呢?

RestFul的传参引入过来

springmvc对restful支持,可以按照参数的逻辑进行接受,传递给controller 需要调用注解

@PathVariable

 

代码的编写逻辑

只需要一个controller

一个方法

 

 

 

 

 

 

当天问题

2018112

9:48

 

在导入pom文件内容时,如果出现问题,在problem中查看对应的报错内容,根据报错提示解决

有可能在problem中看到update project的提示

可以在show view中把problem选出来

 

 《JT项目-1》

 《JT项目-1》

 

这个问题是因为eclipse插件与maven的兼容

 

在创建完common并且继承了parent之后,还是有错误提示

需要你删除override注解

原因complier版本不一样

 

骨架问题

artifact missing

artifact相关问题,查看maven库是否修改;

找对提示的artifact删除,联网重新下载

 

在展示商品分类所有数据中出现如下异常

org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [com.jt.manage.service.ItemCatService] for bean with name &#8216;itemCatService&#8217; defined in file [C:\developertools\eclipsenew\workspace\jt-manage\target\classes\com\jt\manage\service\ItemCatService.class]: problem with class file or dependent class; nested exception is java.lang.NoClassDefFoundError: com/jt/common/service/BaseService

 

根据提示,BaseService无法加载,原因是common添加了BaseService后没有

重新发布,加载失败,需要重新发布common工程

 

访问路径http://localhost:8081/item/cat

 《JT项目-1》

无法访问,但是根据断点测试发现,可以进入controller并且查询到的list正确,但是springmvc却自动拼接前缀后缀,导致响应无效

 

原因在于不处理的controller返回值,都会经过一个Spring**Converter

对所有的默认返回都拼接试图解析器的前后缀

自定义返回值时使用其他的converter

解决:在controller对应的方法中利用注解来完成

@ResponseBody

 


推荐阅读
author-avatar
海峡整形美容医院少校
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有