- 課程計划
- 第二天:商品列表功能實現
- 1、功能分析
- 2、服務中間件Dubbo
- 3、SSM框架整合+Zookeeper
- 4、Dubbo的Admin管理平台
- 5、后台商品列表查詢功能實現
1、功能分析
1.1、后台系統所用的技術
- 框架:Spring + SpringMVC + Mybatis + Dubbo
- 前端:EasyUI
- 數據庫:MySQL
1.2、創建數據庫
- 1、安裝mysql數據庫,要求5.5以上版本。
- 2、在mysql中創建一個taotao數據庫。
- 3、將創建數據庫的腳本taotao.sql導入到taotao中。
1.3、Mybatis逆向工程
- 使用mybatis官方提供的mybatis-generator生成pojo、mapper接口及映射文件。
- 並且將pojo放到toatao-manager-pojo工程中。
- 將mapper接口及映射文件放到taotao-manager-dao工程中。
- 注意1:因為涉及到各個工程(系統)之間來回傳遞對象,所以使用時需要對涉及到的POJO實現序列化接口。
- 我們發現mybatis的插件,有一個可以自動給所有pojo實現序列化接口(example除外)
- 注意2:如果生成的pojo能夠有toString()的重寫會給開發、調試帶來很大的方便,所以我們也將生成的pojo重寫toString()方法。
- 同樣使用mybatis的插件。
- 即我們在使用Mybatis逆向工程的時候,在其配置文件generatorConfig.xml中配置下:
- 注意1:因為涉及到各個工程(系統)之間來回傳遞對象,所以使用時需要對涉及到的POJO實現序列化接口。
<?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>
<context id="testTables" targetRuntime="MyBatis3">
<!-- 配置生成pojo的序列化的插件,mybatis支持很多插件,這些插件都在 org.mybatis.generator.plugins包下 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
<!--配置生成pojo的toString()方法的插件,mybatis支持很多插件,這些插件都在 org.mybatis.generator.plugins包下 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin" />
<commentGenerator>
<!-- 是否去除自動生成的注釋 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/taotao" userId="root" password="root">
</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.taotao.pojo" targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
<!-- 從數據庫返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.taotao.mapper" targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.taotao.mapper" targetProject=".\src">
<!-- enableSubPackages:是否讓schema作為包的后綴 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定數據庫表 -->
<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_item_desc"></table>
<table schema="" tableName="tb_item_param"></table>
<table schema="" tableName="tb_item_param_item"></table>
<table schema="" tableName="tb_order"></table>
<table schema="" tableName="tb_order_item"></table>
<table schema="" tableName="tb_order_shipping"></table>
<table schema="" tableName="tb_user"></table>
</context>
</generatorConfiguration>
使用方法:將Java工程generatorSqlmapCustom導入到eclipse中,運行/generatorSqlmapCustom/src/下的GeneratorSqlmap.java文件生成我們所需的代碼。
1.4、系統間通信問題
1.4.1、分析
由於淘淘商城是基於soa的架構,表現層和服務層是不同的工程。所以要實現商品列表查詢需要兩個系統之間進行通信。
如何實現遠程通信?
- 1、使用Webservice:
效率不高
,它是基於soap協議(html+xml
)。項目中不推薦使用。優點是:跨語言、跨平台。適用於兩個公司之間。 - 2、使用Restful形式的服務:
http+json
。很多項目中應用。如果服務越來越多,服務與服務之間的調用關系復雜,調用服務的URL管理復雜,什么時候添加機器難以確定。 需要治療服務。適用於中小型企業。 - 3、使用Dubbo:使用
RPC協議
進行遠程調用,直接使用socket通信
。傳輸效率高
,並且可以統計出系統之間的調用關系、調用次數,管理服務。適用於大型企業。缺點:不能跨語言。只能java語言。
2、Dubbo
2.1、什么是dubbo
最新中文網址:https://dubbo.incubator.apache.org/zh-cn/index.html
DUBBO是一個分布式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,是阿里巴巴SOA服務化治理方案的核心框架,每天為2,000+個服務提供3,000,000,000+次訪問量支持,並被廣泛應用於阿里巴巴集團的各成員站點。
隨着互聯網的發展,網站應用的規模不斷擴大,常規的垂直應用架構
已無法應對,分布式服務架構
以及流動計算架構
勢在必行,亟需一個治理系統
確保架構有條不紊的演進。

