﻿<?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-eric-1001c</title><link>http://www.blogjava.net/Ericzhang5231/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 12:12:59 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 12:12:59 GMT</pubDate><ttl>60</ttl><item><title>if/else的使用心得</title><link>http://www.blogjava.net/Ericzhang5231/articles/299443.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sat, 24 Oct 2009 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/299443.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/299443.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/299443.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/299443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/299443.html</trackback:ping><description><![CDATA[<div align="center"><img style="width: 402px; height: 189px;" alt="if_else" src="http://www.blogjava.net/images/blogjava_net/ericzhang5231/if_else.png" width="402" border="0" height="189" /><br />
</div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;无疑 if/else几乎是所有编程语言的一个重要语法，我们不但可以在简单的函数里面发现它的足迹，更不用说在具有复杂逻辑、代码行数累累的功能里面了。所以尽管if/else是一个简单的语法结构，但它的功能很强大。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if/else的强大使得我们在遇到任何分支逻辑里面都会优先考虑它的使用，所以无论是简单的，还是复杂逻辑功能函数都会出现if/else，但是这种&#8220;优先考虑&#8221;更多的时候却变成了一种怂恿和诱惑。特别在复杂逻辑功能函数里面，不乏if/else错用、滥用和嵌套用。if/else错用、滥用和嵌套用都会在不同程度上减少代码的可读性，降低代码的可维护性，增加潜在bug的可能性。<br />
&nbsp;&nbsp;&nbsp;&nbsp; if/else错用。什么是if/else错用？由于人的思维快速性，使得我们能够一下子对一些中等复杂的逻辑理解，能够一下子把中等复杂的逻辑结构浮现在脑海，因此在编程的时候就容易过于自信，依葫芦画瓢，想到哪写到那。通常这容易使得某些人在使用if/else的时候导致错用，下面是一个if/else错用的例子：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><span style="color: #008080;">&nbsp;1</span><img id="Codehighlighter1_0_22_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_22_Open_Text.style.display='none'; Codehighlighter1_0_22_Closed_Image.style.display='inline'; Codehighlighter1_0_22_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img style="display: none;" id="Codehighlighter1_0_22_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_22_Closed_Text.style.display='none'; Codehighlighter1_0_22_Open_Image.style.display='inline'; Codehighlighter1_0_22_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_0_22_Closed_Text">/**/</span><span id="Codehighlighter1_0_22_Open_Text"><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;2</span><span style="color: #008000;"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;*&nbsp;只存在A、B和C情况的逻辑<br />
</span><span style="color: #008080;">&nbsp;3</span><span style="color: #008000;"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;</span><span style="color: #008000;">*/</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span><span style="color: #000000;"><img id="Codehighlighter1_31_53_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_53_Open_Text.style.display='none'; Codehighlighter1_31_53_Closed_Image.style.display='inline'; Codehighlighter1_31_53_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img style="display: none;" id="Codehighlighter1_31_53_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_31_53_Closed_Text.style.display='none'; Codehighlighter1_31_53_Open_Image.style.display='inline'; Codehighlighter1_31_53_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(A)</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_31_53_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_31_53_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;5</span><span style="color: #000000;"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;6</span><span style="color: #008000;"><img id="Codehighlighter1_58_164_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_164_Open_Text.style.display='none'; Codehighlighter1_58_164_Closed_Image.style.display='inline'; Codehighlighter1_58_164_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img style="display: none;" id="Codehighlighter1_58_164_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_58_164_Closed_Text.style.display='none'; Codehighlighter1_58_164_Open_Image.style.display='inline'; Codehighlighter1_58_164_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;}</span></span><span style="color: #0000ff;">else</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_58_164_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_58_164_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;7</span><span style="color: #000000;"><img id="Codehighlighter1_70_98_Open_Image" onclick="this.style.display='none'; Codehighlighter1_70_98_Open_Text.style.display='none'; Codehighlighter1_70_98_Closed_Image.style.display='inline'; Codehighlighter1_70_98_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img style="display: none;" id="Codehighlighter1_70_98_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_70_98_Closed_Text.style.display='none'; Codehighlighter1_70_98_Open_Image.style.display='inline'; Codehighlighter1_70_98_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(B)</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_70_98_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_70_98_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;8</span><span style="color: #000000;"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span><span style="color: #008000;"><img id="Codehighlighter1_103_160_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_160_Open_Text.style.display='none'; Codehighlighter1_103_160_Closed_Image.style.display='inline'; Codehighlighter1_103_160_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img style="display: none;" id="Codehighlighter1_103_160_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_103_160_Closed_Text.style.display='none'; Codehighlighter1_103_160_Open_Image.style.display='inline'; Codehighlighter1_103_160_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff;">else</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_103_160_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_103_160_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">10</span><span style="color: #000000;"><img id="Codehighlighter1_118_153_Open_Image" onclick="this.style.display='none'; Codehighlighter1_118_153_Open_Text.style.display='none'; Codehighlighter1_118_153_Closed_Image.style.display='inline'; Codehighlighter1_118_153_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img style="display: none;" id="Codehighlighter1_118_153_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_118_153_Closed_Text.style.display='none'; Codehighlighter1_118_153_Open_Image.style.display='inline'; Codehighlighter1_118_153_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(C)</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_118_153_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_118_153_Open_Text"><span style="color: #000000;">{<br />
</span><span style="color: #008080;">11</span><span style="color: #000000;"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">12</span><span style="color: #008000;"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span><span style="color: #000000;"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span><span style="color: #000000;"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;}</span></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这个例子里面，由于只有3个逻辑可能性，所以很容易就会分别对3个逻辑可能性的一一建立分支。也许在简单的、行数较少的代码里面，一一建立分支的做法并无大碍，但如果功能复杂，行数较多，代码自描述性较差的代码里面，你大半会被这里的逻辑搞晕的。这就是if/else错用了，其实并不需要一一建立分支，至少在上面的例子里面，对于C的判断是不需要的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if/else滥用。滥用是指过多的使用if/else进行逻辑控制，同样也是因为思维的快速性和不具有良好编程经验的人容易烦的错误。例如下面的代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">if</span><span style="color: #000000;">(A</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">B</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">C){<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(A){<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(B){<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(C){<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;}</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span><span style="color: #000000;">}</span></div>
很明显上面的这段代码不是一个良好结构的代码段，当然这里还存在if/else错用和嵌套用的问题。但是这就也说明了if/else错用和嵌套用的基本原因是我们滥用了if/else，因此如果当我们使用超过3个嵌套if/else之后就应该思考这段代码是否能够进行重构。重构的方法很多，本文就不进行具体介绍了，有兴趣可以参考Martin Fowler的《Refactoring: Improving the Design of Existing Code》以及wiki对refactoring的<a href="http://en.wikipedia.org/wiki/Code_refactoring">介绍</a>。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if/else嵌套用。嵌套用很好解释，也很好理解其害处。人脑的堆栈容量是有限的，一般不建议if/else或其他逻辑结构嵌套超过三层以上，否则人对其的记忆就会大大减弱，相信谁也不会想不断翻之前的代码行去查看某个东西吧。我们在说if/else滥用的例子就是一个典型的嵌套用法，层数达到4层以上。这种问题很容易产生，因为程序本来就是要控制逻辑的，逻辑存在多种分支在大部分时候我们都会遇上。那怎么避免这种嵌套用呢？要做到避免其实在一开始是很难做到的，除了经验丰富的人除外。所以我的建议是，先把事情做对了（程序逻辑实现了），然后进行重构。对于大点的程序进行重构建议遵循Martin的观点，先写好相关的test。而这里的重构方法也可以说相当简单，思路一：使用Joshua Bloch在《effective java》中介绍的方法，把嵌套里面的if/else一一揪出并放到所在嵌套层的上一层，如果揪出后还能继续在新所在层揪到新所层的上一层就继续揪，同时要注意else是否能消掉；思路二：是否能够使用switch实现，3个以上的逻辑判断用switch的话更容易让人看懂你写的东西。最后还应该根据实际情况，是否需要把逻辑代码段抽取出来成为一个单独的函数或者类。例如上例我们可以进行如下重构：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;">&nbsp;*&nbsp;思路一：揪if/else/<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #008000;">&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #0000ff;">if</span><span style="color: #000000;">(A){</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething}</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">if</span><span style="color: #000000;">(B){</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething}</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">if</span><span style="color: #000000;">(C){</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething}</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;">&nbsp;*&nbsp;思路二：使用switch<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;">&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #0000ff;">switch</span><span style="color: #000000;">(condition){<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">A</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething;break;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">B</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething;break;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">C</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething;break;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&nbsp;&nbsp;:</span><span style="color: #008000;">//</span><span style="color: #008000;">dosomething;break;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if/esle虽小，而且功能强大，但如果不正确使用，不但会让代码维护困难，更可怕是留下潜在的bug。以上3个问题是比较普通出现的问题，只要我们细心的话，这些问题都可以避免，修改和完善。<br />
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/299443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2009-10-24 10:54 <a href="http://www.blogjava.net/Ericzhang5231/articles/299443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>摩尔定律其实是个魔咒</title><link>http://www.blogjava.net/Ericzhang5231/archive/2009/10/18/mor.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sun, 18 Oct 2009 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/archive/2009/10/18/mor.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/298732.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/archive/2009/10/18/mor.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/298732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/298732.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center"><img border="0" alt="" src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/00/Transistor_Count_and_Moore%27s_Law_-_2008.svg/350px-Transistor_Count_and_Moore%27s_Law_-_2008.svg.png" width="350" height="307" /></div>
<br />
<br />
&nbsp;&nbsp;&nbsp; 摩尔定律是由intel的戈登摩尔提出的一个观点，具体含义可以查看上<a style="font-family: " href="http://zh.wikipedia.org/zh-cn/%E6%91%A9%E5%B0%94%E5%AE%9A%E5%BE%8B" target="_blank">摩尔定律</a>。摩尔定律指出IC制作技术以直线的方式向前推进，普遍流行的说法就是"每18个月番一番"，摩尔定律甚至还被推广至整个IT行业。看来似乎一切都是那么符合摩尔定律，但同时这一切说明把摩尔定律的&#8220;邪恶&#8221;，摩尔定律&#8220;诅咒&#8221;了这一切。《浪潮之巅》的作者吴军提出<a style="font-family: " href="http://www.googlechinablog.com/2007/10/blog-post_16.html" target="_blank">&#8220;反摩尔定律&#8221;</a>揭示了摩尔定律的实质。反摩尔定律从摩尔定律的反方向进行思考，简单的说如果一个企业没有遵循摩尔定律，今天和过去18个月一样卖掉同样多、同样的产品，那它的营业额就只有一半。这说明了什么？这就意味着在不遵循摩尔定律下，这个企业90%都会倒闭！那么你说这个是不是一个魔咒哦？！戈登背后所代表的是intel等大公司，它们具有先进的技术和雄厚的财力，完全有能力做到摩尔定律那样，但其他中小公司能吗？显然是不能的！结果是大公司越发占领市场，中小公司则被进行另一轮淘汰和吞食。&nbsp;<br style="font-family: " />
<br style="font-family: " />
&nbsp;&nbsp;&nbsp;&nbsp;确实，我们不能否定摩尔定律给一般民众带来的好处：个人电脑、电脑配件以及数码产品越来便宜。但长远来看，摩尔定律使得以后中小公司纷纷倒闭，市场只存在少数的超级大公司，那市场上的电脑产品价格控制权不是它们说了算？那我们是不是就变成了砧板的鱼肉，任人宰割呢？有点扯远了，还是回归话题。摩尔定律这种利用自身的优势去&#8220;统治&#8221;市场的招式并不是只有intel会用，其实跨国大公司都对此轻车熟路，Ibm提出的SOA不正是利用自身在企业服务的软件和硬件优势再次成为这个市场的主宰？Microsoft不断的推出新的操作系统也是如此，新操作系统的推出最后使得民众的口袋憋下去了，Microsoft的老板们的别墅又多一栋。很多时候，我们其实是被&#8220;摩尔定律&#8221;了，只是我们大家都还不清楚而儿。</span>
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/298732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2009-10-18 10:52 <a href="http://www.blogjava.net/Ericzhang5231/archive/2009/10/18/mor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浏览器网页兼容性问题--DOM基础篇</title><link>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sat, 17 Oct 2009 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/298691.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/298691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/298691.html</trackback:ping><description><![CDATA[W3C针对XHTML以及HTML开发一种DOM，这个DOM是基于HTMLElement和HTMLDocument实现的。除了少数元素只包含HTMLElement属性和方法外，每个HTML元素都通过特定的HTMLElement类型表示。然而并不是所以浏览器对DOM都支持的，下面列出了一些经常会遇到的不兼容的DOM使用问题。<br />
<br />
1.childNodes <br />
不同浏览器使用childNodes在处理Text节点存在一些差异。Mozilla认为元素之间的空白是Text节点；而IE，会忽略这些空白。可以通过判断childNodes[x].nodeValue == "#text"，childNodes[x].nodeType == 1解决这个问题；或者使用children属性，children属性是一个数组，可以通过索引获取子节点；<br />
<br />
2.document<br />
IE使用document.all，而使用dom标准的浏览可以通过document.getElementsByTagName("*") ；<br />
<br />
3.Id&amp;getElementById<br />
在IE中可以把Id当作元素使用，但在其他浏览器不支持。因此建议使用getElementById，getElementById在IE6中使用，如果元素Name等于Id，也会一同返回；<br />
<br />
4.集合数组<br />
<span style="font-size: 12pt; font-family: 宋体;">IE中在使用集合类对象时候，访问可以通过</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">()</span></span><span style="font-size: 12pt; font-family: 宋体;">与</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">[]</span></span>。建议同一使用[]dom标准访问；<br />
<br />
5.body对象<br />
<span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">IE</span></span><span style="font-size: 12pt; font-family: 宋体;">中</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">body</span></span><span style="font-size: 12pt; font-family: 宋体;">对象要在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">&lt;body&gt;</span></span><span style="font-size: 12pt; font-family: 宋体;">标签完全读入才会存在，而在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">FireFox</span></span><span style="font-size: 12pt; font-family: 宋体;">中一开始就存在</span>；<br />
<br />
6.Type属性<br />
<span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">IE</span></span><span style="font-size: 12pt; font-family: 宋体;">中</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">input</span></span><span style="font-size: 12pt; font-family: 宋体;">标签的</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">type</span></span><span style="font-size: 12pt; font-family: 宋体;">属性是只读的，但在</span><span style="font-size: 12pt;"><span style="font-family: Times New Roman;">FireFox</span></span><span style="font-size: 12pt; font-family: 宋体;">中是可读写的；<br />
<br />
7.removeNodes/removeChild<br />
</span><span style="font-size: 12pt; font-family: 宋体;">在FireFox节点中没有removeNode方法，必须使用如下方法 node.parentNode.removeChild(node)</span>；<br />
<br />
8.ParentNode<br />
<span style="font-size: 12pt; font-family: 宋体;">IE</span><span style="font-size: 12pt; font-family: 宋体;">与FireFox的访问父元素有区别，IE为Obj.ParentElement属性;FireFox为Obj.ParentNode属性</span><span style="font-size: 12pt; font-family: 宋体;">解决办法：因为FireFox与IE都支持DOM，因此统一用ParentNode属性</span>；<br />
<br />
9.set/getAttribute<br />
IE的setAttribute不能设置对象属性、事件属性和style相关的属性，对于自定义的可以设置；要注意在FF中，通过自定义设置的属性和通过.方法设置的属性不是同一个属性；<br />
<br />
10.自定义属性<br />
<span style="font-size: 12pt; font-family: 宋体;">在FF中不支持像IE那样直接获取</span>，建议统一用getAttribute方法；<br />
<br />
11.class/className<br />
<span style="font-size: 12pt; font-family: 宋体;">IE</span><span style="font-size: 12pt; font-family: 宋体;">中用&#8221;classname&#8221;做为属性名来设置或取得css class，FF和其它浏览器用&#8221;class&#8221;做为属性名来设置或取得，Dom标准的node object具有className属性<br />
<br />
12.Range<br />
在IE中有document.selection.createRange(),document.body[button|input].createTextRange()；而在FF中可以通过document.getSelection()[.getRangeAt(0)];而对Range的操作中，除了IE和DOM标准的各种move外，FF中的node element还有selectionStart,selectionEnd只读属性<br />
</span><br />
<br />
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/298691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2009-10-17 16:52 <a href="http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_dom.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浏览器网页兼容性问题--DOM EVENT篇</title><link>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sat, 17 Oct 2009 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/298674.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/298674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/298674.html</trackback:ping><description><![CDATA[DOM的不兼容也说明了DOM高级特性Event的不兼容，因为我们在开发Web的时候，和用户的大量交互都是通过event来实现的，所以单独把event抽出来，把其不兼容性列出：<br />
<br />
<br />
Event的兼容性<br />
1.事件流的区别<br />
IE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 冒泡事件流&nbsp;&nbsp; 在IE6增加&lt;html&gt;等元素对事件流的响应<br />
Mozillal&nbsp;&nbsp; 冒泡事件流 &nbsp; 在IE6的基础上增加window对象对事件流的响应<br />
Netscape&nbsp;&nbsp; 捕获事件流&nbsp;&nbsp; 同Mozillal <br />
DOM标准&nbsp;&nbsp;&nbsp; 冒泡+捕获 &nbsp;&nbsp; 增加文本节点对事件流的响应；同时冒泡+捕获使得事件目标连续接收2次事件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （这可能是DOM的事件增加函数有第3个参数的原因）<br />
2.事件处理函数<br />
IE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attach(eventName, fn)、&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp; eventName=on+事件名 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; detachEvent(eventName, fn)<br />
DOM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addEventListener(eventName,fn,boolean)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removeEventListener(eventName,fn,boolean)&nbsp;&nbsp;&nbsp; eventName=事件名;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean=true:捕获|false:冒泡<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remove只有同事件流才能起效
<br />
3.事件对象<br />
定位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IE：window.event；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.event||arguments[0]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM：arguments[0]（事件处理函数的参数），可以通过caller来防止硬编码获取；<br />
<br />
事件目标&nbsp;&nbsp; IE：event.srcElement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.srcElement||event.target <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM:event.target<br />
<br />
阻止事件&nbsp;&nbsp; IE: event.returnValue = true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(isIE){window.event.returnValue = true;}<br />
默认行为&nbsp;&nbsp; DOM: event.preventDefault()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else{arguments[0].preventDefault();}
<br />
<br />
3.1 鼠标事件[对象]<br />
鼠标位置&nbsp;&nbsp;&nbsp; IE：event.x,event.y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.x?event.x:event.PageX <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM:event.pageX, event.pageY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.y?event.y:event.PageY<br />
进入事件1&nbsp;&nbsp; IE ：onmouseenter, onmouseleave&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它们的区别在于处理嵌套dom object出入上，只有<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DOM：mouseover,mouseout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM标准才进行处理，enter/leave会忽略，也就是说 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(fromElement!=toElement) &amp;&amp; (this.contains(toElement)&nbsp; 触发onmouseover<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
(fromElement!=toElement) &amp;&amp; (this.contains(fromElement) ) 触发onmouseout<br />
进入事件2&nbsp;&nbsp; IE：event.fromElement|toElement，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.srcElement<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM： target，relatedTarget&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于mouseover：fromElement=relatedElement,toElement = srcElement=target;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于mouseout : toElement=relatedElement,fromElement = srcElement=target; <br />
<br />
3.2 键盘事件<br />
字符代码&nbsp;&nbsp;&nbsp; IE：event.keyCode；DOM: 数值代码-event.keyCode。event.isChar?event.charCode:event.keyCode ，在FF中，keyCode只能获得功能键的数值代码，其他的需通过which和charCode，在Opera中，则只能通过which<br />
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/298674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2009-10-17 12:56 <a href="http://www.blogjava.net/Ericzhang5231/articles/javascript_differ_event.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>N记的Scrum使用经验</title><link>http://www.blogjava.net/Ericzhang5231/articles/scrum.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Wed, 20 Aug 2008 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/scrum.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/223281.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/scrum.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/223281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/223281.html</trackback:ping><description><![CDATA[Form: <a href="http://blackanger.blog.51cto.com/140924/66305">http://blackanger.blog.51cto.com/140924/66305</a><br />
<br />
今天和一个在诺基亚工作过的朋友聊Scrum，诺基亚推广Scrum有两年多，和他交流学到了很多东西，给大家分享一下：<br />
<br />
－－－－－－－－－<br />
<blockquote>一段寒暄之后。。。<br />
<br />
(19:58:23) i: 诺基亚用Scrum有多长时间了阿<br />
(19:58:24) he: 算是用过.呵呵<br />
(19:59:06) he: 整个公司推行这个大概也有两年的样子<br />
(19:59:18) he: 不过具体到我这边大概是一年多<br />
(19:59:21) i: 时间也不算短<br />
(19:59:58) i: 那你给我说下那边的情况怎么样:D<br />
(20:00:36) he: 其实怎么说呢...N记以前的风格都是作坊型的<br />
(20:00:49) he: 每个产品组就是个小作坊,所以风格各异<br />
(20:01:01) he: 有的适应Scrum就快一些,有的就有些走样<br />
(20:01:16) i: 那你所在的小作坊怎么样<br />
(20:01:19) i: 呵呵<br />
(20:02:06) he: 不过不管最后是不是有些走样,还是有些好处<br />
(20:02:20) i: 具体流程呢<br />
(20:02:31) he: 其实主要原因是它原来还有一套标准的产品立项, 开发, 测试,<br />
发布流程.<br />
(20:02:41) he: 然而又要把Scrum硬套到中间去<br />
(20:02:55) he: 这中间其实就得看执行的团队和个人权衡了<br />
(20:02:58) i: 这样是好还是不好。<br />
(20:03:17) he: 是这样<br />
(20:03:56) he: 简要的来讲,原来的发布流程是: 可行性研究 -&gt; 立项 -&gt; 开发<br />
-&gt; 测试 -&gt; 试用 -&gt; 发布<br />
(20:04:26) i: 使用scrum以后是。。<br />
(20:05:08) i: 具体流程是否严格按Scrum的规则来做的呢<br />
(20:05:37) he: 那么...想把Scrum嵌入到开发这个阶段去<br />
(20:06:00) i: 恩<br />
(20:06:00) he: 对外面来说原来的那套流程就不变...<br />
(20:06:08) he: 所以有些地方就被框得很死<br />
(20:06:24) i: 比如。。<br />
(20:06:39) he: <strong>如果团队只在开发这个周期做一两个迭代...那么就退化得跟原<br />
来的流程差不多了</strong><br />
(20:07:05) i: 我感觉Scrum可以替代这整个流程吧。<br />
(20:07:20) he: 嗯:)不过那不是我能改变的<br />
(20:07:43) i: 那你个人认为流程该怎么改变才比较好<br />
(20:07:55) i: 就拿N以前的这个为例子<br />
(20:08:07) he: 前四个其实都可以<br />
(20:08:24) he: 不过因为刚推行的时候大家都对Scrum没有底<br />
(20:08:38) he: <strong>上边也不愿意去把新东西搞得那么激进<br />
</strong>(20:09:53) i: 可是我感觉把开发那个环节采用scrum也算是正确的吧，因为前<br />
面的可行性研究方面如何去scrum呢<br />
(20:10:33) he: 嗯,可行性研究的意思<br />
(20:10:44) he: 其实就是抽两三个最精干的人<br />
(20:10:51) he: 组成一个预研的小team<br />
(20:11:08) i: en<br />
(20:11:17) he: 然后在给定的时间内把PM还没有把握的功能作出demo来验证一<br />
条路能不能走通<br />
(20:11:23) he: 其实是满适合Scrum的<br />
(20:11:32) he: 个人觉得:)<br />
(20:11:38) i: 恩，有道理<br />
(20:12:05) i: Scrum这个概念到是不仅仅拘泥于开发<br />
(20:12:16) he: 然后这些小feature的demo就会支持之后的立项申请,才能拿到<br />
经费<br />
(20:12:42) i: 那现在<strong>诺基亚的scrum还是在开发环节</strong>上吗<br />
(20:13:02) he: 是的<br />
(20:13:21) i: 那现在是算成功呢，还是。。。<br />
(20:13:26) he: 据我了解多数是<br />
(20:13:45) he: 嗯,不管怎么说, 它并不像一个原来标准的样子, 作了某些妥协<br />
(20:13:45) i: 对了，和你分享一本书<br />
(20:13:55) he: 但我觉得还是提高了效率的:)<br />
(20:14:16) he: 虽然,很大程度上取决于团队和个人自觉程度<br />
(20:14:56) i: 你说，假如让你在一个下团队里去实施Scrum，你会如何做呢<br />
(20:15:22) i:<br />
<a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches" target="_blank">http://www.infoq.com/minibooks/scrum-xp-from-the-trenches</a><br />
今天在infoq看到这本书。<br />
(20:15:41) he: 呵呵, 这本我有PDF<br />
(20:16:10) i: 噢。。。<br />
(20:16:13) i: hehe<br />
(20:16:26) he: 不过没看完:)<br />
(20:16:33) i: 说说你的想法，关于我刚才那个问题<br />
(20:17:41) he: 是这样, 我以前带的团队通常都是在预研之后接手的<br />
(20:18:08) he: 所以在这个阶段之前, 主要还是和Product Manager讨论他的需<br />
求<br />
(20:18:24) he: 您可以把N记的Product Manager看作一个内部客户<br />
(20:18:30) i: 恩，那些backlog要列出来吗<br />
(20:18:46) he: 还不到Backlog那里....<br />
(20:18:53) i: 好，你继续，呵呵<br />
(20:19:06) he: <strong>Product Manager会提出从他自己的角度出发最看重的需求<br />
</strong>(20:19:26) he: <strong>这些需求也许是很简短的表述,就像一个带场景的user story</strong><br />
(20:19:33) i: 恩<br />
(20:19:47) he: 因为他不会很关心技术, 他更多的代表市场<br />
(20:20:58) he: 所以他的需求也许是这样子的:<br />
节点A将支持灵活的存储设备, 自动监测客户给与的存储设备数量并作出按比例<br />
xx:xx的空间占用<br />
<br />
(20:21:21) i: 对，只是个user story<br />
(20:21:31) i: 下一步呢<br />
(20:21:55) he: 或者当用户B的voice传输到节点C时,将自动监测其媒体类型并<br />
做出质量和编码的变换<br />
(20:22:27) he: <strong>这些user story, 我们通常会在他的会议上先记下来, 整理成<br />
一个list<br />
</strong>(20:22:50) he: <strong>PM会给出他看重的优先级<br />
</strong>(20:23:07) i: 客户给出优先级 ？<br />
(20:23:38) he: 对的, 比如说, 就相当于问他: <strong>您最希望在第一个demo day中<br />
看到的是哪一个feature?<br />
</strong>(20:23:43) i: <strong>而不是我们分析需求去列出优先级，明白<br />
</strong>(20:23:48) he: 或者您最希望推向市场卖的是哪一个<br />
(20:23:54) i: 恩<br />
(20:23:58) he: 是的,它首先是面向feature的<br />
(20:24:04) he: 然后...<strong style="color: red">我们不能全都答应<br />
</strong>(20:24:27) i: 为什么<br />
(20:24:44) i: 可以分迭代来做吧<br />
(20:24:59) he: <strong>我们需要与做feasibility study的team沟通,看看他所提出的<br />
要求是不是都能实现,或者能否以可以接受的代价实现</strong><br />
(20:25:22) i: 噢<br />
(20:25:48) i: 怎么又回到第一环节了<br />
(20:25:59) he: 如果不能实现, <strong>我们可以进一步跟他确认: 您看, 你所说的<br />
feature是A, 但是我们觉得您更需要的可能是A+<br />
</strong>(20:26:28) he: 或者, 您看, <strong>在给出的开发周期内A不能全都实现, 是否可以先<br />
实现A- ...<br />
</strong>(20:26:58) he: 或者当前的平台对于实现A有所限制, 我们可以给您提供两个参<br />
考: A1 或者A2<br />
(20:27:11) he: 有的时候他或者她都会咆哮...<br />
(20:27:13) i: 恩，应该是增量式开发，一步步完成客户的需求<br />
(20:27:28) i: 呵呵<br />
(20:27:30) he: 或者我们双方都在咆哮...<br />
(20:28:17) he: 那么也许最后达成的结果可能会是我们需要在第一个demo中作<br />
出a, 然后同时等待另外一个team的组件b的效果, 如果不行,那么backup可能是<br />
c...<br />
(20:28:57) he: <strong>这个妥协后的结果通常被称为product feature backlog</strong><br />
(20:29:24) he: 它对于技术细节关注很少,主要关注最后能完成的feature<br />
(20:29:34) i: 噢<br />
(20:30:02) i: <strong>这个时候到sprint计划会议来细分这些backlog了吧<br />
</strong>(20:30:06) he: 客户在交货或者中间确认进度的时候看的通常都是feature<br />
backlog<br />
(20:30:45) he: 是的, 通常之后每个feature team都会召集起来开会<br />
(20:30:55) he: 也就是Scrum team<br />
(20:31:08) he: <strong>将每个feature都分解为技术上实现的步骤</strong><br />
(20:31:32) i: 然后细分出来交给团队。<br />
(20:31:35) he: <strong>Scrum Master 会将这些步骤作为一个个TASK纪录</strong><br />
(20:31:45) he: 不是细分出来交给团队...<br />
(20:32:01) he: <strong>这个时候每个团队都参与进来看自己的那部分feature backlog<br />
了<br />
</strong>(20:33:05) i: Scrum Master 记录那些task做什么。<br />
(20:33:07) he: 成员王小花可能会说...我觉着吧,要实现feature A 可能我们<br />
需要先在后段存储s上实现一个抽象层InfA<br />
(20:33:22) he: 它需要routine A1 A2 A3来做<br />
(20:33:31) he: 王二麻子可能反对...<br />
(20:33:46) i: 呵呵。<br />
(20:33:59) he: 说我觉着我们只需要服用组件B和组件C提供的服务接口InfB1和<br />
InfC2...<br />
(20:34:20) he: 然后给一个带路由表的配置文件...<br />
(20:34:30) i: 那这个会议最终目标是要干什么，或者说要得到什么结果<br />
(20:34:53) he: <strong>最后的这些task, 就会形成一个周期内的sprint backlog</strong><br />
(20:35:13) he: 能力越好的团队, 所能细分出来的task越精确<br />
(20:35:19) i: 噢，是指定backlog的过程<br />
(20:35:27) he: <strong>通常粒度控制在20h<br />
</strong>(20:36:28) i: 如果需求有变的情况如何处理<br />
(20:37:02) i: 在迭代的时候<br />
(20:37:14) he: 嗯...我记得上次某大师来讲座的时候我们也问过<br />
(20:37:35) i: 呵呵，怎么回答的<br />
(20:37:45) he: 他的答案是标准做法是<strong>继续把sprint做完,然后在接下来的一个<br />
sprint中完成变动<br />
</strong>(20:38:11) i: 明白了。。。<br />
(20:38:37) i: 那迭代期间你们有每日例会吧<br />
(20:39:02) he: 是的, daily meeting<br />
(20:39:25) i: 对了，你们是不是也这样处理需求的变化，放在下个sprint里<br />
(20:39:47) he: 不是<br />
(20:39:53) he: 我们的sprint 周期长达一个月..<br />
(20:40:10) i: Scrum里规则是一个月。。。<br />
(20:40:17) i: 那。。。<br />
(20:40:19) he: <strong>所以通常我们有drop一个旧的和add一个新的</strong><br />
(20:40:42) he: <strong>除了通常比较简化的Not Started. On Going和Done 三个状态<br />
之外<br />
</strong>(20:40:56) he: <strong>我们有Dropped和Added</strong><br />
(20:42:07) i: 噢，这样处理也很科学<br />
(20:42:46) he: 呵呵:)因为有时候一个月还是太长<br />
(20:43:00) he: 因为对于两地或者三地之间的协同开发<br />
(20:43:06) he: 一个月可以发生的事情太多了<br />
(20:43:23) he: 尤其是这几个地方都有时差的时候<br />
(20:43:47) i: 不过迭代没有完成的话，也许客户不清楚自己需求的变更是好<br />
是坏，大师那么说也有道理吧。迭代完成，让客户看了以后他再看是否变化需求。<br />
(20:44:02) i: 我说的有没有可能 ？<br />
(20:44:30) he: 是的:)<br />
(20:45:06) he: 但是有时候需求确实很急...<br />
(20:45:09) i: 具体应用具体处理吧，起码有了处理的办法。<br />
(20:45:13) i: 恩<br />
(20:45:19) he: 比如突然拿某移动的单<br />
(20:45:27) he: 而该客户以需求怪异著称<br />
(20:45:34) i: 呵呵<br />
(20:45:38) he: 这种情况<strong>不一定非得等到下一个</strong>...<br />
(20:45:45) i: 确实<br />
(20:45:55) i: 拥抱变化<br />
(20:46:29) he: 其实我觉得很依赖团队成员的<br />
(20:46:36) he: 如果团队成员很不积极<br />
(20:46:36) i: Scrum的规则也应该是符合实际情况的经验性方法才能发挥能<br />
量。<br />
(20:46:47) i: 个人敏捷性<br />
(20:46:55) he: 那么sprint planning就会死气沉沉变成任务指派...<br />
(20:47:09) i: Scrum里面说自我管理<br />
(20:47:31) i: 如何调动成员的积极性来更好的团队自我管理<br />
(20:49:18) he: 其实原来我带的team比较实际一点....<br />
(20:49:23) he: 每个sprint都有demo...<br />
(20:49:29) i: 那天在infoq上看了一篇文章，关于这个问题，是说团队成员的<br />
主人翁精神不够<br />
(20:49:38) i: 恩，你继续<br />
(20:49:53) he: 大家通常都很期望demo day那天PM发话说: 嗯,对的,我就是想<br />
要这个<br />
(20:50:10) he: 如此以来...整个team就能申请预算出去大吃大喝了<br />
(20:50:20) he: 因为整个team都比较好吃...<br />
(20:50:23) i: 呵呵<br />
(20:50:29) he: 成都好吃的地方很多,也不很贵<br />
(20:50:39) i: 好吃不懒做<br />
(20:50:58) he: 嗯,总的来说,就是得有promotion:)<br />
(20:51:05) he: 我个人觉得<br />
(20:51:29) i: 一些物质激励<br />
(20:52:10) he: 呃..其实也不限于这个...物质<br />
(20:52:28) he: 您说:)<br />
(20:53:06) i: 比如一起出去游山玩水，放松个一两天<br />
(20:53:19) he: 嗯<br />
(20:54:10) i: 对了，你们用看板没有<br />
(20:54:39) i: 是有专门的系统还是手工看板<br />
(20:55:38) he: 哦.有<strong>一间屋专门换了玻璃板的</strong>...<br />
(20:55:50) i: 常用吗<br />
(20:55:53) he: <strong>四面墙可以乱涂乱画</strong>....<br />
(20:56:03) he: 嗯,经常:P<br />
(20:56:08) i: 呵呵<br />
(20:56:21) i: 我们这方面做的不太够<br />
(20:56:25) he: 针对team里年轻人表现欲都比较强的特点<br />
(20:56:31) he: 我们划出一面墙来<br />
(20:56:40) he: <strong>当月sprint完成的最好的年轻人<br />
</strong>(20:56:46) he: <strong>有权占有那面墙</strong>...<br />
(20:56:53) i: 呵呵<br />
(20:57:02) he: 只要不写的太反动...随便他怎么规划<br />
(20:57:04) i: 涂鸦吗<br />
(20:57:08) he: 嗯.差不多<br />
(20:57:25) he: 对羞涩性队员的效果可能就差一些<br />
(20:57:33) i: 挺有意思<br />
(20:57:54) he: :)<br />
。。。<br />
end<br />
</blockquote>
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/223281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2008-08-20 15:56 <a href="http://www.blogjava.net/Ericzhang5231/articles/scrum.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用回调实现Spring+Hibernate中的批量删除</title><link>http://www.blogjava.net/Ericzhang5231/articles/220158.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Tue, 05 Aug 2008 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/220158.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/220158.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/220158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/220158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/220158.html</trackback:ping><description><![CDATA[Spring+Hibernate 的HibernateTemplate 只提供了单个object的delete，对于某些应用来说，要大量删除数据，只能通过不断的load object，delete object。这种做法效率低。<br />
利用hibernate提供的回调机制，可以实现批量删除，具体方法是：<br />
<br />
<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"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_54_345_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_345_Open_Text.style.display='none'; Codehighlighter1_54_345_Closed_Image.style.display='inline'; Codehighlighter1_54_345_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_54_345_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_345_Closed_Text.style.display='none'; Codehighlighter1_54_345_Open_Image.style.display='inline'; Codehighlighter1_54_345_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">getHibernateTemplate().execute(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HibernateCallback()</span><span id="Codehighlighter1_54_345_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_54_345_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_144_337_Open_Image" onclick="this.style.display='none'; Codehighlighter1_144_337_Open_Text.style.display='none'; Codehighlighter1_144_337_Closed_Image.style.display='inline'; Codehighlighter1_144_337_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_144_337_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_144_337_Closed_Text.style.display='none'; Codehighlighter1_144_337_Open_Image.style.display='inline'; Codehighlighter1_144_337_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;HibernateException,&nbsp;SQLException&nbsp;</span><span id="Codehighlighter1_144_337_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_144_337_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hql&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">delete&nbsp;Object</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.createQuery(hql);<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;result.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(query.executeUpdate()));<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">);</span></div>
<br />
这种做法hibernate只会生成一条sql，效率相对较高。但是利用回调机制，尽管能删除数据库的数据，而一级缓存中的数据并没有删掉，因此在使用的时候要格外小心
 <img src ="http://www.blogjava.net/Ericzhang5231/aggbug/220158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2008-08-05 14:41 <a href="http://www.blogjava.net/Ericzhang5231/articles/220158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LDAP:error code 一览表 </title><link>http://www.blogjava.net/Ericzhang5231/articles/213279.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Tue, 08 Jul 2008 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/213279.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/213279.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/213279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/213279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/213279.html</trackback:ping><description><![CDATA[<font size="2">0 LDAP_SUCCESS Success <br />
