Spring + Maven + Dubbo + MyBatis + Linner + Handlebars-Web開發環境搭建

  spring + Maven + Dubbo + MyBatis + Linner + Handlebars

                                        - 開發環境搭建

       本文主要分三部分,分別是:後臺核心業務邏輯,橋樑輔助控制和前臺顯示頁面。

       本Web開發環境綜合了多種工具,包括Maven包管理與編譯工具,Dubbo分佈式服務框架,MyBatis數據持久化工工具,Linner頁面管理工具和Handlebars Js模板引擎等前衛的開發工具。

        首先介紹一下:後臺核心業務邏輯搭建。

後臺核心業務邏輯搭建

      後臺核心業務邏輯大致分爲三個層次:底層最的核心數據邏輯層(BIZ層),中間層達博服務實現層(服務IMPL層)多寶服務接口層(服務的客戶端層)。此外還有公共的jar包管理父工程(parent工程)公共業務邏輯工程(common工程)任務調度工程(task工程)總的maven管理工程

      示例如下圖:

       

     接下來我會按照搭建順序簡單介紹一下相關工程的配置:

     基本的順序是父工程→biz工程→通用工程→任務工程→服務客戶端工程→服務工程。


   1.1基本jar包管理和服務環境配置父工程

     父工結構如下圖所示:

     

    父工程主要包括pom工程配置文件,過濾器文件下的三個開發環境配置文件和maven打包蝙蝠批處理命令文件。

    首先介紹一下父工程的pom文件:

     (1)不同的打包環境配置,使用不同的打包配置便利了項目整個開發,測試到生產流程的統一化管理。默認將開發環境激活,配置如下圖所示:

     

   (2)編譯時設置不對指定的資源文件進行替換。包括Freemarker模板文件ftl,靜態-dynamic.xml文件,mybatis動態SQL Mapper文件。如下圖:

    

    (3)工程編碼和打包插件配置:包括工程編碼插件Java版本1.7 ,生成javadoc 插件,打包Java 源碼插件,導入eclipse 工程插件等的配置如下圖所示:

    

   (4)單元測試覆蓋率統計插件配置:

   忽略對以下路徑文件的單元測試覆蓋率統計:action,webapp,interceptor,taglib,domain,model,dto和util / DataFormat.class下圖相應配置信息:

    

   1.2 biz核心業務邏輯工程

       biz工程結構如下圖所示:
       

    按模塊劃分的動態SQLMapper文件:示例:SamStateInfoMapper.xml,如圖1-21

    序號①指定mybatis基本配置文件sqlMapConfig.xml的路徑。

    序號②指定動態SQL Mapper文件的路徑。

    序號③爲基礎的baseDAO Bean的聲明。

    一個包類文件,主資源文件;測試Java包類文件,測試資源文件四大部分組成。

     主Java包類文件的文件路徑爲com.ouc.mkhl.supplier,下按模塊劃分,示例中爲jmx,security和util 3個模塊.security模塊又細分爲advice包,dao 數據訪問對象包,域包,模型數據實體類包和服務服務接口包,服務接口包下包含impl服務接口實現包。

     主資源文件包含郵件郵箱模板文件,日誌配置文件,mybatis配置文件,spring相關配置文件。之後將對各配置文件做逐一介紹。

     測試Java包類文件包含與主Java包相關的各單元測試文件。

     測試資源文件包含springcache文件和mybatis數據持久層發電機配置文件。

     1)biz工程的pom配置文件:如下圖所示:

     

   序號①爲工程的父maven工程配置。

    序號②爲工程的繼承和引用工程關係配置。   

   2)biz工程主資源配置文件說明:

    (1)mybatis配置文件:首先介紹基本的SQLMap配置文:sqlMapConfig.xml

    

    按模塊劃分動態SQLMapper文件:示例:SamStateInfoMapper.xml,如下圖

   

   (2)彈簧相關配置文件:

   ①緩存緩存配置文件:ehcache.xml,spring-cache-security.xml,spring-cache.xml。

   ②jmx運行期系統管理配置文件:spring-jmx-mbean.xml。

   ③按模塊劃分的自定義Bean聲明配置文件:示例:spring-upload.xml

   

   序號①爲類似DAO的數據庫接口操作類Bean。

   序號②爲服務接口Bean方法。

   b爲聲明的切面,a爲前置通知和後置通知要執行的方法。

   ④公用操作的配置文件spring-common.xml。

   

   序號①指定mybatis基本配置文件sqlMapConfig.xml的路徑。

   序號②指定動態SQL Mapper文件的路徑。

   序號③爲基礎的baseDAO Bean的聲明。

   ⑤spring配置工具配置:spring-config-toolkit.xml

   

   ⑥數據源配置:spring-datasource.xml

   

   ⑦Dubbo服務接口發佈配置:spring-dubbo.xml

  

  ⑧服務擴展接口配置:spring-external.xml

  

  ⑨業務日誌配置:spring-log.xml

 

   ⑩Quartz監控配置:spring-monitor.xml

  

  傳輸事物管理配置:spring-transaction.xml


   biz工程代碼示例:

    a.Jmx運行期管理擴展服務:

    用戶暴露系統相關管理接口,以實現運行期調用:ExposeMethodInterface

    

   運行期管理系統接口實現:配置

    

    b。系統初始化:SystemBootstrap

  1. 包com.ouc.mkhl.supplier.util;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.util.Properties;  
  5. import mx4j.tools.adaptor.http.HttpAdaptor;  
  6. import org.apache.commons.logging.Log;  
  7. import org.apache.commons.logging.LogFactory;  
  8. import org.springframework.beans.factory.InitializingBean;  
  9. import org.springframework.core.env.AbstractEnvironment;  
  10. import com.ouc.openplatform.SysException;  
  11. 進口com.ouc.openplatform.console.audit.AuditInfoCollector;  
  12. 進口com.ouc.openplatform.session.listener.MaxSessionUtil;  
  13. import com.ouc.openplatform.util.Env;  
  14. import com.ouc.openplatform.util.HOPConstant;  
  15.   
  16. / **  
  17.  * @author WuPing  
  18. * /  
  19. public class SystemBootstrap實現InitializingBean {  
  20.     / *  
  21.      * CONFIG_FILE_PATH系統變量配置文件路徑  
  22.      * /  
  23.     private static final String  CONFIG_FILE_PATH  =  “/env.properties” ;  
  24.     private static final Log  LOG  =  LogFactory .getLog(SystemBootstrap.class);  
  25.     私人HttpAdaptor httpAdaptor;  
  26.     public static void init(){  
  27.         InputStream  inputStream  =  null ;  
  28.         屬性  屬性 =  new  Properties();  
  29.         嘗試{  
  30.     inputStream SystemBootstrap.class.getResourceAsStream(CONFIG_FILE_PATH);  
  31.             properties.load(inputStream);  
  32.             LOG.info(“系統配置項:”+屬性);  
  33.         } catch(Exception e){  
  34.             “”讀取系統配置文件時發生錯誤:“,e);  
  35.             拋出新的SysException(e);  
  36.         }最後{  
  37.             if(inputStream!= null){  
  38.                 嘗試{  
  39.                     inputStream.close();  
  40.                 } catch(IOException e){  
  41.                     LOG.error(“關閉文件輸入流失敗:”,e);  
  42.                 }  
  43.             }  
  44.         }  
  45.         Env.init(屬性);  
  46.         AuditInfoCollector.setAppNM(Env.getProperty(Env.KEY_SERVER_NAME));  
  47.         HOPConstant.setAppName(Env.getProperty(Env.KEY_SERVER_NAME));  
  48.         //設置一些全局參數  
  49.     MaxSessionUtil.setMaxSessionKey(Env.getProperty(Env.KEY_SERVER_NAME)+“_ MAX_SESSION_KEYS”);  
  50.         //使用spring的配置文件  
  51.     System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME,Env.getProperty(Env.ENV_TYPE));  
  52.     }  
  53.   
  54.     @Override  
  55.     public void afterPropertiesSet()拋出異常{  
  56.         httpAdaptor.start();  
  57.     }  
  58.   
  59.     public void setHttpAdaptor(HttpAdaptor httpAdaptor){  
  60.         this.httpAdaptor  =  httpAdaptor ;  
  61.     }  
  62. }  
     

     c.DAO:SupplyUserDAO:

  1. 包com.ouc.mkhl.supplier.security.dao;  
  2. import java.util.List;  
  3. import com.ouc.mkhl.supplier.security.model.SupplyUser;  
  4. 公共接口SupplyUserDAO {  
  5.     public int deleteByPrimaryKey(String supplycode);  
  6.     public int insert(SupplyUser record);  
  7.     public SupplyUser selectByPrimaryKey(String supplycode);  
  8.     public int updateByPrimaryKey(SupplyUser record);  
  9.     public List SupplyUser  selectAllSupplyUser();  
  10.     public SupplyUser selectByVCode(String supplycode);  
  11. }  
     

    d。型號:SupplyUser

  1. 包com.ouc.mkhl.supplier.security.model;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class SupplyUser實現Serializable {  
  6.   
  7.     private static final long  serialVersionUID  = -123120032141L;  
  8.       
  9.     private String supplycode;  
  10.   
  11.     private String supplypass;  
  12.   
  13.     private String supplyname;  
  14.   
  15.     public String getSupplycode(){  
  16.         返回供應代碼;  
  17.     }  
  18.   
  19.     public void setSupplycode(String supplycode){  
  20.         this.supplycode  =  supplycode  == null?null:supplycode.trim();  
  21.     }  
  22.   
  23.     public String getSupplypass(){  
  24.         返回供應通  
  25.     }  
  26.   
  27.     public void setSupplypass(String supplypass){  
  28.         this.supplypass  =  supplypass  == null?null:supplypass.trim();  
  29.     }  
  30.   
  31.     public String getSupplyname(){  
  32.         返回供應名稱  
  33.     }  
  34.   
  35.     public void setSupplyname(String supplyname){  
  36.         this.supplyname  =  supplyname  == null?null:supplyname.trim();  
  37.     }  
  38. }  

  1.3 service-client服務接口工程

       service-client工程結構如圖:

  

  分爲傳輸DTO包,輔助功能助手包,客戶端服務接口聲明服務包和客戶端工具類util包。

    service-client示例代碼:

     一個。DTO:SupplyUserDTO

  1. 包com.ouc.mkhl.supplier.dto;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import com.ouc.openapi.dubbo.governance.annotation.DubboField;  
  6.   
  7. public class SupplyUserDTO實現Serializable {  
  8.   
  9.     private static final long  serialVersionUID  = -223120032141L;  
  10.       
  11.     @DubboField(description  =  “供應商V碼” )  
  12.     private String supplycode;  
  13.       
  14.     @DubboField(description  =  “供應商登錄密碼 - 未加密” )  
  15.     private String supplypass;  
  16.       
  17.     @DubboField(description  =  “供應商全稱” )  
  18.     private String supplyname;  
  19.   
  20.     public String getSupplycode(){  
  21.         返回供應代碼;  
  22.     }  
  23.   
  24.     public void setSupplycode(String supplycode){  
  25.         this.supplycode  =  supplycode  == null?null:supplycode.trim();  
  26.     }  
  27.   
  28.     public String getSupplypass(){  
  29.         返回供應通  
  30.     }  
  31.   
  32.     public void setSupplypass(String supplypass){  
  33.         this.supplypass  =  supplypass  == null?null:supplypass.trim();  
  34.     }  
  35.   
  36.     public String getSupplyname(){  
  37.         返回供應名稱  
  38.     }  
  39.   
  40.     public void setSupplyname(String supplyname){  
  41.         this.supplyname  =  supplyname  == null?null:supplyname.trim();  
  42.     }  
  43. }  
    b。客戶端服務接口服務:SupplyUserServiceClient

  1. 包com.ouc.mkhl.supplier.service;  
  2.   
  3. import io.terminus.pampas.client.Export;  
  4.   
  5. import com.ouc.openapi.dubbo.governance.annotation.DubboMethod;  
  6. import com.ouc.openapi.dubbo.governance.annotation.DubboParam;  
  7. import com.ouc.openapi.dubbo.governance.annotation.DubboService;  
  8. import com.ouc.mkhl.supplier.dto.SupplyUserDTO;  
  9.   
  10. import java.util.List;  
  11.   
  12. / **  
  13.  *供客戶端調用的遠程接口  
  14.  *   
  15.  * @author WuPing  
  16.  *   
  17.  * /  
  18. @DubboService(description  =  “供應商用戶服務” ,  displayName  =  “SupplyUser服務” )  
  19. 公共接口SupplyUserServiceClient {  
  20.   
  21.     //獲取請求  
  22.     // @return List SupplyUserDTO >  
  23.     @Export(paramNames  = {})  
  24.     @DubboMethod(description  =  “獲取所有供應商用戶信息” ,  displayName  =  “getAllSupplyUsers” ,  returnParamDes  =  “供應商用戶DTO列表” )  
  25.     public List SupplyUserDTO  getAllSupplyUsers();  
  26.   
  27.     //用戶登錄處理  
  28.     @Export(paramNames  = {“username”,“password”})  
  29.     @DubboMethod(description  =  “用戶登錄驗證” ,  displayName  =  “userLogin” ,  returnParamDes  =  “驗證結果” )  
  30.     public String userLogin(  
  31.         @DubboParam(name  =  “username” ,  description  =  “登錄用戶名” ,  example  =  “V187” )String username,  
  32.         @DubboParam(name  =  “password” ,  description  =  “密碼” ,  example  =  “123456” )String password);  
  33.   
  34. }  

  1.4 service-impl服務接口具體實現功能工程

     服務工程結構如圖:

   

    該工程包括異常處理過濾包和客戶端服務接口具體實現impl包。主資源文件有客戶端Dubbo接口發佈基本配置文件spring-dubbo.xml和用戶自定義服務配置文件spring-user-provider.xml。圖所示:

    序號①爲代理平臺分配的應用S碼。

    序號②爲後臺接口代理服務。

    序號③爲服務方法認證相關服務接口。

    序號④爲服務自動註冊接口。

   

    服務代碼

       客戶端接口實現Service-impl:SupplyUserServiceClientImpl
  1. package com.ouc.mkhl.supplier.service.impl;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import javax.annotation.Resource;  
  7. import javax.ws.rs.BeanParam;  
  8. import javax.ws.rs.Consumes;  
  9. import javax.ws.rs.DefaultValue;  
  10. import javax.ws.rs.FormParam;  
  11. import javax.ws.rs.GET;  
  12. import javax.ws.rs.POST;  
  13. import javax.ws.rs.Path;  
  14. import javax.ws.rs.PathParam;  
  15. import javax.ws.rs.Produces;  
  16. import javax.ws.rs.QueryParam;  
  17. import javax.ws.rs.core.MediaType;  
  18.   
  19. import org.springframework.stereotype.Service;  
  20.   
  21. import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;  
  22. import com.ouc.openapi.dubbo.governance.annotation.DubboParam;  
  23. import com.ouc.mkhl.supplier.dto.SupplyUserDTO;  
  24. import com.ouc.mkhl.supplier.service.SupplyUserServiceClient;  
  25. import com.ouc.mkhl.supplier.security.service.SupplyUserService;  
  26. import com.ouc.mkhl.supplier.security.model.SupplyUser;  
  27. import com.ouc.mkhl.supplier.helper.EncryptHelper;  
  28.   
  29. @Path(“supplyUser”)  
  30. @Consumes({ContentType.APPLICATION_JSON_UTF_8,ContentType.TEXT_XML_UTF_8})  
  31. //參數類型  
  32. @Produces({ContentType.APPLICATION_JSON_UTF_8,ContentType.TEXT_XML_UTF_8})  
  33. //返回值類型  
  34. @Service(“supplyUserServiceClient”)  
  35. public class SupplyUserServiceClientImpl implements SupplyUserServiceClient {  
  36.   
  37.     @資源  
  38.     SupplyUserService supplyUserService;  
  39.   
  40.     public SupplyUserService getSupplyUserService(){  
  41.     return supplyUserService;  
  42.     }  
  43.     public void setSupplyUserService(SupplyUserService supplyUserService){  
  44.     this.supplyUserService  =  supplyUserService ;  
  45.     }  
  46.       
  47.     @得到  
  48.     @Path(“getAllSupplyUser”)  
  49.     @Override  
  50.     public List SupplyUserDTO  getAllSupplyUsers(){  
  51.   
  52.     列表SupplyUserDTO supplyUserDTOList  =  new  ArrayList SupplyUserDTO ();   
  53.   
  54.     列表SupplyUser supplyUserList  =  supplyUserService .getAllSupplyUser();   
  55.     for(int   =  ; i  supplyUserList.size (); i ++){   
  56.         SupplyUserDTO  tempSupplyUserDTO  =  new  SupplyUserDTO();  
  57.         tempSupplyUserDTO.setSupplycode(supplyUserList.get(i)  
  58.             .getSupplycode());  
  59.         tempSupplyUserDTO.setSupplypass(s​​upplyUserList.get(i)  
  60.             .getSupplypass());  
  61.         tempSupplyUserDTO.setSupplyname(supplyUserList.get(i)  
  62.             .getSupplyname());  
  63.         supplyUserDTOList.add(tempSupplyUserDTO);  
  64.     }  
  65.   
  66.     return supplyUserDTOList;  
  67.     }  
  68.   
  69.     @SuppressWarnings({“unused”})  
  70.     @得到  
  71.     @Path(“getUserByIdAndName”)  
  72.     @Override  
  73.     public String userLogin(  
  74.         @DefaultValue(“V187”)@QueryParam(“username”)String username,  
  75.         @DefaultValue(“123456”)@QueryParam(“password”)String password){  
  76.     System.out.println(“當前登錄用戶:”+用戶名);  
  77.     String  md5Pass  =  “” ; // MD5處理過的密碼  
  78.       
  79.     //設置登錄反饋信息變量:1-成功; 2-用戶名不存在; 3-密碼無效登錄失敗。  
  80.     String  msg  =  null ;  
  81.   
  82.     EncryptHelper  md5Helper  =  new  EncryptHelper();  
  83.   
  84.     //應用本地庫  
  85.     SupplyUser  suppUser  =  new  SupplyUser();  
  86.       
  87.     嘗試{  
  88.         suppUser  =  supplyUserService .getSupplyUserByVCode(username);  
  89.     } catch(Exception e){  
  90.         suppUser  =  null ;  
  91.         e.printStackTrace();  
  92.     }  
  93.       
  94.     if(suppUser  == null){  
  95.         suppUser  =  new  SupplyUser();  
  96.         if(username.equals(“suptest”)){  
  97.         suppUser.setSupplycode(“V187”);  
  98.         suppUser.setSupplyname(“供應商端測試”);  
  99.         suppUser.setSupplypass(“123456”);  
  100.         }  
  101.         else if(username.equals(“ouctest”)){  
  102.         suppUser.setSupplycode(“ouctest”);  
  103.         suppUser.setSupplyname(“ouc端測試”);  
  104.         suppUser.setSupplypass(“123456”);  
  105.         }  
  106.     } else {  
  107.         嘗試{  
  108.         md5Pass  =  md5Helper .md5Encode(password).toUpperCase();  
  109.         } catch(Exception e){  
  110.         // TODO自動生成的catch塊  
  111.         e.printStackTrace();  
  112.         }  
  113.         System.out.println(“MD5後的密碼:”+ md5Pass);  
  114.         password  =  md5Pass ;  
  115.     }  
  116.   
  117.     //反饋信息設置  
  118.     if(suppUser  == null){  
  119.         msg  =  “2” ; //用戶名不存在  
  120.     } else {  
  121.         if(suppUser.getSupplypass()。equals(password)){  
  122.         if(suppUser.getSupplycode()。equals(“haiertest”)){  
  123.             // msg  =  “1” ; // ouc端用戶登錄  
  124.             msg  =  “ouc” ; // ouc端  
  125.         }  
  126.         else {  
  127.             // msg  =  “0” ; //供應商端用戶登錄  
  128.             msg  =  suppUser .getSupplycode(); //供應商端V碼  
  129.         }  
  130.         } else {  
  131.            msg  =  “3” ; //密碼無效  
  132.         }  
  133.     }  
  134.     返回msg;  
  135.     }  
  136.   
  137. }  

   1.5任務調度工程

      任務調度工程結構如圖:
      
     示例中的爲賬號過期定期掃描作業AccountExpireJob。

    配置文件示例spring-lts-job.xml:如圖1-35所示。

    序號①爲設置作業執行週期。

   

橋樑輔助控制

    橋樑工程結構如下圖所示:
   

    包括控制控制器,輔助類域,excel處理,環境配置過濾器過濾器,操作攔截器攔截器,輔助工具utils等。

資源文件有:spring接口和代理服務配置文件root-context.xml,網頁servlet攔截器配置文件servlet-context.xml,Redis配置文件redis-persistence-context.xml。項目環境配置文件過濾器,網頁web.xml配置文件。

    1)項目環境配置文件過濾器:dev.properties,如下圖所示。

   dev.properties文件中:

    序號①爲項目環境類別說明。

    序號②爲日誌配置。

    序號③爲項目驗證網址地址。

    序號④爲redis相關配置。

    序號⑤爲dubbo相關配置。

    序號⑥爲項目中央倉庫地址配置。

    序號⑦爲集羣平臺兵馬俑配置。

    ★序號⑧爲與頁面工程相關的配置:

    應用簡稱(app.name),服務器名稱(server.name),與頁面工程有關的服務Key(server.key),dubbo應用名(dubbo.application.name),頁面工程路徑(publicPathPrefix),瀏覽器訪問域名(domain.name)和默認跳轉頁面(login.after.jump.url)。

    序號⑨爲項目集團內網和外網環境安全配置。

   
   

   2)Web.xml配置文件:

   主要內容有配置系統啓動監聽器startupListeners,基於緩存實現的集羣會話配置和編碼過濾等內容。

  