- 單一應用架構
當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
此時,用於簡化增刪改查工作量的數據訪問框架(ORM)
是關鍵。 - 垂直應用架構
當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
此時,用於加速前端頁面開發的Web框架(MVC)
是關鍵。 - 分布式服務架構
當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
此時,用於提高業務復用及整合的分布式服務框架(RPC)
是關鍵。 - 流動計算架構
當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集群容量,提高集群利用率。
此時,用於提高機器利用率的資源調度和治理中心(SOA)
是關鍵。 - Dubbo就是
資源調度和治理中心的管理工具
。 - Dubbo 就是類似於webservice的關於系統之間通信的框架,並可以
統計
和管理服務
直接的調用情況(包括服務被誰調用了,調用的次數是如何,以及服務的使用狀況)。
2.2、Dubbo的架構
- Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。
- 節點角色說明:
- Provider: 暴露服務的服務提供方。
- Consumer: 調用遠程服務的服務消費方。
- Registry: 服務注冊與發現的注冊中心。
- Monitor: 統計服務的調用次調和調用時間的監控中心。
- Container: 服務運行容器。
- 調用關系說明:
- 0、服務容器負責啟動,加載,運行服務提供者。
- 1、服務提供者在啟動時,向注冊中心注冊自己提供的服務。
- 2、服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 3、注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於`長連接`推送變更數據給消費者。
- 4、服務消費者,從提供者地址列表中,基於`軟負載均衡算法`,選一台提供者進行調用,如果調用失敗,再選另一台調用。
- 5、服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次`統計`數據到監控中心。
2.3、Dubbo的使用方法
- spring配置
- Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行加載。
- 單一工程中spring的配置local.xml(沒有使用dubbo時):
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
- 遠程服務(使用dubbo時):
在本地服務的基礎上,只需做簡單配置,即可完成遠程化:
將上面的local.xml配置拆分成兩份,將服務定義部分放在服務提供方remote-provider.xml,將服務引用部分放在服務消費方remote-consumer.xml。
並在服務提供方增加暴露服務配置,在服務消費方增加引用服務配置
。
服務層發布服務:
<!-- 和本地服務一樣實現遠程服務 -->
<bean id="xxxService" class="com.xxx.XxxServiceImpl" />
<!-- 增加暴露遠程服務配置 -->
<dubbo:service interface="com.xxx.XxxService" ref="xxxService" />
表現層調用服務:
<!-- 增加引用遠程服務配置 -->
<dubbo:reference id="xxxService" interface="com.xxx.XxxService" />
<!-- 和本地服務一樣使用遠程服務 -->
<bean id="xxxAction" class="com.xxx.XxxAction">
<property name="xxxService" ref="xxxService" />
</bean>
2.4、注冊中心--zookeeper
2.4.1、zookeeper的介紹
Zookeeper(集群管理工具:動物管理員)適用於大數據里面的生態系統。比如:大數據中的hadoop(大象)、Hive(蜂巢)等等動物需要動物管理員來管理哈!
Dubbo中使用Zookeeper是作為注冊中心使用的,注冊中心負責服務地址的注冊與查找,相當於目錄服務
,服務提供者和消費者只在啟動時與注冊中心交互,注冊中心不轉發請求,壓力較小。使用dubbo-2.3.3以上版本,建議使用Zookeeper注冊中心。
Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務
,支持變更推送,適合作為Dubbo服務的注冊中心,工業強度較高(穩定性好),可用於生產環境,並推薦使用。
2.4.2、環境准備
- 虛擬機軟件環境:VMware 14 PRO
- linux環境:CentOS 7.5
- 環境我已經裝備好了,我們使用VMWare打開虛擬機。
2.4.3、使用SecureCRT連接Linux系統
- 清除所有文件,我們先要有一個干干凈凈的Linux系統。如下圖:
2.4.4、zookeeper的安裝
- 第一步:linux上安裝jdk,參考鏈接:https://www.cnblogs.com/chenmingjun/p/9931593.html
- 第二步:上傳linux版本的zookeeper壓縮包至linux系統下的/user/local/zookeeper目錄下,解壓縮zookeeper壓縮包
- 第三步:進入zookeeper解壓目錄,將conf文件夾下zoo_sample.cfg改名為zoo.cfg,命令:
mv zoo_sample.cfg zoo.cfg
- 第四步:編輯zoo.cfg文件,修改配置dataDir屬性,指定一個真實目錄(進入zookeeper解壓目錄,創建data目錄:
mkdir data
) - 第五步:
- 啟動zookeeper:bin/zkServer.sh start
- 關閉zookeeper:bin/zkServer.sh stop
- 查看zookeeper狀態:bin/zkServer.sh status
- 注意:如果出現問題,需要關閉linux的防火牆。否則不建議關閉防火牆,而是配置防火牆。
3、SSM框架整合+Zookeeper
3.1、需求
- 根據商品id查詢商品信息,並將商品信息使用json數據返回。
- 分析:
- 請求的url:`/item/{itemId}` 注意:(把參數放在了請求的里面,使用Restfull軟件架構設計模式)
- 參數:商品id,從請求的url中獲得
- 返回值:TbItem對象,逆向工程生成的pojo(響應json數據)
3.2、配置對dubbo的依賴
- 加入dubbo相關的jar包。服務層、表現層都要配置。在服務層、表現層的pom.xml文件中添加依賴。
服務層:taotao-manager-service/pom.xml
<!-- 配置對dubbo的依賴 -->
<!-- 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>
注意:當我們配置對dubbo的依賴后,要查看dubbo的依賴關系,排除掉dubbo依賴的低版本的jar,比如:spring-2.5.6.SEC03.jar和netty-3.2.5.Final.jar(這同樣也是編程的好習慣)!
排除方法:
方法一:在taotao-manager-service/pom.xml中手動編寫代碼,所以最終pom.xml中要添加的內容如下:
<!-- 配置對dubbo的依賴 -->
<!-- dubbo相關 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<!-- 排除對低版本jar包的依賴 -->
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>netty</artifactId>
<groupId>org.jboss.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
方法二:使用圖形化界面,如下圖所示:

