﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-agun 阿甘 ---分享,共同进步-随笔分类-java web</title><link>http://www.blogjava.net/agun/category/30011.html</link><description>激情成就梦想，努力创造未来</description><language>zh-cn</language><lastBuildDate>Tue, 18 Mar 2008 08:45:55 GMT</lastBuildDate><pubDate>Tue, 18 Mar 2008 08:45:55 GMT</pubDate><ttl>60</ttl><item><title>有关web效率</title><link>http://www.blogjava.net/agun/archive/2008/03/18/186927.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 18 Mar 2008 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/03/18/186927.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/186927.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/03/18/186927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/186927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/186927.html</trackback:ping><description><![CDATA[<p style="background: white; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 10pt; font-family: Verdana">1)web</span><span style="font-size: 10pt; font-family: 宋体">开发的特点是是：没有太复杂的技术难点，一切在于迅速的把握需求，其实这正式敏捷开发的要旨所在，一切都可以非常快速的建立，非常快速的重构，我们的开发工具，底层库和框架，包括搜索引擎和</span><span style="font-size: 10pt; font-family: Verdana">web</span><span style="font-size: 10pt; font-family: 宋体">文档提供的帮助，都提我们供给了敏捷的能力。</span></p>
<p style="background: white; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 10pt; font-family: Verdana">2)</span><span style="font-size: 10pt; font-family: 宋体">此外，相应的，最有效率的交流方式必须留给</span><span style="font-size: 10pt; font-family: Verdana">web</span><span style="font-size: 10pt; font-family: 宋体">开发，那就是</span><span style="font-size: 10pt; font-family: Verdana">face2face</span><span style="font-size: 10pt; font-family: 宋体">（面对面），不要太担心你的设计不能被完备的文档所保留下来，他们会以交流，代码和小卡片的方式保存下来</span></p>
<p style="background: white; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 10pt; font-family: Verdana">3)</span><span style="font-size: 10pt; font-family: 宋体">人的因素会更加重要，无论是对用户的需求，还是开发人员的素质。</span></p>
<p style="background: white; margin: 7.5pt 0cm; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">另：有关</span><span style="font-size: 10pt; font-family: Verdana">web</span><span style="font-size: 10pt; font-family: 宋体">效率，有著名的</span><span style="font-size: 10pt; font-family: Verdana">14</span><span style="font-size: 10pt; font-family: 宋体">条规则，由</span><span style="font-size: 10pt; font-family: Verdana">yahoo</span><span style="font-size: 10pt; font-family: 宋体">性能效率小组所总结，并广为流传。业已出现相关插件（</span><span style="font-size: 10pt; font-family: Verdana"><a href="http://download.csdn.net/source/299494">YSlow</a></span><span style="font-size: 10pt; font-family: 宋体">），</span><span style="font-size: 10pt; font-family: Verdana">14 rules</span><span style="font-size: 10pt; font-family: 宋体">列在下面：</span></p>
<p style="background: white; text-align: left" align="left"><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">１．</span></strong><span style="font-size: 10pt; font-family: Verdana"> <a href="http://developer.yahoo.com/performance/rules.html#num_http">Make Fewer HTTP Requests</a> </span></p>
<p style="background: white; text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">减少</span><span style="font-size: 10pt; font-family: Verdana">http</span><span style="font-size: 10pt; font-family: 宋体">请求次数</span></p>
<p style="background: white; text-align: left" align="left"><a href="http://www.w3.org/TR/html401/struct/objects.html#h-13.6"><em><u><span style="color: blue">Image maps</u></em></a> </span><span style="font-family: 宋体">　图像中增加ｕｒｌ可以将多个图片合为一个，减少</span>http<span style="font-family: 宋体">请求。</span></p>
<p style="background: white; text-align: left" align="left"><a href="http://alistapart.com/articles/sprites"><em><u><span style="color: blue">CSS Sprites</u></em></a> </span><span style="font-family: 宋体">　通过</span>css <span style="font-family: 宋体">将图片引入到页面中减少页面请求</span>http <span style="font-family: 宋体">。</span></p>
<p style="background: white; text-align: left" align="left"><em>Combined files</em><span style="font-family: 宋体">合并文件不如合并多个请求的</span>javascript<span style="font-family: 宋体">为一个。减少</span>http<span style="font-family: 宋体">请求。</span></p>
<p style="background: white; text-align: left" align="left"><span style="font-size: 10pt; font-family: Verdana">http://developer.yahoo.net/blog/archives/2007/04/rule_1_make_few.html</span></p>
<p style="background: white; text-align: left" align="left"><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">２．</span></strong><span style="font-size: 10pt; font-family: Verdana"> <a href="http://developer.yahoo.com/performance/rules.html#cdn">Use a Content Delivery Network</a> </span></p>
<p style="background: white; text-align: left" align="left"><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">３．</span></strong><span style="font-size: 10pt; font-family: Verdana"> <a href="http://developer.yahoo.com/performance/rules.html#expires">Add an Expires Header</a> </span></p>
<p style="background: white; text-align: left" align="left"><span style="font-size: 9.5pt; color: black; font-family: 宋体">在下载的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">css</span><span style="font-size: 9.5pt; color: black; font-family: 宋体">、</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">js</span><span style="font-size: 9.5pt; color: black; font-family: 宋体">、</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">image</span><span style="font-size: 9.5pt; color: black; font-family: 宋体">组件里增加过期时间</span></p>
<p style="background: white; text-align: left" align="left"><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">４．</span></strong><span style="font-size: 10pt; font-family: Verdana"> <a href="http://developer.yahoo.com/performance/rules.html#gzip">Gzip Components</a> </span></p>
<p><span style="font-size: 9.5pt; color: black">（对下载的组件进行压缩）</span></p>
<p><span style="font-size: 9.5pt; color: black">毫无疑问，对站点内容进行压缩是一个比较常用的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> Web </span><span style="font-size: 9.5pt; color: black">优化手段．但是并不一定都能达到理想的效果．原因在于</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <a href="http://sourceforge.net/projects/mod-gzip/">mod-gzip</a> </span><span style="font-size: 9.5pt; color: black">模块不但消耗服务器端</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <acronym><span style="font-family: Verdana">CPU</span></acronym></span><span style="font-size: 9.5pt; color: black">资源，也消耗客户端</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <acronym><span style="font-family: Verdana">CPU</span></acronym></span><span style="font-size: 9.5pt; color: black">资源</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span><span style="font-size: 9.5pt; color: black">而且</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, mod_gzip </span><span style="font-size: 9.5pt; color: black">压缩文件后创建的临时文件是放到磁盘上的，这也会给磁盘</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <acronym><span style="font-family: Verdana">IO</span></acronym></span><span style="font-size: 9.5pt; color: black">带来严重的问题</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">Flickr </span><span style="font-size: 9.5pt; color: black">采用的是</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> Httpd 2.x </span><span style="font-size: 9.5pt; color: black">以后支持的　</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"><a href="http://httpd.apache.org/docs/2.0/mod/mod_deflate.html">mod_deflate</a> </span><span style="font-size: 9.5pt; color: black">模块．压缩操作都在内存中进行．</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">mod_deflate </span><span style="font-size: 9.5pt; color: black">在</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> Httpd 1.x </span><span style="font-size: 9.5pt; color: black">是不可用的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, </span><span style="font-size: 9.5pt; color: black">不过可以通过创建</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <acronym><span style="font-family: Verdana">RAM</span></acronym></span><span style="font-size: 9.5pt; color: black">盘的方式来间接提高性能．</span></p>
<p><span style="font-size: 9.5pt; color: black">当然</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, mod_gzip </span><span style="font-size: 9.5pt; color: black">到也不是一无是处</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, </span><span style="font-size: 9.5pt; color: black">对于预压缩的文件</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, </span><span style="font-size: 9.5pt; color: black">还是有好处的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span><span style="font-size: 9.5pt; color: black">而且</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, </span><span style="font-size: 9.5pt; color: black">采用压缩的时候</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">,</span><span style="font-size: 9.5pt; color: black">也要注意策略</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span><span style="font-size: 9.5pt; color: black">图片文件压缩就没什么必要了</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">(Flickr </span><span style="font-size: 9.5pt; color: black">上图像多</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, </span><span style="font-size: 9.5pt; color: black">而且压缩得不到什么好处</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">). Flickr </span><span style="font-size: 9.5pt; color: black">只对</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">JavaScript </span><span style="font-size: 9.5pt; color: black">和</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <acronym><span style="font-family: Verdana">CSS</span></acronym></span><span style="font-size: 9.5pt; color: black">进行压缩</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. mod_gzip </span><span style="font-size: 9.5pt; color: black">新一点的版本能够自动通过配置</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> mod_gzip_update_static </span><span style="font-size: 9.5pt; color: black">选项自动处理</span><span style="font-size: 9.5pt; color: black">预压缩的文件</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. Cal </span><span style="font-size: 9.5pt; color: black">也指出这个特性在一些旧版本的浏览器上会出问题</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span></p>
<p><span style="font-size: 9.5pt; color: black">压缩的另一个主要手段是内容的压缩</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span><span style="font-size: 9.5pt; color: black">针对</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> JavaScript </span><span style="font-size: 9.5pt; color: black">可以进行通过减少注释、合并空格、使用紧凑的语法等小技巧</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">(Google </span><span style="font-size: 9.5pt; color: black">的所有脚本都非常难读，而且非常紧凑，思想类似</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">).</span><span style="font-size: 9.5pt; color: black">当然，经过这样处理的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> JavaScript </span><span style="font-size: 9.5pt; color: black">可能带了很多括号不容易解析，</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"><a href="http://www.flickr.com/">Flickr</a> </span><span style="font-size: 9.5pt; color: black">使用了</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <a href="http://dojotoolkit.org/docs/compressor_system.html">Dojo Compressor</a> </span><span style="font-size: 9.5pt; color: black">来构建解析树。</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">Dojo Compressor </span><span style="font-size: 9.5pt; color: black">开销很低，而且对于最终用户是透明的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. JavaScript </span><span style="font-size: 9.5pt; color: black">的处理方法介绍过，</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">CSS </span><span style="font-size: 9.5pt; color: black">处理则相对简单</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">.</span><span style="font-size: 9.5pt; color: black">通过简单的正则表达式替换</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">(</span><span style="font-size: 9.5pt; color: black">比如把多个空格替换为一个空格符</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">), </span><span style="font-size: 9.5pt; color: black">最高可以获得</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> 50% </span><span style="font-size: 9.5pt; color: black">的压缩比。</span></p>
<p style="background: white; text-align: left" align="left"><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">５．</span></strong><span style="font-size: 10pt; font-family: Verdana"> <a href="http://developer.yahoo.com/performance/rules.html#css_top">Put CSS at the Top</a> </span></p>
<p style="background: white; text-align: left" align="left"><span style="font-size: 9.5pt; font-family: Verdana"><span style="color: black">css</span></span><span style="font-size: 9.5pt; color: black; font-family: 宋体">文件尽可能放在页面的最上面</span></p>
<p style="background: white; text-align: left" align="left"><span style="font-size: 10pt; font-family: Symbol">&#183;</span><span style="font-size: 10pt; font-family: Verdana">&nbsp;<a href="http://developer.yahoo.com/performance/rules.html#js_bottom">Move Scripts to the Bottom</a> </span></p>
<p style="background: white; text-align: left" align="left"><span style="font-size: 9.5pt; font-family: Verdana"><span style="color: black">js</span></span><span style="font-size: 9.5pt; color: black; font-family: 宋体">文件尽可能放在页面的最下面</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">6</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Put JS components as close to the bottom of the page as possible.</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">js</span><span style="font-size: 9.5pt; color: black">文件尽可能放在页面的最下面）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">7</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Avoid CSS Expressions</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（在</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">css</span><span style="font-size: 9.5pt; color: black">文件中慎用表达式）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">8</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Make JavaScript and CSS External</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（在外部包含</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">js</span><span style="font-size: 9.5pt; color: black">和</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">css</span><span style="font-size: 9.5pt; color: black">文件）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">9</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Reduce DNS Lookups</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（减少请求中域名的解析次数）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">10</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Minify JavaScript</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">js</span><span style="font-size: 9.5pt; color: black">代码压缩）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">11</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Avoid doing redirects.</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（避免重定向）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">12</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Remove Duplicates Scripts</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（避免请求重复的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">js</span><span style="font-size: 9.5pt; color: black">文件）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">13</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Configure ETags</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（配置好</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">ETag</span><span style="font-size: 9.5pt; color: black">）</span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana"><a href="http://www.flickr.com/">Flickr</a> </span><span style="font-size: 9.5pt; color: black">的开发者充分利用了</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> Http 1.1 </span><span style="font-size: 9.5pt; color: black">规范定义的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> <a href="http://www.dbanotes.net/web/http_11_etag_lastmodified.html">Etag <span style="font-family: 宋体">与 Last-Modified <span style="font-family: 宋体">机制</span></a> </span></span><span style="font-size: 9.5pt; color: black">来提高</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> Caching </span><span style="font-size: 9.5pt; color: black">的效率</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span><span style="font-size: 9.5pt; color: black">值得注意的是，</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">Cal </span><span style="font-size: 9.5pt; color: black">介绍了一个在负载均衡条件下的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> e-Tag </span><span style="font-size: 9.5pt; color: black">小技巧</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">. </span><span style="font-size: 9.5pt; color: black">即可以设定</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> Apache </span><span style="font-size: 9.5pt; color: black">通过文件调整时间与文件大小获得</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> E-Tag ,</span><span style="font-size: 9.5pt; color: black">而默认情况下</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">, Apache </span><span style="font-size: 9.5pt; color: black">是通过文件节点获取</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> e-Tag </span><span style="font-size: 9.5pt; color: black">的。当然，这也不是很完美，因为会影响</span><span style="font-size: 9.5pt; color: black; font-family: Verdana"> if-modified-since </span><span style="font-size: 9.5pt; color: black">。</span></p>
<p><span style="font-size: 9.5pt; color: black">但是有的网站的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">e-Tag</span><span style="font-size: 9.5pt; color: black">，如</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">yahoo</span><span style="font-size: 9.5pt; color: black">，其产生规则是基于节点的。相同的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">css</span><span style="font-size: 9.5pt; color: black">或</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">js</span><span style="font-size: 9.5pt; color: black">脚本在不同节点服务器上的</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">e-Tag</span><span style="font-size: 9.5pt; color: black">不同，所以如果有</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">n</span><span style="font-size: 9.5pt; color: black">个服务器，那么浏览器获得</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">304</span><span style="font-size: 9.5pt; color: black">应答消息的概率是</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">1/n</span><span style="font-size: 9.5pt; color: black">。</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">14</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Make Ajax Cacheable</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（缓存</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">Ajax</span><span style="font-size: 9.5pt; color: black">请求）</span></p>
<p><span style="font-size: 9.5pt; color: black">以下几点是新增的准则，还没有正式公布，所以大家要注意，</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">15</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Flush the Header</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（先发送</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">Header</span><span style="font-size: 9.5pt; color: black">里的信息）</span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">We improved the page load times by flushing the apache output buffer after the document HEAD was generated.This had two benefits. </span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">First, the HEAD contains SCRIPT and LINK tags for scripts and stylesheets. By flushing the HEAD, those tags are received and parsed by the browser sooner, and in turn the browser starts downloading those components earlier. </span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">Second, the HEAD is flushed before actually generating the search results. This is a win for any property doing a significant backend computation or especially making one or more backend web service calls. </span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">16</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Split</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana"> Static Content Across Multiple Hostnames</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（把较大的静态文件分割成不同域的请求）</span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">If you have many (10 or more) components downloaded from a single hostname, it might be better to split those across two hostnames. </span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">17</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Reduce the Size of Cookies</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（不要让</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">Cookie</span><span style="font-size: 9.5pt; color: black">内容过大）</span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">Reduce the amount of data in the cookie by storing state information on the backend, and abbreviating names and values stored in the cookie. Set expiration dates on your cookies, and make them as short as possible. </span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">18</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Host Static Content on a Different Top-Level Domain</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（把静态文件放在不同的顶级域名下）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">19</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Minify CSS</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">Css</span><span style="font-size: 9.5pt; color: black">代码压缩）</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">20</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Use GET for XHR</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（有</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">XHR</span><span style="font-size: 9.5pt; color: black">时使用</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">GET</span><span style="font-size: 9.5pt; color: black">请求）</span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">Iain Lamb did a deep study of how using POST for XMLHttpRequests is inefficient, especially in IE. His recommendation: &#8220;If the amount of data you have to send to the server is small (less than 2k), I suggest you design your webservice / client application to use GET rather than POST</span><span style="font-size: 9.5pt; color: black">。</span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">21</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Avoid IFrames</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（尽量避免使用</span><span style="font-size: 9.5pt; color: black; font-family: Verdana">IFrame</span><span style="font-size: 9.5pt; color: black">）</span></p>
<p><span style="font-size: 9.5pt; color: black; font-family: Verdana">Don&#8217;t use SRC (set it via JS instead). Each IFrame takes 20-50ms, even if it contains nothing </span></p>
<p><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">22</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: 宋体">。</span></strong><strong><span style="font-size: 9.5pt; color: black; font-family: Verdana">Optimize images</span></strong></p>
<p><span style="font-size: 9.5pt; color: black">（优化图片）</span></p>
 <img src ="http://www.blogjava.net/agun/aggbug/186927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-03-18 10:10 <a href="http://www.blogjava.net/agun/archive/2008/03/18/186927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>quartz在spring中的使用</title><link>http://www.blogjava.net/agun/archive/2008/03/17/186689.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Mon, 17 Mar 2008 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/03/17/186689.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/186689.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/03/17/186689.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/186689.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/186689.html</trackback:ping><description><![CDATA[<p>(1)在spring 中的配置bean<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">(1)在spring&nbsp;中的配置bean<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="methodInvokingJobDetail"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="targetObject"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="quartzTest"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">--指定请求的bean的对象<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="targetMethod"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">quartzTimer</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">--指定对象中的方法<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="cronTrigger"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.scheduling.quartz.CronTriggerBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jobDetail"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="methodInvokingJobDetail"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="cronExpression"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0&nbsp;25&nbsp;17,12,20&nbsp;*&nbsp;*&nbsp;?</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">--定时控制操作<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="triggers"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">local</span><span style="color: #0000ff">="cronTrigger"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>
