最近写了一个微信平台的架构,采用servlet + spring3.0 + hibernate4.1。整体架构由我负责建设,我尽可能的把业务模块分出来。趁着刚搭好的框架,留着这版。代码是大部份都由其他成熟框架直接 copy过来整合,去掉了一些没用的配置。部分我加入的设计也都是自己经过长时间项目提炼出来的,所有代码稳定性大可放心,并且难度不大。源码我也贴网上,希望有人帮我一起完善一下!不足处也请批评指正。

贴出部分代码,用到了部分设计模式,代码可读性比较好。没什么技术含量,里面有一些涉及微信平台的业务代码可能会有点难懂,如果您认为还不错,那就点个赞。如果认为还值得改进,那也麻烦提出来,我也近期慢慢改进。

代码贴在这里,如果有人愿意一同学习进步,后期就放到github上面去,现阶段我将持续改进。

下载地址

http://pan.baidu.com/s/1i320J3n

spring部分代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
  10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
  11. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
  12. ">
  13.  
  14. <!-- 扫描注解Bean -->
  15. <context:component-scan base-package="com.cpic">
  16. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  17. </context:component-scan>
  18.  
  19. <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  20. <property name="locations">
  21. <list>
  22. <value>classpath:resources.properties</value>
  23. </list>
  24. </property>
  25. </bean>
  26.  
  27. <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
  28. <property name="alias" value="proxoolDataSource"/>
  29. <property name="driver" value="${connection.driver_class}" />
  30. <property name="driverUrl" value="${connection.url}" />
  31. <property name="user" value="${connection.username}" />
  32. <property name="password" value="${connection.password}" />
  33. <property name="maximumConnectionCount" value="${proxool.maximum.connection.count}"/>
  34. <property name="minimumConnectionCount" value="${proxool.minimum.connection.count}" />
  35. <property name="statistics" value="${proxool.statistics}" />
  36. <property name="simultaneousBuildThrottle" value="${proxool.simultaneous.build.throttle}"/>
  37. </bean>
  38.  
  39. <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
  40. <property name="dataSource" ref="dataSource"/>
  41. <property name="packagesToScan">
  42. <list>
  43. <value>com.cpic</value>
  44. </list>
  45. </property>
  46. <property name="hibernateProperties">
  47. <props>
  48. <prop key="hibernate.dialect">${hibernate.dialect}</prop>
  49. <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
  50. <prop key="hibernate.format_sql">true</prop>
  51. <prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop>
  52. <prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop>
  53. <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop>
  54. <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
  55. <prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop>
  56.  
  57. <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
  58. <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
  59. <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
  60. <prop key="net.sf.ehcache.configurationResourceName">${net.sf.ehcache.configurationResourceName}</prop>
  61. <prop key="hibernate.cache.use_structured_entries">${hibernate.cache.use_structured_entries}</prop>
  62. <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
  63.  
  64. <!--
  65. <prop key="hibernate.connection.datasource">${hibernate.connection.datasource}</prop>
  66. <prop key="hibernate.connection.provider_class">${hibernate.connection.provider_class}</prop>
  67. <prop key="hibernate.jndi.class">${hibernate.jndi.class}</prop>
  68. -->
  69.  
  70. </props>
  71. </property>
  72. </bean>
  73.  
  74. <!-- 开启AOP监听 只对当前配置文件有效 -->
  75. <aop:aspectj-autoproxy expose-proxy="true"/>
  76.  
  77. <!-- 开启注解事务 只对当前配置文件有效 -->
  78. <tx:annotation-driven transaction-manager="txManager"/>
  79.  
  80. <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  81. <property name="sessionFactory" ref="sessionFactory"/>
  82. </bean>
  83.  
  84. <tx:advice id="txAdvice" transaction-manager="txManager">
  85. <tx:attributes>
  86. <tx:method name="save*" propagation="REQUIRED" />
  87. <tx:method name="add*" propagation="REQUIRED" />
  88. <tx:method name="create*" propagation="REQUIRED" />
  89. <tx:method name="insert*" propagation="REQUIRED" />
  90. <tx:method name="update*" propagation="REQUIRED" />
  91. <tx:method name="merge*" propagation="REQUIRED" />
  92. <tx:method name="del*" propagation="REQUIRED" />
  93. <tx:method name="remove*" propagation="REQUIRED" />
  94. <tx:method name="put*" propagation="REQUIRED" />
  95. <tx:method name="use*" propagation="REQUIRED"/>
  96. <tx:method name="send*" propagation="REQUIRED" />
  97. <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到-->
  98. <tx:method name="get*" propagation="REQUIRED" read-only="true" />
  99. <tx:method name="count*" propagation="REQUIRED" read-only="true" />
  100. <tx:method name="find*" propagation="REQUIRED" read-only="true" />
  101. <tx:method name="list*" propagation="REQUIRED" read-only="true" />
  102. <tx:method name="*" read-only="true" />
  103. </tx:attributes>
  104. </tx:advice>
  105. <aop:config expose-proxy="true">
  106. <!-- 只对业务逻辑层实施事务 -->
  107. <aop:pointcut id="txPointcut" expression="execution(* com.cpic..service.*.*(..))" />
  108. <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
  109. </aop:config>
  110.  
  111. <!-- spring启动时加载spring工具类 -->
  112. <bean id="springUtils" class="com.cpic.common.util.SpringContextUtil"></bean>
  113.  
  114. </beans>

