读书人

以数据替中心的系统 页面表现的思考2

发布时间: 2012-10-14 14:55:08 作者: rapoo

以数据为中心的系统 页面表现的思考2

<html>  <head>     <script type="text/javascript" src="jquery-1.4.2.min.js"></script>      <script type="text/javascript" src="log4js-mini.js"></script>     <script type="text/javascript" src="function.js"></script>     <script type="text/javascript" src="screen_structor.js"></script> <link rel="stylesheet" href="style_cache.css" type="text/css" /> <style>     </style>     <script>
       //页面数据类型的定义       var groupa= {     user_cd:{type:'x',length:2,singlebyte:false,mandatry:true,validator_button:['search']}, user_int:{type:'int',length:5,display_only:false,mandatry:true,validator_button:['search','dssaae']}, user_float:{type:'float',length:8.3}, user_date:{type:'date',length:5,display_only:false,mandatry:false,validator_button:['search']}, user_time:{type:'time',length:5,display_only:false,mandatry:true,validator_button:['search']},   }        $('document').ready( function(){          var binder =new screen_structor('group1' ,groupa);  binder.struct_binding(); //将数据结构映射到页面上。    // event   $('#btest').click(     function(){    var rs=binder.validate(); //基于数据结构进行页面验证alert(rs.succ);for (o in rs.errorMsg){   alert(o+ ':'+rs.errorMsg[o].error_reason);} }  )    }  )  </script>   </head><body><div id='group1'>    x <input type='text' id='user_cd' name='user_cd' maxlength='2'/>  int<input type='text' id='user_int' name='user_int' maxlength='2'/>  date<input type='text' id='user_date' name='user_date' maxlength='2'/>  time<input type='text' id='user_time' name='user_time' maxlength='2'/>   float<input type='text' id='user_float' name='user_float' maxlength='2'/>    <input type='button'  id='search' value='aa' /></div> </body>  </html>