1 LDAP_OPERATIONS_ERROR Operations error <br />
2 LDAP_PROTOCOL_ERROR Protocol error <br />
3 LDAP_TIMELIMIT_EXCEEDED Timelimit exceeded <br />
4 LDAP_SIZELIMIT_EXCEEDED Sizelimit exceeded <br />
5 LDAP_COMPARE_FALSE Compare false <br />
6 LDAP_COMPARE_TRUE Compare true <br />
7 LDAP_STRONG_AUTH_NOT_SUPPORTED Strong authentication not supported <br />
8 LDAP_STRONG_AUTH_REQUIRED Strong authentication required <br />
9 LDAP_PARTIAL_RESULTS Partial results <br />
10 LDAP <span style="font-size: 12pt">referral error and is a good indication that the LDAP server is set up to use referrals. However, WebSphere Portal does not support LDAPs with referrals. <br />
(solution: 1. The LDAP administrator can disable referrals and ensure that your wpconfig.properties file has the correct LDAP settings listed. 2. Use a different LDAP server that does not have or require referrals.)<br />
</span>16 LDAP_NO_SUCH_ATTRIBUTE No such attribute <br />
17 LDAP_UNDEFINED_TYPE Undefined attribute type <br />
18 LDAP_INAPPROPRIATE_MATCHING Inappropriate matching <br />
19 LDAP_CONSTRAINT_VIOLATION Constraint violation <br />
20 LDAP_TYPE_OR_VALUE_EXISTS Type or value exists <br />
21 LDAP_INVALID_SYNTAX Invalid syntax <br />
32 LDAP_NO_SUCH_OBJECT No such object <br />
33 LDAP_ALIAS_PROBLEM Alias problem <br />
34 LDAP_INVALID_DN_SYNTAX Invalid DN syntax <br />
35 LDAP_IS_LEAF Object is a leaf <br />
36 LDAP_ALIAS_DEREF_PROBLEM Alias dereferencing problem <br />
48 LDAP_INAPPROPRIATE_AUTH Inappropriate authentication <br />
49 LDAP_INVALID_CREDENTIALS Invalid credentials <br />
50 LDAP_INSUFFICIENT_ACCESS Insufficient access <br />
51 LDAP_BUSY DSA is busy <br />
52 LDAP_UNAVAILABLE DSA is unavailable <br />
53 LDAP_UNWILLING_TO_PERFORM DSA is unwilling to perform <br />
54 LDAP_LOOP_DETECT Loop detected <br />
64 LDAP_NAMING_VIOLATION Naming violation <br />
65 LDAP_OBJECT_CLASS_VIOLATION Object class violation <br />
66 LDAP_NOT_ALLOWED_ON_NONLEAF Operation not allowed on nonleaf <br />
67 LDAP_NOT_ALLOWED_ON_RDN Operation not allowed on RDN <br />
68 LDAP_ALREADY_EXISTS Already exists <br />
69 LDAP_NO_OBJECT_CLASS_MODS Cannot modify object class <br />
70 LDAP_RESULTS_TOO_LARGE Results too large <br />
80 LDAP_OTHER Unknown error <br />
81 LDAP_SERVER_DOWN Can't contact LDAP server <br />
82 LDAP_LOCAL_ERROR Local error <br />
83 LDAP_ENCODING_ERROR Encoding error <br />
84 LDAP_DECODING_ERROR Decoding error <br />
85 LDAP_TIMEOUT Timed out <br />
86 LDAP_AUTH_UNKNOWN Unknown authentication method <br />
87 LDAP_FILTER_ERROR Bad search filter <br />
88 LDAP_USER_CANCELLED User cancelled operation <br />
89 LDAP_PARAM_ERROR Bad parameter to an ldap routine <br />
90 LDAP_NO_MEMORY Out of memory </font>
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/213279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2008-07-08 11:27 <a href="http://www.blogjava.net/Ericzhang5231/articles/213279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Chapter 7 Defining Portals and Pages</title><link>http://www.blogjava.net/Ericzhang5231/articles/212742.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sat, 05 Jul 2008 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/212742.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/212742.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/212742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/212742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/212742.html</trackback:ping><description><![CDATA[&nbsp;
<ul style="margin-top: 0in; margin-bottom: 0in; margin-left: 0.277in; direction: ltr; unicode-bidi: embed">
    <p style="font-weight: bold; font-size: 12pt; margin: 0in; font-family: Arial">7.1 Logical Structure of a Portal</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">The portal uses a tree like hierarchical structure, where the root o tree is called Content Root. Nodes in this hierarchy belong to one of the following types:</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">Pages</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">Labels,</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">URLs,</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial"><span style="font-weight: bold; font-style: italic">Pages</span>: the basic building block used for displaying content in the form of portlets. Page nodes may contain other nodes, including other pages.</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial"><span style="font-weight: bold; font-style: italic">Labels</span>: a placeholder for pages. Labels may contain other nodes, but display no content, and are used to provide logical grouping of nodes which are used to define common attributes such as access permissions.</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial"><span style="font-weight: bold; font-style: italic">URLs</span>: used to access any resource that can be addressed with a URL. URLs obviously do not contain any other nodes. URLs are useful for addressing external Web sites or another part of the portal.</p>
    <p style="font-weight: bold; font-size: 12pt; margin: 0in; font-family: Arial">7.2 Browsing through the Content Hierarchy</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial"><span style="font-weight: bold">7.2.1 The Manage Pages window allows you to browse through the content hierarchy. On the right-hand side of the current node name are some buttons</span>:</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">Editing page properties</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">Editing page layout (only for page nodes)</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">Controlling access permissions</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">Deleting the node</p>
    <p style="margin: 0in"><img height="128" src="file:///C:/DOCUME~1/ERICZH~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.png" width="247"  alt="" /></p>
    <p style="font-weight: bold; font-size: 10pt; margin: 0in; font-family: Arial">7.2.2 Page Inheritance with Shared Pages</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">When&nbsp;content of a new page is based on another page, the new page is essentially the aggregation of the existing page with a new specialized layer on top of latter. This implies that a prerequisite for accessing a page using a shared page is that both the page and the shared page must be accessible by the user. Shared pages essentially implement a form of inheritance. A page based on a shared page inherits the layout and content of latter. </p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">An important characteristic of share pages is that any changes made to the share page are reflected on all the pages referencing it. A shared page can reference another shared page, thus creating a chain of page references.</p>
    <p style="font-weight: bold; font-size: 10pt; margin: 0in; font-family: Arial">7.2.3 Advanced Layout Editing</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">WebSphere Portal allows six different page basic layouts. Click the Configure button in top-right corner of the window, we can check the box reading Show Toggle Link for Show Layout Tools/Hide Layout Tools. Once do this, the six layout patterns are no longer visible and you may customize your layout by adding as many container as you want. For each column container you may set its width, as well as add row containers within it.</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">7.2.4 Locks</p>
    <p style="font-size: 10pt; margin: 0in; font-family: Arial">The Locks tab allows the administrator to limit the flexibility of a user in editing the page layout and content. Locking the container prevents users from removing this container from a page, whereas locking the container content prevents users from adding or removing portlets and sub containers from the container. Lock are applicable to shared pages, and allow top-level administrators in cascading portals to define content that is mandatory in a page. Of course, you can un-lock containers.</p>
