请跟我来--Ext数据应用开发的几板斧

    在上篇原型介绍中,有朋友就问了是否是组件,我想他可能的意思是能否在IDE的工具箱有可以拖拉使用的组件。暂时我也没有找到好的。Hafeyang 介绍了一个工具http://code.google.com/p/extsharp/ 可以省点脑力。据说是个非常优秀的javascript开发工具,可以支持ext2.0,我没有用过,所以就没有发言权了,有兴趣可以自己研究。不过我还是建议大伙先弄明白最基本的原理,再使用工具,否则很容易变成大公司手中的木偶:-(
    在C/S世界里,编写数据库应用通常分客户端和服务后台,中间通常使用WebService通讯,其根本实际上是一个XML数据包,有些公司为了提升性能,编写了原生的socket通讯程序来传送数据包,高级一点的自己做了负载均衡。这样性能有了,安全也有了,但是无法"Open"!世界就是这样的,没有什么东西十全十美!而在Ext的世界中,推荐大家使用JSON数据串来传递数据,比较开放,性能也说得过去(应该比XML省一半容量),算是一个比较好得折中办法。
    你可以下载showme项目来感受一下数据应用开发,下面简要说明要点如下:
1) 数据源设定
   我们要从数据后台取得服务,就必须指明提供数据的url,如果让前端js直接操作后台数据库,一定造成很难维护的困难局面,做后台NBear,LINQ都不错的,学习起来也很容易。
function createDataStore(meta){
  
var DEFAULT_PAGE_SIZE=10;
  
var ds = new Ext.data.Store({
    proxy: 
new Ext.data.ScriptTagProxy({url: 'facade.aspx'}),
    reader: 
new Ext.data.JsonReader({
      root: 
'data',
      totalProperty: 
'totalCount',
      id: 
'id',
      fields:meta}
),
      remoteSort: 
false,
      baseParams: 
{start:0,limit:DEFAULT_PAGE_SIZE,s_method:'list'}
    }
);
  
return ds;
}

    在实际项目中绝对不允许一次查询返回全部数据的,必须分页查看。(任何好的框架总有愚蠢的用法,反过来还说是框架性能太差,真无言以对!),所以数据包中要定义符合你查询条件的总记录数,还有数据结果集合,当然请求者已经知道是从何处开始查询,每页记录数目。
  
2) ajax发送数据包
    以保存修改后的数据为例,新增和删除同理。
function saveData() {
  
for(var i=0;i<ds.getCount();i++){
    
var r=ds.getAt(i);
    
if(r['id']==''||r.dirty){
       
var dd=Ext.encode(r.data);
       
// Ext.log(dd);//可用于调试
       Ext.Ajax.request({
         url: 
'facade.aspx',
         params: 
{ s_method: 'save',id:r.data['id'],data:dd },
         failure: 
function(){Ext.Msg.alert("error");}
       }
);
     }

   }

   ds.reload();
 }