部分业务 spring配置:

  1. <bean id="textReceviService" class="com.cpic.basemsg.service.impl.TextReceviService"></bean>
  2.  
  3. <bean id="eventReceviService" class="com.cpic.basemsg.service.impl.EventReceviService"></bean>
  4.  
  5. <!-- 在线咨询 -->
  6. <bean id="onlineAskEventImpl" class="com.cpic.basemsg.service.event.impl.OnlineAskEventImpl"></bean>
  7. <!-- 卡单激活 -->
  8. <bean id="activeCareEventImpl" class="com.cpic.basemsg.service.event.impl.ActiveCareEventImpl"></bean>
  9. <!-- 客户回访 -->
  10. <bean id="custReVisEventImpl" class="com.cpic.basemsg.service.event.impl.CustReVisEventImpl"></bean>
  11. <!-- 道路救援 -->
  12. <bean id="roadHelpEventImpl" class="com.cpic.basemsg.service.event.impl.RoadHelpEventImpl"></bean>
  13. <!-- 自助报案 -->
  14. <bean id="selfPoliceEventImpl" class="com.cpic.basemsg.service.event.impl.SelfPoliceEventImpl"></bean>
  15.  
  16. <bean id="wechatMng" class="com.cpic.basemsg.service.WeChatMng">
  17. <property name="map">
  18. <map>
  19. <entry key="text">
  20. <ref local="textReceviService"/>
  21. </entry>
  22. <entry key="event">
  23. <ref local="eventReceviService"/>
  24. </entry>
  25. </map>
  26. </property>
  27.  
  28. <property name="baseMap">
  29. <map>
  30. <entry key="btn13">
  31. <ref local="onlineAskEventImpl"/>
  32. </entry>
  33. <entry key="btn21">
  34. <ref local="roadHelpEventImpl"/>
  35. </entry>
  36. <entry key="btn22">
  37. <ref local="selfPoliceEventImpl"/>
  38. </entry>
  39. <entry key="btn23">
  40. <ref local="custReVisEventImpl"/>
  41. </entry>
  42. <entry key="btn24">
  43. <ref local="activeCareEventImpl"/>
  44. </entry>
  45. </map>
  46. </property>
  47. </bean>

业务解耦类

  1. package com.cpic.basemsg.service;
  2.  
  3. import java.util.Map;
  4.  
  5. /**
  6. * 设计这个类,主要是为了解耦,可实现对逻辑层的配置,将业务更细化
  7. * 将一些共同特性统一处理
  8. * @author wuxw
  9. *
  10. */
  11. public class WeChatMng {
  12.  
  13. static Logger logger = Logger.getLogger(WeChatMng.class);
  14.  
  15. @SuppressWarnings("unchecked")
  16. public WeChatService weChatService;
  17.  
  18. @SuppressWarnings("unchecked")
  19. private Map<String,WeChatService> map;
  20.  
  21. private Map<String,BaseEventService> baseMap;
  22.  
  23. /** 点击事件*/
  24. public BaseEventService baseEventService;
  25.  
  26. public void setMap(Map<String, WeChatService> map) {
  27. this.map = map;
  28. }
  29.  
  30. public void setBaseMap(Map<String, BaseEventService> baseMap) {
  31. this.baseMap = baseMap;
  32. }
  33.  
  34. /**
  35. * 对不同消息类型的控制转发
  36. * @param msgType
  37. * @param wxMsgXml
  38. * @return
  39. */
  40. public String process(String msgType,String wxMsgXml) throws BaseMsgException{
  41. if(msgType == null || msgType == ""){
  42. logger.error("请求消息:" + msgType);
  43. throw new BaseMsgException("请求消息为空!");
  44. }
  45. weChatService = map.get(msgType);
  46. if(null == weChatService){
  47. throw new BaseMsgException("不支持的接口类型:" + msgType);
  48. }
  49. return weChatService.process(wxMsgXml);
  50. }
  51.  
  52. /**
  53. * 对不同事件的控制转发
  54. * @parama clickKey 按钮编号
  55. * @return
  56. * @throws BaseMsgException 业务异常
  57. */
  58. public String processEvent(String click,EventMsgModel model) throws BaseMsgException{
  59. if(click == null){
  60. throw new BaseMsgException("不存在的点击事件:" + click);
  61. }
  62. if(model == null){
  63. throw new BaseMsgException("传入的事件消息为null!" );
  64. }
  65. baseEventService = baseMap.get(click);
  66. if(baseEventService == null){
  67. throw new BaseMsgException("暂时不支持的点击参数:" + click);
  68. }
  69. return baseEventService.process(model);
  70. }
  71.  
  72. }

