ajax.js

  1 /**通用ajax服务的定义对象
  2 
  3  * services可以是单个服务对象,也可以是service服务数组
  4  * 具体服务的定义请参考appendServices成员函数
  5  */
  6 function Service(services){
  7     //一直到299行
  8     this.services=[];
  9     this.shareParameters={};
 10     /**添加共享参数,在这里统一设置共享参数
 11      */
 12     this.addShareParameters=function(shareParameters){
 13         this.shareParameters=shareParameters;
 14         return this;
 15     };
 16     /**
 17      * 批量调用一般服务
 18 
 19      * 入参可以是一个调用服务的数组或者单个调用服务
 20 
 21      * 每个调用服务有下面的属性
 22 
 23      * serviceId 服务Id,不可为空
 24 
 25      * method 服务方法名,不可为空
 26      * parameters 服务参数,必须是object,object的属性名代表参数名,属性值代表参数值。
 27 
 28      * transform:结果集的转换规则(返回结果集合List<Map<String,Object>>时才会用到):null(无转换)、'firstRow'(取首行)、'breakdown'(分列),值不区分大小写 
 29      * shareResults 共享服务的返回结果,默认不共享false,如果后续服务需要使用到结果里面的参数,
 30      *   那么就需要明确指定。该参数可以是 boolean,array或者object,为true时表示全部共享;
 31      *   数组可以指定返回值中需要共享的值的名,这样返回值的键值对应关系共享;
 32      *   object可以额外指定共享名的别名,当要求返回值以新的字段名共享、
 33 
 34      *   或者一个以多个新别名共享时就需要用到这种类型,object的属性名表示结果集中需要共享的字段名,
 35      *   属性值表示新的字段名;
 36 
 37      *   参数共享处理列表结果集时,整个结果集的数据存放在别名为空串的特殊key上。如果本业务没有返回结果,那么参数共享无效。
 38 
 39      * useShare 使用共享参数标志,定义方式与shareResults一样,意义正好想对应。该参数指明如果从共享参数中获取要的值。
 40 
 41      * shareNotNull 校验共享参数是否为空,作为useShare的附属属性。
 42 
 43      *   有时希望如果获取到的共享参数是空的,那么不继续执行,那么可以在这里指定哪些一定不能为空。
 44 
 45      *   目前只允许三种取值,null,true和别名数组,null表示不校验,true表示全校验,别名数组表示只校验指定的值(别名是指useShare中新的别名,并非共享池里面的共享别名)。
 46 
 47      */
 48     this.appendServices=function(services){//到128行
 49         if(!services){
 50             return this;
 51         }
 52         //默认按批量形式添加服务,如果是单个,那么用数组包装
 53 
 54         var tmp_services=services;
 55         if(!$.isArray(tmp_services)){
 56             tmp_services = [tmp_services];
 57         }
 58         //每个service必须有serviceId,method
 59         for(index in tmp_services){
 60             //检查必录项
 61             if(!tmp_services[index].serviceId||!tmp_services[index].method){
 62                 FWalert('服务定义的serviceId和method不可为空');
 63                 return this;
 64             }
 65             //检查可选项
 66             if(tmp_services[index].parameters){
 67                 if(typeof tmp_services[index].parameters !='object'
 68                     ||jQuery.isArray(tmp_services[index].parameters)){
 69                     FWalert('服务定义的参数必须是map!');
 70                     return;
 71                 }
 72             }
 73             //如果指定了transform,那么值只能是规定的
 74 
 75             if(tmp_services[index].transform){
 76                 if('FIRSTROW'!=tmp_services[index].transform.toUpperCase()
 77                         &&'BREAKDOWN'!=tmp_services[index].transform.toUpperCase()){
 78                     FWalert('transform属性不正确');
 79                     return this;
 80                 }
 81             }
 82             //shareResults
 83             //转换shareResults,统一转换成map,或者boolean
 84             shareResults = tmp_services[index].shareResults;
 85             if(shareResults){
 86                 if(typeof shareResults =='boolean'){
 87                     if(!shareResults){
 88                         shareResults =null;
 89                     }
 90                 }else if(jQuery.isArray(shareResults)){
 91                     //转化为map
 92                     shareResults={};
 93                     $.each(tmp_services[index].shareResults,function(indexInArray, valueOfElement){
 94                         shareResults[valueOfElement]=valueOfElement;
 95                     });
 96                     tmp_services[index].shareResults =shareResults;
 97                 }
 98             }
 99             //useShare
100             useShare = tmp_services[index].useShare;
101             if(useShare){
102                 if(typeof useShare =='boolean'){
103                     if(!useShare){
104                         tmp_services[index].useShare =null;
105                     }
106                 }else if(jQuery.isArray(useShare)){
107                     //转化为map
108                     useShare={};
109                     $.each(tmp_services[index].useShare,function(indexInArray, valueOfElement){
110                         useShare[valueOfElement]=valueOfElement;
111                     });
112                     tmp_services[index].useShare =useShare;
113                 }
114             }
115             //shareNotNull,只允许true和字符串数组
116             shareNotNull = tmp_services[index].shareNotNull;
117             if(shareNotNull){
118                 if(typeof shareNotNull !=='boolean' && !jQuery.isArray(shareNotNull)){
119                     FWalert('参数[shareNotNull]的取值必须是true或者字符串数组!');
120                     return this;
121                 }else if(shareNotNull ===false){
122                     tmp_services[index].shareNotNull = null;
123                 }
124             }
125         }
126         this.services=this.services.concat(tmp_services);
127         return this;
128     };
129     /**定义添加直接调用存储过程的服务
130 
131      * 可以批量添加存储过程。每个存储过程服务的有以下属性:
132      * procName、parameters、shareResults、useShare,
133 
134      * 其中procName指明存储过程的名称,其他的请参考appendServices;parameters中的参数名不能是procName
135      * 批量添加存储过程时,用数组存储各个存储过程作为参数传入即可。
136 
137      * ...
138      */
139     this.appendProc=function(procedures){
140         如果传入的参数是空,null,''等,那么就返回该对象,实际上就是返回 new Service() 这个对象,@wyl
141         if(!procedures){
142             return this;
143         }
144         默认按批量形式添加服务,如果是单个,那么用数组包装
145         如果传入的不是数组,那么就把这个对象包装成数组,@wyl,并且用临时变量存起来
146         tmp_procedures=procedures;
147         if(!$.isArray(tmp_procedures)){
148             tmp_procedures = [tmp_procedures];
149         }
150         //遍历,一个一个的处理
151         procedure_services =[];
152         for (index in tmp_procedures){
153             //必须有configId属性
154 
155             procedure = tmp_procedures[index];
156             if(!procedure.procName){
157                 FWalert('存储过程服务必须指定procName属性');
158                 return this;
159             }
160             procedure = $.extend(true,{},procedure,
161                     {serviceId:'directJdbcService',method:'savePointProcedure'
162                         ,parameters:{'':procedure.procName}});
163             //去掉存储过程名称
164             delete procedure.procName;
165             //添加到服务列表
166 
167             procedure_services.push(procedure);
168         }
169         return this.appendServices(procedure_services);
170     };
171     /**定义添加调用预定义查询语句的服务
172      * 可以批量添加查询语句。每个查询服务的包括以下属性:
173      * configId、transform、indices,parameters、shareResults、useShare。
174 
175      * configId是Mapper.xml中的配置ID(注意写上空间名)
176      * parameters是传递给configId的参数
177 
178      * transform:结果集的转换规则:null(无转换)、'firstRow'(取首行)、'breakdown'(分列),值不区分大小写
179 
180      * ,该参数要求传入字符串数组类型,元素值指明参数Map中的一个参数名。
181 
182      * 其它属性将作为查询语句的备用参数。其他的请参考appendServices;
183 
184      * 批量添加查询服务时,用数组存储各个查询服务作为参数传入即可。
185 
186      * ...
187      */
188     this.appendQuery=function(querys){
189         if(!querys){
190             return this;
191         }
192         //默认按批量形式添加服务,如果是单个,那么用数组包装
193 
194         tmp_querys=querys;
195         if(!$.isArray(tmp_querys)){
196             tmp_querys = [tmp_querys];
197         }
198         //遍历,一个一个的处理
199         query_services = [];
200         for (index in tmp_querys){
201             //必须有configId属性
202 
203             var query = tmp_querys[index];
204             if(!query.configId){
205                 FWalert('查询服务必须指定configId属性');
206                 return this;
207             }
208             //参数索引放入参数串中
209             query = $.extend(true,{},query,
210                     {serviceId:'commService',method:'query'
211                         ,parameters:{'_commDo':query.configId}});
212             
213             //去掉存储过程名称,和参数索引
214             delete query.configId;
215             
216             //添加到服务列表
217 
218             query_services.push(query);
219         }
220         return this.appendServices(query_services);
221     };
222     /**定义触发ajax的事件
223 
224      * message:本次ajax请求的名称,可选。
225 
226      * success:处理成功后触发的函数,原型是function(data)。
227 
228      * error:处理是否时触发的函数,原型是function(XMLHttpRequest, textStatus, errorThrown);
229      * async:同步或是异步,同步为false、异步是true
230      */
231     this.sentAjax=function(message,success,error,async){
232         if(this.services.length==0){
233             FWalert('请至少添加一个服务');
234             return;
235         }
236         var t_async = true;
237         var t_message = message;
238         var t_success = success;
239         var t_error = error;
240         if(jQuery.isFunction(message)){
241             t_message = '正在请求服务,请稍候...';
242             t_success =message;
243             t_error = success;
244         }else if (typeof message != 'string'){
245             FWalert('入参错误,请检查程序!');
246             return ;
247         }
248         if(async!=null&&typeof async=='boolean'){
249             if(!async){
250                 t_async = false;
251             }
252         }
253         var thisrequest={};
254          $.ajax({
255             url:contextPath+'/ajax.do'
256             ,data:{parameters:JSON.stringify(this.services),shareArguments:JSON.stringify(this.shareParameters)}
257             ,dataType :'json'
258             ,cache:false
259             ,async:t_async
260             ,type:'post'
261             ,error:function (request, textStatus, errorThrown) {
262                 if(!t_error){
263                     FWalert('数据请求错误!');    
264                 }else{
265                     t_error(request, textStatus, errorThrown);
266                 }
267                 }
268             ,success:function (data, textStatus) {
269                 //校验业务处理是否正确执行
270                 if("1"!=data.FHZ){//出错了,弹出错误提醒
271                     if ("loginTimeout" == data.FHZ) {
272                         if(window.confirm(data.MSG||'')){
273                             window.top.location.href=_selfUrl;
274                         }
275                     } else {
276                         if(t_error){
277                             t_error(data.MSG||'', 'serviceErr', data.MSG);
278                         }else{
279                             FWalert(data.MSG||'');
280                         }
281                     }
282                 }else if(!t_success){
283                 }else{
284                     t_success(data.RTN);
285                 }
286             }
287             ,beforeSend:function( ){
288                 $.data(thisrequest,'msg',showMsg(t_message,-1));
289                 //createProgressBar();
290             }
291             ,complete:function( ){
292                 hideMsg($.data(thisrequest,'msg'));
293             }
294          });
295     };
296     //添加参数
297     if(services){
298         this.appendServices(services);
299     }
300 }
301 /**
302 * 在页面的左上角显示错误消息
303 
304 * @param msg 消息内容
305 * @param timeout 秒为单位,0或者负数表示不自动隐藏
306 * @author 吴英德
307 
308 **/
309 var framework_message_layer;
310 var clearIntervalID;
311 function showMsg(msg,delay){
312 
313     var recurrectLocation=function(){
314         if(framework_message_layer==null)
315                 {clearInterval(clearIntervalID);return;}
316             var posX,posY;
317         if (window.innerHeight) {
318             posX = window.pageXOffset;
319             posY = window.pageYOffset;
320         }
321         else if (document.documentElement && document.documentElement.scrollTop) {
322             posX = document.documentElement.scrollLeft;
323             posY = document.documentElement.scrollTop;
324         }
325         else if (document.body) {
326             posX = document.body.scrollLeft;
327             posY = document.body.scrollTop;
328         }
329         framework_message_layer.style.top=String(posY+10)+'px';
330         framework_message_layer.style.right=String(posX+10)+'px';
331     };
332     if(framework_message_layer == null){
333         framework_message_layer=document.createElement('div');
334         framework_message_layer.className='err_message_blank_board';
335         document.body.appendChild(framework_message_layer);
336         clearIntervalID=window.setInterval(recurrectLocation,100);
337         recurrectLocation();
338     }
339     var my_div = document.createElement('div');
340     my_div.className='err_message';
341     //Element.extend(my_div);
342     my_div.innerHTML=msg;
343     framework_message_layer.appendChild(my_div);
344     recurrectLocation();
345     if(delay>0){
346         setTimeout(function(){
347             jQuery(my_div).remove();
348             if(jQuery(framework_message_layer).is(':empty')){
349                 jQuery(framework_message_layer).remove();
350                 window.clearInterval(clearIntervalID);
351                 framework_message_layer=null;
352             }
353         },delay*1000);
354     }else{
355         return my_div;
356     }
357 }
358 
359 /**隐藏右上角对应的消息
360  * @param object 某消息对象,来自showMsg的返回值
361 
362  */
363 function hideMsg(object){
364     jQuery(object).remove();
365 }

 

posted @ 2016-01-30 01:21  Sunor  阅读(273)  评论(0编辑  收藏  举报