?将数据绑定到页面结构的方法:

  function screen_structor(id,structors){     var myself=this; this.id=id; this.structors=structors; this.logger =  new Log(Log.DEBUG, Log.popupLogger)  //default structor define var default_structor={display_only:false,singlebyte:true,uppertext:true}; for(default_0 in default_structor){    for(field in this.structors){   if (this.structors[field][default_0]==null) this.structors[field][default_0]= default_structor[default_0];} }  // defind processor this.struct_processor={    //length process    length:function(field,node){   //myself.logger.debug("node"+node.name);   switch(field.type){     //string     case 'x':      $(node).attr("maxlength",field.length);  break; //int  case 'int':     $(node).attr("maxlength",Math.floor(field.length/3)+field.length); myself._addClass($(node),'int');  myself.logger.debug("node"+(Math.floor(field.length/3)+1)); break; case 'number':     $(node).attr("maxlength",field.length); myself._addClass($(node),'number'); break;  //date case 'date':     $(node).attr("maxlength",8); myself._addClass($(node),'date'); break; //time case 'time':     $(node).attr("maxlength",5); myself._addClass($(node),'time'); break;                 case 'float':                     var f_length=field['length']; $(node).attr("maxlength",Math.floor(field.length/3)+Math.floor(f_length)+1);                     var total=Math.floor(f_length);                     var fraction=Math.floor((f_length-total)*10); myself.logger.debug("f_length:"+'field[length]'+",total:"+total+",fraction:"+fraction+",field:"+field); myself._addClass($(node),'float'+fraction); break;   }},            //read only            display_only:function(field,node){     if (field['display_only']){       $(node).attr("readonly",'readonly');                    myself._addClass($(node),'display');   }},//uppertext   uppertext:function(field,node){                if (field['uppertext']){                    myself._addClass($(node),'uppertext');   }else{   $(node).removeClass('uppertext');}}            //end };  //validate processor this.validate_processor={    //mandatry    mandatry:function(field,node,functionName){if (field['mandatry']){   if (jQuery.inArray( functionName,field['validator_button'])){      if (isBlank($(node).val())){     return false;  }   }}},//singlebytesinglebyte:function(field,node,functionName){    if (field['singlebyte']==false) return true;    var g_single_pattern=new RegExp("[^\u0000-\u007F]");var v=$(node).val()                if (isBlank(v))return true;                myself.logger.debug("singlebyte "+v);return !g_single_pattern.test(v);},//lenght length:function(field,node,functionName){    if (field['type']=='x' && field['singlebyte']==false){   var v=$(node).val();   var valueByteCount=0;   for (m=0;m<v.length;m++){              if (v.charCodeAt(m)>127)               valueByteCount = valueByteCount + 3;              else               valueByteCount = valueByteCount + 1;           }   if (valueByteCount>field['length']) return false;   return true;}},//type (for float int  )type:function(field,node,functionName){   myself.logger.debug("type "+field.type);   if (field['type']=='float' || field['type']=='int'){      var v=$(node).val();      if (isBlank(v)) return true;   v=v.replace(",", "");   v=v.replace(/\./, "");   myself.logger.debug("v :"+v+"v.length "+v.length+'field.length:'+field.length);   if ((v.length)>Math.floor(field.length)) return false;   }   return true;} }  // private mehtod to add css this._addClass=function(j_node,j_class){    if (j_node.hasClass(j_class)){   return;}else{   j_node.addClass(j_class);} }  //do binding this.struct_binding=function(){ var key="#"+id+" input:text"; $(key).each(function (){   var field=myself.structors[this.name];         if (field){   for(o in field){                           // process all kinds of type length         if (myself.struct_processor[o]){ myself.struct_processor[o](field,this);   }   }   }} )  };  //validate //return: //       succ: true or false //       errorMsg: error_node: the node which is error //       error_reason: the reason of error ex: singglebyte type ..... this.validate=function( functionName){    var rsVal=true;var rsError=[];    var fn=functionName;var key="#"+id+" :input"; $(key).each(function (){   var field=myself.structors[this.name];      if (field){   for(o in field){                           // process all kinds of type length         if (myself.validate_processor[o]){    if ( myself.validate_processor[o](field,this,functionName)==false){   rsVal=false;   rsError[this.name]={error_node:this,error_reason:o,error_type:field.type};   myself.logger.debug("this.name:"+this.name+"value:"+o);}  }   }   }} ) return {succ:rsVal,errorMsg:rsError} }  //end    }

?? 这样将对数据结构的要求与数据的表现分开,集中的放了js一个js文件中,并且集成了 类似struts的validation,信息集中在一个结构中非常方便。

?? binding 方法主要对数据的各个类型(string float ..)加上相应的css这个可以通过htc或者共同的事件绑定到css中统一的处理。

?? validate方法主要是利用已知的类型等信息进行验证。

?

?? 这样我们已经完全把html的数据特征和数据表现分离了,并且将数据特征集中到了一起便于维护。

?? 下一步就是将客户端和服务器分离。

?

?? 传统的web变成调试很麻烦,页面上有很多的tag以及服务器的交互信息,不启动服务器页面也很难调试。jsp的制作完毕后必须启动服务器调试。如果我们能将客户端和服务器彻底分离,客户端html做完后可以单独调试,就非常方便了。这就需要用到ajax的技术。

?? 思路是这样的:

?? ? ? ? 【1】页面就是简单的html

?? ? ? ? 【2】和服务器的交互就是json对象。

?? ? ? ? 【3】页面的调试可以自制json对象类调试,这样就非常方便了。

?

?? 难点:

?? ? ? ? ?struts等mvc的工具体统了很多tag可以自动将数据和form的javabean映射,无论从服务器pull数据下来展现,还是submit数据到服务器都能够实现自动化,节省了不少时间。这个是我们需要解决的。

?? ? ? ? ?如果我们能共在自动从node中收集数据成为对象,再和服务器端用json交互这个问题不就是解决了?这里可用的工具就是dwr。和xstream .

?

?

?

?

?

读书人网 >软件架构设计

热点推荐