本章内容:处理错误与调试JavaScript代码
一、错误处理
错误处理在程序设计中的重要性是毋庸置疑的,良好的错误处理机制可以让用户及时得到提醒。
1.1、try-catch 语句
ECMA-263第3版引入了 try-catch 语句,作为 JavaScript 中 处理异常的一种标准方式。基本的语法如下:
try {
// 可能会导致错误的代码
} catch(err) {
// 在错误发生时怎么处理
}
如果 try 块中的任何代码发生了错误,就会立即退出代码执行过程,然后接着执行 catch 块。此时,catch 快会接受到一个包含错误信息的对象。 catch 中 的error(错误信息的对象)中,包含的实际信息回因浏览器的不同而异,但共同的是有一个保存着错误消息的 message 属性。
1.1.1、finally 子句
虽然在 tyr-catch 语句中是可选的,但 finally 子句一经使用,其代码无论如何都会执行。只要代码中包含 finally 子句,则无论 try 或 catch 语句块中包含什么代码——甚至 return 语句,都不会阻止 finally 子句的执行。
function testFinally() {
try {
return 1
} catch(err) {
return 2
} finally {
return 3
}
}
console.log(testFinally()) // 3
在以上代码中,最后又一个 finally 子句,结构就会导致该 try 中 return的值被忽略掉;如果把 finally 子句拿掉,那么这个函数应该返回 1
如果提供了 finally 子句,则 catch 子句就成了可选的(catch 或 finally 有一个即可)。IE7及更早版本中有一个 bug;除非 catch 子句,否则finally 中的代码永远不会执行。如果你仍然要考虑 IE 的早起版本,那就只好提供一个 catch 子句,哪怕里面什么都不写。IE8修复了这个 bug。
1.1.2、错误类型
每种错误都有对应的错误类型,而当错误发生时,就会抛出相应类型的错误对象。 ECMA-262定义了下列7种错误类型:
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
Error 是基类型,其他错误类型都继承自该类型。Error 类型的错误很少见,如果有也是浏览器抛出的;这个基类型的主要目的是供开发人员抛出自定义错误。
EvalError 类型的错误会在使用 eval() 函数而发生异常时抛出,简单地说,如果没有把 eval() 当成函数调用,就会抛出错误。 例如:
new eval()
在实践中,浏览器不一定会在抛出错误时就抛出 EvalError,不同浏览器中存在差异。有鉴如此,加上在实际开发中极少会这样使用 eval(),所以遇到这种错误类型的可能性极小。
RangeError 类型的错误会在数组超出相应 范围时触发。 例如:在定义数组时,如果指定了数组不支持的项数(如 -20 或 Number.MAX_VALUE),就会触发这种错误。
var item1 = new Array(-20) // 抛出 RangeError
var item2 = new Array(Number.MAX_VALUE) // 抛出 RangeError
JavaScript中经常会出现这种范围错误
ReferenceError 会发生在找不到对象的情况下,通常在访问不存在的变量是,就会发生这种错误。 例如:
var obj = x // 在 x 未声明的情况下会抛出 ReferenceError
SyntaxError ,当我们把语法错误的JavaScript字符串传入 eval() 函数时,就会导致此类错误。 例如:
eval('a ++ b') // 抛出 SyntaxError
TypeError 类型在 JavaScript 中经常遇到,在变量中保存着以外的类型时,或者访问不存在方法是,都会导致这种错误。 如下示例:
var o = new 10 // TypeError
alert('name' in true) // TypeError
Function.prototype.toString.call('name') // TypeError
最常发生错误类型的情况,就是传递给函数的参数事先未检查,结果传入类型与预期类型不相符
URIError 类型错误,在使用 encodeURI() 或 decodeURI()时,传递的 URI 格式不正确时。这种错误也很少见,因为前面说的这两个函数的容错性非常高。
利用不同的错误类型,可以获悉更多有关异常的信息,从而有助于对错误作出恰当的处理。
try {
// todo
} catch(error) {
if (error instanceof TypeError) {
} else if(error instanceof ReferenceError) {
} else {
}
}
1.1.3、合理使用 try-catch
try-catch 能够让我们实现自己的错误处理机制。使用 try-catch 最适合处理那些我们无法控制的错误。在明明白白地知道自己的代码会发生错误时,再使用 try-catch 语句就不太合适了。
1.2、抛出错误
与 try-catch 语句相配的还有一个 throw 操作符,用于随时抛出自定义错误。抛出错误时,必须要给 throw 操作符指定一个值,这个值是什么类型,没有要求。
throw 123
throw 'Hello World!'
throw true
在遇到 throw 操作符是,代码会立即停止执行。当仅有 try-catch 语句捕获到被抛出的值时,代码才会继续执行。
通过使用某种内置消息错误类型,可以更真实地模拟浏览器错误,每种错误类型的构找函数接受一个参数,即实际的错误消息。
throw new Error('Something bad happened')
像下面使用其他错误类型,也可以模拟出类似的浏览器错误。
throw new SyntaxError('xxxx')
throw new TypeError('xxxx')
throw new RangeError('xxxx')
throw new EvalError('xxxx')
throw new URIError('xxxx')
throw new ReferenceError('xxxx')
另外,利用原型链还可以通过继承 Error 来创建自定义错误类型。此时,需要为新创建的错误类型指定 name 和 message 属性。
function CustomError(message) {
this.name = 'CustomError'
this.message = message
}
CustomError.prototype = new Error()
throw new CustomError('my message')
浏览器对待继承自 Error 的自定义错误类型,就像对待其他类型错误一样。如果要捕获自己抛出的错误并且把它与浏览器错误区别对待的话,创建自定义错误时很有用的。
1.2.1、抛出错误的时机
要针对函数为什么会执行失败给出更多信息,抛出自定义错误是一种很方便的方式。应该在出现某种特定的已知错误条件,导致函数无法正常执行时抛出错误。 下面的函数会在参数不是数组的情况下失败:
function process(values) {
values.sort()
for(var i = 0, len = values.length; i < len; i++ ) {
if (values[i] > 100) {
return values[i]
}
}
return -1
}
如果执行这个函数时,传递一个字符串,那么对 sort() 的调用就会失败。对此,不同浏览器会给出不同的错误信息,但都不是特别明确,如下所示:
IE:对象不支持“sort”属性或方法
Firefox:values.sort() 不是函数
Safari:值 undefined (表达式 values.sort 的结果)不是对象。
Chrome:values.sort() 不是函数
Opera:类型不匹配(通常是在需要对象的地方使用了非对象值)
这种情况下,带有适当信息的自定义错误能够显著提升代码的可维护性。
function process(values) {
if (!(values instanceof Array)) {
throw new Error('process(): Arguments must be an array.')
}
// ...
}
建议在开发 JavaScript 代码的过程中,重点关注函数和可能导致函数执行失败的因素。良好的错误处理机制应该确保代码中只发生你自己抛出的错误。
1.2.2、抛出错误与使用 try-catch
关于何时抛出错误,而何时该使用 try-catch 来捕获他们,是一个老生常谈的问题。我们认为只应该捕获那些确切知道该如何处理的错误。捕获错误的目的在于米面浏览器以默认的方式处理它们;而抛出错误的目的在于提供错误发生具体原因的消息。
1.3、错误(error)事件
任何没有通过 try-catch 处理的错误都会触发 window 对象的 error 事件。
这个事件时 Web 浏览器最早支持的事件之一,IE、Firefox、Chrome 为保存向后兼容,并没有对这个事件做任何修改(Opera、Safari 不支持 error 事件)。onerror 事件不会创建 event 对象,但它可以接收三个参数:错误消息、错误所在的URL、行号。要指定 onerror 事件处理程序,必须使用如下所示的 DOM0级技术,它没有遵循 “DOM2 级 事件”的标准格式。
window.onerror = function(message, url, line) {
alert(message + '----' + url + '-----' + line)
return false
}
只要发生错误,无论是不是浏览器生成的,都会触发 error 事件。而在 事件处理函数 中返回 false,可以组织浏览器报告错误的默认行为。 通过放回 false,这个函数实际上就充当了整个文档的 try-catch 语句。只要能够适当的使用 try-catch 语句,就不会有错误消息交给浏览器,也就不会触发 error 事件。
图像也支持 error 事件,只要图像的 src 特性中的 URL 不能反悔可以被识别的图形格式,就会触发 error 事件。此时 error 事件遵循 DOM 格式,会返回一个 以图像为目标的 event 对象。
var image = new Image()
image.onload = function(event) {
alert('image loaded!')
}
image.onerror = function(event) {
alert('image not loaded!')
}
image.src = 'smile.gif' //指定不存在的文件
1.4、处理错误的策略
由于 JavaScript 错误都可能导致网页无法使用,因此搞清楚何时以及为什么发生错误至关重要。作为开发人员,必须要知道代码何时可能出错,会出什么错,同时还要有一个跟踪此类问题的系统。
1.5、常见的错误类型
错误处理的核心,是首先要知道代码里会发生什么错误。由于 JavaScript 是松散类型的,而且也不会验证函数的参数,因此错误只会在代码运行期间出现。一般来说,需要关注三种错误:
1.5.1、类型转换错误
类型转换错误发生在使用某个操作符,或者使用其他可能会自动转换值的数据类型的语言结构时。在使用相等(==)和全等(===)操作符,或者在 if、for 及 while 等流程控制语句中使用 非布尔值是,最常发生类型转换错误。 由于在非动态语言中,开发人员都使用相同的符号执行直观的比较,因此在 JavaScript 中往往也会以相同方式错误地使用他们。
alert(5 == '5') // true
alert(5 === '5') // false
alert(1 == true) // true
alert(1 === true) // false
容易发生类型转成错误的另一个地方,就是流程控制语句。像 if 之类的语句在确定下一步操作之前,会自动把任何值换行成布尔值。尤其是 if 语句,如果使用不当,最容易出错。
function concat(str1, str2, str3) {
var result = str1 + str2
if (str3) { // 不要这样做
result += str3
}
return result
}
假设第三个参数是数值0,那么if鱼护的测试就会失败,而对数值1的测试则会通过 在流程控制语句中使用非布尔值,是极为常见的一个错误来源。为避免此类错误,就要做到在条件比较时传入布尔值。
function concat(str1, str2, str3) {
var result = str1 + str2
if (typeof str3 == 'string') { // 恰当的比较
result += str3
}
return result
}
1.5.2、数据类型错误
JavaScript 是松散型的,在使用变量和函数参数之前,不会对它们进行比较以确保它们的数据类型正确。为了保证不会发生数据类型错误,只能依靠开发人员编写适当的数据类型检测代码。
function getQueryString(url) {
if (typeof url == 'string') {
var pos = url.indexof('?')
if (pos > -1) {
return url.substring(pos + 1)
}
}
return ''
}
前面提到,在流程控制语句中使用 非布尔值作为条件很容易导致类型转换错误。同样,这样做也经常会导致数据类型错误。
function reverseSort(values) {
// if (values) { // 不要这样做!
// if (values != null) { // 不要这样做!
// if (typeof values.sort == 'function') { //不要这样做!
if (values instanceof Array) { // 正确做法
values.sort()
values.reverse()
}
}
大体上来说,基本类型的值应该使用 typeof 来检测,而对象的值则应该使用 instanceof 来检测。
1.5.3、通信错误
JavaScript 与 服务器之间的任何一次通信,都有可能会产生错误。
第一种通信错误与格式不正确的 URL 或发送的数据有光。常见的是没有使用 encodeURIComponent() 对数据进行编码。 例如,下面这个URL的格式就是不正确的:
http://www.yourdomain.com/?redir=http://www.comeotherdomain.com?a=b&c=d
需要针对‘ redir=’ 后面的所有字符串调用 encodeURIComponent() 就可以解决这个问题。
对于查询字符串,应该记住必须要使用 encodeURIComponent() 方法。为了确保这一点,有时候可以定义一个处理查询字符串的函数,例如:
function addQueryStringArg(url, name, value) {
if (url.indexOf('?') == -1) {
url += '?'
} else {
url += '&'
}
url += encodeURIComponent(name) + '=' + encodeURIComponent(value)
return url
}
另外,在服务器相应的数据不正确时,就会发生通信错误。在没有返回相应资源的情况下,Firefox、Chrome、Safari 会默默地失败,IE 和 Opera 则都会报错,
1.6、区分致命错误和非致命错误
任何错误处理策略中最重要的一个部分,就是确定错误是否致命。
非致命错误,可以根据下列一或多个条件来确定:
不影响用户的主要任务
只影响页面的一部分
可以恢复
重复相同操作可以取消错误
致命错误,可以通过以下一或多个条件来确定:
应用程序根本无法继续运行
错误明显影响到了用户的主要操作
会导致其他连带错误
区分非致命错误和致命错误的主要依据,就是看他们对用户的影响。设计良好的代码,可以做到应用程序某一部分发生错误不会不必要地影响另一个实际上毫不相干的部分。
for (var i = 0; len = mods.length; i < len; i++) {
mods[1].init() // 可能会导致致命错误
}
表明上看,这些代码没什么问题:依次对每个模块调用 init() 方法。问题在于,任何模块的 init() 方法如果出错,都会导致数组中后续的所有模块无法再进行初始化。 修改如下:
for (var i = 0; len = mods.length; i < len; i++) {
try {
mods[i].init()
} catch (ex) {
// 这里处理错误
}
}
1.7、把错误记录到服务器
开发 Web 引用程序过程中的一种常见的做法,就是集中保存错误日志,以便查找重要错误的原因。例如数据库和服务器错误都会定期写入日志,而且会按照常用 API 进行分类。在复杂的Web 应用程序中,也推荐你把 JavaScript 错误也回写到服务器。
要建立这样一种 JavaScript 错误记录系统,首先需要在服务器上创建一个页面(或者一个服务器入口点),用于处理数据错误。从查询字符串中取得数控,然后再将数据写入错误日志中:
function logError(sev, msg) {
var img = new Image()
img.src = 'log.php?sev=' + encodeURIComponent(sev) + '&msg=' + encodeURIComponent(msg)
}
这个 logError() 函数接收两个参数:表示严重程序的数组或字符串(视所用系统而异)及错误消息。其中,使用了 Image 对象来发生请求,这样做非常灵活,主要表现如下几方面。
所有浏览器都支持 Image 对象,包括那些不支持 XMLHttpRequest 对象的浏览器
可以避免跨域限制。
在记录错误的过程中出问题的概率比较低。大多数 Ajax 通信都是由 JavaScript 库提供的包装函数来处理的,如果库代码本身有问题,而你还在依赖该库记录错误,可想而知,错误消息是不可能得到记录的。
只要使用 try-catch 语句,就应该把相应错误记录到日志中。
for (var i = 0, len = mods.length; i < len; i++) {
try {
mods[i].init()
} catch(ex) {
logError('nonfatal', 'Module init failed: ' + ex.message)
}
}
二、调试技术
起初,最常见的错发就是在要调试的代码中随处 插入 alert() 函数。但这种做法一方面比较麻烦(调试之后还需要清理),另一方面还可能引入新问题。如今,已经有了很多更好的调试工具,因此不建议在调试中使用 alert() 了。
2.1、将消息记录到控制台
通过 console 对象向 JavaScript 控制台中写入消息,这个对象具有下列方法。
error(message):将错误消息记录到控制台(一般为红色)
info(message):将信息性消息记录到控制台
log(message):将一般消息记录到控制台
warn(message):将警告消息记录到控制台(一般为黄色) 在 Opera 10.5 之前的版本中,JavaScript 控制台可以通过 opera.postError() 方法来访问。这个方法接受一个参数,即要写入到控制台中的参数。它能向 JavaScript 控制台中写入任何信息
还有一种方案是 使用 LiveConnect,也就是在 JavaScript中 运行 java 代码。Firefox、Safari、Opera都支持 LiveConnect,因此可以操作 Java 控制台
不存在一种跨浏览器向 JavaScript 控制台写入消息的机制,但下面的函数倒可以作为统一的接口。
function log(message) {
if (typeof console == 'object') {
console.log(message)
} else if( typeof opera == 'object') {
opera.postError(message)
} else if (typeof java == 'object' && typeof java.lang = 'object') {
java.lang.System.out.println(message)
}
}
2.2、将消息记录到当前页面
另一种输出调试消息的方式,就是在页面中开辟一块小区域,用以显示消息。这个区域通常是一个元素,该元素可以总是出现在页面中,但仅用于调试目的;也可以是一个根据需要动态创建的元素, 例如:将 log() 函数修改如下所示
window.onload = function(event) {
function log(message) {
var log = document.getElementById('debuginfo')
if (log === null) {
log = document.createElement('div')
log.id = 'debuginfo'
log.style.backgroundColor = 'rgba(0, 0, 0, .5)'
log.style.width = document.body.clientWidth + 'px'
log.style.height = document.body.clientHeight + 'px'
log.style.position = 'absolute'
log.style.left = 0
log.style.top = 0
document.body.appendChild(log)
}
log.innerHTML += ''+ message +'
'
}
log('Something bad happended')
}
2.3、抛出错误
抛出错误也是一种调试代码的好办法,如果错误消息很具体,基本上就可以把它当做确定错误来源的依据。但这种错误消息必须能够明确给出导致错误的原因,才能省去其他调试操作。
function divide(num1, num2) {
if (typeof num1 != 'number' || typeof num2 != 'number') {
throw new Error('divide(): Both argyments must be numvers.')
}
return num1 / num2
}
浏览器只要报告了这个错误消息,我们就可以立即知道错误来源及问题的性质。相对来说,这种具体的错误消息要比那些凡凡的浏览器错误消息更有用。
对于大型应用程序来说,自定义的错误通常都使用 assert() 函数抛出。这个函数接受两个参数,一个是求值结果应该为 true 的条件,另一个是条件为 false 时要抛出的错误 以下是一个非常基本 assert() 函数
function assert(condition, message) {
if (!condition) {
throw new Error(message)
}
}
可以使用这个 assert() 函数代替某些函数中需要调试的 if 语句,以便输出错误消息。
function divide(num1, num2) {
assert(typeof num1 == 'number' && typeof num2 == 'number', 'divide(): Both arguments must be bumbers.')
return num1 / num2
}
三、常见的IE错误
多年以来,IE一直都是最难与调试 JavaScript 错误的浏览器。IE给出的错误消息一般很短有语焉不详,而且上下文信息也很少。但作为用户最多的浏览器,如何看懂IE给出的错误也是很受关注的。
3.1、操作终止
在 IE8 之前的版本只,存在一个相对其他浏览器而言,最令人迷惑、讨厌,也最难与调试的错误:w(operation aborted) 。在修改尚未加载完成页面时,就会发生这个错误。发生错误时,会出现一个模态对话框,告诉你“操作终止”。单机 确定(ok)按钮,就会卸载整个页面,继而显示一张空白屏幕;
3.2、无效字符
JavaScript 文件必须包含特定的字符。在 JavaScript 文件中存在无效字符时,IE会抛出 无效字符(invalid character)错误。所谓无效字符,就是 JavaScript 语法中未定义的字符。其它浏览器对无效字符做出的反应与 IE 类似,Firefox 会抛出非法字符(illegal character)错误,Safari会报告发生了语法错误,而Opera会报告发生了 ReferenceError(引用错误),因为它会将无效字符串解释为未定义的标识符。
3.3、未找到成员
IE中的未找到成员(Member not found)错误,是由于垃圾收集例程配合错误所直接导致的。如果在对象被销毁之后,又给对象赋值,就会导致未找到成员错误。而导致这个错误的,一定是 COM 对象。发生这个错误的最常见情形是使用 event 对象的时候。假设你在一个闭包中使用了 event 对象,而该闭包不会立即执行,那么在将来调用它并给 event 的属性赋值时,就会导致未找到成员错误。
document.onclick = function() {
var event = window.event
setTimeout(function() {
event.returnfalse = false // 未找到成员错误
}, 1000)
}
3.4、未知运行时错误
当使用 innerHTML 或 outHTML 以下列方式指定 HTML 时,就会发生未知运行错误(Unknown runtime erro) :
把块元素插入到行内元素时
访问表格任意部分(、 等)的任意属性时
3.5、语法错误
通常,只要IE 一报告发生了语法错误(syntax error) ,都可以很快找到错误的原因。这时候,原因可能是代码少了一个分号,或者花括号前后不对应。然而,还有一种原因不十分明显的情况需要格外注意。 如果你引用了外部的 JavaScript 文件,而该文件最终并没有返回 JavaScript 代码,IE 也会跑出语法错误。通常都会说该错误位于脚本第一行的第一个字符处。
3.6、系统无法找到指定资源
系统无法找到指定资源(The system cannot locate the resource specified) 这种说法,恐怕算是 IE 给出的最有价值的错误消息了。在使用 JavaScript 请求某个 URL,而该URL的长度超过了 IE 对 URL最长不能超过 2083 个字符的限制时,就会触发这个错误。IE不仅限制了 JavaScript 中使用 的URL的长度,而且也限制了用户在浏览器自身中使用的URL长度(其它浏览器对URL的限制没有这么严格)。IE对URL路径还有一个不能超过 2048 个字符的限制。
四、小结
错误处理对于今天复杂的 Web 应用程序开发而言至关重要。不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较差的用户体验,最终引发用户不满。多数浏览器在默认情况下都不会想用户报告错误,因此在开发和调试期间需要启用浏览器的错误报告功能。然而,在投入运行的产品代码中,则不应该再有诸如此类的错误报告出现。 下面是几种避免浏览器响应 JavaScript 错误的方法:
在可能发生错误的地方使用 try-catch 语句,这样你还有机会以适当的方式对 错误给出响应,而不必沿用浏览器处理错误的机制。
使用 window.onerror 事件处理程序,这种方式可以接收 try-catch 不能处理的所有错误(仅限于 IE、Firefox、Chrome)
另外,对任何 Web 应用程序都应该分析可能的错误来源,并制定处理错误的方案
首先,必须要明确是什么致命错误,什么是非致命错误。
其次,再分析代码,以判断最可能发生的错误。JavaScript 中发生错误的主要原因如下。
类型转换
未充分检测数据类型
发送给服务器或从服务器接收到的数据有错误
你可能感兴趣的:(错误处理与调试)
x86-64汇编语言训练程序与实战
十除以十等于一
本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层
《玉骨遥》:大司命为什么不杀朱颜?原因没那么简单
windy天意晚晴
《玉骨遥》里,朱颜就是时影的命劫之人。重明与时影早就知道,他们一直瞒着大司命,如今大司命也知道了真相。可是大司命却没有杀朱颜,而是给朱颜下了诛心咒,还说时影的命劫已经破了,真的如此吗?1、计划总是赶不上变化的大司命从目前剧情来说,大司命还不如时影,他信心十足的事情总会有纰漏。他不让时影见命劫之女,结果时影还是遇上了。他想让时影走火入魔,一心复仇,结果时影在朱颜的劝说下放下了仇恨。大司命让时影开山收
《极简思维》第三部分
小洋苏兮
整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别
我不懂什么是爱,但我给你全部我拥有的
香尧
因为怕黑,所以愿意陪伴在夜中行走的人,给他一点点的安全感。因为渴望温柔与爱,所以愿意为别的孩子付出爱与温柔。因为曾遭受侮辱和伤害,所以不以同样的方式施于其他人。如果你向别人出之以利刃,对方还了你爱与包容,真的不要感激他,真的不要赞美他。每一个被人伤害过的人心里都留下了一颗仇恨的种子,他也会想要有一天以眼还眼,以牙还牙。但他未让那颗种子生根发芽,他用一把心剑又一次刺向他自己,用他血荐仇恨,开出一朵温
别再讲道理啦,对方听不进去的
方所
我之前写过一篇叫做《你总妄想改变他人》,然后就有朋友跟我说,有一些方法可以改变他人之类的。嗯,是这样,但是任何具体的问题,都要限定好语境,描述清楚前提条件,然后再表达观点,我的这位朋友的说法就犯了一刀切的错误,这样并不能让讨论正常展开(这篇我得先给她看看,不然可能会挨揍)。好了,hhhh,谁让她不能写文章呢,我就来再说一说吧。我前面说过,我们在学到一个道理、学会一种方法之后,总是迫不及待地想要去与
Git 与 GitHub 的对比与使用指南
一念&
其它 git github
Git与GitHub的对比与使用指南在软件开发中,Git和GitHub是两个密切相关但本质不同的工具。下面我将逐步解释它们的定义、区别、核心概念以及如何协同使用,确保内容真实可靠,基于广泛的技术实践。1.什么是Git?Git是一个分布式版本控制系统,由LinusTorvalds于2005年创建。它的核心功能是跟踪代码文件的变化,帮助开发者管理项目历史记录、协作和回滚错误。Git是开源的,可以在本地
英伟达靠什么支撑起了4万亿?AI泡沫还能撑多久?
英伟达市值突破4万亿美元,既是AI算力需求爆发的直接体现,也暗含市场对未来的狂热预期。其支撑逻辑与潜在风险并存,而AI泡沫的可持续性则取决于技术、商业与地缘政治的复杂博弈。⚙️一、英伟达4万亿市值的核心支撑因素技术垄断与生态壁垒硬件优势:英伟达GPU在AI训练市场占有率超87%,H100芯片的FP16算力达1979TFLOPS,领先竞品3-5倍。CUDA生态:400万开发者构建的软件护城河,成为A
ARM 和 AMD 架构的区别
m0_69576880
arm开发 windows 架构
ARM架构和AMD架构是两种不同的计算机处理器架构,它们有以下几个主要区别:设计出发点、兼容性、性能特点、市场定价。设计出发点:①ARM构架:ARM架构最初是为嵌入式系统设计的,旨在提供低功耗和高效能的解决方案。它主要应用于移动设备、嵌入式系统和物联网设备②AMD架构:AMD架构是基于x86架构的扩展,旨在提供与Intel架构兼容的处理器。它主要用于台式机、服务器和工作站等计算机系统。兼容性:AR
Linux系统配置(应用程序)
1风天云月
Linux linux 应用程序 编译安装 rpm http
目录前言一、应用程序概述1、命令与程序的关系2、程序的组成3、软件包封装类型二、RPM1、RPM概述2、RPM用法三、编译安装1、解包2、配置3、编译4、安装5、启用httpd服务结语前言在Linux中的应用程序被视为将软件包安装到系统中后产生的各种文档,其中包括可执行文件、配置文件、用户手册等内容,这些文档被组织为一个有机的整体,为用户提供特定的功能,因此对于“安装软件包”与“安装应用程序”这两
JVM 内存模型深度解析:原子性、可见性与有序性的实现
练习时长两年半的程序员小胡
JVM 深度剖析:从面试考点到生产实践 jvm java 内存模型
在了解了JVM的基础架构和类加载机制后,我们需要进一步探索Java程序在多线程环境下的内存交互规则。JVM内存模型(JavaMemoryModel,JMM)定义了线程和主内存之间的抽象关系,它通过规范共享变量的访问方式,解决了多线程并发时的数据一致性问题。本文将从内存模型的核心目标出发,详解原子性、可见性、有序性的实现机制,以及volatile、synchronized等关键字在其中的作用。一、J
Flowable 实战落地核心:选型决策与坑点破解
练习时长两年半的程序员小胡
Flowable 流程引擎实战指南 低代码 BPMN 流程引擎 flowable 后端 java
在企业级流程引擎的落地过程中,选型的准确性和坑点的预见性直接决定项目成败。本文聚焦Flowable实战中最关键的“选型决策”与“常见坑点”,结合真实项目经验,提供可落地的解决方案。一、流程引擎选型:从业务本质出发1.1选型的三大核心维度企业在选择流程引擎时,需避免陷入“技术崇拜”,应回归业务本质。评估Flowable是否适用,可从三个维度判断:业务复杂度若流程涉及动态审批链(如按金额自动升级审批)
Flowable 高级扩展:自定义元素与性能优化实战
练习时长两年半的程序员小胡
Flowable 流程引擎实战指南 流程图 flowable BPMN 流程引擎 java
在前五篇文章中,我们从基础概念、流程设计、API实战、SpringBoot集成,到外部系统协同,逐步构建了Flowable的应用体系。但企业级复杂场景中,原生功能往往难以满足定制化需求——比如需要特殊的审批规则网关、与决策引擎联动实现动态路由,或是在高并发场景下优化流程引擎性能。本文将聚焦Flowable的高级扩展能力,详解如何自定义流程元素、集成规则引擎,并掌握大型系统中的性能调优策略。一、自定
互信息:理论框架、跨学科应用与前沿进展
大千AI助手
人工智能 Python # OTHER 人工智能 深度学习 算法 互信息 香农 通信 随机变量
1.起源与核心定义互信息(MutualInformation,MI)由克劳德·香农(ClaudeShannon)在1948年开创性论文《AMathematicalTheoryofCommunication》中首次提出,该论文奠定了现代信息论的基础。互信息用于量化两个随机变量之间的统计依赖关系,定义为:若已知一个随机变量的取值,能为另一个随机变量提供的信息量。数学上,对于离散随机变量XXX和YYY,
Java | 多线程经典问题 - 售票
Ada54
一、售票需求1)同一个票池2)多个窗口卖票,不能出售同一张票二、售票问题代码实现(线程与进程小总结,请戳:Java|线程和进程,创建线程)step1:定义SaleWindow类实现Runnable接口,覆盖run方法step2:实例化SaleWindow对象,创建Thread对象,将SaleWindow作为参数传给Thread类的构造函数,然后通过Thread.start()方法启动线程step3
企业级区块链平台Hyperchain核心原理剖析
boyedu
区块链 区块链 企业级区块链平台 Hyperchain
Hyperchain作为国产自主可控的企业级联盟区块链平台,其核心原理围绕高性能共识、隐私保护、智能合约引擎及可扩展架构展开,通过多模块协同实现企业级区块链网络的高效部署与安全运行。以下从核心架构、关键技术、性能优化、安全机制、应用场景五个维度展开剖析:一、核心架构:分层解耦与模块化设计Hyperchain采用分层架构,将区块链功能解耦为独立模块,支持灵活组合与扩展:P2P网络层由验证节点(VP)
JAVA接口机结构解析
秃狼
SpringBoot 八股文 Java java 学习
什么是接口机在Java项目中,接口机通常指用于与外部系统进行数据交互的中间层,负责处理请求和响应的转换、协议适配、数据格式转换等任务。接口机的结构我们的接口机的结构分为两个大部分,外部接口机和内部接口机,在业务的调度上也是通过mq来实现的,只要的目的就是为了解耦合和做差异化。在接口机中主要的方法就是定时任务,消息的发送和消费,其他平台调用接口机只能提供外部接口机的方法进行调用,外部接口机可以提供消
通义万相2.2:开启高清视频生成新纪元
Liudef06小白
特殊专栏 AIGC 人工智能 人工智能 通义万相2.2 图生视频
通义万相2.2:开启高清视频生成新纪元2025年7月28日,中国AI领域迎来里程碑时刻——通义万相团队正式开源其革命性视频生成模型Wan2.2的核心权重,这标志着开源社区首次获得支持720P高清视频生成的先进模型架构。一、架构革新:混合专家系统1.1MoE视频扩散架构通义万相2.2首次将混合专家(MoE)架构引入视频扩散模型,通过双专家系统实现计算效率与模型容量的平衡:classMoEVideoD
氧惠官方邀请码333777,氧惠邀请码怎么获得?氧惠邀请码有什么套路?
知行导师
问:氧惠邀请码怎么获得?答:氧惠官方邀请码333777返点高佣金高真的高。问:氧惠邀请码有什么套路?答:氧惠官方邀请码333777返点高佣金高真的高。氧惠APP汇聚各大主流电商和生活服务平台优惠,展示全网全品类商品,满足网购爱好者对品质好货与极致性价比的追求,并同时享受大平台购物权益保障。满足用户日常吃喝玩乐衣食住行的聚合APP,独特的商业模式,响应国家号召,为实现全民共富而努力奋斗。氧惠邀请码3
深入理解汇编语言子程序设计与系统调用
网安spinage
汇编语言 开发语言 汇编 算法
本文将全面解析汇编语言中子程序设计的核心技术以及系统调用的实现方法,涵盖参数传递的多种方式、堆栈管理、API调用等关键知识点,并提供实际案例演示。一、子程序设计:参数传递的艺术1.寄存器传参:高效简洁.386.modelflat,stdcalloptioncasemap:none.dataxdd5;定义变量ydd6sumdd?.code;函数定义:addxy1addxy1procpushebpmo
【老房翻新】92平轻奢简约风,将和谐之美融入空间!
没人比我更懂装修
在客厅空间中,设计师于冷静的空间基调中选用了层次感丰富的黄蓝色作为主要跳色,搭配黑白纹理的地毯与单椅,为空间增加了时尚摩登的气息。艺术感的单品突出点亮了空间,绿植的点缀、留白的软饰则增强了空间的呼吸性。点击此处添加图片说明文字点击此处添加图片说明文字设计师力求使每一处的设立都在空间中达到相互间的呼应与制衡,将艺术的跃动之美赋于空间之上,也将空间的和谐之美融于生活之中。点击此处添加图片说明文字点击此
京东家电年销售额是去年的1300%,主要来自于他....
Shanshan小课堂
经过大半个月角逐纠缠,时间终于来到6月18日,618全球年中购物节迎来最高潮。作为国内最大的家电零售平台,京东家电从18日0点开始,便开启了飞速狂奔的模式,仅8分钟销售额就突破20亿元!展现出强劲的增长势头与家电主场的王者霸气的同时,也让各家电品牌实现了爆发式增长,美的、海尔、格力、奥克斯均在3分钟内突破1亿元大关。在今年的618中,除了消费者已经熟悉的网购形式外,线上线下联动的融合模式、社交电商
编程算法:技术创新的引擎与业务增长的核心驱动力
在数字经济时代,算法已成为推动技术创新与业务增长的隐形引擎。从存内计算突破冯·诺依曼瓶颈,到动态规划优化万亿级金融交易,编程算法正在重塑产业竞争格局。一、存内计算:突破冯·诺依曼瓶颈的算法革命1.1存内计算的基本原理传统计算架构中90%的能耗消耗在数据搬运上。存内计算(Processing-in-Memory)通过直接在存储单元执行计算,实现能效10-100倍提升:#传统计算vs存内计算能耗模型i
图论算法经典题目解析:DFS、BFS与拓扑排序实战
周童學
数据结构与算法 深度优先 算法 图论
图论算法经典题目解析:DFS、BFS与拓扑排序实战图论问题是算法面试中的高频考点,本博客将通过四道LeetCode经典题目(均来自"Top100Liked"题库),深入讲解图论的核心算法思想和实现技巧。涵盖DFS、BFS、拓扑排序和前缀树等知识点,每道题配有Java实现和易错点分析。1.岛屿数量(DFS遍历)问题描述给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿的数量。岛屿由水平或
基于redis的Zset实现作者的轻量级排名
周童學
Java redis 数据库 缓存
基于redis的Zset实现轻量级作者排名系统在今天的技术架构中,Redis是一种广泛使用的内存数据存储系统,尤其在需要高效检索和排序的场景中表现优异。在本篇博客中,我们将深入探讨如何使用Redis的有序集合(ZSet)构建一个高效的笔记排行榜系统,并提供相关代码示例和详细的解析。1.功能背景与需求假设我们有一个笔记分享平台,用户可以发布各种笔记,系统需要根据用户发布的笔记数量来生成一个实时更新的
【项目实战】 容错机制与故障恢复:保障系统连续性的核心体系
本本本添哥
004 - 研效与DevOps运维工具链 002 - 进阶开发能力 分布式
在分布式系统中,硬件故障、网络波动、软件异常等问题难以避免。容错机制与故障恢复的核心目标是:通过主动检测故障、自动隔离风险、快速转移负载、重建数据一致性,最大限度减少故障对业务的影响,保障系统“持续可用”与“数据不丢失”。以下从核心机制、实现方式、典型案例等维度展开说明。一、故障检测:及时发现异常节点故障检测是容错的第一步,需通过多维度手段实时感知系统组件状态,确保故障被快速识别。1.健康检查与心
Java并发核心:线程池使用技巧与最佳实践! | 多线程篇(五)
bug菌¹
Java实战(进阶版) java Java零基础入门 Java并发 线程池 多线程篇
本文收录于「Java进阶实战」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows10+IntelliJIDEA2021.3.2+Jdk1.8本文目录前言摘要正文何为线程池?为什么需要线程池?线程池的好处线程池使用场景如何创建线程池?线程池的常见配置源码解析案例分享案例代码演示案例运行
D2早课与活力链接
亲爱的lingling
宇宙法则是:关注什么,什么就会变大。所以时刻关注自己在想什么,听什么,看什么!感恩今天早晨醒来的第一个意识是,真好,美好的一天开始了,我要越来越漂亮。起床做感恩冥想,呼吸法,喝一杯白开水,贴牛奶面膜。谢谢真我,感觉真好!感恩今天芳哥哥做的爱心早餐,给我煎了鸡蛋,谢谢芳哥的付出。谢谢!感恩我能够越来越清晰自己要做什么,越来越清楚知道自己想要的是什么,更加宁静与喜悦。今天早晨我听到我的高级智慧的声音,
Java 队列
tryxr
java 开发语言 队列
队列一般用什么哪种结构实现队列的特性数据入队列时一定是从尾部插入吗数据出队列时一定是从头部删除吗队列的基本运算有什么队列支持随机访问吗队列的英文表示什么是队列队列从哪进、从哪出队列的进出顺序队列是用哪种结构实现的Queue和Deque有什么区别Queue接口的方法Queue中的add与offer的区别offer、poll、peek的模拟实现如何利用链表实现队列如何利用顺序表实现队列什么叫做双端队列
与羊有关的诗句
胡天寿01
1.《初春汉中漾舟》(孟浩然)羊公岘山下,神女汉皋曲。雪罢冰复开,春潭千丈绿。轻舟恣来往,探玩无厌足。波影摇妓钗,沙光逐人目。倾杯鱼鸟醉,联句莺花续。良会难再逢,日入须秉烛。2.《边头作》(李端)邠郊泉脉动,落日上城楼。羊马水草足,羌胡帐幕稠。射雕过海岸,传箭怯边州。事归朝将,今年又拜侯。3.《出境游山》(王勃)源水终无路,山阿若有人。羊先动石,走兔欲投巾。4.《按覆后归睦州,赠苗侍御》(刘长卿)
5G-RAN与语义通信RAN
一去不复返的通信er
智简网络&语义通信 5G 人工智能 语义通信
1️⃣RAN协议栈与TCP/IP五层协议栈的对应关系a.物理层(TCP/IP)↔PHY(RAN)对应关系:5GNRRAN的物理层直接对应TCP/IP的物理层。功能对比:TCP/IP物理层:负责比特流的物理传输,如通过电缆、光纤或无线介质传输信号。RAN物理层:处理无线信号的调制、编码、信道估计和传输(如OFDM、LDPC编码)。在5GNR中,物理层负责将数据映射到无线信道(如PDSCH、PUSCH
java短路运算符和逻辑运算符的区别
3213213333332132
java基础
/*
* 逻辑运算符——不论是什么条件都要执行左右两边代码
* 短路运算符——我认为在底层就是利用物理电路的“并联”和“串联”实现的
* 原理很简单,并联电路代表短路或(||),串联电路代表短路与(&&)。
*
* 并联电路两个开关只要有一个开关闭合,电路就会通。
* 类似于短路或(||),只要有其中一个为true(开关闭合)是
Java异常那些不得不说的事
白糖_
java exception
一、在finally块中做数据回收操作
比如数据库连接都是很宝贵的,所以最好在finally中关闭连接。
JDBCAgent jdbc = new JDBCAgent();
try{
jdbc.excute("select * from ctp_log");
}catch(SQLException e){
...
}finally{
jdbc.close();
utf-8与utf-8(无BOM)的区别
dcj3sjt126com
PHP
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样如
JAVA Annotation之定义篇
周凡杨
java 注解 annotation 入门 注释
Annotation: 译为注释或注解
An annotation, in the Java computer programming language, is a form of syntactic metadata that can be added to Java source code. Classes, methods, variables, pa
tomcat的多域名、虚拟主机配置
g21121
tomcat
众所周知apache可以配置多域名和虚拟主机,而且配置起来比较简单,但是项目用到的是tomcat,配来配去总是不成功。查了些资料才总算可以,下面就跟大家分享下经验。
很多朋友搜索的内容基本是告诉我们这么配置:
在Engine标签下增面积Host标签,如下:
<Host name="www.site1.com" appBase="webapps"
Linux SSH 错误解析(Capistrano 的cap 访问错误 Permission )
510888780
linux capistrano
1.ssh -v
[email protected] 出现
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
错误
运行状况如下:
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuratio
log4j的用法
Harry642
java log4j
一、前言: log4j 是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现, 当时在log4j完成时,log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中
mysql、sqlserver、oracle分页,java分页统一接口实现
aijuans
oracle jave
定义:pageStart 起始页,pageEnd 终止页,pageSize页面容量
oracle分页:
select * from ( select mytable.*,rownum num from (实际传的SQL) where rownum<=pageEnd) where num>=pageStart
sqlServer分页:
 
Hessian 简单例子
antlove
java Web service hessian
hello.hessian.MyCar.java
package hessian.pojo;
import java.io.Serializable;
public class MyCar implements Serializable {
private static final long serialVersionUID = 473690540190845543
数据库对象的同义词和序列
百合不是茶
sql 序列 同义词 ORACLE权限
回顾简单的数据库权限等命令;
解锁用户和锁定用户
alter user scott account lock/unlock;
//system下查看系统中的用户
select * dba_users;
//创建用户名和密码
create user wj identified by wj;
identified by
//授予连接权和建表权
grant connect to
使用Powermock和mockito测试静态方法
bijian1013
持续集成 单元测试 mockito Powermock
实例:
package com.bijian.study;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import or
精通Oracle10编程SQL(6)访问ORACLE
bijian1013
oracle 数据库 plsql
/*
*访问ORACLE
*/
--检索单行数据
--使用标量变量接收数据
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
select ename,sal into v_ename,v_sal
from emp where empno=&no;
dbms_output.pu
【Nginx四】Nginx作为HTTP负载均衡服务器
bit1129
nginx
Nginx的另一个常用的功能是作为负载均衡服务器。一个典型的web应用系统,通过负载均衡服务器,可以使得应用有多台后端服务器来响应客户端的请求。一个应用配置多台后端服务器,可以带来很多好处:
负载均衡的好处
增加可用资源
增加吞吐量
加快响应速度,降低延时
出错的重试验机制
Nginx主要支持三种均衡算法:
round-robin
l
jquery-validation备忘
白糖_
jquery css F# Firebug
留点学习jquery validation总结的代码:
function checkForm(){
validator = $("#commentForm").validate({// #formId为需要进行验证的表单ID
errorElement :"span",// 使用"div"标签标记错误, 默认:&
solr限制admin界面访问(端口限制和http授权限制)
ronin47
限定Ip访问
solr的管理界面可以帮助我们做很多事情,但是把solr程序放到公网之后就要限制对admin的访问了。
可以通过tomcat的http基本授权来做限制,也可以通过iptables防火墙来限制。
我们先看如何通过tomcat配置http授权限制。
第一步: 在tomcat的conf/tomcat-users.xml文件中添加管理用户,比如:
<userusername="ad
多线程-用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
bylijinnan
java 多线程
public class IncDecThread {
private int j=10;
/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--内部类
*/
public static
买房历程
cfyme
2015-06-21: 万科未来城,看房子
2015-06-26: 办理贷款手续,贷款73万,贷款利率5.65=5.3675
2015-06-27: 房子首付,签完合同
2015-06-28,央行宣布降息 0.25,就2天的时间差啊,没赶上。
首付,老婆找他的小姐妹接了5万,另外几个朋友借了1-
[军事与科技]制造大型太空战舰的前奏
comsci
制造
天气热了........空调和电扇要准备好..........
最近,世界形势日趋复杂化,战争的阴影开始覆盖全世界..........
所以,我们不得不关
dateformat
dai_lm
DateFormat
"Symbol Meaning Presentation Ex."
"------ ------- ------------ ----"
"G era designator (Text) AD"
"y year
Hadoop如何实现关联计算
datamachine
mapreduce hadoop 关联计算
选择Hadoop,低成本和高扩展性是主要原因,但但它的开发效率实在无法让人满意。
以关联计算为例。
假设:HDFS上有2个文件,分别是客户信息和订单信息,customerID是它们之间的关联字段。如何进行关联计算,以便将客户名称添加到订单列表中?
&nbs
用户模型中修改用户信息时,密码是如何处理的
dcj3sjt126com
yii
当我添加或修改用户记录的时候对于处理确认密码我遇到了一些麻烦,所有我想分享一下我是怎么处理的。
场景是使用的基本的那些(系统自带),你需要有一个数据表(user)并且表中有一个密码字段(password),它使用 sha1、md5或其他加密方式加密用户密码。
面是它的工作流程: 当创建用户的时候密码需要加密并且保存,但当修改用户记录时如果使用同样的场景我们最终就会把用户加密过的密码再次加密,这
中文 iOS/Mac 开发博客列表
dcj3sjt126com
Blog
本博客列表会不断更新维护,如果有推荐的博客,请到此处提交博客信息。
本博客列表涉及的文章内容支持 定制化Google搜索,特别感谢 JeOam 提供并帮助更新。
本博客列表也提供同步更新的OPML文件(下载OPML文件),可供导入到例如feedly等第三方定阅工具中,特别感谢 lcepy 提供自动转换脚本。这里有导入教程。
js去除空格,去除左右两端的空格
蕃薯耀
去除左右两端的空格 js去掉所有空格 js去除空格
js去除空格,去除左右两端的空格
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g
SpringMVC4零配置--web.xml
hanqunfeng
springmvc4
servlet3.0+规范后,允许servlet,filter,listener不必声明在web.xml中,而是以硬编码的方式存在,实现容器的零配置。
ServletContainerInitializer:启动容器时负责加载相关配置
package javax.servlet;
import java.util.Set;
public interface ServletContainer
《开源框架那些事儿21》:巧借力与借巧力
j2eetop
框架 UI
同样做前端UI,为什么有人花了一点力气,就可以做好?而有的人费尽全力,仍然错误百出?我们可以先看看几个故事。
故事1:巧借力,乌鸦也可以吃核桃
有一个盛产核桃的村子,每年秋末冬初,成群的乌鸦总会来到这里,到果园里捡拾那些被果农们遗落的核桃。
核桃仁虽然美味,但是外壳那么坚硬,乌鸦怎么才能吃到呢?原来乌鸦先把核桃叼起,然后飞到高高的树枝上,再将核桃摔下去,核桃落到坚硬的地面上,被撞破了,于是,
JQuery EasyUI 验证扩展
可怜的猫
jquery easyui 验证
最近项目中用到了前端框架-- EasyUI,在做校验的时候会涉及到很多需要自定义的内容,现把常用的验证方式总结出来,留待后用。
以下内容只需要在公用js中添加即可。
使用类似于如下:
<input class="easyui-textbox" name="mobile" id="mobile&
架构师之httpurlconnection----------读取和发送(流读取效率通用类)
nannan408
1.前言.
如题.
2.代码.
/*
* Copyright (c) 2015, S.F. Express Inc. All rights reserved.
*/
package com.test.test.test.send;
import java.io.IOException;
import java.io.InputStream
Jquery性能优化
r361251
JavaScript jquery
一、注意定义jQuery变量的时候添加var关键字
这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下:
$loading = $('#loading'); //这个是全局定义,不知道哪里位置倒霉引用了相同的变量名,就会郁闷至死的
二、请使用一个var来定义变量
如果你使用多个变量的话,请如下方式定义:
. 代码如下:
var page
在eclipse项目中使用maven管理依赖
tjj006
eclipse maven
概览:
如何导入maven项目至eclipse中
建立自有Maven Java类库服务器
建立符合maven代码库标准的自定义类库
Maven在管理Java类库方面有巨大的优势,像白衣所说就是非常“环保”。
我们平时用IDE开发都是把所需要的类库一股脑的全丢到项目目录下,然后全部添加到ide的构建路径中,如果用了SVN/CVS,这样会很容易就 把
中国天气网省市级联页面
x125858805
级联
1、页面及级联js
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&l