<p>(2)定时控制--定时的格式（网上总结）<br />
</p>
<p>一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串，其中6个字段是必须的而一个是可选的，如下： <br />
<table cellspacing="8">
    <tbody>
        <tr>
            <th align="left">字段名 </th>
            <th align="left">&nbsp; </th>
            <th align="left">允许的值 </th>
            <th align="left">&nbsp; </th>
            <th align="left">允许的特殊字符 </th>
        </tr>
        <tr>
            <td align="left"><code>秒</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>0-59</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>, - * /</code> </td>
        </tr>
        <tr>
            <td align="left"><code>分</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>0-59</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>, - * /</code> </td>
        </tr>
        <tr>
            <td align="left"><code>小时</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>0-23</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>, - * /</code> </td>
        </tr>
        <tr>
            <td align="left"><code>日</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>1-31</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>, - * ? / L W C</code> </td>
        </tr>
        <tr>
            <td align="left"><code>月</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>1-12 or JAN-DEC</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>, - * /</code> </td>
        </tr>
        <tr>
            <td align="left"><code>周几</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>1-7 or SUN-SAT</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>, - * ? / L C #</code> </td>
        </tr>
        <tr>
            <td align="left"><code>年&nbsp;(可选字段)</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>empty, 1970-2099</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>, - * /</code></td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;'*' 字符可以用于所有字段，在&#8220;分&#8221;字段中设为"*"表示"每一分钟"的含义。 </p>
