山东青岛电脑学校 专业软件工程师培训,软件人才就业实训中心0532-85025005

Java回调机制解析

 模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,也是我们在写程序中经常使用的;回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,这句话可能有点绕,等文章后面举例说明;异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题,举例来讲:A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走。回调是异步的基本,因此下面着重说回调机制。

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 4

javascript事件模型框架

 最近一直在读《javascript高级程序设计》,也快读完了,读到事件这一章,书中提供的一个事件工具类很实用,我注释了一下,并摘记:

None.gif//eventutil.js
None.gif
var EventUtil = new Object;
ExpandedBlockStart.gifContractedBlock.gif
/**//* 
InBlock.gif  此方法用来给特定对象添加事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,    fnHandler是事件回调函数
InBlock.gif/*
InBlock.gifEventUtil.addEventHandler = function (oTarget, sEventType, fnHandler) {
InBlock.gif    //firefox情况下
InBlock.gif    if (oTarget.addEventListener) {
InBlock.gif        oTarget.addEventListener(sEventType, fnHandler, false);
InBlock.gif    }
InBlock.gif    //IE下
InBlock.gif    else if (oTarget.attachEvent) {
InBlock.gif        oTarget.attachEvent("on" + sEventType, fnHandler);
InBlock.gif    }
InBlock.gif    else {
InBlock.gif        oTarget["on" + sEventType] = fnHandler;
InBlock.gif    }
InBlock.gif};
InBlock.gif/* 
InBlock.gif  此方法用来移除特定对象的特定事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,fnHandler是事件回调函数
InBlock.gif/*       
InBlock.gifEventUtil.removeEventHandler = function (oTarget, sEventType, fnHandler) {
InBlock.gif    if (oTarget.removeEventListener) {
InBlock.gif        oTarget.removeEventListener(sEventType, fnHandler, false);
InBlock.gif    } else if (oTarget.detachEvent) {
InBlock.gif        oTarget.detachEvent("on" + sEventType, fnHandler);
InBlock.gif    } else { 
InBlock.gif        oTarget["on" + sEventType] = null;
InBlock.gif    }
InBlock.gif};
InBlock.gif
InBlock.gif/*
InBlock.gif 格式化事件,因为IE和其他浏览器下获取事件的方式不同并且事件的属性也不尽相同,通过此方法提供一个一致的事件
ExpandedBlockEnd.gif
*/
ExpandedBlockStart.gifContractedBlock.gifEventUtil.formatEvent 
= function (oEvent) dot.gif{
InBlock.gif    
//isIE和isWin引用到一个js文件,判断浏览器和操作系统类型
ExpandedSubBlockStart.gifContractedSubBlock.gif
    if (isIE && isWin) dot.gif{
InBlock.gif        oEvent.charCode 
= (oEvent.type == "keypress"? oEvent.keyCode : 0;
InBlock.gif        
//IE只支持冒泡,不支持捕获
InBlock.gif
        oEvent.eventPhase = 2;
InBlock.gif        oEvent.isChar 
= (oEvent.charCode > 0);
InBlock.gif        oEvent.pageX 
= oEvent.clientX + document.body.scrollLeft;
InBlock.gif        oEvent.pageY 
= oEvent.clientY + document.body.scrollTop;
InBlock.gif        
//阻止事件的默认行为
ExpandedSubBlockStart.gifContractedSubBlock.gif
        oEvent.preventDefault = function () dot.gif{
InBlock.gif            
this.returnValue = false;
ExpandedSubBlockEnd.gif        }
;
InBlock.gif
InBlock.gif         
//将toElement,fromElement转化为标准的relatedTarget 
ExpandedSubBlockStart.gifContractedSubBlock.gif
        if (oEvent.type == "mouseout"dot.gif{
InBlock.gif            oEvent.relatedTarget 
= oEvent.toElement;
ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 else if (oEvent.type == "mouseover"dot.gif{
InBlock.gif            oEvent.relatedTarget 
= oEvent.fromElement;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
//取消冒泡      
ExpandedSubBlockStart.gifContractedSubBlock.gif
        oEvent.stopPropagation = function () dot.gif{
InBlock.gif            
this.cancelBubble = true;
ExpandedSubBlockEnd.gif        }
;
InBlock.gif
InBlock.gif        oEvent.target 
= oEvent.srcElement;
InBlock.gif        
//添加事件发生时间属性,IE没有
InBlock.gif
        oEvent.time = (new Date).getTime();
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return oEvent;
ExpandedBlockEnd.gif}
;
None.gif
ExpandedBlockStart.gifContractedBlock.gifEventUtil.getEvent 
= function() dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (window.event) dot.gif{
InBlock.gif        
//格式化IE的事件
InBlock.gif
        return this.formatEvent(window.event);
ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else dot.gif{
InBlock.gif        
return EventUtil.getEvent.caller.arguments[0];
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
;
None.gif


附带上一个判断浏览器和系统类型的js文件,通过引入一些名字显而易见的全局变量作为判断的结果,使用时需要小心变量名称冲突:
None.gif//detect.js,同样来自《JAVASCRIPT高级程序设计》
None.gif
var sUserAgent = navigator.userAgent;
None.gif
var fAppVersion = parseFloat(navigator.appVersion);
None.gif
ExpandedBlockStart.gifContractedBlock.gif
function compareVersions(sVersion1, sVersion2) dot.gif{
InBlock.gif
InBlock.gif    
var aVersion1 = sVersion1.split(".");
InBlock.gif    
var aVersion2 = sVersion2.split(".");
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (aVersion1.length > aVersion2.length) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i=0; i < aVersion1.length - aVersion2.length; i++dot.gif{
InBlock.gif            aVersion2.push(
"0");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else if (aVersion1.length < aVersion2.length) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (var i=0; i < aVersion2.length - aVersion1.length; i++dot.gif{
InBlock.gif            aVersion1.push(
"0");
ExpandedSubBlockEnd.gif        }
    
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for (var i=0; i < aVersion1.length; i++dot.gif{
InBlock.gif 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (aVersion1[i] < aVersion2[i]) dot.gif{
InBlock.gif            
return -1;
ExpandedSubBlockStart.gifContractedSubBlock.gif        }
 else if (aVersion1[i] > aVersion2[i]) dot.gif{
InBlock.gif            
return 1;
ExpandedSubBlockEnd.gif        }
    
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
return 0;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
var isOpera = sUserAgent.indexOf("Opera"> -1;
None.gif
var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isOpera) dot.gif{
InBlock.gif    
var fOperaVersion;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if(navigator.appName == "Opera"dot.gif{
InBlock.gif        fOperaVersion 
= fAppVersion;
ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else dot.gif{
InBlock.gif        
var reOperaVersion = new RegExp("Opera (//d+//.//d+)");
InBlock.gif        reOperaVersion.test(sUserAgent);
InBlock.gif        fOperaVersion 
= parseFloat(RegExp["$1"]);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    isMinOpera4 
= fOperaVersion >= 4;
InBlock.gif    isMinOpera5 
= fOperaVersion >= 5;
InBlock.gif    isMinOpera6 
= fOperaVersion >= 6;
InBlock.gif    isMinOpera7 
= fOperaVersion >= 7;
InBlock.gif    isMinOpera7_5 
= fOperaVersion >= 7.5;
ExpandedBlockEnd.gif}

None.gif
None.gif
var isKHTML = sUserAgent.indexOf("KHTML"> -1 
None.gif              
|| sUserAgent.indexOf("Konqueror"> -1 
None.gif              
|| sUserAgent.indexOf("AppleWebKit"> -1
None.gif              
None.gif
var isMinSafari1 = isMinSafari1_2 = false;
None.gif
var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isKHTML) dot.gif{
InBlock.gif    isSafari 
= sUserAgent.indexOf("AppleWebKit"> -1;
InBlock.gif    isKonq 
= sUserAgent.indexOf("Konqueror"> -1;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (isSafari) dot.gif{
InBlock.gif        
var reAppleWebKit = new RegExp("AppleWebKit///(//d+(?://.//d*)?)");
InBlock.gif        reAppleWebKit.test(sUserAgent);
InBlock.gif        
var fAppleWebKitVersion = parseFloat(RegExp["$1"]);
InBlock.gif
InBlock.gif        isMinSafari1 
= fAppleWebKitVersion >= 85;
InBlock.gif        isMinSafari1_2 
= fAppleWebKitVersion >= 124;
ExpandedSubBlockStart.gifContractedSubBlock.gif    }
 else if (isKonq) dot.gif{
InBlock.gif
InBlock.gif        
var reKonq = new RegExp("Konqueror///(//d+(?://.//d+(?://.//d)?)?)");
InBlock.gif        reKonq.test(sUserAgent);
InBlock.gif        isMinKonq2_2 
= compareVersions(RegExp["$1"], "2.2">= 0;
InBlock.gif        isMinKonq3 
= compareVersions(RegExp["$1"], "3.0">= 0;
InBlock.gif        isMinKonq3_1 
= compareVersions(RegExp["$1"], "3.1">= 0;
InBlock.gif        isMinKonq3_2 
= compareVersions(RegExp["$1"], "3.2">= 0;
ExpandedSubBlockEnd.gif    }
 
InBlock.gif    
ExpandedBlockEnd.gif}

None.gif
None.gif
var isIE = sUserAgent.indexOf("compatible"> -1 
None.gif           
&& sUserAgent.indexOf("MSIE"> -1
None.gif           
&& !isOpera;
None.gif           
None.gif
var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isIE) dot.gif{
InBlock.gif    
var reIE = new RegExp("MSIE (//d+//.//d+);");
InBlock.gif    reIE.test(sUserAgent);
InBlock.gif    
var fIEVersion = parseFloat(RegExp["$1"]);
InBlock.gif
InBlock.gif    isMinIE4 
= fIEVersion >= 4;
InBlock.gif    isMinIE5 
= fIEVersion >= 5;
InBlock.gif    isMinIE5_5 
= fIEVersion >= 5.5;
InBlock.gif    isMinIE6 
= fIEVersion >= 6.0;
ExpandedBlockEnd.gif}

None.gif
None.gif
var isMoz = sUserAgent.indexOf("Gecko"> -1
None.gif            
&& !isKHTML;
None.gif
None.gif
var isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = false;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isMoz) dot.gif{
InBlock.gif    
var reMoz = new RegExp("rv:(//d+//.//d+(?://.//d+)?)");
InBlock.gif    reMoz.test(sUserAgent);
InBlock.gif    isMinMoz1 
= compareVersions(RegExp["$1"], "1.0">= 0;
InBlock.gif    isMinMoz1_4 
= compareVersions(RegExp["$1"], "1.4">= 0;
InBlock.gif    isMinMoz1_5 
= compareVersions(RegExp["$1"], "1.5">= 0;
ExpandedBlockEnd.gif}

None.gif
None.gif
var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML 
None.gif            
&& (sUserAgent.indexOf("Mozilla"== 0
None.gif            
&& (navigator.appName == "Netscape"
None.gif            
&& (fAppVersion >= 4.0 && fAppVersion < 5.0);
None.gif
None.gif
var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isNS4) dot.gif{
InBlock.gif    isMinNS4 
= true;
InBlock.gif    isMinNS4_5 
= fAppVersion >= 4.5;
InBlock.gif    isMinNS4_7 
= fAppVersion >= 4.7;
InBlock.gif    isMinNS4_8 
= fAppVersion >= 4.8;
ExpandedBlockEnd.gif}

None.gif
None.gif
var isWin = (navigator.platform == "Win32"|| (navigator.platform == "Windows");
None.gif
var isMac = (navigator.platform == "Mac68K"|| (navigator.platform == "MacPPC"
None.gif            
|| (navigator.platform == "Macintosh");
None.gif
None.gif
var isUnix = (navigator.platform == "X11"&& !isWin && !isMac;
None.gif
None.gif
var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;
None.gif
var isMac68K = isMacPPC = false;
None.gif
var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isWin) dot.gif{
InBlock.gif    isWin95 
= sUserAgent.indexOf("Win95"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows 95"> -1;
InBlock.gif    isWin98 
= sUserAgent.indexOf("Win98"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows 98"> -1;
InBlock.gif    isWinME 
= sUserAgent.indexOf("Win 9x 4.90"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows ME"> -1;
InBlock.gif    isWin2K 
= sUserAgent.indexOf("Windows NT 5.0"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows 2000"> -1;
InBlock.gif    isWinXP 
= sUserAgent.indexOf("Windows NT 5.1"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows XP"> -1;
InBlock.gif    isWinNT4 
= sUserAgent.indexOf("WinNT"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows NT"> -1 
InBlock.gif              
|| sUserAgent.indexOf("WinNT4.0"> -1 
InBlock.gif              
|| sUserAgent.indexOf("Windows NT 4.0"> -1 
InBlock.gif              
&& (!isWinME && !isWin2K && !isWinXP);
ExpandedBlockEnd.gif}
 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isMac) dot.gif{
InBlock.gif    isMac68K 
= sUserAgent.indexOf("Mac_68000"> -1 
InBlock.gif               
|| sUserAgent.indexOf("68K"> -1;
InBlock.gif    isMacPPC 
= sUserAgent.indexOf("Mac_PowerPC"> -1 
InBlock.gif               
|| sUserAgent.indexOf("PPC"> -1;  
ExpandedBlockEnd.gif}

None.gif
ExpandedBlockStart.gifContractedBlock.gif
if (isUnix) dot.gif{
InBlock.gif    isSunOS 
= sUserAgent.indexOf("SunOS"> -1;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
if (isSunOS) dot.gif{
InBlock.gif        
var reSunOS = new RegExp("SunOS (//d+//.//d+(?://.//d+)?)");
InBlock.gif        reSunOS.test(sUserAgent);
InBlock.gif        isMinSunOS4 
= compareVersions(RegExp["$1"], "4.0">= 0;
InBlock.gif        isMinSunOS5 
= compareVersions(RegExp["$1"], "5.0">= 0;
InBlock.gif        isMinSunOS5_5 
= compareVersions(RegExp["$1"], "5.5">= 0;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
文章转自庄周梦蝶  ,原文发布时间5.16

 

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 7

未命名文章

 在学习spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是Java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾。

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 3

springMVC容器加载源码分析

 

springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理。这里我们来分析下springMVC的源码。

首先,spring提供了一个处理所有请求的servlet,这个servlet实现了servlet的接口,就是DispatcherServlet。把它配置在web.xml中,并且处理我们在整个mvc中需要处理的请求,一般如下配置:

<servlet><servlet-name>spring-servlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring-servlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
  • 1

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 3

不学测试怎么能成为一个好的程序员?

 

在今天的视频中,我将讨论没有学习测试的程序员。 我从新手程序员那里得知老程序员总是说“如果你不知道什么测试,你怎么能说你是一个程序员?”

所以,如果你不知道测试你真的能成为一个程序员吗? 你可能不知道,软件测试是一个为利益相关者提供被测试的产品或服务质量相关信息的调查研究。 软件测试也可以提供一个客观、独立考虑业务增值和理解软件实现的风险的视角。

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 17

Go 语言如何实现优雅的错误处理 

 

我撰写本文,是为了回应别处一个文章的说法。具体来说,就是错误处理的方式太“不优雅”。

go语言的错误处理方式,往往被新接触go语言的新人所诟病。注意哦,我说的可不是“异常处理”。Go语言中是没有异常的,尽管你会说Go语言不是使用panic和recover来处理异常的么。但是,我必须明确指出,我是反对你这种说法的。经常使用这种说法,其实是反设计模式的。你的程序中出现某种错误时,Go只是使用一种类似这种处理方式去处理罢了。

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 10

java程序员38道常规面试题

 

1. 谈一谈”==“与”equals()"的区别。

《Think in Java》中说:“关系操作符生成的是一个boolean结果,它们计算的是操作数的值之间的关系”。

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 8

Java类_对象_变量

 

类:Java类是一个模板,是一类具体事物的描述。小猫、小狗就是动物,那么动物就可以是一个类;狗也是可以是一个类,因为萨摩耶、哈士奇、阿拉斯加都是狗。Java类描述的是一类对象的行为和状态。

对象:Java对象是类的具体实现。如果说小狗是一个类的话,那么一只哈士奇就是这一个类的一个对象,它有颜色、高度、品种等状体;同时还有叫、破坏沙发、啃咬椅子等行为。
代码中的对象: 代码中的对象是有状态和行为的,其状态就是代码中的属性,其行为就是代码中的方法。比如如下Java代码:

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 7

导致烂代码的35个恶习,看看你染上了几个?

 《人月神话》出版以来,IT行业的科技公司们一直苦苦追寻传说中以一当十的超级程序员,最新的研究表明确实存在这样一小撮效率奇高的“程序金刚”,但是一位普通程序猿如何能够蜕变成代码金刚呢? 

近日web开发专家Christian  Maioli总结了导致程序猿效率低下,代码像意大利面条一样难以维护的35条恶习(归为代码组织、团队工作、写代码、测试与维护四大类)。 

代码组织

1.总是说“一会弄好”,但从来不兑现。(缺乏任务管理和时间管理能力) 

Tags:

发布: 青软IT学院 分类: 未分类 评论: 0 浏览: 5