前臺頁面工程

  1)頁面工程結構如下。

  典型的被管理的項目前端工程結構如下:

├─a  app ## app 是開發者自開發代碼的存儲目錄。
│├─ A1:部件 ## 存放項目的組件文件。
││└─dropdown ## 示例組件(此處假設爲下拉)。
││└─ 模板## 組件自身的前端模板。
││├─view.coffee | view.js ## 組件js,可以使咖啡也可以是js。
││├─view.hbs ## 組件模板
││└─view.scss | view.css  ## 組件樣式文件,可以是scss,也可以是css。
│├─ A3:圖片 ## 存放項目相關的圖片文件。
││└──logo.png 
│├─ A5:腳本 ## 存放項目相關的的JavaScript文件。
展示│展示│└──app.coffee 
展示│├─ A6:風格 ## 存放項目相關的樣式表文件。
││└──app.scss 
│├─ A7:模板 ## 存放項目相關的前端模板文件。
││└──welcome.hbs 
│├─ A8:意見 ## 用於存放項目相關的頁面文件。
││└──index.html 
│└─ A2:文件 ## 用於存放相關配置文件,例如front_config.yaml等。
├─bin ## 用戶可以基於本啓動本地服務器(以當前文件夾爲根),當然更好的選擇是適用的。
│└──服務器。
├─config.yml ## 是整個項目的配置文件。
├─b public ## 是項目執行linner build後生成的打包文件位置,是發佈項目所需的所有文件。
├──測試 ## 測試前端項目的單元測試文件所在目錄。
└─c   vendor ## 存放引入的第三方代碼組件,例如jQuery,Underscore等.

                    

   2)頁面調用後臺服務

   
   
 特別注意:配置文件對空格敏感,請謹慎編寫。

  3)整個項目的配置文件config.yml。

  

  4)後端服務back_config.yaml配置:

  

  5)前端頁面引用服務front_config.yaml配置:

  

    6)頁面hbs示例:

  組件類型調用服務示例

  

   ajax類型服務調用方式


  

  友情鏈接:

   手把官網:http : //handlebarsjs.com/

   Node.js官網:https//nodejs.org/en/

   CoffeeScript中文網:http : //coffee-script.org/#top

   Redis中文官網:http : //www.redis.cn/

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