二種方式本質是一樣的!
表現層:taotao-manager-web/pom.xml
<!-- 配置對dubbo的依賴 -->
<!-- dubbo相關 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<!-- 排除對低版本jar包的依賴 -->
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>netty</artifactId>
<groupId>org.jboss.netty</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
</dependency>
3.3、整合思路
- 1、Dao層:
mybatis整合spring,通過spring管理SqlSessionFactory、Mapper代理對象。需要mybatis和spring的整合包。由spring創建數據庫連接池。
下圖所示為文件所對應的工程: - 2、Service層:
所有的service實現類都放到spring容器中管理,並由spring管理事務。發布dubbo服務
。
下圖所示為文件所對應的工程:
web.xml中:配置加載spring容器 - 3、表現層:
springmvc框架,由springmvc管理Controller。引用dubbo服務
。
下圖所示為文件所對應的工程:
web.xml中:配置前端控制器,配置URL攔截形式。
3.4、Dao整合
- 整合后的目錄結構如下:后面的配置文件可以參考此圖片創建目錄(這樣的目錄結構賞心悅目啊!)
3.4.1、創建SqlMapConfig.xml配置文件
SqlMapConfig.xml(由於和spring進行整合了,里面空空如也,但是該文件必須要有!)
<?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>
</configuration>
3.4.2、spring整合mybatis
創建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-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 配置數據庫連接池 -->
<!-- 加載配置文件 -->
<context:property-placeholder location="classpath:properties/-*.properties" />
<!-- 數據庫連接池 -->
<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:mybatis/SqlMapConfig.xml" />
</bean>
<!-- 配置Mapper映射文件的包掃描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.taotao.mapper" />
</bean>
</beans>
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
備注:
Druid(德魯伊)是目前最好的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。
Druid已經在阿里巴巴部署了超過600個應用,經過多年多生產環境大規模部署的嚴苛考驗。
3.5、Service整合
3.5.1、配置管理Service
applicationContext-service.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:dubbo="http://code.alibabatech.com/schema/dubbo"
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-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 配置包掃描器,掃描所有需要帶@Service注解的類 -->
<context:component-scan base-package="com.taotao.service" />
<!-- 使用dubbo發布服務:需要先引入dubbo的約束 -->
<!-- 提供方應用信息,用於計算依賴關系 -->
<dubbo:application name="taotao-manager" />
<dubbo:registry protocol="zookeeper" address="192.168.5.130:2181" />
<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 聲明需要暴露的服務接口 -->
<dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" />
</beans>
3.5.2、配置事務管理
創建applicationContext-transaction.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-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 配置事務管理器 :包括:通知、切面-->
<!-- 事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 數據源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 傳播行為 -->
<!-- 增刪改操作需要配置事務 -->
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<!-- 查詢操作不需要配置事務 -->
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 切面 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.taotao.service.*.*(..))" />
</aop:config>
</beans>
3.5.3、配置web.xml
由於taotao-manager-service是一個聚合工程中的web工程,所以我們需要配置下該工程的web.xml
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"
id="WebApp_ID" version="2.5">
<display-name>taotao-manage-servicer</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 初始化spring容器:也即加載spring容器,taotao-manager-service是web工程,需要在web容器中運行 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
3.5.4、spring父子容器的關系
- 思考:以上我們的服務層已經配置好了,在表現層的springmvc我們還需要初始化spring容器嗎?即springmvc可以初始化一個容器嗎?亦即我們還需要寫上面web.xml中的那段代碼嗎?
答:在表現層的springmvc我們不需要初始化spring容器了。為什么呢?原因如下圖所示:
訪問規則:子容器可以訪問父容器的對象,父容器不可以訪問子容器的對象。
即:spring父容器里面的對象可以注入spring子容器中,而spring子容器中的對象不可以注入spring父容器中。
3.6、表現層整合
3.6.1、配置管理Controller
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-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.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-4.2.xsd">
<!-- 配置包掃描器,掃描所有需要帶@Controller注解的類 -->
<context:component-scan base-package="com.taotao.controller" />
<!-- 配置注解驅動 -->
<mvc:annotation-driven />
<!-- 配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 引用dubbo服務 :需要先引入dubbo的約束-->
<dubbo:application name="taotao-manager-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.5.130:2181"/>
<dubbo:reference interface="com.taotao.service.ItemService" id="itemService" />
</beans>
注意:如果沒有添加interface的依賴,還需要在表現層工程的pom文件中添加taotao-manager-interface工程的依賴。
添加的內容如下:
<!-- 配置對interface的依賴:表現層調用服務要通過該接口 -->
<dependency>
<groupId>com.taotao</groupId>
<artifactId>taotao-manager-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
3.6.2、配置web.xml
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"
id="WebApp_ID" version="2.5">
<display-name>taotao-manager-web</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置解決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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- /表示攔截所有請求,但不攔截jsp,/*表示攔截所有請求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置springmvc的前端控制器 -->
<servlet>
<servlet-name>taotao-manager-web</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation不是必須的, 如果不配置contextConfigLocation,
springmvc的配置文件默認在:WEB-INF/servlet的name+"-servlet.xml" -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!-- 1表示tomcat啟動之后就會加載servlet前端控制器,否則表示第一次請求的時候才加載 -->>
</servlet>
<servlet-mapping>
<servlet-name>taotao-manager-web</servlet-name>
<!-- /表示攔截所有請求,但不攔截jsp,/*表示攔截所有請求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意:其中配置項<load-on-startup>1</load-on-startup>
表示tomcat啟動之后就會加載這個servlet前端控制器,如果不配置的話,就表示第一次請求的時候才加載這個servlet前端控制器。
3.6.3、編寫Controller
@Controller
public class ItemController {
@Autowired
private ItemService itemService;
/**
* 根據商品id查詢商品信息,並將商品信息使用json數據格式返回。
* @param itemId
* @return
*/
@RequestMapping("/item/{itemId}")
@ResponseBody // 在后台,把JavaBean強制轉換成json格式數據返回給前台頁面。
public TbItem getItemById(@PathVariable Long itemId) {
TbItem item = itemService.getItemById(itemId);
return item;
}
}
注意:使用注解@ResponseBody可能會出現訪問406錯誤,90%的情況下,是由於沒有把jackson注解的jar包沒有引入。
@ResponseBody的作用:在后台,把JavaBean強制轉換成json格式數據返回給前台頁面。沒有該jar,就不能把對象轉成一個json格式的數據(json串)。服務器會出現406錯誤。
本工程taotao-manager-web中有jackson的jar依賴,因為工程taotao-manager-web依賴工程taotao-common了,而在工程taotao-common依賴了jackson的jar包。
3.7、dubbo服務調用測試
3.7.1、添加日志文件log4j.properties
- 測試之前我們先將log4j的日志配置文件log4j.properties拷貝至要啟動工程的classpath目錄下,如下圖所示:
這樣工程啟動報錯就能輸出錯誤信息,便於我們解決問題!
3.7.2、啟動工程
- 注意:使用tomcat插件要先啟動服務層工程taotao-manager,再啟動表現層工程taotao-manager-web。
- 控制台會報錯如下圖:
是由於目標主機無法訪問,在cmd中都無法ping通,可能是遠程主機沒有啟動,我們啟動遠程主機,啟動zookeeper服務,問題仍舊在,為什么呢?突然想到了,遠程主機的防火牆沒有關閉,把端口2181屏蔽掉了。由於本博主使用的CentOS 7.5,防火牆使用的是firewalld,我們使用命令的方式來添加端口(修改后需要重啟firewalld服務),操作如下:
[root@itheima ~]# cd /etc/firewalld/zones/
[root@itheima zones]# firewall-cmd --permanent --add-port=2181/tcp
[root@itheima zones]# service firewalld restart
Redirecting to /bin/systemctl restart firewalld.service
[root@itheima zones]#
- 再次啟動服務層工程taotao-manager,啟動成功,沒有問題。
- 然后我們啟動表現層工程taotao-manager-web
3.7.3、測試訪問
- 測試訪問地址:localhost:8081/item/830972
測試報錯如下圖所示:
原因是:映射文件並沒有拷貝到classpath下導致。 - 解決mapper映射文件不發布的問題:
在taotao-manager-dao工程中的pom文件中添加如下內容:
<build>
<resources>
<!-- 如果不添加此節點,mybatis的mapper.xml文件都會被漏掉 -->
<!-- 注意:配置了此方式,原來的默認的資源拷貝行為將無效了 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!-- 如果不添加此節點,src/main/resources目錄下的配置文件將被忽略 -->
<resource>
<directory>src/main/resource</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
taotao-manager-dao我們在表現層也會用到,所以改好后需要選擇taotao-manager-dao工程進行安裝,選中工程右鍵 Run as --> Maven install
注意:由於taotao-manager是一個聚合工程,taotao-manager-dao是該聚合工程中的模塊工程,所以taotao-manager-dao中有修改的話,taotao-manager-dao也不需要安裝,所以我們直接重啟工程taotao-manager即可,命令:clean tomcat7:run
再次測試訪問:localhost:8081/item/830972,出現了新的錯誤,如下:

原因是:因為涉及到各個工程(系統)之間來回傳遞對象,所以使用時需要對涉及到的POJO實現序列化接口。
解決方式一:所以我們需要修pojo類,實現序列化接口。
解決方式二:我們發現mybatis的插件,有一個可以自動給所有pojo實現序列化接口和序列化版本id(example除外)。即我們在使用Mybatis逆向工程的時候,在其配置文件generatorConfig.xml中配置下:
<!-- 配置pojo的序列化 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
修改完成后,由於我們在表現層也會用到taotao-manager-pojo,所以我們需要重新安裝下,選中工程右鍵 Run as --> Maven install,安裝完成后然后我們重啟服務端工程和表現層工程。整合成功!
瀏覽器效果如下圖:
瀏覽器美化后的json格式數據:

瀏覽器原始的json格式數據:

4、Dubbo的Admin管理平台
- Dubbo監控中心其實就是一個web工程,目前推薦將Dubbo監控中心和注冊中心安裝在同一台服務器上,這樣可以不需要任何配置。
4.1、環境准備
- 1、准備好war包
- 2、准備好tomcat
- 3、使用SecureCRT上傳到linux系統中
- 4、需要安裝先tomcat
即解壓tomcat,命令:tar -zxvf apache-tomcat-7.0.47.tar.gz
然后刪除tomcat壓縮包,命令:rm -rf apache-tomcat-7.0.47.tar.gz
4.2、部署監控中心
- 部署監控中心,拷貝dubbo-admin-2.5.4.war包到/usr/local/tomcat/apache-tomcat-7.0.47/webapps/下,並起個別名,名字太長了(下面演示本博主沒有起別名,覺得名字還能接受)
[root@itheima tomcat]# ll
總用量 26296
drwxr-xr-x. 9 root root 160 11月 10 15:04 apache-tomcat-7.0.47
-rw-r--r--. 1 root root 26924417 9月 26 22:11 dubbo-admin-2.5.4.war
[root@itheima tomcat]# cp dubbo-admin-2.5.4.war apache-tomcat-7.0.47/webapps/
[root@itheima tomcat]# rm -rf dubbo-admin-2.5.4.war
[root@itheima tomcat]# ll apache-tomcat-7.0.47/webapps/
總用量 26304
drwxr-xr-x. 13 root root 4096 11月 10 15:04 docs
drwxr-xr-x. 8 root root 149 11月 10 15:18 dubbo-admin-2.5.4
-rw-r--r--. 1 root root 26924417 11月 10 15:18 dubbo-admin-2.5.4.war
drwxr-xr-x. 7 root root 111 11月 10 15:04 examples
drwxr-xr-x. 5 root root 87 11月 10 15:04 host-manager
drwxr-xr-x. 5 root root 103 11月 10 15:04 manager
drwxr-xr-x. 3 root root 4096 11月 10 15:04 ROOT
[root@itheima tomcat]#
- 啟動tomcat(注意:要先啟動注冊中心zookeeper)
[root@itheima tomcat]# cd apache-tomcat-7.0.47/bin/
[root@itheima bin]# ./startup.sh --啟動tomcat
Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-7.0.47
Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-7.0.47
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-7.0.47/temp
Using JRE_HOME: /usr/local/java/jdk1.7.0_80/jre
Using CLASSPATH: /usr/local/tomcat/apache-tomcat-7.0.47/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-7.0.47/bin/tomcat-juli.jar
[root@itheima bin]# ps -ef|grep tomcat --查看Tomcat的日志
root 4741 1 18 15:07 pts/1 00:00:03 /usr/local/java/jdk1.7.0_80/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/apache-tomcat-7.0.47/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/apache-tomcat-7.0.47/endorsed -classpath /usr/local/tomcat/apache-tomcat-7.0.47/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-7.0.47/bintomcat-juli.jar -Dcatalina.base=/usr/local/tomcat/apache-tomcat-7.0.47 -Dcatalina.home=/usr/local/tomcat/apache-tomcat-7.0.47 -Djava.io.tmpdir=/usr/local/tomcat/apache-tomcat-7.0.47/temp org.apache.catalina.startup.Bootstrap start
root 4761 3081 0 15:07 pts/1 00:00:00 grep --color=auto tomcat
[root@itheima bin]#
4.3、測試訪問
- 測試訪問:
http://192.168.5.130:8080/dubbo-admin-2.5.4/
,瀏覽器彈出訪問連接超時
原因是:遠程主機的防火牆沒有關閉,把端口8080屏蔽掉了。由於本博主使用的CentOS 7.5,防火牆使用的是firewalld,我們使用命令的方式來添加端口(修改后需要重啟firewalld服務),操作如下:
[root@itheima ~]# cd /etc/firewalld/zones/
[root@itheima zones]# firewall-cmd --permanent --add-port=8080/tcp
[root@itheima zones]# service firewalld restart
Redirecting to /bin/systemctl restart firewalld.service
[root@itheima zones]#
- 同理,增加端口8080、8081、20880、7070(dubbo監控使用端口)
- 查看tomcat目錄下logs日志命令:
tail -f logs/catalina.out
- 再次訪問::http://192.168.5.130:8080/dubbo-admin-2.5.4/,依然不行,tomcat主頁可以訪問但是項目dubbo-admin-2.5.4無法訪問,經過幾個小時的谷歌和百度並嘗試,發現了最終原因:
dubbo-admin不能在jdk1.8的環境下運行
,mmp!於是我卸載了jdk1.8,重新安裝了jdk1.7。問題解決了!!!彈出了我想要的界面:
用戶名:root
密碼:root - 相關截圖如下:
成功登錄界面如下:
點擊【服務治理】 --> 【服務】,就能看見我們發布的服務了
點擊【該服務】,可以看到本地電腦的IP和端口號
點擊【本地電腦的IP】,查看【服務提供者】的一些信息
查看【服務消費者】的一些信息查看【應用】
如果監控中心和注冊中心在同一台服務器上,可以不需要任何配置。
如果不在同一台服務器,需要修改配置文件:
文件位置:/usr/local/tomcat/apache-tomcat-7.0.86/webapps/dubbo-admin-2.5.4/WEB-INF/dubbo.properties
如果要運行監控中心,必須先啟動zookeeper。
監控中心對於dubbo的服務的調用來說不是必須的,不安裝也可以運行。安裝的目的是為了更好的統計其調用的次數,方便管理。
5、后台商品列表查詢功能
5.1、整合靜態頁面
靜態頁面位置:如圖:

使用方法:把靜態頁面添加到taotao-manager-web工程中的WEB-INF下,如下圖所示:

由於在web.xml中定義的url攔截形式為
“/”表示攔截所有的url請求
,包括靜態資源例如css、js等。所以需要在springmvc.xml中添加資源映射標簽:
<!-- 配置資源映射標簽 -->
<mvc:resources location="/WEB-INF/js/" mapping="/js/**" />
<mvc:resources location="/WEB-INF/css/" mapping="/css/**" />
5.2、展示后台首頁+展示菜單頁面
5.2.1、功能分析
- 首頁的請求的url:/
- 請求參數:無
- 返回值:index.jsp (首頁)
5.2.2、Controller
/**
* 頁面展示Controller
* @author chenmingjun
* @date 2018年11月9日下午7:59:33
* @version 1.0
*/
@Controller
public class PageController {
/**
* 展示后台首頁
* @return
*/
@RequestMapping("/")
public String showIndex() {
return "index";
}
/**
* 展示后台菜單各頁面
* @param page
* @return
*/
@RequestMapping("/{page}")
public String showPage(@PathVariable String page) {
return page;
}
注意:要先刪掉webapp下測試用的的index.jsp。
5.3、后台商品列表查詢功能分析
5.3.1、商品列表頁面
- 瀏覽器界面效果:
- 瀏覽器請求的網址:http://localhost:8081/item/list?page=1&rows=30
- 對應的jsp:
item-list.jsp - 請求的url:
/item/list - 請求的參數:
page=1&rows=30
- 對應的jsp:
- 服務端響應的json數據格式:
Easyui中datagrid控件要求的數據格式為:
{total:"2",rows:[{"id":"1","name":"張三"},{"id":"2","name":"李四"}]}
5.3.2、響應的json數據格式EasyUIDataGridResult
創建商品列表查詢時的返回的數據類EasyUIDataGridResult(包裝類),將該類放入taotao-common中,因為服務層和表現層都要用它!
package com.taotao.common.pojo;
import java.io.Serializable;
import java.util.List;
/**
* 列表查詢時的返回的數據類
* @author chenmingjun
* @date 2018年11月11日上午11:54:31
* @version 1.0
*/
public class EasyUIDataGridResult implements Serializable{
private Long total;
private List<?> rows;
private static final long serialVersionUID = 1L;
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public List<?> getRows() {
return rows;
}
public void setRows(List<?> rows) {
this.rows = rows;
}
@Override
public String toString() {
return "EasyUIDataGridResult [total=" + total + ", rows=" + rows + "]";
}
}
5.3.3、分頁處理
- 由於逆向工程生成的代碼是不支持分頁處理的,如果想進行分頁需要自己編寫mapper,這樣就失去逆向工程的意義了。為了提高開發效率可以使用mybatis的分頁插件PageHelper。
5.4、Mybatis的分頁插件PageHelper
5.4.1、Mybatis分頁插件PageHelper的說明
- 如果你也在用Mybatis,建議嘗試該分頁插件,這個一定是最方便使用的分頁插件。
- 該插件目前支持Oracle、Mysql、
MariaDB
、SQLite、Hsqldb、PostgreSQL六種數據庫分頁。不支持SQLServer數據庫(微軟)。
5.4.2、使用方法
Maven中央倉庫最近更新的Artifact:http://maven.outofmemory.cn/
第一步:把PageHelper依賴的jar包添加到工程中。官方提供的代碼對逆向工程支持的不好,使用參考資料中的pagehelper-fix。

注意:我們使用的PageHelper3.4.2-fix在Maven的中央倉庫下載不到(因為有一點小bug,被我們修改過了,重新起了個名字),所以需要使用參考資料中的工程 ,將其導入到eclipse中,再使用maven安裝到本地倉庫。 即選中項目 --> 右鍵 --> Run As --> Maven install
第二步:在/taotao-manager-dao/pom.xml文件中添加對該分頁插件的依賴,之前我們配置該文件的時候已經配置依賴過了。
雖然添加過依賴了,但是為了筆記記錄的完整,我們將添加的內容展示出來,如下:
<!-- 添加對分頁插件pagehelper的依賴 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
第三步:在Mybatis的全局配置文件中配置對攔截器插件的依賴。
配置文件位置:/taotao-manager-service/src/main/resources/mybatis/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>
<!-- 配置攔截器插件:作用是在執行sql語句之前,將sql語句攔截下來,在sql語句中拼接上limit -->
<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>
第四步:在代碼中使用,參考“分頁測試”的代碼。
5.4.3、分頁測試
在/taotao-manager-service/src/test/java/com/taotao/pagehelper/中新建PagehelperTest.java文件,文件內容如下:
@Test
public void pagehelperTest() throws Exception {
// 1、先在Mybatis的配置文件中配置攔截器插件:作用是在執行sql語句之前,將sql語句攔截下來,在sql語句中拼接上limit
// 2、在執行查詢之前設置分頁條件,使用Pagehelper的靜態方法
PageHelper.startPage(1, 10);
// 3、執行查詢,使用mapper,需要初始化一個spring容器,從spring容器中的得到這個mapper的代理對象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
TbItemMapper itemMapper = applicationContext.getBean(TbItemMapper.class);
// 創建TbItemExample對象
TbItemExample example = new TbItemExample();
// 調用createCriteria()方法,創建條件查詢對象,本測試沒有條件,可以不用調用,表示查詢所有
// Criteria criteria = example.createCriteria();
List<TbItem> list = itemMapper.selectByExample(example); // 本測試沒有條件,表示查詢所有
// 4、取出分頁信息,分頁后,實際返回的結果list類型是Page<E>,如果想取出分頁信息
// 方式一:需要強制轉換為Page<E>
// Page<TbItem> listIteam = (Page<TbItem>)list;
// 方式二:我們使用PageInfo對象對查詢出來的結果進行包裝,推薦使用第二種
PageInfo<TbItem> pageInfo = new PageInfo<>(list);
// PageInfo中包含了非常全面的分頁屬性,下面演示幾個
System.out.println("總記錄數:" + pageInfo.getTotal());
System.out.println("總頁數:" + pageInfo.getPages());
System.out.println("當前頁數:" + pageInfo.getPageNum());
System.out.println("每頁記錄數:" + pageInfo.getPageSize());
}
5.5、Service層
參數:Integer page、Integer rows
業務邏輯:查詢所有商品列表,要進行分頁處理。
返回值:EasyUIDataGridResult
5.5.1、接口代碼
/**
* 分頁查詢后台商品列表信息
* @param page
* @param rows
* @return
*/
EasyUIDataGridResult getItemList(Integer page, Integer rows);
5.5.2、接口實現類代碼
@Override
public EasyUIDataGridResult getItemList(Integer page, Integer rows) {
// 設置分頁信息,使用PageHelper
if (page == null) {
page = 1;
}
if (rows == null) {
rows = 30;
}
PageHelper.startPage(page, rows);
// 執行查詢,不需要設置查詢條件,即查詢所有
TbItemExample example = new TbItemExample();
List<TbItem> list = itemMapper.selectByExample(example);
// 取分頁信息
PageInfo<TbItem> pageInfo = new PageInfo<>(list);
// 創建返回結果對象
EasyUIDataGridResult result = new EasyUIDataGridResult();
// 給返回的結果對象設置值(即封裝數據)
result.setTotal(pageInfo.getTotal());
result.setRows(list);
return result;
}
5.5.3、發布服務
在taotao-manager-service中的applicationContext-service.xml中發布服務。
注意address的值:使用自己的zookeeper所在的系統的ip地址和端口。

由於taotao-manager-interface工程中新加了代碼,所以需要向本地倉庫更新下:
選中taotao-manager-interface工程右鍵 --> Run As --> Maven install
5.6、表現層
5.6.1、Controller
1、初始化表格請求的url:/item/list
2、Datagrid默認請求參數:
1)page:當前的頁碼,從1開始。
2)rows:每頁顯示的記錄數。
3、服務器響應的數據:json格式的數據。EasyUIDataGridResult
/**
* 分頁查詢后台商品列表信息,並將商品列表信息使用json數據格式返回。
* @param page
* @param rows
* @return
*/
@RequestMapping("/item/list")
@ResponseBody // 在后台,把JavaBean強制轉換成json格式數據返回給前台頁面。
public EasyUIDataGridResult getItemList(Integer page, Integer rows) {
EasyUIDataGridResult result = itemService.getItemList(page, rows);
return result;
}
5.6.2、引用服務
在taotao-manager-web工程中的springmvc.xml中引入服務。
注意address的值:使用自己的zookeeper所在的系統的ip地址和端口。

5.7、測試
1)需要先啟動zookeeper,再啟動服務層,再啟動表現層。
如果先啟動表現層,后啟動服務層,會報錯,但是不影響使用。
2)為了更方便的進行測試,表現層工程和服務層工程屬於不同的工程,要debug的時候需要設置源碼,如下:
Debug設置源代碼,涉及到工程都要添加,為了方便
,可以添加所有的工程。
以工程taotao-manager為例:
步驟一:

步驟二:

步驟三:

5.8、解決錯誤+原因
1)表現層警告:

說明:
反序列化時,使用
Page<E>
,在表現層沒有這個類,但是我們有這個類的父類ArrayList,因為該類Page繼承ArrayList,如下圖,所以說這個警告我們可以不用管!若想解決這個警告,我們可以在web層(表現層)加入對分頁pagehelper的jar包的依賴(該包中有該類)。

2)表現層異常:

dubbo服務調用超時時間默認1秒,即表現層調用服務層,服務層在1秒鍾內不響應(重試3次),表現層就拋出異常。
由於我們要使用debug模式調試代碼,所以需要設置服務調用超時時間,dubbo服務調用超時時間默認1秒,我們設置成300秒。便於我們調試。

5.9、安裝maven工程時跳過測試
- 1、maven命令安裝jar包時跳過測試:clean install -DskipTests
表示先清理再安裝,打包時跳過測試。 - 2、還可以使用跳過測試的插件:maven-sufire-plugin