<p>'?' 字符可以用在&#8220;日&#8221;和&#8220;周几&#8221;字段.&nbsp;它用来指定 '不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。 </p>
<p>'-' 字符被用来指定一个值的范围，比如在&#8220;小时&#8221;字段中设为"10-12"表示"10点到12点". </p>
<p>&nbsp;','&nbsp;字符指定数个值。比如在&#8220;周几&#8221;字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday". </p>
<p>'/'&nbsp;字符用来指定一个值的的增加幅度. 比如在&#8220;秒&#8221;字段中设置为"0/15"表示"第0, 15, 30,&nbsp;和 45秒"。而 "5/15"则表示"第5, 20, 35,&nbsp;和 50". 在'/'前加"*"字符相当于指定从0秒开始. 每个字段都有一系列可以开始或结束的数值。对于&#8220;秒&#8221;和&#8220;分&#8221;字段来说，其数值范围为0到59，对于&#8220;小时&#8221;字段来说其为0到23, 对于&#8220;日&#8221;字段来说为0到31, 而对于&#8220;月&#8221;字段来说为1到12。"/"字段仅仅只是帮助你在允许的数值范围内从开始"第n"的值。&nbsp;因此 对于&#8220;月&#8221;字段来说"7/6"只是表示7月被开启而不是&#8220;每六个月&#8221;, 请注意其中微妙的差别。 </p>
<p>'L'字符可用在&#8220;日&#8221;和&#8220;周几&#8221;这两个字段。它是"last"的缩写, 但是在这两个字段中有不同的含义。例如,&#8220;日&#8221;字段中的"L"表示"一个月中的最后一天" —— 对于一月就是31号对于二月来说就是28号（非闰年）。而在&#8220;周几&#8221;字段中, 它简单的表示"7" or "SAT"，但是如果在&#8220;周几&#8221;字段中使用时跟在某个数字之后, 它表示"该月最后一个星期&#215;" —— 比如"6L"表示"该月最后一个周五"。当使用'L'选项时,指定确定的列表或者范围非常重要，否则你会被结果搞糊涂的。 </p>
<p>'W' 可用于&#8220;日&#8221;字段。用来指定历给定日期最近的工作日(周一到周五)&nbsp;。比如你将&#8220;日&#8221;字段设为"15W"，意为: "离该月15号最近的工作日"。因此如果15号为周六，触发器会在14号即周五调用。如果15号为周日, 触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将&#8220;日&#8221;字段设为"1W", 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。'W'字符只能用于&#8220;日&#8221;字段的值为单独的一天而不是一系列值的时候。 </p>
<p>'L'和'W'可以组合用于&#8220;日&#8221;字段表示为'LW'，意为"该月最后一个工作日"。 </p>
<p>'#' 字符可用于&#8220;周几&#8221;字段。该字符表示&#8220;该月第几个周&#215;&#8221;，比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。再比如: "2#1" =&nbsp;表示该月第一个周一而 "4#5" = 该月第五个周三。注意如果你指定"#5"该月没有第五个&#8220;周&#215;&#8221;，该月是不会触发的。 </p>
<p>'C' 字符可用于&#8220;日&#8221;和&#8220;周几&#8221;字段，它是"calendar"的缩写。 它表示为基于相关的日历所计算出的值（如果有的话）。如果没有关联的日历, 那它等同于包含全部日历。&#8220;日&#8221;字段值为"5C"表示"日历中的第一天或者5号以后"，&#8220;周几&#8221;字段值为"1C"则表示"日历中的第一天或者周日以后"。 </p>
<p>对于&#8220;月份&#8221;字段和&#8220;周几&#8221;字段来说合法的字符都不是大小写敏感的。 </p>
<p>下面是一些完整的例子: <br />
<table cellspacing="8">
    <tbody>
        <tr>
            <th align="left">表达式 </th>
            <th align="left">&nbsp; </th>
            <th align="left">含义 </th>
        </tr>
        <tr>
            <td align="left"><code>"0 0 12 * * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>每天中午十二点触发</code> </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 ? * *"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>每天早上10：15触发</code> </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 * * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>每天早上10：15触发</code> </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 * * ? *"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>每天早上10：15触发</code> </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 * * ? 2005"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left"><code>2005年的每天早上10：15触发</code> </td>
        </tr>
        <tr>
            <td align="left"><code>"0 * 14 * * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每天从下午2点开始到2点59分每分钟一次触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 0/5 14 * * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每天从下午2点开始到2：55分结束每5分钟一次触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 0/5 14,18 * * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每天的下午2点至2：55和6点至6点55分两个时间段内每5分钟一次触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 0-5 14 * * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每天14:00至14:05每分钟一次触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 10,44 14 ? 3 WED"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">三月的每周三的14：10和14：44触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 ? * MON-FRI"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每个周一、周二、周三、周四、周五的10：15触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 15 * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每月15号的10：15触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 L * ?"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每月的最后一天的10：15触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 ? * 6L"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每月最后一个周五的10：15触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 ? * 6L"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每月最后一个周五的10：15触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 ? * 6L 2002-2005"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">2002年至2005年的每月最后一个周五的10：15触发 </td>
        </tr>
        <tr>
            <td align="left"><code>"0 15 10 ? * 6#3"</code> </td>
            <td align="left">&nbsp; </td>
            <td align="left">每月的第三个周五的10：15触发</td>
        </tr>
    </tbody>
</table>
</p>
 <img src ="http://www.blogjava.net/agun/aggbug/186689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-03-17 09:29 <a href="http://www.blogjava.net/agun/archive/2008/03/17/186689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring ApplicationContext简单研究</title><link>http://www.blogjava.net/agun/archive/2008/03/11/185269.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 11 Mar 2008 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/03/11/185269.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/185269.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/03/11/185269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/185269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/185269.html</trackback:ping><description><![CDATA[<p>spring 研究装载配置文件</p>
<p>1，研究spring webApplicationContext初始化。spring 如何初始化。 <br />
spring 有两种方法，一个是ContextLoaderListener这个Listerner，另一个是ContextLoaderServlet这个Servlet，这两个方法都是在web应用启动的时候来初始化WebApplicationContext，ContextLoader是一个工具类，用来初始化WebApplicationContext，其主要方法就是initWebApplicationContext，ContextLoader是把WebApplicationContext（XmlWebApplicationContext是默认实现类）放在了ServletContext中，ServletContext也是一个&#8220;容器&#8221;，也是一个类似Map的结构，而WebApplicationContext在ServletContext中的KEY就是WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE，我们如果要使用WebApplicationContext则需要从ServletContext取出，Spring提供了一WebApplicationContextUtils类，可以方便的取出WebApplicationContext，只要把ServletContext传入就可以了。 </p>
<p>2，研究通过使用ApplicationContext对spring 进行初始化。 </p>
<p>初始化流程，在初始化的时候，新增一个加载servlet ，这个serlvet负责初始化。AppContextLoader 提供了初始化applicationContext的方法, <br />
通过定义ClassPathXmlApplicationContext　来加载spring 配置文件。装载配置文件。 <br />
并把装载的ApplicationContext文件放在servletContext中作为全局变量来使用。在使用ClassPathXmlApplicationContext 则需要从ServletContext取出.<br />
</p>
 <img src ="http://www.blogjava.net/agun/aggbug/185269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-03-11 09:57 <a href="http://www.blogjava.net/agun/archive/2008/03/11/185269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>httpclient (2)</title><link>http://www.blogjava.net/agun/archive/2008/01/29/178365.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 29 Jan 2008 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/01/29/178365.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/178365.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/01/29/178365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/178365.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/178365.html</trackback:ping><description><![CDATA[<p>根据以上步骤，我们来编写用GET方法来取得某网页内容的代码。</p>
<ul>
    <li>大部分情况下 HttpClient 默认的构造函数已经足够使用。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">HttpClient httpClient = new HttpClient();
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程，如果想要把自动处理转发过程去掉的话，可以调用方法setFollowRedirects(false)。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">GetMethod getMethod = new GetMethod("http://www.ibm.com/");
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序，在运行executeMethod方法的时候，需要处理两个异常，分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对，比如不小心将"http"写成"htp"，或者服务器端返回的内容不正常等，并且该异常发生是不可恢复的；第二种异常一般是由于网络原因引起的异常，对于这种异常 （IOException），HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义（通过实现接口HttpMethodRetryHandler来实现）。通过httpClient的方法setParameter设置你实现的恢复策略，本文中使用的是系统提供的默认恢复策略，该策略在碰到第二类异常的时候将自动重试3次。executeMethod返回值是一个整数，表示了执行该方法后服务器返回的状态码，该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转（默认状态下GetMethod的实例是自动处理跳转的）等。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">//设置成了默认的恢复策略，在发生异常时候将自动重试3次，在这里你也可以设置成自定义的恢复策略
                getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                new DefaultHttpMethodRetryHandler());
                //执行getMethod
                int statusCode = client.executeMethod(getMethod);
                if (statusCode != HttpStatus.SC_OK) {
                System.err.println("Method failed: " + getMethod.getStatusLine());
                }
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>在返回的状态码正确后，即可取得内容。取得目标地址的内容有三种方法：第一种，getResponseBody，该方法返回的是目标的二进制的byte流；第二种，getResponseBodyAsString，这个方法返回的是String类型，值得注意的是该方法返回的String的编码是根据系统默认的编码方式，所以返回的String值可能编码类型有误，在本文的"字符编码"部分中将对此做详细介绍；第三种，getResponseBodyAsStream，这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">byte[] responseBody = method.getResponseBody();
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>释放连接。无论执行方法是否成功，都必须释放连接。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">method.releaseConnection();
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>处理内容。在这一步中根据你的需要处理内容，在例子中只是简单的将内容打印到控制台。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">System.out.println(new String(responseBody));
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    </li>
</ul>
<p>下面是程序的完整代码，这些代码也可在附件中的test.GetSample中找到。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package test;
            import java.io.IOException;
            import org.apache.commons.httpclient.*;
            import org.apache.commons.httpclient.methods.GetMethod;
            import org.apache.commons.httpclient.params.HttpMethodParams;
            public class GetSample{
            public static void main(String[] args) {
            //构造HttpClient的实例
            HttpClient httpClient = new HttpClient();
            //创建GET方法的实例
            GetMethod getMethod = new GetMethod("http://www.ibm.com");
            //使用系统提供的默认的恢复策略
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
            new DefaultHttpMethodRetryHandler());
            try {
            //执行getMethod
            int statusCode = httpClient.executeMethod(getMethod);
            if (statusCode != HttpStatus.SC_OK) {
            System.err.println("Method failed: "
            + getMethod.getStatusLine());
            }
            //读取内容
            byte[] responseBody = getMethod.getResponseBody();
            //处理内容
            System.out.println(new String(responseBody));
            } catch (HttpException e) {
            //发生致命的异常，可能是协议不对或者返回的内容有问题
            System.out.println("Please check your provided http address!");
            e.printStackTrace();
            } catch (IOException e) {
            //发生网络异常
            e.printStackTrace();
            } finally {
            //释放连接
            getMethod.releaseConnection();
            }
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N100F0"><span class="smalltitle">POST方法</span></a></p>
<p>根据RFC2616，对POST的解释如下：POST方法用来向目的服务器发出请求，要求它接受被附在请求后的实体，并把它当作请求队列（Request-Line）中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能：</p>
<ul>
    <li>对现有资源的注释（Annotation of existing resources）
    <li>向电子公告栏、新闻组，邮件列表或类似讨论组发送消息
    <li>提交数据块，如将表单的结果提交给数据处理过程
    <li>通过附加操作来扩展数据库 </li>
</ul>
<p>调用HttpClient中的PostMethod与GetMethod类似，除了设置PostMethod的实例与GetMethod有些不同之外，剩下的步骤都差不多。在下面的例子中，省去了与GetMethod相同的步骤，只说明与上面不同的地方，并以登录清华大学BBS为例子进行说明。</p>
<ul>
    <li>构造PostMethod之前的步骤都相同，与GetMethod一样，构造PostMethod也需要一个URI参数，在本例中，登录的地址是http://www.newsmth.net/bbslogin2.php。在创建了PostMethod的实例之后，需要给method实例填充表单的值，在BBS的登录表单中需要有两个域，第一个是用户名（域名叫id），第二个是密码（域名叫passwd）。表单中的域用类NameValuePair来表示，该类的构造函数第一个参数是域名，第二参数是该域的值；将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面，但是HttpClient对于要求接受后继服务的请求，比如POST和PUT，不支持自动转发，因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的"自动转向"部分。代码如下：
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">String url = "http://www.newsmth.net/bbslogin2.php";
                PostMethod postMethod = new PostMethod(url);
                // 填入各个表单域的值
                NameValuePair[] data = { new NameValuePair("id", "youUserName"),
                new NameValuePair("passwd", "yourPwd") };
                // 将表单的值放入postMethod中
                postMethod.setRequestBody(data);
                // 执行postMethod
                int statusCode = httpClient.executeMethod(postMethod);
                // HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发
                // 301或者302
                if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
                statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
                // 从头中取出转向的地址
                Header locationHeader = postMethod.getResponseHeader("location");
                String location = null;
                if (locationHeader != null) {
                location = locationHeader.getValue();
                System.out.println("The page was redirected to:" + location);
                } else {
                System.err.println("Location field value is null.");
                }
                return;
                }
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    </li>
</ul>
 <img src ="http://www.blogjava.net/agun/aggbug/178365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-01-29 14:55 <a href="http://www.blogjava.net/agun/archive/2008/01/29/178365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>httpclient (1) </title><link>http://www.blogjava.net/agun/archive/2008/01/29/178362.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 29 Jan 2008 06:50:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/01/29/178362.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/178362.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/01/29/178362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/178362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/178362.html</trackback:ping><description><![CDATA[<blockquote>
<p>最近用到了HttpClient ，搜集的资料：</p>
<p>HttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient，然后根据作者实际工作经验给出了一些常见问题的解决方法。</p>
</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="N10053"><span class="atitle">HttpClient简介</span></a></p>
<p>HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了，越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能，但是对于大部分应用程序来说，JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目，用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中，比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient，更多使用 HttpClient 的应用可以参见<a href="http://wiki.apache.org/jakarta-httpclient/HttpClientPowered">http://wiki.apache.org/jakarta-httpclient/HttpClientPowered</a>。HttpClient 项目非常活跃，使用的人还是非常多的。目前 HttpClient 版本是在 2005.10.11 发布的 3.0 RC4 。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N10060"><span class="atitle">HttpClient 功能介绍</span></a></p>
<p>以下列出的是 HttpClient 提供的主要的功能，要知道更多详细的功能可以参见 HttpClient 的主页。</p>
<ul>
    <li>实现了所有 HTTP 的方法（GET,POST,PUT,HEAD 等）
    <li>支持自动转向
    <li>支持 HTTPS 协议
    <li>支持代理服务器等 </li>
</ul>
<p>下面将逐一介绍怎样使用这些功能。首先，我们必须安装好 HttpClient。</p>
<ul>
    <li>HttpClient 可以在<a href="http://jakarta.apache.org/commons/httpclient/downloads.html">http://jakarta.apache.org/commons/httpclient/downloads.html</a>下载
    <li>HttpClient 用到了 Apache Jakarta common 下的子项目 logging，你可以从这个地址<a href="http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi">http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi</a>下载到 common logging，从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中
    <li>HttpClient 用到了 Apache Jakarta common 下的子项目 codec，你可以从这个地址<a href="http://jakarta.apache.org/site/downloads/downloads_commons-codec">http://jakarta.apache.org/site/downloads/downloads_commons-codec</a>.cgi 下载到最新的 common codec，从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中 </li>
</ul>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N10093"><span class="atitle">HttpClient 基本功能的使用</span></a></p>
<p><a name="N10099"><span class="smalltitle">GET 方法</span></a></p>
<p>使用 HttpClient 需要以下 6 个步骤：</p>
<p>1. 创建 HttpClient 的实例</p>
<p>2. 创建某种连接方法的实例，在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址</p>
<p>3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例</p>
<p>4. 读 response</p>
<p>5. 释放连接。无论执行方法是否成功，都必须释放连接</p>
<p>6. 对得到后的内容进行处理</p>
 <img src ="http://www.blogjava.net/agun/aggbug/178362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-01-29 14:50 <a href="http://www.blogjava.net/agun/archive/2008/01/29/178362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>