3) 集成门面处理概要
    为了说明原理,我直接在facade.aspx中用C#说明:
 protected override void OnLoad(EventArgs e) {
        Response.ContentEncoding 
= Encoding.UTF8;
        String rt 
= "";// = service.Execute(Request.Params);
        String method = Request.Params["s_method"];
        
bool ok = true;
        
if ("list".Equals(method)) {
            String sql 
= "1=1";
            String s1 
= Request.Params["start"];
            String s2 
= Request.Params["limit"];
            
int start = 0;
            
int pagesize = 10;
            
if (s1 != null && s1.Length > 0)
                start 
= int.Parse(s1);
            
if (s2 != null && s2.Length > 0)
                pagesize 
= int.Parse(s2);
            String q 
= Request.Params["query"];
            
if (q != null{
                
// todo 修改sql,例如:
                
//sql = "Name like '%" + q + "%'";
            }

            
//str = service.loadJsonRecords(sql, start, pagesize);
            rt = "{\"totalCount\":\"50\",\"data\":[{\"Name\":\"alex\",\"Email\":\"lsj_3@21cn.com\",\"Mobile\":\"13922666727\",\"GradYear\":1995,\"sCreatedDate\":\"2008-01-02 21:06:28\",\"id\":\"1\"},{\"Name\":\"tom\",\"Mobile\":\"13922666739\",\"GradYear\":2009,\"id\":\"2\",\"sCreatedDate\":\"2008-01-02 21:06:28\"},{\"Name\":\"jerry\",\"Mobile\":\"13922666749\",\"GradYear\":2009,\"id\":\"3\",\"sCreatedDate\":\"2008-01-02 21:06:28\"}]}";
        }

        
else if ("delete".Equals(method)) {

     }


}




    这里我直接输入了一串已经准备好的数据,读者可以用自己熟悉的框架改造为直接和数据库查询。下篇我介绍llano如何做到这一点。
    有了数据包,当然就是把结果送回客户端,如果有回调要求,则生成的是客户端js的入口函数名和数据,这样就可以异步更新前端了。
  bool scriptTag = false;
        String cb 
= Request.Params["callback"];

        
if (cb != null{
            scriptTag 
= true;
            Response.ContentType 
= "text/javascript";
        }

        
else {

            Response.ContentType 
= "application/x-json";
        }

        
if (scriptTag)
            rt 
= cb + "(" + rt + ")";
        Response.Write(rt);
        Response.End();


   细心的读者一定会发现我们有多处重复进行了硬编码:
 var colModel = new Ext.grid.ColumnModel([
        
{header: "姓名", width: 60, sortable: true,  dataIndex: 'Name'},
        
{header: "邮件", width: 175, sortable: true,  dataIndex: 'Email'},
        
{header: "手机", width: 125, sortable: true, dataIndex: 'Mobile'},
        
{header: "毕业年份", width: 65, sortable: true, renderer: myRenderer, dataIndex: 'GradYear'},
        
{header: "登记日期", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('Y/m/d'), dataIndex: 'sCreatedDate'}
      ]);

..

  items: [
           
{fieldLabel:'姓名',name: 'Name',allowBlank: false,minLength:3,maxLength:8,anchor:'90%'},
           
{fieldLabel:'邮件',name: 'Email',vtype:'email',anchor:'90%'}
           
{fieldLabel:'手机',name: 'Mobile',anchor:'90%'},
           
{fieldLabel:'毕业年份',name: 'GradYear',xtype:'numberfield',anchor:'90%',value: '2008'},  
           
{fieldLabel:'登记日期',name: 'sCreatedDate', xtype:'datefield',format: 'Y-m-d', anchor:'90%'}
         ]

   那我们就在下一篇文章中看看如何重构,使得程序灵活一些,毕竟真正的项目通常一个表就30个左右的字段,我们大家可不想变成打字工人:-)
alex 1-3




posted @ 2008-01-03 10:32 成为-行动-拥有(BeDoHave) 阅读(3550) 评论(8)  编辑 收藏 所属分类: 路在脚下

  回复  引用    
#1楼 2008-01-03 11:14 | freeman12 [未注册用户]
非常不错,期待下一篇。非常同意斑竹的观点,人不要成为技术的奴隶,技术是为人服务的,记得N年前有人说:机器越来越像人了,人也越来越像机器了。仔细想想确实非常有道理,事实上,只有原理通了,才可以更好的以不变应万变,否则只能感觉IT技术层出不穷,累死我们了,不过斑竹的文章太精炼了些,有时初学者或功底不太深厚的朋友可能会感觉没有讲的太Step By Step,:)
  回复  引用    
#2楼 2008-01-03 11:34 | zzz [未注册用户]
如果让前端js直接操作后台数据库,那一定是“罪大恶极”,遗憾的是Ext居然有这样的途径给大家
-----------------------
直接?哪来的Driver?楼主真搞笑。。。

用CodeSmith来生成ColumnModel,RecordType这些还是不错的
  回复  引用  查看    
#3楼 [楼主]2008-01-03 12:01 | 飞豆      
@zzz
谢谢你的意见,你可以在examples\tasks\db下看到那些代码。
我已经修改了我的建议,希望大家搞技术的说话都几分平和,心有多大,世界就有多大!
  回复  引用    
#4楼 2008-01-03 12:21 | zzz [未注册用户]
回复的真快啊。。。
我没有别的意思,只是js根本不可能直接操作,这个地球人都知道。
至于你说的那个tasks它是通过google gears来操作数据库的。不知道楼主有没有浏览过那个示例?
我原来也打开过那个示例,不过要先装gears才能浏览,还以为是啥无聊的工具了。汗一个。。。
现在听楼主一说才搜了下,这家伙挺新鲜的啊
  回复  引用    
#5楼 2008-01-03 13:24 | laputa [未注册用户]
用c#组织json格式的数据源,用 ext js展示,应该就是这样啊
最好能在一次ajax请求中将所有需要的数据全部加载出来,避免多次请求
  回复  引用  查看    
#6楼 2008-01-03 14:37 | richardzeng      
亟待模型硬编码的解决方案
  回复  引用  查看    
#7楼 2008-01-03 21:54 | Hafeyang      
楼主真的很讲究效率.
期待接下来的精彩文章!

  回复  引用    
#8楼 2008-01-04 09:48 | justdoit [未注册用户]
Waiting接下来的分解,不要吊我们的胃口呀!现在还只是在facade中仿真产生数据,如何通过service访问DB中的数据。最近也在研究EXT,打算作为公司的框架,所以需要些指点,少走些弯路,:)

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-03 11:59 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: