本项目Gitee地址:https://gitee.com/bobokaka/pinyougou
项目依赖资料gitee地址:https://gitee.com/bobokaka/pinyougou-data
1.0 IT行业发展
近年来,IT行业发展趋向互联网化,传统项目(比如桌面应用)目前也就国企等单位有此需求。
互联网化趋向于视频、直播、金融、保险、医疗、房地产等等。
2.0 互联网特点
- 高并发访问(访问量大)
- 大数据量
3.0 互联网项目开发架构
- 前端页面必须美观、大气、上档次。
- 系统必须具有流畅的运行效果——必须对项目进行一系列优化。
- (1) 数据层优化
- 1> 数据库集群(主备,读写分离),分表、分库存储(大数据:500w'条即换表),开启索引、缓存,数据库设计优化,sql语句优化。
- 2> 缓存优化(把频繁读取数据,放入缓存,减轻数据库压力)
- 3> 搜索优化(使用专业的搜索工具进行搜索:solr等)
- (2) 项目层优化
- 1> 必须使用集群
- 2> 必须使用分布式
- 3> JVM:tomcat服务器优化
- (3) 应用层优化
- 1> 页面缓存
- 2> 页面静态化
- 3> nginx负载均衡(用来分发请求)
- 4> F5负载均衡
主备 nginx负载均衡:实现高可用。
image.png
4.0 b2bc类型电商项目——品优购。
- 把传统的项目拆分成面向服务分布式架构:SOA
- ssm框架分布式项目搭建
- 分布式项目测试通过
- 前端开发组件——angularJS——重前端轻后端——使运行速度更快
- 商品列表查询、添加、更新
- 商品相关的业务
- 首页广告内容加载——redis缓存
- 搜索——solr搜索
- 同步索引库(activeMQ消息中间件)
- 商品详情页静态化
- 发短信登录
- 单点登录(查收,spring security)
- 购物车
- 订单
- 微信支付
- 集群上线部署(zookeeper集群、redis集群、项目集群、solr集群、acitive集群、nginx集群)
- 集群
- docker容器部署
品优购是一个B2B2C平台,即有商家对商家,也有商家对个人。
采用商家入驻模式,商家入驻平台提交申请,平台进行资质审核、审核通过后,商家拥有独立的管理后台录入商品信息,商品经过平台审核后即可通过。
品优购网上商城主要分为网站前台、运营商后台、商家管理后台三个子系统。
4.1 网站前台
主要包括网站首页、商家首页、商品详细页、、搜索页、会员中心、订单与支付相关页面、
秒杀频道等。
image.png
4.2 运营商后台
是运营商的运营人员的管理后台。 主要包括商家审核、品牌管理、规格管理、模板管理、
商品分类管理、商品审核、广告类型管理、广告管理、订单查询、商家结算等。
image.png
4.3 商家管理后台
入驻的商家进行管理的后台,主要功能是对商品的管理以及订单查询统计、资金结算等功能。
image.png
5.0 系统架构
5.1 什么是SOA架构
SOA是service-Oriented Architecture的首字母简称,面向服务分布式架构。支持面向服务的框架样式。
5.2 什么叫面向服务
service就是服务,web就是服务消费者,web层面向service,即面向服务架构。
5.3 为什么使用SOA架构?
解决并发压力,大数据场景。
能够解决:
- 分担服务器压力
- 提高项目并发能力
- 提高访问速度
传统项目框架:
只有一个war包,所有业务集中一个项目中进行开发。
并发量:(5+-)
初步分布式部署:
- 项目和数据库进行拆分分布式
- 项目开发采用mvc框架开发
- 项目采用分层开发
并发量:(500+-)
缺点:
image.png
- 容错性差(不具有高可用性)
- 并发量不能满足互联网需求
所以,采用集群分布式部署。
集群方式部署:
- 项目采用集群部署
- 数据库采用集群部署
优点:
- 容错能力提高(具有高可用性)
- 并发能力提升
缺点:
image.png
- 并发能力不能满足需求(10w?)
- 请求分发问题。分发给哪个服务器
- seession如何共享?
- (1) tomcat集群session复制功能,把用户的身份信息直接广播给每一个集群服务器。——用户太多,无法实现
- (2) 第三方服务器,存储session
使用redis服务器存储用户身份信息。
6.0 实现SOA
6.1 思路
1. 把service拆分成一个单独的项目(war)
2. 把web拆分成一个单独项目(war)
web和service是远程调用关系,这个架构叫做面向服务架构。
6.2 实现远程调用技术
- webservice
- dubbox(dubbo)——轻量级的服务治理框架
- spring cloud——重量级服务治理框架
6.3 采用webservice实现面向服务分布式架构
优点:
- 并发能力提升(10w+-)
- 分布式项目采用集群部署(高可用性)
缺点:
- 网络抖动
- 进程繁忙
以上2种情况都会导致项目性能下降。
解决方案:
- 提升带宽(钱钱钱)
- 使用dubbox框架
6.4 使用dubbox进行面向服务分布式架构拆分
表现层:web项目(war)
dubbox服务治理中间件
- rpc 远程调用hessain2 二进制序列化
- nio 异步通讯 netty
服务层:service项目(war)
zookeep:第三方服务器,注册中心,存储对象。
7.0 数据库环境准备
下面开始项目的搭建。
项目搭建可分为3个步骤:
- 数据库环境
- 开发搭建zookeeper注册中心
- 搭建项目结构
表名称 | 含义 |
---|---|
tb_brand | 品牌 |
tb_specification | 规格 |
tb_specification_option | 规格选项 |
tb_type_template | 类型模板:用于关联品牌和规格 |
tb_item_cat | 商品分类 |
tb_seller | 商家 |
tb_goods | 商品 |
tb_goods_desc | 商品详情 |
tb_item | 商品明细 |
tb_content | 内容(广告) |
tb_content_category | 内容(广告)类型 |
tb_user | 用户 |
tb_order | 订单 |
tb_order_item | 订单明细 |
tb_pay_log | 支付日志 |
首先是数据库环境的准备。
image.png image.png
品优购采用当前流行的前后端编程架构。
后端框架采用 Spring +SpringMVC+mybatis +Dubbox。前端采用 angularJS + Bootstrap。
8.0 zokepper安装
8.1 下载zookeeper
可参考如下链接:
Zookeeper本地安装配置(入门)https://blog.csdn.net/nangu0673/article/details/82587014
首先,下载一个zookeeper。
现在服务器大都是linux系统,配置安装教程如下:
zookeeper安装文档.docx
8.2 修改配置文件
解压后,进入目录中的conf目录,有一个zoo_sample.cfg文件,将其重命名为zoo.cfg,然后打开,在最后添加
dataDir=D:/acm/zookeeper-3.4.5/data
dataDirLog=D:/acm/zookeeper-3.4.5/log
完整的zoo.cfg文件配置:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:/acm/zookeeper-3.4.5
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
dataDir=D:/acm/zookeeper-3.4.5/data
dataDirLog=D:/acm/zookeeper-3.4.5/log
将解压后的文件放到想要放的位置
image.png
8.3 启动zookeeper
进入bin目录双击zkServer.cmd即可开启zookeeper本地服务,当出现如图所示信息时,表示服务开启成功。
image.png
8.4 配置环境变量
新建系统变量变量名ZOOKEEPER_HOME,变量值D:/acm/zookeeper-3.4.5 【zooleeper安装/解压路径】
在path环境变量中添加 %ZOOKEEPER_HOME%\bin 以及 %ZOOKEEPER_HOME\conf
win+R输入cmd进入命令行窗口,输入zkServer回车,信息如图所示即为配置成功。
image.png
到此,配置完成。
9.0 项目结构
image.png10.0 新建maven项目
10.1 设置eclipse后面的new菜单
建议参考如下设置:
image.png
image.png
image.png
image.png
image.png
image.png
最后的效果:
image.png
10.2 新建pyg-parent
父项目
新建一个maven project。
本项目所有maven项目创建都跳过框架模板。
image.png image.png image.png
这里我之前创建了一个项目pyg-html-utils ,后期会创建。此处可以忽略。
10.3 创建pyg-common
项目
因为和pyg-parent
父项目是继承而不是聚合,使用应该创建一个maven project,如果是聚合关系,就创建maven Module项目。
image.png
image.png
10.4 同样的步骤创建项目pyg-pojo
项目、pyg-dao
项目
image.png
到此,3个公共工程创建完毕。
10.5 创建后台聚合父工程
image.png10.6 创建聚合后台的其他工程项目
image.pngimage.png
image.png
image.png
同理,创建后台服务工程项目
image.png
image.png
image.png
到此,服务层搞定。
10.6 表现层
表现层(web层)调用服务层。
我们用两个表现层项目,一个是商家,一个是运营商。
new一个maven project,创建运营商表现层工程。。
image.png
同理,创建商家表现层工程。
image.png
至此,项目结构为(忽略pyg-html-utils):
image.png
11.0 完善pom.xml
在大型项目中,这一般由产品经理或者项目架构师完成,所以作为一般开发人员只需要复制粘贴即可。
11.1 父项目pyg-parent的pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<!-- 顶级父工程,不是用来提供坐标依赖的,仅仅是一个规范,一个模板
dependencyManagement标签:管理坐标,不提供依赖
作用主要是:锁定坐标的版本、锁定编译环境
公司里面有一套规范,需要按规范来,不要随便更改
其他项目需要什么坐标,从中拷贝什么坐标-->
<!-- 集中定义依赖版本号 -->
<properties>
<junit.version>4.1</junit.version>
<spring.version>4.2.4.RELEASE</spring.version>
<pagehelper.version>4.0.0</pagehelper.version>
<servlet-api.version>2.5</servlet-api.version>
<dubbo.version>2.8.4</dubbo.version>
<zookeeper.version>3.4.7</zookeeper.version>
<zkclient.version>0.1</zkclient.version>
<mybatis.version>3.2.8</mybatis.version>
<mybatis.spring.version>1.2.2</mybatis.spring.version>
<mybatis.paginator.version>1.2.15</mybatis.paginator.version>
<mysql.version>5.1.48</mysql.version>
<druid.version>1.0.9</druid.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<freemarker.version>2.3.23</freemarker.version>
<activemq.version>5.11.2</activemq.version>
<security.version>3.2.3.RELEASE</security.version>
<solrj.version>4.10.3</solrj.version>
<ik.version>2012_u6</ik.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>${mybatis.paginator.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.csource.fastdfs</groupId>
<artifactId>fastdfs</artifactId>
<version>1.2</version>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!-- 缓存 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
</dependency>
<!-- 身份验证 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-cas</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.3.3</version>
<!-- 排除log4j包冲突 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<dependency>
<!-- ik分词器 -->
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>${ik.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.4.01</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
11.2 工具类pyg-common的pom文件配置
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!-- 删掉下面自动创建的两个标签,因为父工程中已经有了 -->
<!-- <groupId>com.pinyougou</groupId> -->
<artifactId>pyg-common</artifactId>
<!-- <version>0.0.1-SNAPSHOT</version> -->
<!-- 工具类工程: 1. 抽取公共坐标 2. 存放工具类 版本号不用写,被父工程锁定了 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<!-- 文件上传组件 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</dependency>
</dependencies>
</project>
update maven后,可以看到依赖包都已经被maven自动导入:
image.png
11.3 dao层pyg-dao的pom文件配置
/pyg-dao/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-dao</artifactId>
<!-- dao持久层: 1. 访问数据库 2. mybatis 3. 数据源 4. 依赖pojo -->
<dependencies>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
</dependency>
<!-- 分页的坐标 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- pojo -->
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- common -->
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
11.4 后台管理的聚合父工程pyg-manager的pom.xml配置
pyg-manager工程原则上不需要坐标依赖,但是它的聚合子工程需要。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-manager</artifactId>
<packaging>pom</packaging>
<modules>
<module>pyg-manager-interface</module>
<module>pyg-manager-service</module>
</modules>
<!-- 后台管理聚合父工程、 1.抽取子工程公共坐标 2.聚合管理子工程(统一打包,统一部署,统一启动) 父工程中配置tomcat插件(服务层从9000开始是端口) -->
<dependencies>
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<!-- 配置tomcat插件 -->
<!-- build:配置插件标签 -->
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<!-- <version>2.2</version> -->
<configuration>
<!-- 服务启动端口:从9000开始 -->
<port>9000</port>
<!-- /把项目发布tomcat服务器ROOT目录下 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
10.5 pyg-manager-interface的pom.xml配置
不用配置。
/pyg-manager-interface/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-manager</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-manager-interface</artifactId>
</project>
10.6 pyg-manager-service需要管理spring事务,配置pom.xml文件。
/pyg-manager-service/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-manager</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-manager-service</artifactId>
<packaging>war</packaging>
<!-- service需要 1. spring 2. dao 3. pojo 4. common 5. 发布服务:dubbo和zookeeper -->
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<!-- 依赖服务端接口 -->
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-manager-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
11.7 运营商表现层pyg-manager-web的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-manager-web</artifactId>
<packaging>war</packaging>
<!-- 运营商表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-manager-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
11.8 商家表现层pyg-shop-web的pom.xml配置
商家表现层pyg-shop-web的配置和运营商表现层一模一样。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-shop-web</artifactId>
<packaging>war</packaging>
<!-- 商家表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-manager-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
12.0 Dao层
从Dao层开始,Dao层主要负责访问数据库。
12.1 添加数据源
image.png/pyg-dao/src/main/resources/prop/db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pinyougoudb?characterEncoding=utf-8
jdbc.username=root
jdbc.password=bywwcnll57
12.2 mybatis配置文件
/pyg-dao/src/main/resources/config/SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<!-- com.github.pagehelper 为 PageHelper 类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六种数据库-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
12.3 数据源工厂扫描接口的配置。
/pyg-dao/src/main/resources/spring/applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 数据库连接池 -->
<!-- 加载配置文件 prop下面所有的properties -->
<context:property-placeholder
location="classpath*:prop/*.properties" />
<!-- 数据库连接池
数据源使用阿里巴巴的DruidDataSource-->
<bean id="dataSource"
class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<property name="maxActive" value="10" />
<property name="minIdle" value="5" />
</bean>
<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation"
value="classpath:config/SqlMapConfig.xml" />
<!-- 定义别名 -->
<property name="typeAliasesPackage" value="com.pyg.pojo"></property>
</bean>
<!-- 接口代理开发的扫描配置 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.pyg.mapper" />
</bean>
</beans>
13.0 逆向工程生成接口
在12.3中
<!-- 接口代理开发的扫描配置 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.pyg.mapper" />
</bean>
接口代理并不存在。我们可以通过反射来实现接口类生成。这时候需要mybatis generator的插件。
image.png
安装说明:
- 把plugins中的所有jar拷贝到eclipse的plugins文件夹之中
- 把features中的所有文件夹拷贝到eclipse的features文件夹之中
- 重启eclipse,ok
配置好后,重启eclipse。配置逆向工程配置文件/pyg-dao/src/main/resources/generatorConfig.xml
image.png
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- classPathEntry:数据库的JDBC驱动的jar包地址 -->
<classPathEntry
location="F:\workspace\pyg-workspace\pyg-dao\src\main\resources\lib\mysql-connector-java-5.1.28-bin.jar" />
<context id="caigouTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/pinyougoudb" userId="root"
password="bywwcnll57">
</jdbcConnection>
<!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" -->
<!-- connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" -->
<!-- userId="yycg" -->
<!-- password="yycg"> -->
<!-- </jdbcConnection> -->
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer true,把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.pyg.pojo"
targetProject="pyg-pojo">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="true" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:自动mapper的位置 -->
<sqlMapGenerator targetPackage="com.pyg.mapper"
targetProject="pyg-dao">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.pyg.mapper" implementationPackage="com.pyg.mapper"
targetProject="pyg-dao">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="tb_user"></table>
<table schema="" tableName="tb_content"></table>
<table schema="" tableName="tb_content_category"></table>
<table schema="" tableName="tb_item"></table>
<table schema="" tableName="tb_item_cat"></table>
<table schema="" tableName="tb_order"></table>
<table schema="" tableName="tb_order_item"></table>
<table schema="" tableName="tb_address"></table>
<table schema="" tableName="tb_areas"></table>
<table schema="" tableName="tb_brand"></table>
<table schema="" tableName="tb_provinces"></table>
<table schema="" tableName="tb_cities"></table>
<table schema="" tableName="tb_seller"></table>
<table schema="" tableName="tb_freight_template"></table>
<table schema="" tableName="tb_specification"></table>
<table schema="" tableName="tb_specification_option"></table>
<table schema="" tableName="tb_type_template"></table>
<table schema="" tableName="tb_goods"></table>
<table schema="" tableName="tb_goods_desc"></table>
<table schema="" tableName="tb_pay_log"></table>
</context>
</generatorConfiguration>
执行‘’蝙蝠“:
image.png等待完成,打开pyg-dao,可见:
image.png
打开pyg-pojo,可见:
image.png
但是在我们的com.pyg.mapper目录下,只能编译.java的文件,xml配置文件无法编译执行,这时候需要调整一下:
在src/main/resources目录下新建com.pyg.mapper包目录,把xml文件移动到该目录下:
image.png
这种模式,也满足我们的接口代理开发。
14.0 服务层配置
14.1 service配置文件
pyg-manager-service项目负责管理事务,配置其配置文件:
image.png
/pyg-manager-service/src/main/resources/spring/applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 指定dubbo发布服务端口 -->
<dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
<!-- 指定服务名称 -->
<dubbo:application name="pyg-manager-service" />
<!-- 指定服务注册中心地址 -->
<dubbo:registry
address="zookeeper://127.0.0.1:2181" />
<!-- 注解的方式发布服务(dubbo:annotation) -->
<dubbo:annotation
package="com.pyg.manager.service.impl" />
</beans>
14.2 WEB-INF
/pyg-manager-service/src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- classpath*:加载两个src目录下的applicationContext-service.xml -->
<param-value>classpath*:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
15.0 web工程pyg-manager-web
image.png一些常量保存在application.properties文件中。目前为空。
/pyg-manager-web/src/main/resources/spring/springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder
location="classpath:config/application.properties" />
<!-- 转换json格式做支持的注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters
register-defaults="true">
<bean
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes"
value="application/json" />
<property name="features">
<array>
<value>WriteMapNullValue</value>
<value>WriteDateUseDateFormat</value>
</array>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 放行静态资源 -->
<mvc:default-servlet-handler/>
<!-- 引用dubbo 服务 -->
<dubbo:application name="pinyougou-manager-web" />
<!-- 指定服务注册中心地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 注解的方式引入服务(dubbo:annotation) -->
<dubbo:annotation
package="com.pyg.manager.controller" />
</beans>
web.xml中配置编码过滤器、加载DispatcherServlet(前端控制器)、springmvc文件。
/pyg-manager-web/src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 此处采用斜杠,则需要在springmvc.xml文件中放心静态资源 -->
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
16.0 web工程pyg-shop-web
同15.0 配置一样。
/pyg-shop-web/src/main/resources/config/application.properties为空。
/pyg-shop-web/src/main/resources/spring/springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder
location="classpath:config/application.properties" />
<!-- 转换json格式做支持的注解驱动 -->
<mvc:annotation-driven>
<mvc:message-converters
register-defaults="true">
<bean
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes"
value="application/json" />
<property name="features">
<array>
<value>WriteMapNullValue</value>
<value>WriteDateUseDateFormat</value>
</array>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 放行静态资源 -->
<mvc:default-servlet-handler/>
<!-- 引用dubbo 服务 -->
<dubbo:application name="pinyougou-shop-web" />
<!-- 指定服务注册中心地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 注解的方式引入服务(dubbo:annotation) -->
<dubbo:annotation
package="com.pyg.shop.controller" />
</beans>
/pyg-shop-web/src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 此处采用斜杠,则需要在springmvc.xml文件中放心静态资源 -->
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
17.0 集成测试
17.1 新建一个查询所有品牌的接口
image.png/pyg-manager-interface/src/main/java/com/pyg/manager/service/BrandService.java
package com.pyg.manager.service;
import java.util.List;
import com.pyg.pojo.TbBrand;
/**
* 查询品牌的接口
*
* @author EdPeng
*
*/
public interface BrandService {
/**
* 查询所有的品牌数据
*/
public List<TbBrand> findAll();
}
17.2 在service项目中实现该接口。
image.png/pyg-manager-service/src/main/java/com/pyg/manager/service/impl/BrandServiceImpl.java
package com.pyg.manager.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.config.annotation.Service;
import com.pyg.manager.service.BrandService;
import com.pyg.mapper.TbBrandMapper;
import com.pyg.pojo.TbBrand;
import com.pyg.pojo.TbBrandExample;
//必须使用dubbo的@Service才能发布到zookeeper的注册中心里。
@Service
public class BrandServiceImpl implements BrandService{
// 注入mapper接口代理对象
@Autowired
private TbBrandMapper brandMapper;
@Override
public List<TbBrand> findAll() {
//创建example对象
TbBrandExample example = new TbBrandExample();
// 查询所有
List<TbBrand> list = brandMapper.selectByExample(example);
return list;
}
}
17.3 编写表现层代码
image.png/pyg-manager-web/src/main/java/com/pyg/manager/controller/BrandController.java
package com.pyg.manager.controller;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.pyg.manager.service.BrandService;
import com.pyg.pojo.TbBrand;
//@RestController是@Controller和@ResponseBody的集合体
@RestController
public class BrandController {
// 注入远程服务的对象,alibaba.dubbo的注解来实现
@Reference
private BrandService brandService;
// 查询所有品牌数据
@RequestMapping("/finAll")
public List<TbBrand> findAll() {
// 调用远程服务对象方法
List<TbBrand> list = brandService.findAll();
return list;
}
}
为了执行项目,需要在pyg-manager-web工程中植入tomcat插件,修改pom.xml文件。
/pyg-manager-web/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-shop-web</artifactId>
<packaging>war</packaging>
<!-- 商家表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->
…………
<!-- build:配置插件标签 -->
<!-- 解决<packaging>war</packaging>报错的bug -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<!-- <version>2.2</version> -->
<configuration>
<!-- 前台启动端口:从8084开始 -->
<port>8084</port>
<!-- /把项目发布tomcat服务器ROOT目录下 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
同时也修改好pyg-shop-web项目的pom.xml文件。
/pyg-shop-web/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pinyougou</groupId>
<artifactId>pyg-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>pyg-shop-web</artifactId>
<packaging>war</packaging>
<!-- 商家表现层: 1.servlet 2. 服务接口 3.spring 4. 引入服务:dubbo,zookeeper -->
…………
<!-- build:配置插件标签 -->
<!-- 解决<packaging>war</packaging>报错的bug -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<!-- <version>2.2</version> -->
<configuration>
<!-- 前台启动端口:从8084开始 -->
<port>8084</port>
<!-- /把项目发布tomcat服务器ROOT目录下 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
17.4 安装项目
首先是pyg-parent项目安装,没安装找不到包。
image.png
见下图,安装成功:
image.png
同样的方法,依次安装pyg-common、pyg-pojo、pyg-dao、pyg-manager、pyg-manager-web
如果没有出现BUILD SUCCESS
字样,并提示如下界面:
在window-Preferences-Java-Installed JREs中,设置:
image.png
image.png
image.png
勾选,保存,再一次运行maven install即可。
为了方便调试,载入log4j文件。
image.png
/pyg-manager-web/src/main/resources/log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=debug, stdout
开启zookeeper。win+R键,输入cmd,再输入" zkServer
"
因为是第一次启动,并且在我们的pyg-manager-web配置了tomcat插件,使用通过如下操作启动该项目。
未完待续。
原因:没有服务器。
网友评论