</ul>
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/212742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2008-07-05 16:06 <a href="http://www.blogjava.net/Ericzhang5231/articles/212742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Chapter 1 Introduce</title><link>http://www.blogjava.net/Ericzhang5231/articles/websphereportal.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Sat, 05 Jul 2008 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/websphereportal.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/212741.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/websphereportal.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/212741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/212741.html</trackback:ping><description><![CDATA[&nbsp;
<p style="font-weight: bold; font-size: 14pt; margin: 0in; font-family: Verdana">Chapter 1 Introduce</p>
<p style="font-weight: bold; font-size: 12pt; margin: 0in; font-family: Arial">1.1 Why do we need portal</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">As Internet dev, business required to integrate various sites into one to supply more comfortable service. However, this generated a smorgasbord look and feel. Security soon became an issue and each site then required authentication, which mean user would endure the frustrating experiencing of logins on a single site with difference name and password. And now many different devices with different attributes such as desktops, mobile phones, and palm pilots are needed to access into business sys.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">Portals help today's business address the Internet challenges. It helps programmers focus on developing the business functionality by letting the portal manage the look and feel, personalization, content management, and security. It allows users to integrate different applications from disparate locations and enables them to seamlessly exchange information. Each user can create a personalized device-independent "desktop" with a consistent look and feel by suing drag and drop components.</p>
<p style="font-weight: bold; font-size: 12pt; margin: 0in; font-family: Arial">1.2 IBM WebSphere Family</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">IBM WebSphere is made up of three components: <span style="font-weight: bold">foundation and tools, reach and user experience or business portals, and business integration.</span></p>
<p style="margin: 0in 0in 0in 0.5in"><img height="231" src="file:///C:/DOCUME~1/ERICZH~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image001.png" width="487"  alt="" /></p>
<p style="font-size: 12pt; margin: 0in; font-family: Arial">1.3 <span style="font-weight: bold">What is WebSphere Portal?</span></p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.1 <span style="font-weight: bold">The User Experience</span></p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">Each user can create his or her own portal pages and customize the content and look and feel of these pages. They can add functionality to their pages through portlets, which are portal app. Based on their permissions, users can choose for each page or set of pages their own themes, skins, and layout.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana"><span style="font-weight: bold; font-style: italic">Themes</span>: define the fonts, colors, spacing, and other look-and-feel components of the page.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana"><span style="font-weight: bold; font-style: italic">Skins</span>: comprise title bars, borders, shadows, etc. that surround the portlets.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.1.1 <span style="font-weight: bold">Content Management</span></p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WP provides the user the ability to syndicate content or to get up-to-date personalized and filtered content and services from multiple subscriber source such as Financial Times and others. Also support RSS format. IBM Lotus Workpalce Web Content Management (ILWWCM) provides Web Content Management system. ILWWCM is designed for organizations with user that publish content to a web site, whether it is marketing updating product information or human resources updating information on benefits. Content can be published through templates or forms and consists of images, word doc, excel, html and so forth.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.1.2 <span style="font-weight: bold">Document management</span></p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WebSphere Portal Document Manager (PDM) provides user the ability to view, add, edit, and delete documents within a common folder hierarchy that can be user-defined. Documents can be made available immediately or to go through an approval process using a defined workflow model.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.1.3 <span style="font-weight: bold">Search</span></p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">Use of the search capabilities is made through the search portlet, the WP crawler, or the document indexer. Enhanced search is also provided through IBM Lotus Extended Search and DV2 Information Integrator.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.1.4 <span style="font-weight: bold">Collaboration</span></p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WebSphere Portal provides complete support for collaboration through the Notes, Domino, and Domino Web Access portlets. These portlets provide access to collaboration app that use Lotus Notes databases on Domino servers such as Mail, Calendar, To Do, Notes View, TeamRoom, and Discussion. Additional portlets are available that integrate Domino.doc, Discovery Server, QuickPlace, and Sametime.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WP offers Collaboration Center, which is a framework that integrates People Finder, the Web Conference Center, QuickPlace, and Sametime.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.1.5 <span style="font-weight: bold">Personalization</span></p>
<ol style="margin-top: 0in; font-size: 10pt; margin-bottom: 0in; margin-left: 1.375in; direction: ltr; font-family: Verdana; unicode-bidi: embed" type="1">
    <li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle" value="1"><span style="font-size: 10pt; font-family: Verdana">Creating a user profile by collecting user information and classifying it into segments;</span></li>
    <li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle" value="2"><span style="font-size: 10pt; font-family: Verdana">Creating models for the content that defines it by its attributes. For instance, a content model might contain product name, price, and age segment;</span></li>
    <li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle" value="3"><span style="font-size: 10pt; font-family: Verdana">Matching the user segment to the content on the basis of any combination of filtering, rules, or recommendation engine.</span></li>
