SSM入門項目-1-框架整合

導入數據庫與mybatis逆向工程

1,導入mysql數據庫

2,通過mybatis逆向工程生成pojo與mapper

將生成的pojo與mapper直接導入manager工程下的pojo與mapper。

SSM整合

1,dao層

1.1,在service工程中首先配置mybatis的配置文件

SqlMapConfig.xml

1.2,Spring配置與mybatis的整合。

applicationContext-dao.xml

  • 配置數據庫連接池(通過配置文件導入)
  • SqlSessionFactory(spring-mybatis整合包)
  • Mapper影射文件掃描

2,service層

applicationContext-service.xml
- 配置掃描器(掃描@service註解的類)
- 配置事務(單獨提出trans的配置文件)

事務配置文件

applicationContext-trans.xml
- 事務管理器(指定數據源)
- 通知(傳播行爲,通過方法開頭來判斷是否開啓事務)
- 切面(指定切入點service下的所有類與方法)

3,服務層的web.xml 初始化spring容器

掃描所有spring目錄下的applicationContext-*.xml。
※spring父子容器關係:我們在這初始化了ContextLoaderListener的話,在SpringMVC的配置之配置前端控制器就可以了。
這裏寫圖片描述
訪問規則:子容器可以訪問父容器,父容器不能訪問子容器。
原則上子容器也可以完成父子容器所有操作,
但DispatcherServlet屬於表現層框架,不宜使用。且ContextLoaderListener可以更好的兼容其他框架。

4,web層(表現層)

springmvc.xml

  • 註解驅動(處理器映射器,處理器適配器)
  • 視圖解析器(jsp視圖)
  • 包掃描器(掃描@Controller註解的類)

5,服務層的web.xml 初始化spring容器

  • post亂碼過濾器
  • 前端控制器(load-on-start 代表啓動服務時就開啓)

系統間通信

1,分析

  • Webservice:效率不高基於soap協議。項目中不推薦使用。
  • 使用restful形式的服務:http+json。很多項目中應用。如果服務太多,服務之間調用關係混亂,需要治療服務。
  • 使用dubbo。使用rpc協議進行遠程調用,直接使用socket通信。傳輸效率高,並且可以統計出系統之間的調用關係、調用次數。(缺點:只能是java工程間調用)
    這裏寫圖片描述
  • 單一應用架構
    • 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
    • 此時,用於簡化增刪改查工作量的 數據訪問框架(ORM) 是關鍵。
  • 垂直應用架構
    • 當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
    • 此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。
  • 分佈式服務架構
    • 當垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作爲獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
    • 此時,用於提高業務複用及整合的 分佈式服務框架(RPC) 是關鍵。
  • 流動計算架構
    • 當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個調度中心基於訪問壓力實時管理集羣容量,提高集羣利用率。
    • 此時,用於提高機器利用率的 資源調度和治理中心(SOA) 是關鍵。

2,Dubbo的架構

這裏寫圖片描述

  • 節點角色說明:
    • Provider: 暴露服務的服務提供方。
    • Consumer: 調用遠程服務的服務消費方。
    • Registry: 服務註冊與發現的註冊中心。
    • Monitor: 統計服務的調用次調和調用時間的監控中心
    • Container: 服務運行容器。
  • 調用關係說明:
    • 0=服務容器負責啓動,加載,運行服務提供者。
    • 1=服務提供者在啓動時,向註冊中心註冊自己提供的服務。
    • 2=服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
    • 3=註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
    • 4=服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
    • 5=服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

注意:註冊中心負責服務地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊中心不轉發請求,壓力較小。Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務,支持變更推送,適合作爲Dubbo服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用

3,Dubbo註冊中心的搭建

3.1,VMware安裝zookeeper-3.4.10.tar.gz

我練習的時候現在這個是穩定版本。

3.2,創建data文件夾,並且修改conf中的配置文件

這裏寫圖片描述

3.3,運行服務

在zookeeper的服務bin中啓動該服務。注意由於默認的端口號2181,所以VMware別忘了開放端口。

4,寫一個小邏輯

寫一個查詢商品的邏輯。可以詳見代碼。

5,在服務端(service)發佈服務

前提是導入dubbo,zookeeper,zkclient的相關依賴導入。

<!-- 發佈dubbo服務 -->
    <!-- 提供方應用信息,用於計算依賴關係 -->
    <dubbo:application name="liussm_manager" />
    <!-- 註冊中心的地址 -->
    <dubbo:registry protocol="zookeeper" address="192.168.113.129:2181" />
    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 聲明需要暴露的服務接口 -->
    <dubbo:service interface="com.liuyang19900520.service.ItemService" ref="itemServiceImpl" />

6,在客戶端(web)引用服務

