学习京淘的意义
1 为什么选择电商项目作为java培优部分的重要项目
· 火(用户量广)
· 技术难点多,高(高并发,高可用)尤其是在中国
谷歌是全球并发最高的网站
· 学习成本低(无需精通业务部分)
2 学习完京淘项目对我们的就业有什么好处
· 代替1-2年工作经验
· 技术就业范围广,就业重心多(附录1-京淘项目的技术点)
电商架构
redis缓存
搜做+爬虫
· 高薪保证
3 如何学好京淘(建议和要求)
· 认真听讲
挑错字
· 当天内容当天消化
理论和代码,根据当天的问题,第二天早上第一节课会有知识回顾+遗留
问题;
· 利用好小组,集体资源,朋友的力量
· 预习的问题
当天结束后,我会告知第二天的技术点;可以根据这些技术点自行查看一些资料,带着目的看资料:
这是什么;在哪用;
京淘简介(过一下)
2017年12月4日
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
京淘架构
2018年1月10日
9:57
传统架构是如何开发一个项目
不分功能不分模块不分任务的全都放到一个工程完成
优点:结构简单,开发过程不需要考虑分布式的难题,不需要考虑jar包的
依赖管理;
缺点:高可用能力低,一旦某一个模块失效,整体失效,团队开发的配合那难度大
京淘如此庞大的一个电商系统能否单人独立开发完成?
一个大型项目需要众多的工程团队配合完成,或者小组,单个的人相互配合,由不同
的团队开发不同的模块
京淘中我们引入多个工程系统;分为两部分
1 业务系统(启动的这些系统):
前台系统(jt-web):访问首页;登录连接,注册连接,购物车连接,订单连接
后台系统(jt-manage):商品增删改查(web前端技术EasyUI KindEditor)
购物车系统:选择商品,数量,支付金额;
订单系统:从购物车发起的连接,生成订单,收货人信息,付款方式,商品内容
登录系统:权限管理,用户信息的获取;
2 支撑系统:
父工程:管理所有依赖的jar包(maven继承);本质就是准备好pom文件
工具工程:管理所有工程的公用工具类(maven依赖);代码
以上的每一个工程系统都是一个单独的maven工程
<问题>如何按团队分功能分模块开发呢?
一个大型项目,业务划分成多个子系统的过程就是所谓的拆分过程中的业务
纵向拆分
<同理>
每一个子业务系统当功能非常复杂,结构烦琐时,也很难由同一个团队或者小组
单独开发完成,引出二级拆分(横向拆分);本质就是三层架构的拆分工作
(持久层(pojo,mapper接口,mapper.xml),业务层(service),控制层(controller))
注意:parent和common是没有横向拆分的;主要负责提供资源
每一个横向拆分出来的部分也需要单独成立一个maven工程,但是本次版本的
京淘没有做横向拆分
如果进行拆分,以下图样貌展示
本次京淘以包的形式代替横向拆分中的子系统
京淘的整体布局结构
多个工程,根据项目的纵向拆分,分为不同功能的不同工程系统;
<问题>
一个业务系统manage,内部如何组成的后台系统
controller,service,mapper,pojo
对于支撑子系统(parent,common);只做资源的提供
解释业务系统需要具体的实时开发的代码问题;
对于某一个业务系统,三层架构包括:持久层,业务层,控制层;
可以从前向后的开发(页面分析-controller-service-mapper,pojo,mapper.xml),也可以从后向前(pojo,mapper--service--controller-页面解析)
京淘开发的环境基础
2018年1月10日
11:30
maven环境基础
1 配置eclipse和maven
eclipse的属性(preferences中)
2 maven仓库的设置
maven下的set.xml的53
maven工程的继承
情景分析
在一个庞大的项目中,由于业务拆分给了多个工程团队开发不同的模块,每个团队有管理自己开发工程的权利;
导致一个问题,每个工程都有不同的自己依赖的jar包;如果各自为政;
例如mybatis包,jar包有不同版本,后台系统需要;登录系统;购物车系统,订单系统
版本不一致导致,当系统间需要相互调用和交互的时候,有可能会造成代码冲突的bug;这种bug很致命,也很难处理;
所以我们引入maven工程的继承特点来完成父类工程的创建,将所有的jar包管理交给parent
搭建父类maven工程和普通maven工程区别只有一个pom文件中的类型
不是jar也不是war而是pom
准备数据库的数据
资源文件:设计--jt.sql
1 创建一个叫jtdb的数据库
2 右键数据库将sql文件导入
浏览文件选中jt.sql
点击导入完成
如果导入时候出现错误,是由于数据库版本导致的问题
解决办法删除你当前的mysql,重新安装我给的版本
预习内容
2018年1月10日
11:49
1 从pd中观察一下商品分类,商品列表,观察字段,主键,类型,和汇通比较一下
2 了解一下EASYUI
3 观察一下课程资料中的代码中
manage工程中的自工程jt-manage-web中的src文件夹下的resource文件中
的配置文件
4 观察代码中的parent里的pom文件
5 common工程中的工具类
回顾+遗留问题
2018年1月10日
22:35
知识回顾
京淘的架构
1 大型项目根据业务和功能模块交给不同团队开发--纵向拆分
拆成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包();工具类等
不同的开发团队下载对应的资源文件
在各自的环境中开发工程,最终将完成的任务以war包形式上传到SVN服务器上,或者setup或者update
当某一个版本的系统需要发布时,就把SVN上整合的一批war同时发布到不同的测试环境/生产环境/现场环境
创建父工程和工具工程
2018年1月12日
9:26
parent工程
maven工程的常用骨架quickstart和webapp
支撑的工程parent 和common都是使用quickstart
1 创建一个maven工程
2 选择qu
ickstart
3 命名
4 完成创建后修改3处
· java build path
· java complier
· workspace的encoding
回忆:
parent工程的作用是什么?
解决所有工程的jar包依赖
5 导入依赖的pom文件
资料位置:课前资料--常用配置文件--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工具类资源
资源位置:课前资料--基础框架--工具类--jt-common--src文件
里面的main文件夹直接全部copy到工具类工程
把main文件夹放到src下,点击yestoall
5 依赖父类
pom视图界面完成依赖的配置
后台工程
2018年1月12日
10:25
完成后台代码需要创建一个后台工程
1 创建maven工程(quickstart/webapp)
两个骨架的却别
一个是java工程
一个是web工程
在京淘中判断工程是否是web可以根据工程是否需要接收
前台请求来判断;有没有controller
例如:sso.jt.com;如果有请求地址:http://sso.jt.com/login
2 修改属性(4处)
多了一个project facets
3 继承parent同时依赖common
4 发布当前创建的工程
右键工程,点击-run--maven install进行发布
有可能碰到问题是提示ERROR
你没有使用jdk可以在使用jre
解决办法:需要修改eclipse绑定的jdk环境
商品分类
2018年1月12日
10:43
开发的功能是根据什么东西来完成的?
企业中是根据严格的需求说明书来进行开发的,京淘暂时没有那么严谨;
完成需求一:
展示商品分类的所有数据到浏览器
前台需要后台传递json格式的数据
数据来源--数据库--商品分类表
查看数据库设计
资料位置:设计--pdm文件
分类id:
数据库id类型的三种选择
· int(int):优点,性能高;缺点,会重复
· long(bigint):优点,性能高;缺点,会重复;
· 数据存储量比int大,在同样情况下考虑量的问题时使用long
· string(varchar):在分布式环境中,多个数据库产生的问题就是,分开的数据自增int或者long会产生重复,这时使用string类型(uuid);
电商中的数据库是分布式的吗?
对于电商系统;数据库不是分布式的,而是中央集中(大量的查询已经被缓存所替代--京淘中的缓存是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一个文件和文件目录结果过来;
资料位置:课前资料--基础框架--managewebresource--resources--
mybatis中的mapper.xml
mapper接口文件(ItemCatMapper)
需要继承通用mapper的使用,自定义SysMapper来
继承通用mapper的功能供后续mapper接口使用
通用mapper不支持批量删除,自定义SysMapper继承通用mapper后支持批量删除
创建一个mapper接口类,继承SysMapper即可
业务层(ItemCatService)
和以往的习惯不一样在于没有接口,直接实现类;
业务逻辑是什么?
查寻当前tb_item_cat中的所有数据;
List
需要继承一个父类的Service叫BaseService
自动注入了SysMapper同时封装了一些方法的调用
例如queryAll
引入BaseService
资料位置:课前资料--基础框架--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="表名"):把类和表对应
@Id:在主键属性上添加,对应表中的主键字段
@GeneratedValue(strategy=GenerationType.IDENTITY):对应自增字段
@Column(name="parent_id"):把剩下的属性一一与表中字段对应
解决第二个问题
SSM(SPRING+SPRINGMVC+MYBATIS)
资料位置:课前资料--基础框架--配置文件--managewebresources--mybatis
查看一下当中的配置信息
驼峰映射规则就是代替
JPA中Column注解的使用,这就是为什么column可以
省略
后期缓存有第三方技术redis
代替数据库二级缓存
//讲分页时候再说
//基于拦截器来实现,就是在查询时拦截查询语句,将sql进行整理拼接等操作
//包名与sysmapper不一致,需要修改
value="com.jt.common.mapper.SysMapper" />
资料位置:课前资料--基础框架--配置文件--resources-spring
applicationContext.xml
将文件拷贝到对应的目录中
查看当前的文件内容
//写代码过程中如果有字符串出现,为了解耦进行属性替换
//Property,this.getclass.getclassloader.getresource.getpath
//最后调用prop.getProperty进行解耦
class="com.jt.common.spring.exetend.ExtendedPropertyPlaceholderConfigurer">
//不同jvm实力的参数覆盖;
//以下三个配置文件可以删除,暂时用不到
需要将jdbc.properties和env.properties导入
资料位置:课前资料--基础框架--resources中找到
配置文件,copy到工程中的resources下
spring的实务管理文件
applicationContext-transaction.xml
资料位置:课前资料--基础框架--resources,copy到工程的spring文件夹下
查看内容
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">//必须和applciationContext中的连接池配置id一致
//
增删改查 insert--sava,delete,update
注意在service业务层的方法名称,新增不能使用insert
applicationContext-mybatis.xml与mybatis整合文件
copy到spring目录下
查看内容
//省略返回值的全路径名称
//扫描mapper的xml文件
springmvc的框架配置文件
//返回index,最终根据试图解析器访问的具体资源
/WEB-INF/views/index.jsp
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
//拦截器配置标签,manage暂时用不到
//新增商品时的图片上传类
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
三大框架整合完毕
启动maven工程需要
解决第三个问题
解决tomcat插件问题
在manage工程的pom文件里引入tomcat的插件文本
配置configuration的运行或者debug
添加其他所有工程文件到source中
代码修改之后,需要将manage工程重新发布
解决第四个问题
资料位置:课前资料--基础框架--静态资源--后台系统
将所有资料copy到manage工程的src下的main下webapp中,覆盖所有
另外如果想打印启动的日志详情,可以在工程文件中的src--main--resources添加日志properties
重新发布,执行maven工程,在浏览器中输入访问地址,查看返回数据
利用responseBody注解将返回对象转化成json字符串
从前台浏览器查看到一片字符串,是否是json,可以调用json查看软件
后台的页面访问
2018年1月12日
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
一个方法
当天问题
2018年1月12日
9:48
在导入pom文件内容时,如果出现问题,在problem中查看对应的报错内容,根据报错提示解决
有可能在problem中看到update project的提示
可以在show view中把problem选出来
这个问题是因为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 'itemCatService' 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
无法访问,但是根据断点测试发现,可以进入controller并且查询到的list正确,但是springmvc却自动拼接前缀后缀,导致响应无效
原因在于不处理的controller返回值,都会经过一个Spring**Converter
对所有的默认返回都拼接试图解析器的前后缀
自定义返回值时使用其他的converter
解决:在controller对应的方法中利用注解来完成
@ResponseBody