</ol>
<p style="font-size: 10pt; margin: 0in 0in 0in 1.375in; font-family: Verdana">The personalization rules are referenced in the portlets. They are created using web-based tools. Another method provided to match site visitors with content is through the recommendation engine. The recommendation engine uses statistical techniques to identify groups of users with similar interests. WebSphere Portal also provides campaign management tools, which enable a business goal to be reached by defining and executing a set of business rules.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.1.6<span style="font-weight: bold"> Performance</span></p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WebSphere Portal creates logs that feed into the IBM Tivoli Web Site Analyzer. The Web Site analyzer will analyze the data and report metric in both graphic and text formats so that you can determine the effectiveness of you web site and focus on areas to improve it.</p>
<p style="font-weight: bold; font-size: 12pt; margin: 0in 0in 0in 0.5in; font-family: Arial">1.3.2 The Developer Experience</p>
<p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.2.1 Portlets communication</p>
<ol style="margin-top: 0in; font-size: 10pt; margin-bottom: 0in; margin-left: 1.375in; direction: ltr; font-family: Verdana; unicode-bidi: embed" type="1">
    <li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle" value="1"><span style="font-size: 10pt; font-family: Verdana">Sending information through a portlet action and a portlet message. (Simply speaking, one portlet create a portlet action and encode it into the URL that is used for displaying another portlet. Upon clicking the URL, an action listener is called and then a portlet message is sent to another portlet with the needed parameters)</span></li>
    <li style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle" value="2"><span style="font-size: 10pt; font-family: Verdana">WP provides cooperative portlets, which can be "Click-2-Action" or "wired", to pass messages independently. Portlet express their desire to interact with a broker who at runtime matches data types between the source of one portlet with the action of another portlet. If a match occurs with a "Click-2-Action portlet", a pop-up menu appears on the page that will enable the user to transfer the data to the connected portlet. If the portlet is wired by an administrator, then the data will be exchanged automatically as opposed to having to wait for the user to click the pop-up menu.</span></li>
