Atitit 通用接口的设计与实现attilax 总结
1. 现存的情况与预计目标 1
1.1. 实现零配置零注解 1
1.2. 4gl dsl sql sp接口 优先于3gl接口 1
1.3. 异常模型 代替返回值模型 1
1.4. 接口返回数据类型 指定 2
1.5. 返回结果 多种序列化格式 2
1.6. 异常传递模型 代替返回值模式 2
2. 通用接口原理与概念 2
2.1. 参照 Autoit Autohotkey pinvoke jna的模式 2
2.2. Ajax+ Jsbridge 3
2.3. Web rest版数据库接口, Rest+jdbc+mybatis+dbutil 3
3. 三大接口 3
3.1. 通用版全功能接口http param模式 范例 ( 可以运用于任何场合) 3
3.2. 通用版数据操作sql接口 (快速开发接口,适用与内部人员操作模块) 3
3.3. 通用版数据sp存储过程调用接口 (快速开发接口,适用于任何场合) 4
4. 后记 5
4.1. 核心代码 5
4.2. 未来的展望 dsl 模式 6
4.3. 未来的展望 dsl第二发展,支持表达式方法链 7
增加接口通用度。,每增加一个子接口,无需做任何的配置和注解
其次对于数据库操作,3gl接口比较繁琐 ,增加了4gl dsl sql sp接口
其次,接口的返回值模型稍有繁琐。。可以使用异常模型代替
返回类型类型就是str int等,支持复杂格式map list,以及对象。
返回序列化格式,即是结果使用什么样的序列化返回结果。。支持json ,预计还要支持xml yaml
异常拥有比返回值更好的处理模式。
异常序列化为指定的序列化格式返回,传递给调用端。。
直接指明要调用的类与方法名。后台通过反射的模式调用。。
类似 pinvoke , jna 模式
DllCall ( "dll", "返回值类型", "函数名称" [, 类型1, 参数1[, 类型n, 参数n]] ) AutoIt中的参数类型与Win32 API中的参数类型不完全相同,这点要注意。
Autohotkey
Result := DllCall("[DllFile/]Function" [, Type1, Arg1, Type2, Arg2, "Cdecl ReturnType"])
http://localhost:8080/AjaxJsbridge_HttpparamMode_servlet?m=com.attilax.rest.Class4test.m1&p1=123
createmode参数: 类的创建模式 默认为动态new创建模式
。静态类的方法调用 为static
动态类,默认值,或者使用new
m:或者method ,指明要调用的方法,全类名加方法名,比如com.attilax.rest.Class4test.m1
retType:返回数据类型int str map list obj等
retFmt:返回数据序列化格式,一般为json,也可以为none,xml,默认为json
P1_type :第一个参数类型 有str int 等,默认为str
P1:第一个参数
P2_type:第二个参数类型
P2:第二个参数
iocFac:ioc工厂:支持spring guice new 工厂模式,默认为com.attilax.rest.JavaNewCreatorFac
morennew 工厂模式为 com.attilax.rest.JavaNewCreatorFac
特点::
全功能接口。
开发效率不是最高
http://localhost:8080/AjaxJsbridge_HttpparamMode_servlet?m=com.attilax.db.DbServiceV4qb9.executeQuery&p1=select+*+from+ecs_users+limit+10&iocFac=com.attilax.ioc.Ioc4other
注意:此数据接口是为快速开发而设置的,直接使用sql dsl存取数据,方便快捷。适用于后端管理,以及内部管理系统模块,适用于用户特定以及内部用户的模块。不适用于面向广大不特定用户的模块。。
面向广大不特定用户的模块需要隐藏sql,传递sql语句id即可,具体的sql语句应该存储在存储过程,代码或者配置文件里面 。。需要使用存储过程接口或其他接口即可
特点::
开发效率貌似最高
非全功能接口,只针对数据操作接口。其次,不适用于面向公众人员使用的模块。
调用存储过程mysql,即是使用特定sql语句,call 调用存储过程即可,比如call `sp_查询用户`('mer')。。
http://localhost:8080/AjaxJsbridge_HttpparamMode_servlet?m=com.attilax.db.DbServiceV4qb9.executeQuery&p1=call+`sp_查询用户`('mer')&iocFac=com.attilax.ioc.Ioc4other
即是p1参数为 call `sp_查询用户`('mer')。。 ,注意url参数的urlencode编码
特点::
开发效率较高
非全功能接口,只针对数据操作接口。
@Override
public void service(ServletRequest req, ServletResponse response) {
try {
HttpServletRequest req2 = (HttpServletRequest) req;
Global.req.set(req2);
String iocx =get_iocFac( req.getParameter("iocFac"));
String class_meth_full = (getMeth(req));
String cls =refx.getClassName(class_meth_full);
String meth_name=refx.getMethodName(class_meth_full);
Class c = Class.forName(cls);
List<Object> params = Lists.newArrayList();
for (int i = 1; i < 7; i++) {
String pname = "p" + i;
if (req.getParameter(pname) == null)
continue;
String p = req.getParameter(pname);
String ptype = getPtype(req, pname);
Object p_obj=getP(p,ptype);
params.add(p_obj);
}
Object[] p_a = params.toArray();
String createmode =req.getParameter("createmode");
Object rzt;
if(isStaticMode(createmode))
{
rzt = MethodUtils.invokeStaticMethod(c, meth_name, p_a);
}
else//def is new
{
Object cls_obj = com.attilax.reflect.MethodUtils.invokeStaticMethod(iocx, "getBean", c);
rzt = MethodUtils.invokeMethod(cls_obj, meth_name, p_a);
}
System.out.println(rzt);
// Object r = new DslParser().parseV3(req2.getParameter("dsl"));
if (req.getParameter("retFmt") != null) {
if (req.getParameter("retFmt").equals("json"))
response.getWriter().println(AtiJson.toJson(rzt)); // �벻Ҫ�Ļ�ɾ��
} else
response.getWriter().println(rzt.toString()); // �벻Ҫ�Ļ�ɾ��
} catch (Exception e) {
logger.error("--err", e);
logger.error("--err2", AtiJson.toJson(e));
filex.save_safe(core.getTrace(e), "c:\\0rechglog\\" + filex.getUUidName() + ".log");
ExUtil.throwExV2(e);
}
}
直接支持java表达式,http://xxxxxx/api?dsl=new com.xxx.userservice().reg()
作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconoclast image-smasher
捕鸟王"Bird Catcher kok 虔诚者Pious 宗教信仰捍卫者 Defender Of the Faith. 卡拉卡拉红斗篷 Caracalla red cloak 万兽之王
简称:: Emir Attilax Akbar 埃米尔 阿提拉克斯 阿克巴
全名::Emir Attilax Akbar bin Mahmud bin attila bin Solomon bin adam Al Rapanui 埃米尔 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门 本亚当 阿尔 拉帕努伊
常用名:艾提拉(艾龙), EMAIL:1466519819@qq.com
头衔:uke总部o2o负责人,全球网格化项目创始人,
uke交友协会会长 uke捕猎协会会长 Emir Uke部落首席大酋长,
uke宗教与文化融合事务部部长, uke宗教改革委员会副主席
uke制度与重大会议委员会委员长,uke保安部首席大队长,uke制度检查委员会副会长,
uke 首席cto 软件部门总监 技术部副总监 研发部门总监主管 产品部副经理 项目部副经理 uke科技研究院院长uke软件培训大师
uke波利尼西亚区大区连锁负责人 汤加王国区域负责人 uke克尔格伦群岛区连锁负责人,莱恩群岛区连锁负责人,uke布维岛和南乔治亚和南桑威奇群岛大区连锁负责人
Uke软件标准化协会理事长理事长 Uke 数据库与存储标准化协会副会长
uke终身教育学校副校长 Uke医院 与医学院方面的创始人
uec学院校长, uecip图像处理机器视觉专业系主任 uke文档检索专业系主任
Uke图像处理与机器视觉学院首席院长
Uke 户外运动协会理事长 度假村首席大村长 uke出版社编辑总编
转载请注明来源:attilax的专栏 ?http://blog.csdn.net/attilax
--Atiend v8