day69_淘淘商城項目_02_dubbo介紹 + dubbo框架整合 + zookeeper + 商品列表查詢實現 + 分頁 + 逆向工程_匠心筆記


  • 課程計划
    • 第二天:商品列表功能實現
  • 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中配置下:
<?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
  • 服務端響應的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(110);

        // 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM