现在介绍常量的配置,主要用于客户端(as3)与服务端(java)之间的常量同步,比如错误码、请求标识等

配置格式:

<macros name="Macros" groupStart="16" groupEnd="128" bitOffset="20" author="idoublewei" note="宏定义">
<macro name="SEX_MALE" type="integer" value="0" note="性别:男"/>
<macro name="SEX_FEMALE" type="integer" value="1" note="性别:女"/>
<group name="WEEK" type="string" value="week" note="星期">
<macro name="WEEK_MON" type="string" value="monday" note="星期一"/>
<macro name="WEEK_TUE" type="string" value="tuesday" note="星期二"/>
</group>
</macros>

常量定义只能有一个根节点 macros,子节点 macro 表示一个常量,子节点 group 同样表示一个常量,但它与其下子节点 macro 有一层特殊的关系,下面在说明 groupStart 和 groupEnd 的时候再详细说明。

macros :

---name 常量类名 - 必须指定

---groupStart 起始分组编号 - 非必须,默认1。解释:有的常量是不关心值的,但必须相互唯一,这时就可以让程序自动计算常量的值,这种常量类型为 integer,该值的意义可见 bitOffset 解释

---groupEnd 结束分组编号 - 非必须,默认 Integer.MAX_VALUE,解释同 groupStart

---bitOffset 自动计算的常量的有效低位。解释:假设该值取 24,自动计算的常量值为 0x24565842,则该常量的高 8(0x24) 位为分组编号(位于 groupStart 与 groupEnd 之间),后 24(0x565842) 位为常量的有效编号

---author 常量类创建者 - 非必须

---note 常量类注释 - 非必须

macro, group :

---name 常量名 - 必须指定

---type 常量类型(区分大小写) - 非必须\

------object 基类

------string 字符串

------integer 整数

------unsigned 非负整数

------decimal 小数

------bool 布尔值

------array 数组,后可接符号 "|" + 元素类型(默认为 object),例如 - array|Integer

------date 日期

---value 常量值(区分大小写) - 非必须,null 表示空

------如果 type 为 bool,则取值:true, false

------如果 type 为 array,则取值: new - 新建对象

------如果 type 为 date,则取值:new - 新建对象。 ms - 日期毫秒数,后接符号 "|" + 数字,例如 - ms|428, format - 日期字符串,后接符号 "|" + 日期格式字符,例如 - format|14-04-16 20:15:36 637

---note 常量注释 - 非必须

需要注意的是

---如果未同时指定 type 和 value,则默认类型为 integer,value 由 groupStart 和 groupEnd 计算

---如果未指定 type,但指定了 value,默认类型为 string

---如果指定的类型为自定义类,则会原样输出,所以指定为自定义类时,最好将自定义类包路径写上,如 com.vo.MyClass

这儿这个 groupStart 和 groupEnd 可能会让人有点不好理解。举个例子,每个应用或游戏都会分很多模块,每个模块的相关请求命令都会写到相关的模块类中,比如

---用户模块 : 注册请求,登录请求

---好友模块 :加好友请求,查询好友请求

如果这样定义请求常量

<macros name="ReqMacros" groupStart="1" groupEnd="100" bitOffset="24" author="idoublewei" note="请求命令常量">

  <group name="USER_MODULE" note="用户相关请求命令模块">
    <macro name="USER_REGISTER" note="注册用户,参数 : userName, password"/>
    <macro name="USER_LOGIN" note="登录用户,参数 : userName, password"/>
  </group>   <group name="FRIEND_MODULE" note="好友相关请求命令模块">
    <macro name="FRIEND_ADD" note="添加好友"/>
    <macro name="FRIEND_SEARCH" note="查询好友"/>
  </group> </macros>

例子中所有的常量都没指定类型 type 和值 value,则会自动计算常量值。自动计算的规则:

常量值的计算公式 : index + (group << bitOffset)

---index 当前分组的第 index 个常量

---group 当前分组号,macros 下的直接常量 macro 的分组号从 groupStart 开始,第1个 group 节点的分组号从 groupStart + 1 开始。如果 macros 总的分组大于了 groupEnd - groupStart + 1,则会忽略超出的配置分组

---bitOffset (32 - bitOffset)表示常量值的高几位代表该常量的分组号

根据该配置,可以得到 as3 常量类

package
{
/**
* 请求命令常量
* @author idoublewei 2014-05-24 10:03:30
*/
public class ReqMacros
{ /** 用户相关请求命令模块 */
static public const USER_MODULE:int = 33554432;
/** 注册用户,参数 : userName, password */
static public const USER_REGISTER:int = 33554433;
/** 登录用户,参数 : userName, password */
static public const USER_LOGIN:int = 33554434;
/** 好友相关请求命令模块 */
static public const FRIEND_MODULE:int = 50331648;
/** 添加好友 */
static public const FRIEND_ADD:int = 50331649;
/** 查询好友 */
static public const FRIEND_SEARCH:int = 50331650; }
}

java 常量类

/**
* 请求命令常量
* @author idoublewei 2014-05-24 10:03:30
*/
public class ReqMacros { /** 用户相关请求命令模块 */
static public final int USER_MODULE = 33554432;
/** 注册用户,参数 : userName, password */
static public final int USER_REGISTER = 33554433;
/** 登录用户,参数 : userName, password */
static public final int USER_LOGIN = 33554434;
/** 好友相关请求命令模块 */
static public final int FRIEND_MODULE = 50331648;
/** 添加好友 */
static public final int FRIEND_ADD = 50331649;
/** 查询好友 */
static public final int FRIEND_SEARCH = 50331650; }

我们可以看到

---USER_MODULE 常量的值写成16进制为 0x02000000,USER_REGISTER 为 0x02000001,USER_LOGIN 为 0x02000002

---FRIEND_MODULE  常量的值写成16进制为 0x03000000,FRIEND_ADD 为 0x03000001,FRIEND_SEARCH 为 0x03000002

可以看出来,常量值的低 bitOffset 位可作为实际请求命令,剩余的高 (32 - bitOffset) 位可以解释成该请求命令属于哪个模块。这样的常量值定义有什么好处呢?来试着写一下服务端的请求处理吧。

---用户请求的处理可以写成 UserFacade,专门处理高 (32 - bitOffset) 位为 2 的请求命令

---好友请求的处理可以写成 FriendFacade,专门处理高 (32 - bitOffset) 位为 3 的请求命令

然后写一个接口 IFacade 定义为请求处理接口,如下

/**
* 请求处理接口
* @author idoublewei
*/
public interface IFacade { /**
* 处理请求
* @param command 请求命令
* @param param请求参数
* @return 请求返回的数据
*/
Object request(int command, Object param); }

那么可以让前面的 UserFacade implements IFacade,FriendFacade implements IFacade,这样所有请求处理都归结到 IFacade 了。然后再定义一个 FacadeMgr 类,专门管理请求的分发,如下

import java.util.HashMap;
import java.util.Map; public class FacadeMgr { //这个就是配置中的 bitOffset
private int bitOffset = 24;
private Map<Integer, IFacade> commandModuleFacadeMap = new HashMap<Integer, IFacade>(); /** 注册模块接口 */
public void registerFacade(int commandModule, IFacade facade) {
commandModuleFacadeMap.put(Integer.valueOf(commandModule) >>> bitOffset, facade);
}
/** 处理请求 */
public Object request(int command, Object param) {
if (commandModuleFacadeMap.containsKey(Integer.valueOf(command >>> bitOffset))) {
return commandModuleFacadeMap.get(Integer.valueOf(command >>> bitOffset)).request(command, param);
}
return null;
} }

可以在服务启动初始化时注册相关请求处理接口

FacadeMgr facadeMgr = new FacadeMgr();
facadeMgr.registerFacade(ReqMacros.USER_MODULE, new UserFacade());
facadeMgr.registerFacade(ReqMacros.FRIEND_MODULE, new FriendFacade());

当前请求到达时,可以直接请用

facadeMgr.request(reqCommand, reqParam);

as3+java+mysql(mybatis) 数据自动工具(五)的更多相关文章

  1. as3+java+mysql(mybatis) 数据自动工具(一)

    在页游中,大部分的开发模式都是:客户端(as3)+ 服务端(java)+ 数据库(mysql). 在这3个部分会有一个相同的部分就是数据结构.比如一个用户数据,在客户端使用类 UserVO(as3) ...

  2. as3+java+mysql(mybatis) 数据自动工具(四)

    现在介绍一下只配置 as3 与 java 公用的数据类,这种配置一般是该数据类只需要在 as3 与 java 之间转换,跟数据库没有关系.比如在客户端与服务端的数据交换中,需要定义一个统一返回请求的数 ...

  3. as3+java+mysql(mybatis) 数据自动工具(七) - 完结

    autoscript packed 文件地址:http://pan.baidu.com/s/1dDvgcO5 如果需要项目源码的话,可以留下邮箱,先声明一下,该工具主要是为了实现自动同步输出代码类文件 ...

  4. as3+java+mysql(mybatis) 数据自动工具(三)

    介绍一下数据类配置,该数据类配置主要用于需要将数据库 mysql 数据转换成 java 对象,再转换为 as3 对象的数据类 配置文件为 xml 格式. <objects> <obj ...

  5. as3+java+mysql(mybatis) 数据自动工具(二)

    AutoScript 项目结构如下图 ---AutoScript.java 为程序入口 ---com.autoscript.object 同步 as3 和 java 的数据类 ---com.autos ...

  6. as3+java+mysql(mybatis) 数据自动工具(六)

    这篇来写一些常量定义的实例.我一般在配置常量的时候,都会让 bitOffset = 20,这样是一个比较好的分配,就是每个分组可以有 0xFFFFF(1048575) 个常量,0xFFF(4095) ...

  7. java+Mysql大数据的一些优化技巧

    众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法; 例如,我们要将 ...

  8. Java+MySql图片数据保存与读取的具体实例

    1.创建表: drop table if exists photo;CREATE TABLE photo (    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ...

  9. Java+MySql图片数据保存

    之前一直没有做过涉及到图片存储的应用,最近要做的东东涉及到了这个点,就做了一个小的例子算是对图片存储的初试吧! 1.创建表: drop table if exists photo; CREATE TA ...

随机推荐

  1. iPhone手机屏幕的尺寸

    以下是 iPhone的型号和对应的屏幕宽高 英寸  宽 高  厚度 3.5   320 480 4s      ipad   系列   4   320 568 5   5s   4.7  375 66 ...

  2. 1058: [ZJOI2007]报表统计 - BZOJ

    Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个非 ...

  3. 利用手上的UI资源(附免费UI工具包)

    http://www.uisdc.com/how-to-use-ui-kits# 大家都知道,UI工具包里有很多好看的资源:比如按钮.滑块.面包屑.播放器.表单,甚至是一个"赞!" ...

  4. discuz云平台报调用远程接口失败的问题分析和解决

    根据网络两篇文章整理 问题描述:当开通或关闭某个云平台服务的时候,报如下错误信息:调用远程接口失败.请检查您的服务器是否处于内网以及您服务器的防火墙设置. 云平台测试站点的接口文件正常,于是开始在文件 ...

  5. 让wordpress投稿作者在后台只看到自己的文章

    wordpress支持多作者撰写,让更多的人参与网站内容的创建是个不错的想法,UGC(User-generated content)使网站主题更丰富,不同的内容吸引不同的受众,一个好的网站应该多产生U ...

  6. Eclipse 插件开发 —— 深入理解查找(Search)功能及其扩展点

    引言 查找功能是计算机语言开发环境 / 平台的一个非常重要的特性.Eclipse 也不例外,它提供了丰富的查找功能(用户可以输入正则表达式或任意字符串,指定查找范围和匹配选项等等),并且提供了简单易用 ...

  7. SDUT2191Calendar

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2191 题意:给你两个年月日,让你算出其中经历了 ...

  8. 关于PYTHON的反射,装饰的练习

    从基本概念,简单例子才能慢慢走到高级一点的地方. 另外,PYTHON的函数式编程也是我很感兴趣的一点. 总体而言,我觉得OOP可以作大的框架和思路,FP能作细节实现时的优雅牛X. ~~~~~~~~~~ ...

  9. 获取Android系统时间

    目的: 输入 2014-09-09 14:02:03    输出 等待:1小时20分 注意: HH:mm:ss 为获取手机 24小时格式的时间  15:03    hh:mm:ss 为12小时模式的时 ...

  10. php关于private、public成员变量访问问题

    如果类里面定义了__get($name)方法,则不论类的private成员还是public成员,都能够在类的外面通过类似$class->name访问到.如果是public变量,则不会自动调用ge ...