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 }