</ol>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.2.2 Through the portlet API, WebSphere Portal provides programmers the ability to </p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dynamically discover available services.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.2.3 WP server supports the JAAS architecture</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.2.4 WP provides developers with support for Web Service for Remote Portlets </p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">(WSRP)</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.2.5 WebSphere Portal Application Integrator (WPAI) support ability to access </p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enterprise Application Systems such as SAP, PeopleSoft, Siebel</p>
<p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.2.2 The Administrator Experience</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WebSphere Portal enables an administrator to have complete dynamic control over user access right for every&nbsp;portal resource including portlets, pages, and user groups. The permission are defined by the user role. WP has defined roles (Administrator, Security Administrator, Delegator, Manager, Editor, Privileged User, and User).</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">If a role is assigned to a page, group, or folder, then resource below the parent inherit the permissions unless they are specifically blocked. A user can also delegate his or her role to other users.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WebSphere Portal Member Services provides administration services through portlets for creating, updating, and deleting portal user and for managing their access rights. These services are provided at both the user and group levels. Users can be members of one or more groups and groups can be members of other groups.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">User profile information can be supported in an LDAP and/or a database.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 1in; font-family: Verdana">WebSphere Portal support form-based authentication (HTML user prompted form) through WAS or a third-party authentication server such as Tivoli Access Manager or Netegrity Siteminder.</p>
<p style="font-size: 10pt; margin: 0in 0in 0in 0.5in; font-family: Verdana">1.3.3 WebSphere Portal Architecture</p>
<p style="margin: 0in 0in 0in 0.5in"><img height="273" src="file:///C:/DOCUME~1/ERICZH~1/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.png" width="483"  alt="" /></p>
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/212741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2008-07-05 16:04 <a href="http://www.blogjava.net/Ericzhang5231/articles/websphereportal.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Recommand a website</title><link>http://www.blogjava.net/Ericzhang5231/articles/210776.html</link><dc:creator>Eric-1001c</dc:creator><author>Eric-1001c</author><pubDate>Thu, 26 Jun 2008 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/Ericzhang5231/articles/210776.html</guid><wfw:comment>http://www.blogjava.net/Ericzhang5231/comments/210776.html</wfw:comment><comments>http://www.blogjava.net/Ericzhang5231/articles/210776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Ericzhang5231/comments/commentRss/210776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Ericzhang5231/services/trackbacks/210776.html</trackback:ping><description><![CDATA[Recommand a website帕兰<a href="http://parandroid.com/">影像 http://parandroid.com/</a>
<img src ="http://www.blogjava.net/Ericzhang5231/aggbug/210776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Ericzhang5231/" target="_blank">Eric-1001c</a> 2008-06-26 11:32 <a href="http://www.blogjava.net/Ericzhang5231/articles/210776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>