以数据为中心的系统 页面表现的思考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;
					  }
				   }
				}
			},
			//singlebyte
			singlebyte: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 .

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值