使用GeneXus做开发做了有一段时间了 却发现一个问题(O_O)?就是除了相关的Wiki外 网上其他地方的相关资料都很少 于是乎我就想在这记录一些东西 来帮助以后会用到的人(°ー°〃)
那么第一个问题:什么是GeneXus ?? w(゚Д゚)w?
这个问题我想大部分人都很陌生 首先可能先入为主的以为是一个技术 但是无论是从贴吧圈子里都很少或者说几乎没听过这个词语 对吧?其实这个GeneXus是一款从国外传进来的开发工具ㄟ( ▔, ▔ )ㄏ
欸 Σ(⊙▽⊙"a 现在主流的语言都会有自己的一个配套的开发工具 Java有Idea C#有Vs 安卓有自己的Android Studio 等等诸如此类的 那么这是不是某种语言的开发工具呢?
其实也不是-_-||使用它的话可以同时开发javaC# 以及安卓 IOS等应用程序 是不是听得很奇怪 这都不是一个平台的东西 PS:(ˉ▽ ̄~) 切~~ C#天下第一!!破音!~( ̄0 ̄)/ 请继续往下看
首先传统模式的开发由于受成本的控制,不可能所有开发人员都是经验非常丰富的。人员能力参差不齐导致代码 Bug非常多 其次就是随着多元化的时代的脚步 公司人员投入的成本也很大
比如一个项目可能就需要公司的前端设计+后端开发服务然后是其他的公司的测试啊什么的 或者说一个人身上需要参与着几个项目 比如这个项目还需要用到IOS开发 这时候公司又没有 这类人员
公司招了一个 写完这个项目又不需要了 然后踢了 哈哈哈哈哈╮(╯▽╰)╭ 又不是没有这样的事 这个时候GeneXus的作用就体现出来了 首先比如一个项目可能前后需要10个人参与 那么按照我们的要求 使用GeneXus的团队只需要3个人 !!理由如下:
1.几乎全自动化的代码生成:我们使用的过程中只需要关注逻辑代码的编写 其底层的代码完全由GeneXus替代 相当于你告诉它(我想吃雪糕 你从抽屉里拿钱 然后过马路 过马路时注意车辆 和店员说买个雪糕 蓝莓味的 然后回来给我)剩下的事情不需要操心 它自动帮你完成 只要逻辑没问题 那么就不会发生代码层级的bug.
2.代码的复用性: 我们只需要写一套业务逻辑 这套代码就能直接生成安卓、IOS 、C# 以及Java端的应用 Σ( ° △ °|||)︴ 沃日!唯一可能改变的就只有页面的布局之类的 但是不用急请继续往下看
3.提供各种Web及移劢端UI模板,模块化配置 里面自带了各种Web端的UI设计 不仅如此 移动端IOS 和安卓 WebForm 甚至到塞班系统都有集成 选个模板修修改改就可以了 当然 你完全可以自己找一个UI设计
画出你想要的 然后 拖拉拽 OK 你没看错 是直接拖拉拽 然后改一下名字显示 绑定一下变量或者Grid 然后把之前Web端写好的逻辑挪过来 点击安卓环境 生成 完事..... 超方便的说 (* ̄ω ̄)
4.最后就是简单易学,学习GeneXus只要掌插各个对象的使用方法就可以,不用陷入各种不同技术的细节中。因为之前我就说过 GeneXus有自己的技术团队 会把当下热门的技术进行学习了解摸透 然后通过自己的方式集成到IDE中
我们要做的就只有调用就好了 这么说你可能还没有明确的概念 我举个简单的例子吧 比如现在我调用一个接口获取电话号码的归属地 当然这里只是举个例子 C#代码如下 这里我用的是聚合数据的参考代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using Xfrog.Net; using System.Diagnostics; using System.Web; namespace ConsoleAPI { class Program { static void Main(string[] args) { string url = "http://apis.juhe.cn/mobile/get"; var parameters = new Dictionary<string, string>(); parameters.Add("phone" , "13429667914"); //需要查询的手机号码 parameters.Add("key", "您申请的ApiKey");//你申请的key string result = sendPost(url, parameters, "get"); // 代码中JsonObject类下载地址:http://download.csdn.net/download/gcm3206021155665/7458439 JsonObject newObj = new JsonObject(result); String errorCode = newObj["error_code"].Value; if (errorCode == "0") { Debug.WriteLine("成功"); Debug.WriteLine(newObj); } else { //Debug.WriteLine("请求异常"); Debug.WriteLine(newObj["error_code"].Value+":"+newObj["reason"].Value); } } ////// Http (GET/POST) /// /// 请求URL /// 请求参数 /// 请求方法 /// 响应内容 static string sendPost(string url, IDictionary<string, string> parameters, string method) { if (method.ToLower() == "post") { HttpWebRequest req = null; HttpWebResponse rsp = null; System.IO.Stream reqStream = null; try { req = (HttpWebRequest)WebRequest.Create(url); req.Method = method; req.KeepAlive = false; req.ProtocolVersion = HttpVersion.Version10; req.Timeout = 60000; req.ContentType = "application/x-www-form-urlencoded;charset=utf-8"; byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(parameters, "utf8")); reqStream = req.GetRequestStream(); reqStream.Write(postData, 0, postData.Length); rsp = (HttpWebResponse)req.GetResponse(); Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet); return GetResponseAsString(rsp, encoding); } catch (Exception ex) { return ex.Message; } finally { if (reqStream != null) reqStream.Close(); if (rsp != null) rsp.Close(); } } else { //创建请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + BuildQuery(parameters, "utf8")); //GET请求 request.Method = "GET"; request.ReadWriteTimeout = 5000; request.ContentType = "text/html;charset=UTF-8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8")); //返回内容 string retString = myStreamReader.ReadToEnd(); return retString; } } /// /// 组装普通文本请求参数。 /// /// Key-Value形式请求参数字典 /// URL编码后的请求数据 static string BuildQuery(IDictionary<string, string> parameters, string encode) { StringBuilder postData = new StringBuilder(); bool hasParam = false; IEnumerator string, string>> dem = parameters.GetEnumerator(); while (dem.MoveNext()) { string name = dem.Current.Key; string value = dem.Current.Value; // 忽略参数名或参数值为空的参数 if (!string.IsNullOrEmpty(name))//&& !string.IsNullOrEmpty(value) { if (hasParam) { postData.Append("&"); } postData.Append(name); postData.Append("="); if (encode == "gb2312") { postData.Append(HttpUtility.UrlEncode(value, Encoding.GetEncoding("gb2312"))); } else if (encode == "utf8") { postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8)); } else { postData.Append(value); } hasParam = true; } } return postData.ToString(); } /// /// 把响应流转换为文本。 /// /// 响应流对象 /// 编码方式 /// 响应文本 static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding) { System.IO.Stream stream = null; StreamReader reader = null; try { // 以字符流的方式读取HTTP响应 stream = rsp.GetResponseStream(); reader = new StreamReader(stream, encoding); return reader.ReadToEnd(); } finally { // 释放资源 if (reader != null) reader.Close(); if (stream != null) stream.Close(); if (rsp != null) rsp.Close(); } } } }
是不是很麻烦?当然现在可能你们公司都有大佬写好了一些东西 不用写这么多代码来调用但是相比于GeneXus调用 简单
//拼接聚合API调用地址 &vUrlStr = "apis.juhe.cn/mobile/get?" //拼接参数:手机号 &vUrlStr = &vUrlStr +"phone="+&iPhone //拼接参数:APPKEY &vUrlStr = &vUrlStr +"&key=1234567890" //拼接参数:dtype(默认json) &vUrlStr = &vUrlStr +"&dtype=" //调用聚合API调用地址 &httpclient.Host = &vUrlStr &httpclient.Execute('GET', '') &result = &httpclient.ToString() //接口返回Json &oResult.FromJson(&result)
通过定义变量然后拼接接口需要的参数调用内置函数&httpclient以及他的一些属性最后用内置函数FromJson解析返回的Json数据就结束了 炒鸡简单
当然简简单单这么些篇幅完全不能够介绍完GeneXus所拥有的能力 接下来我会将一些东西慢慢展示给你们大家