Spring + Maven + Dubbo + MyBatis + Linner + Handlebars-Web开发环境搭建

来源:互联网 发布:淘宝众筹 淘宝怎么不管 编辑:程序博客网 时间:2024/05/01 14:12

  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

[HTML] 查看普通拷贝打印 
在CODE上查看代码片派生到我的代码片
  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:

[HTML] 查看普通拷贝打印 
在CODE上查看代码片派生到我的代码片
  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

[HTML] 查看普通拷贝打印 
在CODE上查看代码片派生到我的代码片
  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

[html] 查看纯文本 
打印在CODE上查看代码片派生到我的代码片
  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

[html] 查看纯文本 
打印在CODE上查看代码片派生到我的代码片
  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
[html] 查看纯文本 
打印在CODE上查看代码片派生到我的代码片
  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/

1 0
原创粉丝点击