问题:
在前端获取事件属性时,报错,找不到属性
目前的事件 SIMEventObject 中有这样的属性, sAddr,dAddr,它们的特的是第一个字母小写,第二个字母大写
但是在前端通过 ${event.sAddr}取值的时候,总是报找不到 sAddr 属性
这个问题以前也碰到过,但是没有往心里去,现在再次碰到,找了一下Java源码,才发现Java文档里其实有说明
原因:
1. 以前一直认为一个JavaBean,应该包括属性,setter,getter 方法,setter/getter 的命名规则则是将属性的第一个字母大写,前面加上 get/set ,但事实上不是这样,属性的名称跟 setter/getter 方法的名称无关,比如说,你可以这样写:
public class Bean{
private String anyword;
public void setProp(String anyword)
{ }
this.anyword = anyword;
}
public String getProp()
return anyword;
}
}
2. 对于 jstl 中的表达式 ${event.sAddr},实际的执行过程是这样:
a. 首选根据 event 的类型, 比如 SIMEventObject,得到其 BeanInfo
b. 在 BeanInfo 中 包含 event 的属性
c. 这个属性名称的来源是不是我们通常理解的 field, 而是根据 Bean 规范得到的(应该是根据 setter/getter 方法)
d. 得到属性名称时,它会将得到的属性字串的第一个字母去大写化,比如 由getDevAddr,得到 DevAddr,然后最后得到的是 devAddr;
e. 但是如果属性有多个字母,且第一个字母,第二个字母都大写的,则不做处理,比如 getSAddr,则直接返回 SAddr,也就是说,它认为 SAddr 是这个 Bean 的属性,而不是 sAddr
下面是部分过程代码:
BeanInfo mBeanInfo = Introspector.getBeanInfo (SIMEventObject.class);
PropertyDescriptor[] pds = mBeanInfo.getPropertyDescriptors();
Map propMap = new TreeMap();
Method readMethod = getPublicMethod (pd.getReadMethod ());
Method writeMethod = getPublicMethod (pd.getWriteMethod ());
BeanInfoProperty property = new BeanInfoProperty(readMethod,writeMethod,pd);
for(PropertyDescriptor pd : pds)
{
//问题在这里,就是 pd.getName(),对于第一个字母,第二个字母都是大写的,它不会做处理,即,SAddr/Saddr/SaDrr/saddr,返回 SAddr/saddr/saDrr/saddr 但对于其他情况,则将第一个字母变成小写返回,比如 saddr/SaDdr,则返回 saddr;但是当取值${event.sAddr}时,它会从 map 中获取属性,用如下方法: propMap.get("sAddr"),而实际上 propMap 中的key值是 SAddr,所以,如果我们将表达式换成 ${event.SAddr}
即可
propMap.put(pd.getName(),pd)
}
----------------------------------
将首字母变成小写调用是以下方法:
java.beans.Introspector
decapitalize
public static String decapitalize(String name)获得一个字符串并将它转换成普通 Java 可用名称大写形式的实用程序方法。这通常意味着将首字符从大写转换成小写,但在(不平常的)特殊情况下,当有多个字符且第一个和第二个字符都是大写字符时,不执行任何操作。
因此 "FooBah" 变成 "fooBah","X" 变成 "x",但 "URL" 仍然是 "URL"。
2008年11月28日星期五
2008年11月25日星期二
Yahoo!网站性能最佳体验的34条黄金守则之JavaScript和CSS
Yahoo!网站性能最佳体验的34条黄金守则之JavaScript和CSS
From: http://hi.baidu.com/szhesh/blog/item/25276d344d57ac3d5bb5f585.html
在第一部分和第二部分中我们分别介绍了改善网站性能中页面内容和服务器的几条守则,除此之外,JavaScript和CSS也是我们页面中经常用到的内容,对它们的优化也提高网站性能的重要方面:
CSS:
把样式表置于顶部
避免使用CSS表达式(Expression)
使用外部JavaScript和CSS
削减JavaScript和CSS
用< link>代替@import
避免使用滤镜
JavaScript
把脚本置于页面底部
使用外部JavaScript和CSS
削减JavaScript和CSS
剔除重复脚本
减少DOM访问
开发智能事件处理程序
17、把样式表置于顶部
在研究Yahoo!的性能表现时,我们发现把样式表放到文档的< head />内部似乎会加快页面的下载速度。这是因为把样式表放到< head />内会使页面有步骤的加载显示。
注重性能的前端服务器往往希望页面有秩序地加载。同时,我们也希望浏览器把已经接收到内容尽可能显示出来。这对于拥有较多内容的页面和网速较慢的用户来说特别重要。向用户返回可视化的反馈,比如进程指针,已经有了较好的研究并形成了正式文档。在我们的研究中HTML页面就是进程指针。当浏览器有序地加载文件头、导航栏、顶部的logo等对于等待页面加载的用户来说都可以作为可视化的反馈。这从整体上改善了用户体验。
把样式表放在文档底部的问题是在包括Internet Explorer在内的很多浏览器中这会中止内容的有序呈现。浏览器中止呈现是为了避免样式改变引起的页面元素重绘。用户不得不面对一个空白页面。
HTML规范清楚指出样式表要放包含在页面的< head />区域内:“和< a />不同,< link />只能出现在文档的< head />区域内,尽管它可以多次使用它”。无论是引起白屏还是出现没有样式化的内容都不值得去尝试。最好的方案就是按照HTML规范在文档< head />内加载你的样式表。
18、避免使用CSS表达式(Expression)
CSS表达式是动态设置CSS属性的强大(但危险)方法。Internet Explorer从第5个版本开始支持CSS表达式。下面的例子中,使用CSS表达式可以实现隔一个小时切换一次背景颜色:
background-color: expression( (new Date()).getHours()%2 "#B8D4FF" : "#F08A00" );
如上所示,expression中使用了JavaScript表达式。CSS属性根据JavaScript表达式的计算结果来设置。expression方法在其它浏览器中不起作用,因此在跨浏览器的设计中单独针对Internet Explorer设置时会比较有用。
表达式的问题就在于它的计算频率要比我们想象的多。不仅仅是在页面显示和缩放时,就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给CSS表达式增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到10000次以上的计算量。
一个减少CSS表达式计算次数的方法就是使用一次性的表达式,它在第一次运行时将结果赋给指定的样式属性,并用这个属性来代替CSS表达式。如果样式属性必须在页面周期内动态地改变,使用事件句柄来代替CSS表达式是一个可行办法。如果必须使用CSS表达式,一定要记住它们要计算成千上万次并且可能会对你页面的性能产生影响。
19、使用外部JavaScript和CSS
很多性能规则都是关于如何处理外部文件的。但是,在你采取这些措施前你可能会问到一个更基本的问题:JavaScript和CSS是应该放在外部文件中呢还是把它们放在页面本身之内呢?
在实际应用中使用外部文件可以提高页面速度,因为JavaScript和CSS文件都能在浏览器中产生缓存。内置在HTML文档中的JavaScript 和CSS则会在每次请求中随HTML文档重新下载。这虽然减少了HTTP请求的次数,却增加了HTML文档的大小。从另一方面来说,如果外部文件中的 JavaScript和CSS被浏览器缓存,在没有增加HTTP请求次数的同时可以减少HTML文档的大小。
关键问题是,外部JavaScript和CSS文件缓存的频率和请求HTML文档的次数有关。虽然有一定的难度,但是仍然有一些指标可以一测量它。如果一个会话中用户会浏览你网站中的多个页面,并且这些页面中会重复使用相同的脚本和样式表,缓存外部文件就会带来更大的益处。
许多网站没有功能建立这些指标。对于这些网站来说,最好的坚决方法就是把JavaScript和CSS作为外部文件引用。比较适合使用内置代码的例外就是网站的主页,如Yahoo!主页和My Yahoo!。主页在一次会话中拥有较少(可能只有一次)的浏览量,你可以发现内置JavaScript和CSS对于终端用户来说会加快响应时 间。
对于拥有较大浏览量的首页来说,有一种技术可以平衡内置代码带来的HTTP请求减少与通过使用外部文件进行缓存带来的好处。其中一个就是在首页中内置 JavaScript和CSS,但是在页面下载完成后动态下载外部文件,在子页面中使用到这些文件时,它们已经缓存到浏览器了。
20、削减JavaScript和CSS
精简是指从去除代码不必要的字符减少文件大小从而节省下载时间。消减代码时,所有的注释、不需要的空白字符(空格、换行、tab缩进)等都要去掉。在 JavaScript中,由于需要下载的文件体积变小了从而节省了响应时间。精简JavaScript中目前用到的最广泛的两个工具是JSMin和YUI Compressor。YUI Compressor还可用于精简CSS。
混淆是另外一种可用于源代码优化的方法。这种方法要比精简复杂一些并且在混淆的过程更易产生问题。在对美国前10大网站的调查中发现,精简也可以缩小原来代码体积的21%,而混淆可以达到25%。尽管混淆法可以更好地缩减代码,但是对于JavaScript来说精简的风险更小。
除消减外部的脚本和样式表文件外,< script>和< style>代码块也可以并且应该进行消减。即使你用Gzip压缩过脚本和样式表,精简这些文件仍然可以节省5%以上的空间。由于JavaScript和CSS的功能和体积的增加,消减代码将会获得益处。
21、用< link>代替@import
前面的最佳实现中提到CSS应该放置在顶端以利于有序加载呈现。
在IE中,页面底部@import和使用< link>作用是一样的,因此最好不要使用它。
22、避免使用滤镜
IE独有属性AlphaImageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素(不仅仅是图片)它都会运算一次,增加了内存开支,因此它的问题是多方面的。
完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很好地工作。如果你确实需要使用AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用户无效。
23、把脚本置于页面底部
脚本带来的问题就是它阻止了页面的平行下载。HTTP/1.1 规范建议,浏览器每个主机名的并行下载内容不超过两个。如果你的图片放在多个主机名上,你可以在每个并行下载中同时下载2个以上的文件。但是当下载脚本时,浏览器就不会同时下载其它文件了,即便是主机名不相同。
在某些情况下把脚本移到页面底部可能不太容易。比如说,如果脚本中使用了document.write来插入页面内容,它就不能被往下移动了。这里可能还会有作用域的问题。很多情况下,都会遇到这方面的问题。
一个经常用到的替代方法就是使用延迟脚本。DEFER属性表明脚本中没有包含document.write,它告诉浏览器继续显示。不幸的是,Firefox并不支持DEFER属性。在Internet Explorer中,脚本可能会被延迟但效果也不会像我们所期望的那样。如果脚本可以被延迟,那么它就可以移到页面的底部。这会让你的页面加载的快一点。
24、剔除重复脚本
在同一个页面中重复引用JavaScript文件会影响页面的性能。你可能会认为这种情况并不多见。对于美国前10大网站的调查显示其中有两家存在重复引用脚本的情况。有两种主要因素导致一个脚本被重复引用的奇怪现象发生:团队规模和脚本数量。如果真的存在这种情况,重复脚本会引起不必要的HTTP请求和无用的JavaScript运算,这降低了网站性能。
在Internet Explorer中会产生不必要的HTTP请求,而在Firefox却不会。在Internet Explorer中,如果一个脚本被引用两次而且它又不可缓存,它就会在页面加载过程中产生两次HTTP请求。即时脚本可以缓存,当用户重载页面时也会产生额外的HTTP请求。
除增加额外的HTTP请求外,多次运算脚本也会浪费时间。在Internet Explorer和Firefox中不管脚本是否可缓存,它们都存在重复运算JavaScript的问题。
一个避免偶尔发生的两次引用同一脚本的方法是在模板中使用脚本管理模块引用脚本。在HTML页面中使用< script />标签引用脚本的最常见方法就是:
< script type="text/javascript" src="menu_1.0.17.js">< /script>
在PHP中可以通过创建名为insertScript的方法来替代:
< php insertScript("menu.js") >
为了防止多次重复引用脚本,这个方法中还应该使用其它机制来处理脚本,如检查所属目录和为脚本文件名中增加版本号以用于Expire文件头等。
25、减少DOM访问
使用JavaScript访问DOM元素比较慢,因此为了获得更多的应该页面,应该做到:
缓存已经访问过的有关元素
线下更新完节点之后再将它们添加到文档树中
避免使用JavaScript来修改页面布局
有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”。
26、开发智能事件处理程序
有时候我们会感觉到页面反应迟钝,这是因为DOM树元素中附加了过多的事件句柄并且些事件句病被频繁地触发。这就是为什么说使用event delegation(事件代理)是一种好方法了。如果你在一个div中有10个按钮,你只需要在div上附加一次事件句柄就可以了,而不用去为每一个按钮增加一个句柄。事件冒泡时你可以捕捉到事件并判断出是哪个事件发出的。
你同样也不用为了操作DOM树而等待onload事件的发生。你需要做的就是等待树结构中你要访问的元素出现。你也不用等待所有图像都加载完毕。
你可能会希望用DOMContentLoaded事件来代替onload,但是在所有浏览器都支持它之前你可使用YUI 事件应用程序中的onAvailable方法。
有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”。
From: http://hi.baidu.com/szhesh/blog/item/25276d344d57ac3d5bb5f585.html
在第一部分和第二部分中我们分别介绍了改善网站性能中页面内容和服务器的几条守则,除此之外,JavaScript和CSS也是我们页面中经常用到的内容,对它们的优化也提高网站性能的重要方面:
CSS:
把样式表置于顶部
避免使用CSS表达式(Expression)
使用外部JavaScript和CSS
削减JavaScript和CSS
用< link>代替@import
避免使用滤镜
JavaScript
把脚本置于页面底部
使用外部JavaScript和CSS
削减JavaScript和CSS
剔除重复脚本
减少DOM访问
开发智能事件处理程序
17、把样式表置于顶部
在研究Yahoo!的性能表现时,我们发现把样式表放到文档的< head />内部似乎会加快页面的下载速度。这是因为把样式表放到< head />内会使页面有步骤的加载显示。
注重性能的前端服务器往往希望页面有秩序地加载。同时,我们也希望浏览器把已经接收到内容尽可能显示出来。这对于拥有较多内容的页面和网速较慢的用户来说特别重要。向用户返回可视化的反馈,比如进程指针,已经有了较好的研究并形成了正式文档。在我们的研究中HTML页面就是进程指针。当浏览器有序地加载文件头、导航栏、顶部的logo等对于等待页面加载的用户来说都可以作为可视化的反馈。这从整体上改善了用户体验。
把样式表放在文档底部的问题是在包括Internet Explorer在内的很多浏览器中这会中止内容的有序呈现。浏览器中止呈现是为了避免样式改变引起的页面元素重绘。用户不得不面对一个空白页面。
HTML规范清楚指出样式表要放包含在页面的< head />区域内:“和< a />不同,< link />只能出现在文档的< head />区域内,尽管它可以多次使用它”。无论是引起白屏还是出现没有样式化的内容都不值得去尝试。最好的方案就是按照HTML规范在文档< head />内加载你的样式表。
18、避免使用CSS表达式(Expression)
CSS表达式是动态设置CSS属性的强大(但危险)方法。Internet Explorer从第5个版本开始支持CSS表达式。下面的例子中,使用CSS表达式可以实现隔一个小时切换一次背景颜色:
background-color: expression( (new Date()).getHours()%2 "#B8D4FF" : "#F08A00" );
如上所示,expression中使用了JavaScript表达式。CSS属性根据JavaScript表达式的计算结果来设置。expression方法在其它浏览器中不起作用,因此在跨浏览器的设计中单独针对Internet Explorer设置时会比较有用。
表达式的问题就在于它的计算频率要比我们想象的多。不仅仅是在页面显示和缩放时,就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给CSS表达式增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到10000次以上的计算量。
一个减少CSS表达式计算次数的方法就是使用一次性的表达式,它在第一次运行时将结果赋给指定的样式属性,并用这个属性来代替CSS表达式。如果样式属性必须在页面周期内动态地改变,使用事件句柄来代替CSS表达式是一个可行办法。如果必须使用CSS表达式,一定要记住它们要计算成千上万次并且可能会对你页面的性能产生影响。
19、使用外部JavaScript和CSS
很多性能规则都是关于如何处理外部文件的。但是,在你采取这些措施前你可能会问到一个更基本的问题:JavaScript和CSS是应该放在外部文件中呢还是把它们放在页面本身之内呢?
在实际应用中使用外部文件可以提高页面速度,因为JavaScript和CSS文件都能在浏览器中产生缓存。内置在HTML文档中的JavaScript 和CSS则会在每次请求中随HTML文档重新下载。这虽然减少了HTTP请求的次数,却增加了HTML文档的大小。从另一方面来说,如果外部文件中的 JavaScript和CSS被浏览器缓存,在没有增加HTTP请求次数的同时可以减少HTML文档的大小。
关键问题是,外部JavaScript和CSS文件缓存的频率和请求HTML文档的次数有关。虽然有一定的难度,但是仍然有一些指标可以一测量它。如果一个会话中用户会浏览你网站中的多个页面,并且这些页面中会重复使用相同的脚本和样式表,缓存外部文件就会带来更大的益处。
许多网站没有功能建立这些指标。对于这些网站来说,最好的坚决方法就是把JavaScript和CSS作为外部文件引用。比较适合使用内置代码的例外就是网站的主页,如Yahoo!主页和My Yahoo!。主页在一次会话中拥有较少(可能只有一次)的浏览量,你可以发现内置JavaScript和CSS对于终端用户来说会加快响应时 间。
对于拥有较大浏览量的首页来说,有一种技术可以平衡内置代码带来的HTTP请求减少与通过使用外部文件进行缓存带来的好处。其中一个就是在首页中内置 JavaScript和CSS,但是在页面下载完成后动态下载外部文件,在子页面中使用到这些文件时,它们已经缓存到浏览器了。
20、削减JavaScript和CSS
精简是指从去除代码不必要的字符减少文件大小从而节省下载时间。消减代码时,所有的注释、不需要的空白字符(空格、换行、tab缩进)等都要去掉。在 JavaScript中,由于需要下载的文件体积变小了从而节省了响应时间。精简JavaScript中目前用到的最广泛的两个工具是JSMin和YUI Compressor。YUI Compressor还可用于精简CSS。
混淆是另外一种可用于源代码优化的方法。这种方法要比精简复杂一些并且在混淆的过程更易产生问题。在对美国前10大网站的调查中发现,精简也可以缩小原来代码体积的21%,而混淆可以达到25%。尽管混淆法可以更好地缩减代码,但是对于JavaScript来说精简的风险更小。
除消减外部的脚本和样式表文件外,< script>和< style>代码块也可以并且应该进行消减。即使你用Gzip压缩过脚本和样式表,精简这些文件仍然可以节省5%以上的空间。由于JavaScript和CSS的功能和体积的增加,消减代码将会获得益处。
21、用< link>代替@import
前面的最佳实现中提到CSS应该放置在顶端以利于有序加载呈现。
在IE中,页面底部@import和使用< link>作用是一样的,因此最好不要使用它。
22、避免使用滤镜
IE独有属性AlphaImageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素(不仅仅是图片)它都会运算一次,增加了内存开支,因此它的问题是多方面的。
完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很好地工作。如果你确实需要使用AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用户无效。
23、把脚本置于页面底部
脚本带来的问题就是它阻止了页面的平行下载。HTTP/1.1 规范建议,浏览器每个主机名的并行下载内容不超过两个。如果你的图片放在多个主机名上,你可以在每个并行下载中同时下载2个以上的文件。但是当下载脚本时,浏览器就不会同时下载其它文件了,即便是主机名不相同。
在某些情况下把脚本移到页面底部可能不太容易。比如说,如果脚本中使用了document.write来插入页面内容,它就不能被往下移动了。这里可能还会有作用域的问题。很多情况下,都会遇到这方面的问题。
一个经常用到的替代方法就是使用延迟脚本。DEFER属性表明脚本中没有包含document.write,它告诉浏览器继续显示。不幸的是,Firefox并不支持DEFER属性。在Internet Explorer中,脚本可能会被延迟但效果也不会像我们所期望的那样。如果脚本可以被延迟,那么它就可以移到页面的底部。这会让你的页面加载的快一点。
24、剔除重复脚本
在同一个页面中重复引用JavaScript文件会影响页面的性能。你可能会认为这种情况并不多见。对于美国前10大网站的调查显示其中有两家存在重复引用脚本的情况。有两种主要因素导致一个脚本被重复引用的奇怪现象发生:团队规模和脚本数量。如果真的存在这种情况,重复脚本会引起不必要的HTTP请求和无用的JavaScript运算,这降低了网站性能。
在Internet Explorer中会产生不必要的HTTP请求,而在Firefox却不会。在Internet Explorer中,如果一个脚本被引用两次而且它又不可缓存,它就会在页面加载过程中产生两次HTTP请求。即时脚本可以缓存,当用户重载页面时也会产生额外的HTTP请求。
除增加额外的HTTP请求外,多次运算脚本也会浪费时间。在Internet Explorer和Firefox中不管脚本是否可缓存,它们都存在重复运算JavaScript的问题。
一个避免偶尔发生的两次引用同一脚本的方法是在模板中使用脚本管理模块引用脚本。在HTML页面中使用< script />标签引用脚本的最常见方法就是:
< script type="text/javascript" src="menu_1.0.17.js">< /script>
在PHP中可以通过创建名为insertScript的方法来替代:
< php insertScript("menu.js") >
为了防止多次重复引用脚本,这个方法中还应该使用其它机制来处理脚本,如检查所属目录和为脚本文件名中增加版本号以用于Expire文件头等。
25、减少DOM访问
使用JavaScript访问DOM元素比较慢,因此为了获得更多的应该页面,应该做到:
缓存已经访问过的有关元素
线下更新完节点之后再将它们添加到文档树中
避免使用JavaScript来修改页面布局
有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”。
26、开发智能事件处理程序
有时候我们会感觉到页面反应迟钝,这是因为DOM树元素中附加了过多的事件句柄并且些事件句病被频繁地触发。这就是为什么说使用event delegation(事件代理)是一种好方法了。如果你在一个div中有10个按钮,你只需要在div上附加一次事件句柄就可以了,而不用去为每一个按钮增加一个句柄。事件冒泡时你可以捕捉到事件并判断出是哪个事件发出的。
你同样也不用为了操作DOM树而等待onload事件的发生。你需要做的就是等待树结构中你要访问的元素出现。你也不用等待所有图像都加载完毕。
你可能会希望用DOMContentLoaded事件来代替onload,但是在所有浏览器都支持它之前你可使用YUI 事件应用程序中的onAvailable方法。
有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”。
2008年11月18日星期二
50个最好且免费的 ajax 例子
作者: ╱/罒呍唲 链接:http://www.javaeye.com/news/4050-50-free-and-the-best-example-of-ajax 发表时间: 2008年11月05日
声明:本文系JavaEye网站发布的原创新闻,严禁任何网站转载本文,否则必将追究法律责任!
Web应用程序已经取得了跨越式的发展,我们要感谢下Ajax 技术。
以下是我们提供的最好的而且免费提供的脚本,这些例子中使用了jQuery, Mootools, Prototype 和script.aculo.us ,不妨尝试一下!
Ajax Forms
ShoutBox
Validate a Username AJAX
Ajax Instant Messenger
Ajax Tabs Content
Ajax Shopping Carts
Ajax Star Ratings
Ajax Inline Edit
Ajax Progress Bar
Ajax Pagination
Ajax File Browser & Manager
Ajax Calendar
Ajax Photo Manipulation
Ajax Dynamic Image Gallery and Slideshows
Ajax File Upload
Ajax AutoCompleter
CMS
Polls
Tabular data manipulations
Miscellaneous
- Ajax Scrolling pages
- jTip – A jQuery Tool Tip
- Ajax Broken Link Checker
- Facebox
- Drop Down Panel script
来自:noupe.com
已有 8 人发表留言,猛击->>这里<<-参与讨论
JavaEye推荐
windows 下删除 .svn 文件
From: http://www.google.com/reader/view/feed/http%3A%2F%2Ffeed.awflasher.com%2F?hl=en
SVN是我认为目前最方便的版本管理体系。我最早一次接触版本管理是2004年,当时学校BBS的代码要求用CVS管理;第二次亲密接触是在2006年,当时公司的代码使用Eclipse+CVS管理;而第一次使用SVN则是在2007年的一个封闭开发项目。
我十分喜欢SVN的方便,无论是在Linux下的命令行操作还是在Windows下的资源管理器插件,都十分简易。而且code.google.com也支持SVN来供我们发布、维护开源项目(例如我的WordPress主题TES)然而,久而久之,SVN文件夹下会有许多.svn的“meta数据”。这些数据久而久之会带来不少麻烦。尤其是基于资源管理器交互的Windows系统。
今天看了Jon Galloway的一个注册表脚本,十分方便,分享如下:
建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg),内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""
保存之后,双击这个reg文件。成功后,在每一个文件夹上点击右键都会有一个“Delete SVN Folders”的选项,点击之后,既可以删除这个文件下下面所有的.svn文件了:
SVN是我认为目前最方便的版本管理体系。我最早一次接触版本管理是2004年,当时学校BBS的代码要求用CVS管理;第二次亲密接触是在2006年,当时公司的代码使用Eclipse+CVS管理;而第一次使用SVN则是在2007年的一个封闭开发项目。
我十分喜欢SVN的方便,无论是在Linux下的命令行操作还是在Windows下的资源管理器插件,都十分简易。而且code.google.com也支持SVN来供我们发布、维护开源项目(例如我的WordPress主题TES)然而,久而久之,SVN文件夹下会有许多.svn的“meta数据”。这些数据久而久之会带来不少麻烦。尤其是基于资源管理器交互的Windows系统。
今天看了Jon Galloway的一个注册表脚本,十分方便,分享如下:
建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg),内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""
保存之后,双击这个reg文件。成功后,在每一个文件夹上点击右键都会有一个“Delete SVN Folders”的选项,点击之后,既可以删除这个文件下下面所有的.svn文件了:
2008年11月12日星期三
2008年11月11日星期二
windows 服务无法关闭的问题解决过程
问题:服务启动后,通过 windows 的服务管理程序停止服务时,报 "1053 错误,无法正常关闭服务",但实际上所有的应用,包括 mysql 都已经关掉。
解决步骤及思路:
1. 在系统信息里查看详细的报错信息,系统没有记录(可能是 windows 不记录其他应用服务的报错信息)
2. Google,查到 MSDN 文档,说的很清楚,就是调用关闭服务的时候超时(默认 30 秒),解决这个问题需要安装 .Net Framework 1.1 SP1
3. 由于我的机器本身安装了 .Net Framework 2.0 SP1,所以怀疑不是这个的原因,另外一个原因是懒的卸载 2.0再安装 1.1
4. 由于安装服务的命令是 windows 自带的 SC 命令,查找 SC 的用法,看是否有增加延时设置的地方,未果
5. 再 Google ,未找到合适的解决方案
6. 下载 .net 1.1 及 sp1,卸载本机 .net 2.0,安装 .net 1.1 sp1,重启机器,问题未解决
7. 想到可能是在关闭服务的时候,在等待其他应用返回或关闭,而造成超时。检查脚本及代码,发现关闭应用时,同时会关闭 数据库,试者手动关闭数据库,再关闭服务,成功。怀疑问题出在这里,但尚未确认。
8. 检查关闭数据库的代码,是在 tomcat 关闭时,在 Servlet 的 destroy 方法中关闭,代码如下:
public void destroy()
{
logger.info("SecFox server is stopping......");
try
{
ManageServer.getManageServer().shutdown();
}catch(Exception e)
{
logger.info("Stop SecFox server:",e);
}
try
{
String stopdb = serverpro.getProperty("stopdb");
if (!stopdb.equals(""))
{
Runtime.getRuntime().exec(stopdb,null,new File(rootDir));
logger.info("Stop database.");
}
}catch(Exception e)
{
logger.info("Stop database:",e);
}
logger.info("SecFox server has stop.");
System.exit(0);
}
9. 检查代码,怀疑是 最后一句 System.exit(0) 造成 jvm 强行退出,而关闭服务的进程还在等待返回,试着注释掉这句,重启应用,结果依旧;试着把 mysql 手动停掉,再关服务,可以正常关闭。多次起动/关闭服务,前两次可以正常关闭,以后又失败。
10. 想啊想,不得其解,觉得问题还是在这里,怀疑是缓存问题,第二天试着把 tomcat 缓存清掉,再试,成功
11. 换一台机器,在不改代码的情况下试,问题依旧;换代码,清缓存,再试,问题解决
12. 由于服务启动的过程中,需要调用脚本启动 mysql,服务启动后,mysql 要过一会儿才能启动,如果此时关闭服务,由于 mysql 还没有启动,所以仍然会报 1053 错误;测试:
a. 启动服务,马上关闭服务,报错落
b. 启动服务,等 mysql 起来后,再关闭服务,正常
--------------------------
附 Runtime.exit() 的JavaDoc :
通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。此方法从不正常返回。可以将变量作为一个状态码;根据惯例,非零的状态码表示非正常终止。
虚拟机的关闭序列包含两个阶段。在第一个阶段中,会以某种未指定的顺序启动所有已注册的关闭挂钩(如果有的话),并且允许它们同时运行直至结束。在第二个阶段中,如果已启用退出终结,则运行所有未调用的终结方法。一旦完成这个阶段,虚拟机就会暂停。
如果在虚拟机已开始其关闭序列后才调用此方法,那么若正在运行关闭挂钩,则将无限期地阻断此方法。如果已经运行完关闭挂钩,并且已启用退出终结 (on-exit finalization),那么此方法将利用给定的状态码(如果状态码是非零值)暂停虚拟机;否则将无限期地阻断虚拟机。
解决步骤及思路:
1. 在系统信息里查看详细的报错信息,系统没有记录(可能是 windows 不记录其他应用服务的报错信息)
2. Google,查到 MSDN 文档,说的很清楚,就是调用关闭服务的时候超时(默认 30 秒),解决这个问题需要安装 .Net Framework 1.1 SP1
3. 由于我的机器本身安装了 .Net Framework 2.0 SP1,所以怀疑不是这个的原因,另外一个原因是懒的卸载 2.0再安装 1.1
4. 由于安装服务的命令是 windows 自带的 SC 命令,查找 SC 的用法,看是否有增加延时设置的地方,未果
5. 再 Google ,未找到合适的解决方案
6. 下载 .net 1.1 及 sp1,卸载本机 .net 2.0,安装 .net 1.1 sp1,重启机器,问题未解决
7. 想到可能是在关闭服务的时候,在等待其他应用返回或关闭,而造成超时。检查脚本及代码,发现关闭应用时,同时会关闭 数据库,试者手动关闭数据库,再关闭服务,成功。怀疑问题出在这里,但尚未确认。
8. 检查关闭数据库的代码,是在 tomcat 关闭时,在 Servlet 的 destroy 方法中关闭,代码如下:
public void destroy()
{
logger.info("SecFox server is stopping......");
try
{
ManageServer.getManageServer().shutdown();
}catch(Exception e)
{
logger.info("Stop SecFox server:",e);
}
try
{
String stopdb = serverpro.getProperty("stopdb");
if (!stopdb.equals(""))
{
Runtime.getRuntime().exec(stopdb,null,new File(rootDir));
logger.info("Stop database.");
}
}catch(Exception e)
{
logger.info("Stop database:",e);
}
logger.info("SecFox server has stop.");
System.exit(0);
}
9. 检查代码,怀疑是 最后一句 System.exit(0) 造成 jvm 强行退出,而关闭服务的进程还在等待返回,试着注释掉这句,重启应用,结果依旧;试着把 mysql 手动停掉,再关服务,可以正常关闭。多次起动/关闭服务,前两次可以正常关闭,以后又失败。
10. 想啊想,不得其解,觉得问题还是在这里,怀疑是缓存问题,第二天试着把 tomcat 缓存清掉,再试,成功
11. 换一台机器,在不改代码的情况下试,问题依旧;换代码,清缓存,再试,问题解决
12. 由于服务启动的过程中,需要调用脚本启动 mysql,服务启动后,mysql 要过一会儿才能启动,如果此时关闭服务,由于 mysql 还没有启动,所以仍然会报 1053 错误;测试:
a. 启动服务,马上关闭服务,报错落
b. 启动服务,等 mysql 起来后,再关闭服务,正常
--------------------------
附 Runtime.exit() 的JavaDoc :
通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。此方法从不正常返回。可以将变量作为一个状态码;根据惯例,非零的状态码表示非正常终止。
虚拟机的关闭序列包含两个阶段。在第一个阶段中,会以某种未指定的顺序启动所有已注册的关闭挂钩(如果有的话),并且允许它们同时运行直至结束。在第二个阶段中,如果已启用退出终结,则运行所有未调用的终结方法。一旦完成这个阶段,虚拟机就会暂停。
如果在虚拟机已开始其关闭序列后才调用此方法,那么若正在运行关闭挂钩,则将无限期地阻断此方法。如果已经运行完关闭挂钩,并且已启用退出终结 (on-exit finalization),那么此方法将利用给定的状态码(如果状态码是非零值)暂停虚拟机;否则将无限期地阻断虚拟机。
订阅:
博文 (Atom)