前提是導入 dubbo,zookeeper,zkclient的相關依賴導入。

<!-- 引用dubbo服務 -->
    <dubbo:application name="taotao_manager_web"/>
    <dubbo:registry protocol="zookeeper" address="192.168.113.129:2181"/>   
    <dubbo:reference interface="com.liuyang19900520.service.ItemService" id="itemService" />

6,先運行服務端再運行客戶端

前提:保證註冊中心的服務開啓的前提下。
簡單分析一下:剛剛開始學習這個用法,說一下感受
註冊中心的服務啓動一個socket接收器,時時刻刻等着連接。而服務端service發佈的服務一旦啓動,便開始與註冊中心的zookeeper連接成功,而這時客戶端web需要引用的服務一旦啓動,再通過zookeeper去搜索發佈的服務。

7,錯誤!

這裏寫圖片描述
這個錯誤我想是一個通過逆向工程生成的pojo沒能夠實現序列化接口造成的。我從資料中找到一個升級版的你先工程,替換掉pojo,然後更新maven工程,再次install。再次嘗試。install的時候應該講web工程和manager工程一同完成。
這裏寫圖片描述

8,監控中心

調整不出來了。後續想個辦法吧。JDK1.8版本不兼容,有些問題。

完成一個小功能

1,寫一個PageController

@Controller
public class PageController {

    @RequestMapping("/")
    public String showIndex() {
        return "index";
    }

    /*
     *取得的參數是jsp中點擊的參數,用PathVariable來接一下。得到的就是easyui中attributes的參數
     *<li data-options="attributes:{'url':'item-add'}">新增商品</li>
     *取出的內容箇舊市item-add
     */
    @RequestMapping("/{page}")
    public String showPage(@PathVariable String page) {
        return page;
    }

}

注意註釋上的內容,能夠完成頁面的跳轉。

2,配置資源映射

如果不配置的話,css和js資源文件就會被攔截,所以不要忘記在mvc的文件中去配置資源映射

<!-- 配置資源映射 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

3,實現商品查詢

3.1,使用easyUI完成的表格代碼(部分)

<table class="easyui-datagrid" id="itemList" title="商品列表" 
       data-options="singleSelect:false,collapsible:true,pagination:true,url:'/item/list',method:'get',pageSize:30,toolbar:toolbar">
    <thead>
        <tr>
            <th data-options="field:'ck',checkbox:true"></th>
            <th data-options="field:'id',width:60">商品ID</th>
            <th data-options="field:'title',width:200">商品標題</th>
            <th data-options="field:'cid',width:100">葉子類目</th>
            <th data-options="field:'sellPoint',width:100">賣點</th>
            <th data-options="field:'price',width:70,align:'right',formatter:TAOTAO.formatPrice">價格</th>
            <th data-options="field:'num',width:70,align:'right'">庫存數量</th>
            <th data-options="field:'barcode',width:100">條形碼</th>
            <th data-options="field:'status',width:60,align:'center',formatter:TAOTAO.formatItemStatus">狀態</th>
            <th data-options="field:'created',width:130,align:'center',formatter:TAOTAO.formatDateTime">創建日期</th>
            <th data-options="field:'updated',width:130,align:'center',formatter:TAOTAO.formatDateTime">更新日期</th>
        </tr>
    </thead>
</table>

由於上述代碼中,我們選中的分頁,所以我們點擊商品查詢時候的請求是
http://localhost:8080/item/list?page=1&rows=30
easyUI使用json數據的要求:使用一個共通的接收數據的pojo

public class EasyUIDataGridResult implements Serializable{

    private long total;
    private List rows;
    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;
    }

}

3.2,使用PageHelper完成分頁

3.2.1,dao.xml中進行配置插件。

位置在sqlSessionFactory的bean中進行配置,我抄的這個練習項目和我現在使用的有差別,我分頁的git路徑在下面,希望學習的朋友可以學習一下:
https://github.com/pagehelper/Mybatis-PageHelper

<property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <!-- 這裏的幾個配置主要演示如何使用,如果不理解,一定要去掉下面的配置 -->
                    <property name="properties">
                        <value>
                            helperDialect=mysql
                            reasonable=true
                            supportMethodsArguments=true
                            params=count=countSql
                            autoRuntimeDialect=true
                        </value>
                    </property>
                </bean>
            </array>
        </property>

3.2.2,寫一下測試代碼

測試代碼我不粘貼了,結果和聯繫項目中的一樣。
這裏寫圖片描述

3.3,完成功能

3.3.1,interface中聲明接口,返回easyUIResult的pojo
3.3.2,service中實現接口,獲得pageInfo對象
3.3.3,web中返回json對象
3.3.4,安裝修改的工程後,重新啓動服務

這裏寫圖片描述

還真是他媽的意外啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章