部分类的核心设计

  1. /**
  2. * 抽象出功能模块
  3. * 信息的处理流程分三步依次进行:
  4. * 1. 接收信息
  5. * 2. 处理信息
  6. * 3. 返回信息
  7. * 并且这个顺序不能变,强制使用处理信息的流程
  8. * 我们只需要关心业务处理的方式
  9. * @author wuxw
  10. *
  11. */
  12. public abstract class WeChatServiceAbs<T extends BaseMsgModel> extends CommonHibernateDao implements WeChatService<BaseMsgModel> {
  13.  
  14. /**
  15. * 处理消息,用模版的形式对各模块独立
  16. * @param xmlMsg 传入消息
  17. * @return 返回处理后的消息
  18. * @throws WeChatException
  19. */
  20. public String process(String xmlMsg) throws BaseMsgException{
  21. MsgModel msg = reviceMsg(xmlMsg);
  22. return processMsg(msg).toString();
  23. }
  24. }

java微信平台,发源码的更多相关文章

  1. 沐雪多用户微信公众平台开发源码,商城小程序源码(2018年最新的asp.net C# 微信源码,小程序源码)

    现售价5400元,就可以搭建自己的微信平台啦 购买地址:https://item.taobao.com/item.htm?id=539102325336 该系统是由[上海沐雪网络]独家授权销售,其他地 ...

  2. Java微信公众平台开发_07_JSSDK图片上传

    一.本节要点 1.获取jsapi_ticket //2.获取getJsapiTicket的接口地址,有效期为7200秒 private static final String GET_JSAPITIC ...

  3. JAVA微信扫码支付模式二功能实现完整例子

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

  4. Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

    转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是 ...

  5. Java微信公众平台开发_03_消息管理之被动回复消息

    GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图, ...

  6. java微信扫码支付Native(模式二)

    官方开发文档模式二的地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 pom文件的依赖: <?xml versio ...

  7. Java之微信支付(扫码支付模式二)案例实战

    摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路. 一:微信支付接入准备工作: 首先, ...

  8. Java中的微信支付(2):API V3 微信平台证书的获取与刷新

    1. 前言 在Java中的微信支付(1):API V3版本签名详解一文中胖哥讲解了微信支付V3版本API的签名,当我方(你自己的服务器)请求微信支付服务器时需要根据我方的API证书对参数进行加签,微信 ...

  9. java 微信公众服务平台 下发 模板消息

    java 微信公众服务平台 下发 模板消息 (一).部分截图 (二).部分代码 (一).部分截图: (二).部分代码: //此处 给用户微信发消息... Map<String,String> ...

随机推荐

  1. APP 半自适应 WEB页面

    特别赶,响应式纯自适应的,有空写了新的发. (在手机上看,页面上看一定乱) <!DOCTYPE html><html> <head> <meta http-e ...

  2. centos下mysql 最新版最终成功安装!备份一下几个关键地方

    我本来仅仅是为了搭建简单的LAMP环境,亲自己主动手,却发现有这么多的问题会发生.(by default7#zbphp.com) 非常多地方给的安装Mysql的提示是通过yum一键安装.shell命令 ...

  3. installshield 32位打包和64位打包的注意事项

    原文:installshield 32位打包和64位打包的注意事项 32/64位问题要把握几点:1. 明确你的产品是否需要区分32/64位2. 明确你的产品中是否有32/64位的服务注册3. 了解In ...

  4. Java堆栈(转)

     Java栈与堆 ----对这两个概念的不明好久,最终找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自己主动管理栈和堆, ...

  5. 注意,WebDeploy服务会占用80端口。(Windows关闭了IIS,80端口任然被占用)

    最近遇到一个很奇怪的事情,Windows上的 IIS 网站 全关掉了,80端口仍然被占用.然后我新装了一台服务器,一个一个组件地装,装一个测一次,最后发现,WebDeploy这个组件,会占用80端口. ...

  6. VS2015预览

    VS2015预览版体验   .NET开源了,JAVA颤抖吧...据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样 ...

  7. [译]在运行时内存中的Java对象是怎么样的

    (文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...

  8. [译]关于Java 字符串最常被问到的十个问题

    (说明,该文章翻译自Top 10 questions of Java Strings) 下面是关于Java字符串最常被问到的十个问题 1.怎么去比较字符串?使用==还是使用equals()? 简单来说 ...

  9. JavaScipt中对DOM的理解

    一.理解DOM 浏览器通过文档对象模型DOM使JavaScript程序可以访问页面上的元素,而DOM是页面上XHTML中文档正文标题.段落.列表.样式ID.class以及所有其他出现的数据的一个内部表 ...

  10. beanutils中类型转换

    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws Servl ...