﻿<?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-Flyingis-文章分类-Technology</title><link>http://www.blogjava.net/flyingis/category/4258.html</link><description>Talking and thinking freely !&lt;br&gt;
Flying in the world of Java and GIS !</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:10:25 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:10:25 GMT</pubDate><ttl>60</ttl><item><title>正确使用XHTML的冒险</title><link>http://www.blogjava.net/flyingis/articles/83430.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 25 Nov 2006 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/articles/83430.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/83430.html</wfw:comment><comments>http://www.blogjava.net/flyingis/articles/83430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/83430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/83430.html</trackback:ping><description><![CDATA[
		<div class="entry-body">
				<p>
						<font face="Verdana" size="2">原文：</font>
						<a href="http://www.456bereastreet.com/archive/200501/the_perils_of_using_xhtml_properly/">
								<font face="Verdana" size="2">http://www.456bereastreet.com/archive/200501/the_perils_of_using_xhtml_properly/</font>
						</a>
						<br />
						<font face="Verdana" size="2">作者：</font>
						<a href="http://www.456bereastreet.com/">
								<font face="Verdana" size="2">Roger Johansson</font>
						</a>
						<br />
						<font face="Verdana" size="2">翻译：</font>
						<a href="http://www.omemo.net/neo/about.php">
								<font face="Verdana" size="2">Neo</font>
						</a>
						<font face="Verdana" size="2">(</font>
						<a href="http://www.omemo.net/neo">
								<font face="Verdana" size="2">http://www.omemo.net/neo</font>
						</a>
						<font face="Verdana" size="2">)<br />修正：</font>
						<a href="http://www.junchenwu.com/">
								<font face="Verdana" size="2">JunChen</font>
						</a>
				</p>
				<p>
						<a href="http://www.junchenwu.com/">
								<font face="Verdana" size="2">JunChen</font>
						</a>
						<font face="Verdana" size="2">注：omemo.net网站似乎已经挂掉，链接都失效了。文章写得非常不错，一直是Best of 456 Berea Street。在这里发布的时候我进行了少量代码上和翻译上的修改，以忠实原著。</font>
				</p>
				<p>
						<strong>
								<font face="Verdana" size="2">我使用<abbr>XHTML</abbr>有些年了，但直至去年夏天我才着眼于如何正确使用，那就是说，以<code>application/xhtml+xml</code>的<acronym title="Multipart Internet Mail Extension">MIME</acronym>类型来伺服(server)它。虽然我遇到了这些问题，但我知道问题远非如此。就如你即将发现的一样，当你开始使用真正的<abbr>XHTML</abbr>，你会遭遇很多似乎细小但让人困惑的问题。</font>
						</strong>
				</p>
		</div>
		<p class="entry-more">
				<font face="Verdana" size="2">请注意这不是一篇讨论支持或反对使用<abbr>XHTML</abbr>的文章。我只是写下我所知道的潜在的易犯错误，并且让你自己来决定自己的选择：<abbr>HTML</abbr> 4.01，为所有浏览器伺服为<code>text/html</code>的<abbr>XHTML</abbr> 1.0或者为能够处理其的浏览器伺服为<code>application/xhtml+xml</code>而其他浏览器则伺服为<code>text/html</code>的<abbr>XHTML</abbr> 1.0。否则有些东西会完全不一样。</font>
		</p>
		<p class="entry-more">
				<font face="Verdana" size="2">只有在问题发生的时候，我才有机会去了解和认识这些东西。有些情况下我必须花很多时间来查找问题和求助于其他人，来寻求一个解决方案。但我在其中学到不少东西，我会把我已经使用<abbr>XHTML</abbr>后应该知道的都告诉你。</font>
		</p>
		<p class="entry-more">
				<font face="Verdana" size="2">注意我这里提及的问题只会发生在能正确处理<code>application/xhtml+xml</code><acronym title="Multipart Internet Mail Extension">MIME</acronym>类型的用户代理中，而因此<abbr>XHTML</abbr>被作为<abbr>XML</abbr>。这也可能是这里不提及<abbr>XHTML</abbr>的早期使用的原因——很少有人使用这样的浏览器，所以几乎不会有人因只伺服为<code>text/html</code>的<abbr>XHTML</abbr>所烦忧。</font>
		</p>
		<p class="entry-more">
				<font face="Verdana" size="2">今天，实际上把<abbr>XHTML</abbr>伺服为<code>application/xhtml+xml</code>正慢慢变得平常。我所知道的理由有两个：</font>
		</p>
		<div class="entry-more">
				<ol>
						<li>
								<font face="Verdana" size="2">使用Firefox，Mozilla，Opera，Safari和其他兼容<abbr>XHTML</abbr>浏览器的人数增加了很多，所以你不再仅仅为自己和伙伴这样做。嗯。或许你就这样做，当将影响更多人。</font>
						</li>
						<li>
								<font face="Verdana" size="2">在web开发者之间，对<abbr>XHTML</abbr>的真正面目是什么的觉醒越来越多了。使用<abbr>XHTML</abbr>已经有多次多时的热烈的讨论，尤其是伺服为<code>text/html</code>的时候。如果你参与了任何一次讨论，你知道我在说什么。</font>
						</li>
				</ol>
		</div>
		<p>
				<font face="Verdana" size="2">假如你，像我，决定实现某些类型的content negotiation和在传送<abbr>XHTML</abbr>的时候使用正确的媒体类型，你需要知道什么能（和将）在你发布的文档中发生，并且知道怎样避免问题的发生。对于对content negotiation同进行content negotiation的脚本例子有兴趣的读者，我推荐你阅读</font>
				<a href="http://www.autisticcuckoo.net/archive.php?id=2004/11/03/content-negotiation">
						<font face="Verdana" size="2">Content Negotiation</font>
				</a>
				<font face="Verdana" size="2">和</font>
				<a href="http://keystonewebsites.com/articles/mime_type.php">
						<font face="Verdana" size="2">Serving up XHTML with the correct MIME type</font>
				</a>
				<font face="Verdana" size="2">。还有很多这种类型的文章，但这是我读到的最精彩的两篇。</font>
		</p>
		<p>
				<font face="Verdana" size="2">每一个基本的教程都有一些<abbr>HTML</abbr>和<abbr>XHTML</abbr>的明显区别：元素和属性名字使用小写，属性值总要用引号。不要使用简化属性，确保所有的元素都有结束标签和没有不正确的嵌套等等。但是，当<abbr>XHTML</abbr>伺服为<code>application/xhtml+xml</code>时还需要知道更多东西。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">良好的结构是必须的</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">文档<strong>必须</strong>是良好的结构（well-formed）的<abbr>XML</abbr>（跟合法的（valid）<abbr>XHTML</abbr>不必然相同）。就是必须，不是可能。</font>
		</p>
		<p>
				<font face="Verdana" size="2">如果文档结构不好，符合标准的浏览器（当前我知道Mozilla，Firefox，Netscape，Camino，Opera，Safari和OmniWeb——相当多的浏览器除了IE）将会显示错误信息并且以某种方式中止处理文档。</font>
		</p>
		<p>
				<font face="Verdana" size="2">此外，这还意味着不再使用未编码的"&amp;"号。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">XML声明可能是必须的</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">如果要使用UTF-8或者UTF-16以外的变法，必须要XML声明，除非HTTP头已经提供编码。</font>
		</p>
		<p>
				<font face="Verdana">
						<font size="2">在HTTP头中是否要指定字符编码有些模糊，<cite><a href="http://www.w3.org/TR/webarch/#xml-media-types">Architecture of the World Wide Web, Volume One: Media Types for XML</a></cite>这样写的：<q>总体上，不应该在协议头为XML数据指定字符编码，因为数据本身已描述。</q></font>
				</font>
		</p>
		<p>
				<font face="Verdana" size="2">另一方面，<cite><a href="http://www.w3.org/TR/xhtml1/#C_9"><abbr>XHTML</abbr> 1.0, Second Edition: Character Encoding</a></cite>写到：</font>
		</p>
		<p>
				<q>
						<font face="Verdana" size="2">为了让文档使用指定的字符编码，最好的办法是保证web服务器发送正确的头。</font>
				</q>
		</p>
		<p>
				<font face="Verdana" size="2">就是说，在XML声明中指定字符编码是好的习惯：</font>
		</p>
		<p>
				<code>
						<font face="Verdana" size="2">&lt;?xml version="1.0" encoding="iso-8859-1"?&gt;</font>
				</code>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">只有五个实体是安全的</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">只有五个预定义的实体（<code>&amp;lt;</code>, <code>&amp;gt;</code>, <code>&amp;amp;</code>, <code>&amp;quot;</code>, 和<code>&amp;apos;</code>）的支持是有保证的。其他的可能完全被忽略或者直接输出。比如，如果<abbr>XHTML</abbr>文档包含如<code>&amp;nbsp;</code>或者<code>&amp;rdquo;</code>的实体，Safari会直接地输出。Opera反而选择忽略未知的实体，同时Mozila家族会认得这些实体并且就像HTML中<q cite="http://www.mozilla.org/docs/web-developer/faq.html#xhtmldiff">“如果文档引用公共的映射浏览器伪<abbr title="Document Type Definition">DTD</abbr>目录中的标识符并且没有单独声明的文档”</q>来处理。</font>
		</p>
		<p>
				<font face="Verdana" size="2">使用UTF-8字符编码是最受推荐的，让你（几乎）可以使用你需要键入文档的任意字符，不需要实体或者字符编号。如果你不能或不愿使用UTF-8，数字式的字符编号是可以支持和安全使用的。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">SGML式注释的内容可能会被忽略</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">SGML注释（<abbr>HTML</abbr>风格注释， <code>&lt;!-- 注释 --&gt;</code>）可能会（并且会）被浏览器当作注释，就算是在<code>script</code>或者<code>style</code>元素内部使用。</font>
		</p>
		<p>
				<font face="Verdana" size="2">在<abbr>HTML</abbr>中，普遍地把<code>script</code>和<code>style</code>的内容装入注释中，为的是在不认识<code>script</code>或<code>style</code>元素的浏览器中隐藏他们，并且在页面上把其内容生成平白文本。</font>
		</p>
		<p>
				<font face="Verdana" size="2">在<abbr>XHTML</abbr>中，这样做会引起浏览器忽略掉注释里的任何内容。</font>
		</p>
		<p>
				<font face="Verdana" size="2">在老的浏览器中隐藏<code>script</code>和<code>style</code>的习惯可以追溯到1990年代中期。我的经验是，有如此表现的浏览器是十分罕见的，所以你可以安全地忽略它们，并且停止在脚本和样式中装入SGML式注释，就算你使用的是HTML。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">脚本和样式元素的内容也被当作XML</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">样式和脚本元素是PCDATA（parsed character data，解析字符数据）块，不是CDATA（character data，字符数据）块。因此，在其内看起来像XML的任何东西都会被当作XML来解析，并且会引发错误除非是良构的。</font>
		</p>
		<p>
				<font face="Verdana" size="2">为了在<code>script</code>或<code>style</code>块中使用&lt;、&amp;或者--，你需要用</font>
				<a href="http://www.w3.org/TR/REC-xml/#sec-cdata-sect">
						<font face="Verdana" size="2">CDATA </font>
				</a>
				<font face="Verdana" size="2">：<br /><br /></font>
		</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 id="Codehighlighter1_31_49_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_49_Open_Text.style.display='none'; Codehighlighter1_31_49_Closed_Image.style.display='inline'; Codehighlighter1_31_49_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_31_49_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_49_Closed_Text.style.display='none'; Codehighlighter1_31_49_Open_Image.style.display='inline'; Codehighlighter1_31_49_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">script </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text/javascript"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span id="Codehighlighter1_31_49_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" />
				</span>
				<span id="Codehighlighter1_31_49_Open_Text">
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">[CDATA[<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />]]</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&gt;</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">script</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>
				<font face="Verdana" size="2">在CDATA里，你可以任何顺序的字符，它们不会被当作XML来解析（除了结束CDATA部分]]&gt;）。</font>
		</p>
		<p>
				<font face="Verdana" size="2">需要以<code>text/html</code>发送的文档中，CDATA部分的起始和结束标签需要注释掉，以便在不能处理CDATA部分的浏览器中隐藏：<br /></font>
		</p>
		<p>
				<font face="Verdana" size="2">
				</font>
		</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 id="Codehighlighter1_31_55_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_55_Open_Text.style.display='none'; Codehighlighter1_31_55_Closed_Image.style.display='inline'; Codehighlighter1_31_55_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_31_55_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_55_Closed_Text.style.display='none'; Codehighlighter1_31_55_Open_Image.style.display='inline'; Codehighlighter1_31_55_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">script </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text/javascript"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span id="Codehighlighter1_31_55_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" />
				</span>
				<span id="Codehighlighter1_31_55_Open_Text">
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"> &lt;![CDATA[</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
								<img src="http://www.blogjava.net/images/dot.gif" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"> ]]&gt;</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">script</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_89_119_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_119_Open_Text.style.display='none'; Codehighlighter1_89_119_Closed_Image.style.display='inline'; Codehighlighter1_89_119_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_89_119_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_89_119_Closed_Text.style.display='none'; Codehighlighter1_89_119_Open_Image.style.display='inline'; Codehighlighter1_89_119_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">style </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text/css"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span id="Codehighlighter1_89_119_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" />
				</span>
				<span id="Codehighlighter1_89_119_Open_Text">
						<span style="COLOR: #800000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img id="Codehighlighter1_90_104_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_104_Open_Text.style.display='none'; Codehighlighter1_90_104_Closed_Image.style.display='inline'; Codehighlighter1_90_104_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_90_104_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_90_104_Closed_Text.style.display='none'; Codehighlighter1_90_104_Open_Image.style.display='inline'; Codehighlighter1_90_104_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_90_104_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">/**/</span>
						<span id="Codehighlighter1_90_104_Open_Text">
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">/*</span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"> &lt;![CDATA[ </span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">*/</span>
						</span>
						<span style="COLOR: #800000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<img src="http://www.blogjava.net/images/dot.gif" />
								<br />
								<img id="Codehighlighter1_110_118_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_118_Open_Text.style.display='none'; Codehighlighter1_110_118_Closed_Image.style.display='inline'; Codehighlighter1_110_118_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_110_118_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_110_118_Closed_Text.style.display='none'; Codehighlighter1_110_118_Open_Image.style.display='inline'; Codehighlighter1_110_118_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_110_118_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">/**/</span>
						<span id="Codehighlighter1_110_118_Open_Text">
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">/*</span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"> ]]&gt; </span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">*/</span>
						</span>
						<span style="COLOR: #800000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">style</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>如果要确保很老的浏览器隐藏CDATA部分，需要使用更为复杂的方法，像在<cite>Ian Hickson</cite>的<a href="http://www.hixie.ch/advocacy/xhtml"><font face="Verdana" size="2">Sending <abbr>XHTML</abbr> as text/html Considered Harmful</font></a><font face="Verdana" size="2">中描述的那样：</font></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 id="Codehighlighter1_31_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_72_Open_Text.style.display='none'; Codehighlighter1_31_72_Closed_Image.style.display='inline'; Codehighlighter1_31_72_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_31_72_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_72_Closed_Text.style.display='none'; Codehighlighter1_31_72_Open_Image.style.display='inline'; Codehighlighter1_31_72_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">script </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text/javascript"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span id="Codehighlighter1_31_72_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" />
				</span>
				<span id="Codehighlighter1_31_72_Open_Text">
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;&lt;![CDATA[//&gt;&lt;!--</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
								<img src="http://www.blogjava.net/images/dot.gif" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;&lt;!]]&gt;</span>
						<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">script</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_106_149_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_149_Open_Text.style.display='none'; Codehighlighter1_106_149_Closed_Image.style.display='inline'; Codehighlighter1_106_149_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_106_149_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_106_149_Closed_Text.style.display='none'; Codehighlighter1_106_149_Open_Image.style.display='inline'; Codehighlighter1_106_149_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">style </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text/css"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span id="Codehighlighter1_106_149_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" />
				</span>
				<span id="Codehighlighter1_106_149_Open_Text">
						<span style="COLOR: #800000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img id="Codehighlighter1_111_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_111_133_Open_Text.style.display='none'; Codehighlighter1_111_133_Closed_Image.style.display='inline'; Codehighlighter1_111_133_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_111_133_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_133_Closed_Text.style.display='none'; Codehighlighter1_111_133_Open_Image.style.display='inline'; Codehighlighter1_111_133_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&lt;!--</span>
						<span id="Codehighlighter1_111_133_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">/**/</span>
						<span id="Codehighlighter1_111_133_Open_Text">
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">/*</span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;&lt;![CDATA[/*&gt;&lt;!--</span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">*/</span>
						</span>
						<span style="COLOR: #800000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<img src="http://www.blogjava.net/images/dot.gif" />
								<br />
								<img id="Codehighlighter1_139_145_Open_Image" onclick="this.style.display='none'; Codehighlighter1_139_145_Open_Text.style.display='none'; Codehighlighter1_139_145_Closed_Image.style.display='inline'; Codehighlighter1_139_145_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_139_145_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_139_145_Closed_Text.style.display='none'; Codehighlighter1_139_145_Open_Image.style.display='inline'; Codehighlighter1_139_145_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_139_145_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">/**/</span>
						<span id="Codehighlighter1_139_145_Open_Text">
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">/*</span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">]]&gt;</span>
								<span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">*/</span>
						</span>
						<span style="COLOR: #800000; BACKGROUND-COLOR: #f5f5f5">--&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">style</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>
				<font face="Verdana" size="2">一个更好的办法可能是在发送<code>text/html</code>的文档前使用content negotiation脚本来删除任何CDATA部分。</font>
		</p>
		<p>
				<font face="Verdana" size="2">当然，最聪明和安全的途径是把所有的CSS和JavaScript都移动到外部文件中，但不总是现实的做法。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">没有会自动补全的元素</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">在<abbr>HTML</abbr>中，假如表格的<code>tbody</code>元素漏写的话浏览器会自动补全，而<abbr>XHTML</abbr>不会。如果你没有清楚地添加tbody，它就不会出现。在编写CSS选择器和JavaScript的时候请铭记在心。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">用document.write编写的脚本不再工作</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">在<abbr>XHTML</abbr>中使用JavaScript，<code>document.write</code>不会工作。Ian Hickson在</font>
				<a href="http://ln.hixie.ch/?start=1091626816&amp;count=1">
						<font face="Verdana" size="2">Why document.write() doesn’t work in XML</font>
				</a>
				<font face="Verdana" size="2">解释了原因。你需要使用<code>document.createElementNS()</code>代替。关于更多可以在</font>
				<a href="http://www.experts-exchange.com/Web/Web_Languages/JavaScript/Q_20483232.html">
						<font face="Verdana" size="2">Experts Exchange中的论坛主题</font>
				</a>
				<font face="Verdana" size="2">中找到。</font>
		</p>
		<p>
				<font face="Verdana" size="2">这也是Google AdSense不在<abbr>XHTML</abbr>中工作的原因之一。那些希望以application/xhtml+xml伺服<abbr>XHTML</abbr>并且使用Google广告的人，这儿有一个解决办法：Simon Jessey的</font>
				<a href="http://keystonewebsites.com/articles/adsense.php">
						<font face="Verdana">
								<font size="2">Making AdSense work with <abbr>XHTML</abbr></font>
						</font>
				</a>
				<font face="Verdana" size="2">。尽管有点麻烦，但还是工作了（我在这里也使用了），同时被Google所认可。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">引入样式元素</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">在<abbr>XHTML</abbr>中，为了兼容定义CSS规则的XML方法，你应该使用XML样式表声明（访问 </font>
				<a href="http://www.w3.org/TR/xhtml1/#C_14">
						<abbr>
								<font face="Verdana" size="2">XHTML</font>
						</abbr>1.0, Second Edition: Referencing Style Elements when serving as XML</a>
				<font face="Verdana" size="2">的XML样式表声明和</font>
				<a href="http://www.w3.org/TR/xml-stylesheet/%22">
						<font face="Verdana" size="2">Associating Style Sheets with XML documents</font>
				</a>
				<font face="Verdana">
						<font size="2">的xml-stylesheet处理说明）。要载入外部CSS文件，我们需要使用<code>style</code>元素，同时应该使用XML样式表声明来引入样式元素。为此，使用id属性给<font face="Verdana"><code>style</code>元素一个分解的标识符，然后在XML样式表声明中引入该标识符：</font></font>
				</font>
				<font face="Verdana" size="2">
				</font>
		</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" />
				<span style="COLOR: #0000ff">&lt;?</span>
				<span style="COLOR: #ff00ff">xml-stylesheet href="stylesheet1.css" type="text/css"</span>
				<span style="COLOR: #0000ff">?&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;?</span>
				<span style="COLOR: #ff00ff">xml-stylesheet href="#stylesheet2"  type="text/css"</span>
				<span style="COLOR: #0000ff">?&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;!</span>
				<span style="COLOR: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">html </span>
				<span style="COLOR: #ff0000">xmlns</span>
				<span style="COLOR: #0000ff">="http://www.w3.org/1999/xhtml"</span>
				<span style="COLOR: #ff0000"> xml:lang</span>
				<span style="COLOR: #0000ff">="en"</span>
				<span style="COLOR: #ff0000"> lang</span>
				<span style="COLOR: #0000ff">="en"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">head</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">title</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">XML stylesheet declaration</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">title</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_382_409_Open_Image" onclick="this.style.display='none'; Codehighlighter1_382_409_Open_Text.style.display='none'; Codehighlighter1_382_409_Closed_Image.style.display='inline'; Codehighlighter1_382_409_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_382_409_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_382_409_Closed_Text.style.display='none'; Codehighlighter1_382_409_Open_Image.style.display='inline'; Codehighlighter1_382_409_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">style </span>
				<span style="COLOR: #ff0000">type</span>
				<span style="COLOR: #0000ff">="text/css"</span>
				<span style="COLOR: #ff0000"> id</span>
				<span style="COLOR: #0000ff">="stylesheet2"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span id="Codehighlighter1_382_409_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" />
				</span>
				<span id="Codehighlighter1_382_409_Open_Text">
						<span style="COLOR: #800000; BACKGROUND-COLOR: #f5f5f5">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />@import "stylesheet2.css";<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">style</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">head</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>
				<font face="Verdana" size="2">我不知道在实际中究竟有多必要，并且不使用XML样式表声明的话会有什么问题。或许有人会指点我的。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">CSS的应用规则有些不一样</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">CSS应用到<code>body</code>的性质（property）并不应用到<abbr>XHTML</abbr>的整个文档。最值得注意的是应用背景颜色或者图片。在<abbr>HTML</abbr>中，应用到<code>body</code>元素的背景将会覆盖整个页面。在<abbr>XHTML</abbr>中，你必须同时样式化html。在Juicy Studio的</font>
				<a href="http://juicystudio.com/mimetest/body.asp">
						<font face="Verdana" size="2">CSS body Element Test</font>
				</a>
				<font face="Verdana" size="2">中有这个行为的演示。</font>
		</p>
		<p>
				<font face="Verdana" size="2">在<abbr>XHTML</abbr>中作为CSS规则的元素和属性名字是大小写敏感的（而且必须是小写的）。避免问题最简单的办法是，不管在HTML，<abbr>XHTML</abbr>还是CSS中所有东西都保持小写。</font>
		</p>
		<p>
				<strong>
						<font face="Verdana" size="2">有挑战，但不是不可能</font>
				</strong>
		</p>
		<p>
				<font face="Verdana" size="2">当我开始为兼容的浏览器伺服<abbr>XHTML</abbr>为<code>application/xhtml+xml</code>时，在作出决定前假如我能读到想这篇一样的文章，或许我的头痛可以减轻不少。我甚至考虑使用<code>HTML 4.01 Strict</code>。虽然如此，我还是从经验中学到不少，而学习总是一个好东西。</font>
		</p>
		<p>
				<font face="Verdana" size="2">正确地使用真正的<abbr>XHTML</abbr>，十分希望这篇文章能为你提供一些更有用的信息，并且可以为是否需要走这条路提供更多有根据的决定。</font>
		</p>
		<p>
				<abbr>
						<font face="Verdana" size="2">HTML</font>
				</abbr>和<abbr>XHTML</abbr>可能比我在这里提到的还有更多地不同，所以在这里把你在使用<code>application/xhtml+xml</code>的<abbr>XHTML</abbr>时遇到的问题提出来，如果你知道任何的错误或者忽略，务必告诉我。</p>
<img src ="http://www.blogjava.net/flyingis/aggbug/83430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-11-25 12:04 <a href="http://www.blogjava.net/flyingis/articles/83430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中文处理学习笔记--Hello Unicode</title><link>http://www.blogjava.net/flyingis/articles/32461.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 25 Feb 2006 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/articles/32461.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/32461.html</wfw:comment><comments>http://www.blogjava.net/flyingis/articles/32461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/32461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/32461.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 版权声明：可以任意转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明http://www.chedong.com/tech/hello_unicode.html		关键词：linux java mutlibyte encoding locale i18n i10n chinese  ISO-8859-1 GB2312 BIG5 GBK UNICODE		内容摘要：		不知...&nbsp;&nbsp;<a href='http://www.blogjava.net/flyingis/articles/32461.html'>阅读全文</a><img src ="http://www.blogjava.net/flyingis/aggbug/32461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-02-25 23:52 <a href="http://www.blogjava.net/flyingis/articles/32461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The differences between Linux distributions</title><link>http://www.blogjava.net/flyingis/articles/27575.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Wed, 11 Jan 2006 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/articles/27575.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/27575.html</wfw:comment><comments>http://www.blogjava.net/flyingis/articles/27575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/27575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/27575.html</trackback:ping><description><![CDATA[<P>A lot of people have heard of GNU/Linux (more commonly referred to as just "Linux") and are having trouble finding out what the differences are between different versions -- or distributions -- that are available. This article will show how they differ, and how GNU/Linux differs from similar operating systems.</P>
<TABLE style="FLOAT: right; MARGIN-RIGHT: 0px">
<TBODY>
<TR>
<TD>
<SCRIPT language=JavaScript src="http://www.thejemreport.com/phpads/adx.js" type=text/javascript></SCRIPT>

<SCRIPT language=JavaScript type=text/javascript>
<!--
   if (!document.phpAds_used) document.phpAds_used = ',';
   phpAds_random = new String (Math.random()); phpAds_random = phpAds_random.substring(2,11);
   
   document.write ("<" + "script language='JavaScript' type='text/javascript' src='");
   document.write ("http://www.thejemreport.com/phpads/adjs.php?n=" + phpAds_random);
   document.write ("&amp;what=zone:8&amp;target=_blank");
   document.write ("&amp;exclude=" + document.phpAds_used);
   if (document.referrer)
      document.write ("&amp;referer=" + escape(document.referrer));
   document.write ("'><" + "/script>");
//-->
</SCRIPT>

<SCRIPT language=JavaScript src="http://www.thejemreport.com/phpads/adjs.php?n=447228446&amp;what=zone:8&amp;target=_blank&amp;exclude=," type=text/javascript></SCRIPT>

<SCRIPT type=text/javascript><!--
google_ad_client = "pub-9549240138312262";
google_ad_width = 300;
google_ad_height = 250;
google_ad_format = "300x250_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = "DDB7BA";
google_color_bg = "FFF5F6";
google_color_link = "0000CC";
google_color_url = "008000";
google_color_text = "6F6F6F";
//--></SCRIPT>

<SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</SCRIPT>

<DIV id=beacon_6 style="LEFT: 0px; VISIBILITY: hidden; POSITION: absolute; TOP: 0px"><IMG style="WIDTH: 0px; HEIGHT: 0px" height=0 alt="" src="http://www.thejemreport.com/phpads/adlog.php?bannerid=6&amp;clientid=6&amp;zoneid=8&amp;source=&amp;block=0&amp;capping=0&amp;cb=c98740aae7bc991943eb9856b53e07e2" width=0></DIV><NOSCRIPT><a href='http://www.thejemreport.com/phpads/adclick.php?n=a94f9b5c' target='_blank'><img src='http://www.thejemreport.com/phpads/adview.php?what=zone:8&amp;n=a94f9b5c' border='0' alt=''></a></NOSCRIPT></TD></TR></TBODY></TABLE>
<H1>What Is GNU/Linux?</H1>
<P>GNU/Linux is a modular operating system that looks and acts like a more intelligently programmed, up-to-date Unix. The term itself -- GNU/Linux -- is extremely vague and doesn't exist in the literal sense. You don't go to the store and buy GNU/Linux; instead you buy a software distribution (or <EM>distro</EM> for short) that uses GNU/Linux as its basis. So while you can't buy "Linux" at the store, you <EM>can</EM> buy SUSE Linux or Linspire.</P>
<P>Distributions can fundamentally differ in several ways:</P>
<UL>
<LI>Base operating system 
<LI>Software management and updating 
<LI>Hardware management 
<LI>Desktop environment and theme 
<LI>Proprietary extras </LI></UL>
<P>The sections below will cover each of these topics in depth. If there is one particular area that you are confused about, feel free to skip down to the appropriate section. The next topic will cover how GNU/Linux differs from Unix and other Unix-like operating systems.</P>
<H1>BSD, Unix, OS X, Linux?</H1>
<P>There are many Unix-like operating systems and derivatives. Which ones are which?</P>
<DIV style="TEXT-ALIGN: center">
<TABLE style="BORDER-RIGHT: thin solid; BORDER-TOP: thin solid; MARGIN-LEFT: auto; BORDER-LEFT: thin solid; WIDTH: 90%; MARGIN-RIGHT: auto; BORDER-BOTTOM: thin solid">
<TBODY>
<TR>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; FONT-STYLE: italic; BORDER-COLLAPSE: collapse">Category</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; FONT-STYLE: italic; BORDER-COLLAPSE: collapse">OSes</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; FONT-STYLE: italic; BORDER-COLLAPSE: collapse">Origin of code?</TD></TR>
<TR>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">GNU</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">GNU/Linux, GNU/HURD, GNU/Mach, GNU/BSD</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Free Software Foundation; kernels developed separately except HURD. The Linux kernel was originally written by Linus Torvalds, and is currently maintained by him.</TD></TR>
<TR>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">BSD</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">FreeBSD, OpenBSD, NetBSD, DesktopBSD, BSD/OS</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">UC Berkeley, originally; each project has been developed separately since the early-mid 1990s, however.</TD></TR>
<TR>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Unix</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Solaris, AIX, IRIX, HP/UX, Tru64, UnixWare, OpenServer</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Bell Labs (AT&amp;T) developed the original Unix code. UNIX is now a trademarked operating system certification program instead of an operating system, and no longer requires that a compliant OS contain AT&amp;T Unix source code to achieve brand certification. Despite that, all of the extant Unix derivatives are compliant with at least one published UNIX standard.</TD></TR>
<TR>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Darwin</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Darwin, OS X</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Based on the NeXTSTEP operating system, which used the Mach kernel and some FreeBSD programs and networking code. OS X is developed from Darwin.</TD></TR>
<TR>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Minix</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Minix</TD>
<TD style="BORDER-RIGHT: thin dotted; PADDING-RIGHT: 0px; BORDER-TOP: thin dotted; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: thin dotted; PADDING-TOP: 0px; BORDER-BOTTOM: thin dotted; BORDER-COLLAPSE: collapse">Originally written by Andrew Tanenbaum, but now mostly developed by a handful of others</TD></TR></TBODY></TABLE></DIV>
<P>GNU/Linux is only one possible combination of the GNU operating system with a separate kernel. GNU's own kernel is HURD, but it's been in development for a long time and is nowhere near ready for production. GNU/BSD and GNU/Mach exist, but more for experimental purposes than anything else. So in effect, GNU/Linux is the only GNU-based operating system that matters. Theoretically, you could use the operating system components from BSD and eliminate GNU entirely (or almost entirely) from GNU/Linux, but that would -- again -- be purely an academic pursuit.</P>
<P>Of the above-listed operating systems, only GNU/Linux has a variety of software distributions. The others are software distributions in themselves. The one exception is Solaris, which is based on code from the <A href="http://www.opensolaris.org/">OpenSolaris project</A>. There is at least one other OpenSolaris-based distribution aside from Solaris, and others are probably in development.</P>
<P>Most of these operating systems are similar in superficial ways. All are command line-based at heart, even if many of them default to graphical interfaces. Most of them share the majority of their terminal commands -- or have commands that have largely similar functionality and syntax -- so if you know one system very well, it is not difficult to learn a different one. GNU's userland utilities were improved replacements of Unix commands; BSD was originally developed from Unix source code, so its userland utilities started out as clones of Unix commands and have evolved from there. Some of these OSes can use the same software programs if properly configured. Some are restricted to specific hardware architectures, while others are extraordinarily versatile in terms of what computers they can operate on.</P>
<P>The amount of code- and program-sharing among all of these operating systems varies. All of them are guaranteed to have either BSD code integrated somewhere, or at least one GNU utility (usually the GNU Compiler Collection, the BASH terminal program, or the Emacs text editor, among many others) included by default.</P>
<H1>Base operating system differences</H1>
<P>Among GNU/Linux distributions, there can be many variances in the base operating system (kernel and userland utilities). Some have unique methods of managing startup scripts; others mimic BSD or Unix. You can know everything there is to know about creating and modifying init scripts on Red Hat Enterprise Linux, then be totally lost when trying to implement the same changes on Gentoo Linux.</P>
<P>Almost all distros make their own small, custom changes to the Linux kernel in order to accommodate other changes or additions that the distribution maintainers want to make. This makes each distro's kernel unique, and probably incompatible with other distributions. Commercial desktop GNU/Linux distros usually have extensively hacked kernels that support proprietary programs like Win4Lin, VMware, and proprietary hardware drivers.</P>
<P>GNU/Linux distributions are generally <EM>binary compatible</EM> with each other. That means that a program that will work on SUSE Linux will also work on Xandros and Linspire and any other distribution of the same generation and hardware architecture. Like all other operating systems, programs that are compiled for one architecture will not work on others. The only exception is 32-bit x86 binaries, which will work with most 64-bit AMD64 and Intel EM64T computers.</P>
<H1>Software management and updating</H1>
<P>Chances are, if you've selected the right GNU/Linux distribution for your needs, you won't have to add any extra software to it. If you do, most distros have software repositories that contain thousands of extra software packages that have been certified to work with your configuration. All you have to do is figure out which programs you want, select them from a list, and everything is installed for you. It's much like using Windows Update.</P>
<P>Also like Windows Update, all major GNU/Linux distributions come equipped with a software update framework. Unlike Windows Update, however, GNU/Linux updaters will find patches and bug fixes for <EM>all</EM> of the software on your computer -- not just the basic operating system. Each distribution has its own specialized update tools, but they are all generally easy to use.</P>
<P>On a more basic level, GNU/Linux distributions install software in one of two ways: by compiling from source code, or -- more commonly -- by installing precompiled binary packages.</P>
<P>Source-based distributions like Gentoo and Arch still have a software management framework like the big fancy commercial distros, but you have extra options. You can add in compiler flags to make programs a little faster or use less memory, or you can build applications with hooks to other programs so that your software is more interoperable. Binary distributions make guesses as to what your needs will be, and try to cover all of the bases by compiling everything in. In the real world, you're not going to notice much of a difference by adding compiler optimizations and other options, but if you like tinkering with your computer, you'll enjoy the experience.</P>
<P>Source-based distros will take a lot longer to manage because it takes time to compile large programs. You can use binary packages to get started, but updates are applied by compiling from source code. A binary installation of the KDE desktop environment takes only slightly longer than the time consumed downloading the binaries from the Internet, but compiling the full KDE system from source can literally take days. The same can be said of such behemoths as OpenOffice.org, GNOME, and Mozilla.</P>
<P>Binary distributions almost exclusively use two package formats for programs: RPM (a recursive acronym for RPM Package Manager), and DEB (short for Debian, a GNU/Linux distribution that is commonly used as a basis for others). In the old days, you may have had to go searching for RPMs or DEBs of programs that you wanted. In this day and age, however, you use your package manager to find and retrieve them for you. In the event that you must install one of these packages by hand, there are graphical alternatives to the standard command line tools for installing them. There are even tools available to use DEB packages on RPM-based distros, and vice-versa. Usually programs are packaged in both formats, though.</P>
<P>Red Hat (and Fedora Core), SUSE, and Mandriva are three well-known distributions that use RPM packages. Linspire, Xandros, Debian, Ubuntu, and Mepis are some of the most popular DEB-based distributions. Both package formats are heavily entrenched in these and other distributions; neither seeks to replace the other.</P>
<P>Occasionally you might see someone on a message forum or mailing list complaining about RPMs and "dependency hell." This is because individual packages usually depend on other packages, and that means tracking down several RPMs to install one program, then doing some command line kung-fu to install them in the right order. Again, this is the old way of doing things -- nowadays you let your package manager do the work for you.</P>
<P>Popular package managers include:</P>
<UL>
<LI><A href="http://linux.duke.edu/projects/yum/">YUM</A> 
<LI>APT 
<LI><A href="http://labix.org/smart">Smart</A> 
<LI><A href="http://www.nongnu.org/synaptic/">Synaptic</A> </LI></UL>
<H1>Hardware management</H1>
<P>Commercial GNU/Linux distributions include software that automatically detects and installs the proper drivers for all of your computer hardware and peripherals. Usually it works perfectly without any user intervention necessary. Sometimes it encounters unsupported hardware, or hardware that requires a newer kernel or driver. Some distros share the same autodetection and hardware management code, some have a totally unique hardware management framework.</P>
<P>Non-commercial distros are usually good at detecting hardware, but never contain proprietary drivers for ATI and Nvidia video cards, some kinds of wireless network chips, RAID cards, and video capture cards. Drivers for these devices require licensing and distribution agreements that non-commercial distribution developers are generally unwilling to negotiate, agree to, or pay for. This means that if you want to take full advantage of your 3D graphics card, you will have to download and install a proprietary video driver. A simple Google search will usually yield installation instructions. Again, this is best done by adding software repository sources to your package manager instead of installing them by hand.</P>
<H1>Desktop environments and themes</H1>
<P>The two primary desktop environments in the world of GNU/Linux are GNOME and KDE. Most distros support both, and usually default to one or the other. There are also window managers, which don't have the large number of integrated programs, but are usually considered to be more responsive and efficient on slower computers. Which one you should use is entirely a matter of preference.</P>
<P>Aside from desktop environment, each distribution has its own special color, icon, login, desktop, and menu theme. You can change the theme -- there are several dozen good themes available, and more coming out every week -- so don't let the default look and feel of the desktop discourage you. You can make KDE look almost exactly like Windows XP, and you can make GNOME look almost exactly like Apple OS X. Window managers are even more customizable, but often require you to edit configuration files by hand.</P>
<H1>Proprietary extras</H1>
<P>In addition to the proprietary hardware drivers mentioned previously, there are also proprietary software extras that are an important complement to the desktop computing experience. Most people will, at one time or another, need to access a PDF, Java applet, Flash animation, or video file on the World Wide Web. And when they need to see those files, they need browser plugins to do it. Unfortunately, all of the most functional plugins for these technologies are not free-as-in-rights, and won't be included with the majority of GNU/Linux distributions. If you want them, you have to either choose a commercial distro (there are some recommendations in a section below), or add them by hand. As I've said before, adding them by hand is not necessarily difficult, but it will take some reading and research to get everything working perfectly. If you are not prepared to do this, do not choose a GNU/Linux distro that does not include these extras.</P>
<H1>Recommendations</H1>
<P>If you don't know what you're doing, don't choose distributions that require a lot of legwork to configure basic services or install extra software. If you are new to GNU/Linux and want a great desktop experience, I recommend trying these distros (listed in no specific order):</P>
<UL>
<LI><A href="http://www.linspire.com/">Linspire</A> 
<LI><A href="http://www.xandros.com/">Xandros</A> 
<LI><A href="http://www.novell.com/products/suselinux/">SUSE Linux</A> 
<LI><A href="http://www.mandriva.com/">Mandriva</A> </LI></UL>
<P>All of these distros will cost you something -- usually under US $100. A lot of experienced GNU/Linux enthusiasts will recommend non-commercial distributions like Ubuntu, Fedora Core, or Debian. These are good distros and are available free of charge, but require that you add proprietary video drivers and Web browser plugins by hand, and don't have the same kind of automatic hardware management that the four distros I listed above have. That means that you could end up rather frustrated by your GNU/Linux experience. Also stay away from the open source edition of SUSE Linux -- that is also missing many of the proprietary extras that you're used to in Windows or OS X (the commercial version of SUSE does have plugins for Java, Flash, and PDF). It's not tough to add them if you <A href="http://softwareinreview.com/cms/content/view/2/1/">follow this guide</A>, but many people are not prepared to get that technical with their software.</P>
<P>If you're looking for a distro that is more suited to server use, try these:</P>
<UL>
<LI><A href="http://www.redhat.com/en_us/USA/rhel/">Red Hat Enterprise Linux</A> 
<LI><A href="http://www.novell.com/products/linuxenterpriseserver/">SUSE Linux Enterprise Server</A> 
<LI><A href="http://wwwnew.mandriva.com/en/enterprise/products/corporate_server">Mandriva Corporate Server</A> </LI></UL>
<P>Again, people will argue that other distros or Unix-like OSes are better, but the above-mentioned distributions are easy to install, configure, and manage, and come with extensive documentation and commercial support. You will have a much easier time with them, and you're better off going with one of these if you're new to GNU/Linux or Unix-like operating systems in general. You can make virtually any GNU/Linux distribution into a server of any kind; it's just a matter of how much work you have to do to prepare and maintain it. If you don't want to do a lot of work, choose one of the above distros.</P>
<P>Non-commercial desktop distributions of note include:</P>
<UL>
<LI><A href="http://www.ubuntu.org/">Ubuntu</A> 
<LI><A href="http://www.opensuse.org/">SUSE Linux OSS</A> 
<LI><A href="http://fedora.redhat.com/">Fedora Core</A> </LI></UL>
<P>If you would prefer more of a challenge, as either a server or a desktop OS, try these distros:</P>
<UL>
<LI><A href="http://www.gentoo.org/">Gentoo</A> 
<LI><A href="http://www.debian.org/">Debian</A> 
<LI><A href="http://www.slackware.org/">Slackware</A> 
<LI><A href="http://www.archlinux.org/">Arch</A> </LI></UL>
<P>Lastly, if you would like to see what a GNU/Linux desktop can look like, you can download <A href="http://www.knoppix.com/">Knoppix</A>, a distro that runs entirely from a CD. You write the ISO file to a blank CD-R disc, then restart your computer with the disc in the CD drive. You'll run a whole distribution right from the CD. When you're done playing around, just select the Shutdown menu option, remove the CD from the drive, and restart -- nothing will be written to your hard drive.</P>
<P><STRONG>Copyright 2006 Jem Matzan.<BR>link: <A href="http://www.softwareinreview.com/cms/content/view/26/1/"><FONT color=#0000ff>http://www.softwareinreview.com/cms/content/view/26/1/</FONT></A></STRONG></P><img src ="http://www.blogjava.net/flyingis/aggbug/27575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2006-01-11 13:32 <a href="http://www.blogjava.net/flyingis/articles/27575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目经理面试指南[转载]</title><link>http://www.blogjava.net/flyingis/articles/24062.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Thu, 15 Dec 2005 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/articles/24062.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/24062.html</wfw:comment><comments>http://www.blogjava.net/flyingis/articles/24062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/24062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/24062.html</trackback:ping><description><![CDATA[
		<font size="2">
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
						<b>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">    准备面试的方法<br /></span>
						</b>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　　书、杂志、组织和研讨会 <span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　　本文的参考目录中列出了许多能得到有效的管理实践信息的地方。去寻找管理方面的书籍，包括技术管理和商业管理两个方面。阅读管理大师，例如：<span lang="EN-US">Peter Drucker</span>，<span lang="EN-US">C. A. Gallagher</span>和<span lang="EN-US">A. Maslow</span>写的书和文章。他们提供了在任何领域都使用的管理知识。信息管理大师例如：<span lang="EN-US">Tom DeMarco, M. Page-Jones, Ed Yourdon, L. L. Constantine</span>等等提供了许多条理清楚的、经过实践检验的方法。<span lang="EN-US"><br /><br /></span>　　如果你要同用户一起工作，要阅读一本有关领域的专业书籍。了解业务比了解技术环境更重要。事实上，让用户参加面试过程越来越流行。要准备得更充分，可以买一本《哈佛商业评论》（<span lang="EN-US">Harvard Business Review</span>）这是一本很好的杂志，适用于商业读者同样也适用于<span lang="EN-US">IT</span>管理。许多<span lang="EN-US">IT</span>杂志例如《<span lang="EN-US">CIO</span>杂志》及在参考书目中列出的书目中都有有关项目管理和人员管理方面的文章。这些杂志中还包括概括或详细的技术性文章。<span lang="EN-US"><br /><br /></span>　　可以和美国管理协会（<span lang="EN-US">AMA</span>）和其他商业组织取得联系，获取管理信息。值得一提的是，卡奈基梅隆大学的软件工程研究所（<span lang="EN-US">SEI</span>）在<span lang="EN-US">90</span>年代提出的管理软件过程，最新标准版本为<span lang="EN-US">SEI9000</span>。<span lang="EN-US"><br /><br /></span>　　许多技术研讨会，例如数字咨询和技术转换研究所（<span lang="EN-US">Digital Consulting and Technology Transfer Institute</span>）有许多不同领域的项目管理和技术研讨会。另一种途径是通过你所在的组织。他们也许会提供有关授权、谈判和倾听技巧等的课程，所有这些都有助于你准备项目管理。<span lang="EN-US"><br /><br /></span><b>　　你应该了解的软件 </b><span lang="EN-US"><br /><br /></span>　　掌握一种项目管理工具。例如微软的<span lang="EN-US">Project</span>和<span lang="EN-US">Applied Business Technology/Project Workbench</span>。所有这些工具都有许多有效的项目管理方法和术语字典。<span lang="EN-US"><br /><br /></span>　　除了上述提到的工具外，还有一个越来越流行的工具可以针对不同技术环境中的项目在计划编制、费用估算和管理方法上提供帮助。这个工具就是<span lang="EN-US">LBMS/Process Engineer</span>，具有<span lang="EN-US">CASE</span>界面的工具。<span lang="EN-US"><br /><br /></span>　　如果你使用过此类工具，把这些内容列在你的简历中。当然，不仅要掌握工具，你还必须具有坚实的基础知识和项目管理方法。<span lang="EN-US"><br /></span>　　一个项目经理必须足智多谋。通过<span lang="EN-US">email</span>进行通信已经取代了电话和邮寄备忘录。许多公司有自己的系统，还有许多公司使用<span lang="EN-US">Lotus Notes</span>。无论是用何种产品，必须具有如下性能： <span lang="EN-US"><o:p></o:p></span></span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" align="left">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">　　<span lang="EN-US">· </span>能够与处于不同地理位置的人取得联系 <span lang="EN-US"><br /></span>　　<span lang="EN-US">· </span>能够有效地通知团队（包括供应商）范围，进度的变更 <span lang="EN-US"><br /></span>　　<span lang="EN-US">· </span>能很快地解决小问题<span lang="EN-US"><br /><br /></span>　　要记住人们工作方式的差别，性格内向的人更愿意通过<span lang="EN-US">email</span>沟通。这样他们可以有时间思考问题的答案而不是在会议上立刻做出答案。<span lang="EN-US"><br /></span>　　作为一个项目经理，你可能会作报告（<span lang="EN-US">report</span>）和介绍<span lang="EN-US">(presentation)</span>。因此，需要掌握字处理软件和图形软件。这些软件在市场上都可以买到。在你的简历上列出你会使用的此类软件。<span lang="EN-US"><br /><br /></span><b>　　寻找思想 </b><span lang="EN-US"><br /></span>　　任何行业都有好的项目经理和差的项目经理。你可以从两种项目经理身上得到启示（什么是应该做的而什么是应该避免的）。如有可能，问一些优秀的项目经理他们是如何做的。如果你对你的职业发展道路还不太清楚，你可以拿一篇刚刚读过的有关文章，问问这些项目经理对此文的观点。<span lang="EN-US"><br /><br /></span>　　一个成功的项目经理的标志有拥有一支气氛融洽的积极的团队，上层领导的信任和用户的尊重。一致的行动是另一个标志，它是衡量领导能力的基础。优秀的项目经理应该了解每个雇员的长处和短处。他们认为失败并不是缺点，而是一次学习机会。<span lang="EN-US"><br /><br /></span>　　项目经理必须建立一套专业标准。但按照一套完美的例子来进行管理却是一个失败的项目经理。这虽然说明他们的多才多艺，但更体现了他们在授权和沟通方面的能力不足。使原来想积极工作的员工变得消极的做法可以毁了项目经理。你在技术方面的能力应该用于指导和培训员工。如果你参与编程或设计，你不是在开发你的团队，也不是在做项目经理。<span lang="EN-US"><br /><br /></span><b>　　项目计划技术 </b><span lang="EN-US"><br /><br /></span>　　以下是在面试中通常会提到的有关项目计划编制的术语和图表。大多项目计划编制工具都会使用到一些或全部术语和功能。你应该复习一下有用的一个或多个项目管理工具，这有助于你进一步熟悉常用的技术和功能。<span lang="EN-US"><br /><br /></span>　　图表类型：<span lang="EN-US"><br /><br /></span>　　甘特图：用图形，特别是条形图，描述项目进度的图表。每一个条形符号代表不同的意义。例如：关键任务的条形符号及<span lang="EN-US">/</span>或颜色可能与非关键任务的不同。概要任务（活动或阶段）的符号可能于其他任务不同。<span lang="EN-US"><br /><br /></span>　　<span lang="EN-US">Pert</span>图：用流程图来表示所有任务的现行依赖关系。<span lang="EN-US">PERT</span>的意思是计划评价与审查技术，是一种网络图。<span lang="EN-US"><br /><br /></span>　　任务列表：文本<span lang="EN-US">/</span>纵向地列出项目计划。通常至少应包括以下栏目：任务编号，任务名称，开始日期，结束日期，持续时间和工作效率。<span lang="EN-US"><br /><br /></span>　　工作分解结构：项目任务和<span lang="EN-US">/</span>或活动的结构图。<span lang="EN-US"><br /><br /></span>　　关键路径：是贯穿整个项目的一条路径，表明在限定的时间成功完成项目涉及的各任务间的依赖关系。调整关键路径上任务的时间进度将会影响整个项目的交付时间。关键路径方法（<span lang="EN-US">CRM</span>）图是一种网络图，用于项目的进度控制和协调项目的活动和事件。<span lang="EN-US"><br /><br /></span>　　可交付成果：证明一个或多个任务完成的有形事物。例如：逻辑数据模型。<span lang="EN-US"><br /><br /></span>　　依赖关系：任务间的联系会影响一个或多个任务的开始时间。例如：在没有弄清需求前，不能开始编程。<span lang="EN-US"><br /><br /></span>　　<span lang="EN-US">JAD/</span>简化方法：联合应用程序设计<span lang="EN-US">(</span>简化方法是<span lang="EN-US">90</span>年代的术语<span lang="EN-US">)</span>。一套面向结果的<span lang="EN-US">,</span>大脑风暴式的<span lang="EN-US">,</span>有一个共同的商业目的信息集合<span lang="EN-US">/</span>分享会议。该方法是<span lang="EN-US">IBM</span>公司在<span lang="EN-US">1970</span>年开发的，由固定的，结构化的过程组成，并在一个有经验的实施者的领导下进行。简化方法去掉了一些结构<span lang="EN-US">,</span>然而<span lang="EN-US">,</span>仍要求所有各方都必须参加所有的会议和一个有建模技术的记录员作记录。参加者们包括项目团队<span lang="EN-US">,</span>管理<span lang="EN-US">(</span>与用户<span lang="EN-US">)</span>和行政官员。为会议的成功，每个人必须理解和同意目的并且尽快解决他们的任务。<span lang="EN-US"><br /><br /></span>　　延迟：是任务的结束时间和与其相关的任务的开始时间之间的延迟时间。这允许任务结束时间和开始时间的重叠和拉长。<span lang="EN-US"><br /><br /></span>　　方法论：一种明确的、有组织的、可重复的、结构化的方法<span lang="EN-US">/</span>技术 ，以完成一个通用的目的。这些技术或指南定义步骤，任务，角色，目的和可交付成果，这些是任何系统的成功的实现所必须的。<span lang="EN-US"><br /><br /></span>　　衡量标准：一个一致并且可重复的测量一个项目的大小和复杂性的方法。标准准备在整个项目生命期中使用许多方法中的一个。今天公司使用的流行方法是：<span lang="EN-US"><br /></span>　　<span lang="EN-US">a) </span>功能点（<span lang="EN-US">Allan Abrecht</span>）<span lang="EN-US"><br /></span>　　<span lang="EN-US">b) </span>重要事件<span lang="EN-US"> (Tom DeMarco) <br /></span>　　<span lang="EN-US">c) </span>加权平均<span lang="EN-US"><br /></span>　　<span lang="EN-US">d) </span>代码行<span lang="EN-US"><br /><br /></span>　　里程碑：在项目生命期的一个重要的事件的结束。通常一个里程碑是在关键的路径上的一项活动。它不必是一个有形的可交付产品例如一个逻辑数据模型，但可以是用户对工作成果的肯定。<span lang="EN-US"><br /><br /></span>　　阶段<span lang="EN-US">/</span>活动<span lang="EN-US">/</span>摘要标题：概要级的概念。不是所有的项目管理工具都强调特定的阶段和摘要一级的格式，然而许多标准的开发方法用这些术语进行工作分解。<span lang="EN-US"><br /><br /></span>　　<span lang="EN-US">RAD</span>：快速的应用开发<span lang="EN-US">(</span>如果不正确地使用会有破坏作用<span lang="EN-US">)</span>。通过应用程序生成器，建模和快速原型工具的使用加快开发工作的一条途径。最大的改进是在整个开发生命周期中加入快速原型。这在编码前了解清楚用户需求提供优秀的工具。<span lang="EN-US"><br /><br /></span>　　资源限制：一个基于可得到的资源的数量，每个资源的技巧的水平，资源工作时间表而开发的计划和时间表。<span lang="EN-US"><br /><br /></span>　　范围变更：对原先设计要求的功能增加而没有对人员，时间或费用的影响进行评估。范围变更可能是一个商业用户或一个热心的程序员提出的。两者影响系统的交付并且不能被估计，分析，或记录。<span lang="EN-US"><br /><br /></span>　　面试中的表达的要点<span lang="EN-US">(</span>就算问题没被问<span lang="EN-US">) <br /><br /></span><b>　　如果你没有管理经验 </b><span lang="EN-US"><br /><br /></span>　　对于那些从未正式管理过一个项目的，可能是非正式地管理过的人。在那些情况中，当强调他们的技术背景优势的同时需要明确说明他们没认识到他们已掌握的那些技巧。你可以提及你是怎么不得不在没有授权的情况下领导一个大型的开发团队进行工作的。需要强调的是没有一个稳固的技术的基础<span lang="EN-US">,</span>你的工程任务和估计的决定可能被过分简单化。当你是项目的领导人，你需要提供技术的连贯避免团队超负荷工作。<span lang="EN-US"><br /><br /></span>　　如果你的技术技巧在未来的技术的环境中是落伍或不同的<span lang="EN-US"><br /><br /></span>　　你不需要理解技术环境的内部是如何工作的，但是你应该理解一般的概念和特征决定环境的能力和弱点。许多项目管理技巧是超出技术范围的。因此<span lang="EN-US">,</span>如果你的技术技巧是落伍的，你仍然能强调你在技术上能负独立责任。提及你管理的应用类型和及其商业作用。提及团队是如何有效地完成目标的。强调你的管理哲学。提到上级，与你地位同等的人，你的用户和部下是如何评价你的管理能力的，记住提起任何你掌握的商务领域知识。在面试时应该将你对你的技能落后的恐惧抛在一旁。一旦你拥有这个工作，你将能向公司内的专家询问。在所有组织中都有各方面专家的非正式的机构。你可以到处打听一下，把他们找出来。<span lang="EN-US"><br /><br /></span><b>　　问面试官的问题： </b><span lang="EN-US"><br /><br /></span>　　即使你通过面试，得到了这个职位，你还需要信息进行估价，这时是你的好机会。如果这将是项目经理的第一个工作任务，这尤其是关键。你需要明白你的工作环境。因此，你可以问下列问题：<span lang="EN-US"><br /><br /></span>　　<span lang="EN-US">1. </span>公司优先权是什么？<span lang="EN-US"><br /></span>　　<span lang="EN-US">2. </span>本项目的执行资助者是谁？<span lang="EN-US"><br /></span>　　<span lang="EN-US">3. </span>公司使用的开发原理体系是什么？<span lang="EN-US"><br /></span>　　<span lang="EN-US">4. </span>本项目最后期限是什么？<span lang="EN-US"><br /></span>　　<span lang="EN-US">5. </span>有量度项目成功的方法吗？<span lang="EN-US"><br /></span>　　<span lang="EN-US">6. </span>你的新经理将怎样保持项目信息灵通？<span lang="EN-US"><br /></span>　　<span lang="EN-US">7. </span>你的新经理管理哲学和风格是什么？<span lang="EN-US"><br /></span>　　<span lang="EN-US">8. </span>项目上的人们的技能水平是什么？<span lang="EN-US"><br /></span>　　<span lang="EN-US">9. </span>你将管理的项目的范围被充分地定义吗？<span lang="EN-US"><br /></span>　　<span lang="EN-US">10. </span>技术环境已经选好了吗？<span lang="EN-US"><br /><br /></span>　　以下是典型的项目管理面试中通常会问到的问题（期望的回答）：<span lang="EN-US"><br /></span>　　很多的问题的答案是主观的，面试官想知道你的观点是否和他们的及公司一致。问题的构成如下：<span lang="EN-US"><br /></span>　　<span lang="EN-US">1. </span>项目管理软件工具知识，<span lang="EN-US"><br /></span>　　<span lang="EN-US">2. </span>编制项目计划的技术 ，<span lang="EN-US"><br /></span>　　<span lang="EN-US">3. </span>人员管理技能<span lang="EN-US"><br /></span>　　<span lang="EN-US">4. </span>沟通技能<span lang="EN-US"><br /></span>　　<span lang="EN-US">5. </span>原理体系知识（标准开发生命周期和项目管理 ）。<span lang="EN-US"><br /><br /></span>　　项目管理软件工具知识<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">1</span>：工期和工作量之间的差异是什么？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">1</span>：工期是商业<span lang="EN-US">/</span>日历上的天数，与人数和工作量无关。工作量是与日历天数无关的人的工作。例如：<span lang="EN-US"><br /></span>　　一天的工作量对于一个一只花<span lang="EN-US">50%</span>在时间在上面的人来说，他的工期就是两天。如果两个人全职工作，工期是<span lang="EN-US">1</span>天，而工作量是两个工作日。<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">2</span>：怎样和为什么要在编制项目计划时考虑依赖关系？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">2</span>：根据使用的软件包，依赖关系可以通过将任务及其后续任务的标识符进行关联来表示。依赖关系说明了任务之间关联<span lang="EN-US">/</span>并列的要求。依赖关系可以是指在另一个任务能开始之前有一个任务必须完成。例如，逻辑模型必须在物理模型前完成。但测试并不是要在所有编程工作完成之后才开始，如果没有完成的程序对线性测试没有影响。<span lang="EN-US"><br /><br /></span>　　项目计划加入依赖关系，就能找出项目的关键路径并且能够确定它对项目工期的影响。<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">3</span>：你怎样将人的工作步调与计划结合？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">3</span>：根据组织使用的具体的工具，可以将资源拆成更小的资源<span lang="EN-US">/</span>单位，或者可以将任务拆成更小的任务。<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">4</span>：你怎样将培训，假日和个人教育时间表结合起来？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">4</span>：每个产品都有标明不工作的天数的公司<span lang="EN-US">/</span>全球的日历。每个产品都也有个人的资源日历标明个人不工作的时间。如果项目需要教育和培训，应该把它们象任务那样写在项目计划上。<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">5</span>：你怎样安排类似状态会议这样贯穿整个项目但只需要极少的时间和工作量的任务？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">5</span>：它的工期将和整个项目时间一样长，占工作量的百分比很小。被分配给任务的每个人花在该任务的时间占他时间的百分比极低。<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">6</span>：实况报告对计划的作用以及实况与最初预计的比较有何价值？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">6</span>：根据组织使用的特定的工具，每个工具都为实况报告中输入相互独立的要素<span lang="EN-US">/</span>域信息。也可以将报表进行分类，来向团队成员和其他相关团体说明关键路径的变化或时间表的调整。这些报告对已实现工作评价和作为在计划下一个工程或阶段的输入有价值。另一个把估计和实况报告比较的有价值的用途是把范围变更对项目的影响记录下来。<span lang="EN-US"><br /><br /></span>　　做项目计划的技能<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">7</span>：你为什么制定项目计划？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">7</span>：项目计划是实现成功的系统的路线图。它提供了一种手段来通知每个人希望他们做什么及何时完成。它帮助项目经理使管理层，商务用户和支持团体了解项目状态和调整特殊的资源。逐项列记的<span lang="EN-US">“</span>一览表<span lang="EN-US">”</span>协助对任何变动的影响进行迅速评估。当实况报告与计划联系起来后，项目计划为今后项目的任务划分和估算提供了有用的信息。<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">8</span>：你将怎样着手做项目的计划？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">8</span>：进程安排是一门艺术。根据已知有关业务目标的事实，公司一般标准，以及可以利用的过去的经验。可以从清楚地定义范围和目标开始。把项目的风险和制约做成文件。差的估计源于对业务知识和项目范围缺乏了解。可以从项目任务分解入手，例如先划分阶段，然后定义每个阶段的活动，再定义每个活动中的任务。识别和文档化里程碑和可交付产品。项目计划是当信息变得可以利用的时，不断细化的有生命文件。很好地记录进度的变化对项目经理，开发团队，支持团队，以及管理层，商业用户都有益处。<span lang="EN-US"><br /><br /></span>　　问题<span lang="EN-US">9</span>：你将怎样着手制定项目计划？<span lang="EN-US"><br /></span>　　答案<span lang="EN-US">9</span>：在适当的活动和阶段或其他的概括的标准说明下，输入确定的任务。将适当的可交付产品及里程碑和特定的任务联系起来。连接全部需要依赖关联的任务。把资源角色或资源名字加到每个任务上。应用度量结果确定事先的任务工作量，把更多的时间用于需求收集，设计和测试。考虑所有已知的节假日，培训，休假或其他的资源停工时间。计划草案将同支持团体，管理层和商务用户一起复查，做为补充性的输入和最终的批准。<span lang="EN-US"><br /><br /></span><span style="COLOR: blue">原文链接：</span><span lang="EN-US"><a href="http://pm.csai.cn/manager/NO415.htm">http://pm.csai.cn/manager/NO415.htm</a><o:p></o:p></span></span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US" style="FONT-SIZE: 10pt">
								<o:p> </o:p>
						</span>
				</p>
				<p class="main">
						<a href="http://pm.csai.cn/manager/NO415.htm">
								<font color="#0000ff">
								</font>
						</a>
				</p>
		</font>
<img src ="http://www.blogjava.net/flyingis/aggbug/24062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-12-15 16:12 <a href="http://www.blogjava.net/flyingis/articles/24062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java开源工具包</title><link>http://www.blogjava.net/flyingis/articles/23260.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 10 Dec 2005 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/articles/23260.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/23260.html</wfw:comment><comments>http://www.blogjava.net/flyingis/articles/23260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/23260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/23260.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">
						<font face="Verdana">    逐渐整理一些有用的Java开源工具包，并且不断更新。<br /><br />    <b>算法工具</b>：<br /><br />    基于Java的遗传算法工具JGAP是一款用Java编写的遗传算法包。它提供了基本的遗传算法，你可以使用它来解决一些适合用遗传算法解决的问题。2005年12月10日止最新的版本是JGAP2.5。下载地址</font>
						<a href="https://sourceforge.net/project/showfiles.php?group_id=11618&amp;package_id=48940">
								<font face="Verdana" color="#000080">https://sourceforge.net/project/showfiles.php?group_id=11618&amp;package_id=48940</font>
						</a>
						<br />
						<br />
						<font face="Verdana">    Jakarta Commons Math 是Jakarta Commons 的一个单独的子项目，主要包括数学和统计学组件。下载地址</font>
				</font>
				<font face="Verdana">
						<font color="#000080" size="2">
								<a href="http://jakarta.apache.org/site/downloads/downloads_commons-math.cgi">
										<font color="#000080">http://jakarta.apache.org/site/downloads/downloads_commons-math.cgi</font>
								</a>
						</font>
						<br />
						<br />
						<font size="2">    Java函数编程工具FunctionalJ是一个开源的工具包，能够帮助你在Java中进行函数编程。下载地址</font>
				</font>
				<a href="http://functionalj.sourceforge.net/">
						<font face="Verdana">
								<font color="#000080" size="2">http://functionalj.sourceforge.net/</font>
						</font>
				</a>
				<br />
				<br />
				<font size="2">
						<font face="Verdana">    JFormula是由JAPISoft 开发的一组数学表达式API，用于计算各种不同的数学表达式。下载链接</font>
						<a href="http://www.japisoft.com/download.html">
								<font face="Verdana" color="#000080">http://www.japisoft.com/download.html</font>
						</a>
				</font>
				<font face="Verdana">
						<br />
						<br />
				</font>
				<font face="Verdana">
						<font size="2">    <b>标签工具</b>：<br /><br />    AJAXTag是一组JSP标签，用来简化AJAX技术在JSP页面中的使用。它提供了一些常见功能的标签如下拉级联选择，用户在文本框中输入字符自动从指定的数据中匹配用户输入的字符等。它构建在JavaScript框架之上。下载地址</font>
				</font>
				<a href="http://sourceforge.net/projects/ajaxtags/">
						<font face="Verdana">
								<font color="#000080" size="2">http://sourceforge.net/projects/ajaxtags/</font>
						</font>
				</a>
				<br />
				<br />
				<font face="Verdana">
						<font size="2">    <b>网络应用框架:</b><br /><br />    Apache Mina 0.9: MINA (Multipurpose Infrastructure for Network Applications)是一个网络应用程序框架。用户利用它可以容易地开发高性能和高伸缩性的网络应用程序。下载地址</font>
				</font>
				<a href="http://svn.apache.org/repository/directory-network/">
						<font face="Verdana">
								<font color="#000080" size="2">http://svn.apache.org/repository/directory-network/</font>
						</font>
				</a>
				<br />
				<br />
				<font face="Verdana" size="2">    <strong>AJAX应用框架:</strong><br /></font>
		</p>
		<p>
				<font face="Verdana">
						<font size="2">    Buffalo是由国人开发的Ajax框架。Buffalo中定义了Web远程调用的传输基础，并且将远程调用对象完整的序列化到了本地，成为可以被JavaScript编程触及的对象。Buffalo中的重要组件 - BuffaloBinding，提供了将JavaScript对象绑定到HTML元素的能力。这种绑定将是无侵入的，只需要在HTML元素中加入若干个不影响排版的属性，即可将数据与界面绑定。<br />    Buffalo 1.1 之前的版本重要的功能主要集中于远程调用与Java对象/JavaScript对象之间的双向序列化，这个特性已经被众多的应用久经考验，被认为是健壮的。它大大减少了在Java对象与JavaScript对象之间需要考虑的细节，开发者可以更用心地进行业务设计和界面设计。1.2版本的推出，引入了新的众多的特性包括，新的重新改写的Spring集成，与流行javascript库prototype的集成，支持浏览器前进后退按钮，等等。<br />    下载链接</font>
				</font>
				<a href="http://www.amowa.net/buffalo/">
						<font face="Verdana">
								<font color="#000080" size="2">http://www.amowa.net/buffalo/</font>
						</font>
				</a>
				<br />
				<font face="Verdana">
						<font size="2">    <br />    AJAX<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体"><font size="2">这项用于创建互动<span lang="EN-US">Web</span>应用的技<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">术正在爆发式的进入到<span lang="EN-US">Web</span>开发领域中，<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">迅速的变得如此热门以至于一些开发者<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">在技术上无法及时更新。为了满足更快的开发<span lang="EN-US">AJAX</span>的需求，已经有不少公司和开发者社区正在推出<span lang="EN-US">AJAX</span>的<span lang="EN-US">RAD</span>平台。其中<span lang="EN-US">ThinkCAP</span>框架集成了超过<span lang="EN-US">24</span>种开源代码库。<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">现在，<span lang="EN-US">ThinkCAP</span>的框架部分也<span lang="EN-US"><a href="http://trends.newsforge.com/article.pl?sid=06/01/08/1725231"><font color="#000080"><span lang="EN-US"><span lang="EN-US">以GPL</span></span><span lang="EN-US"><span lang="EN-US">方式开源</span></span></font></a></span>了。详细链接<span lang="EN-US" style="FONT-FAMILY: 宋体"><a href="http://trends.newsforge.com/article.pl?sid=06/01/08/1725231"><font color="#000080">http://trends.newsforge.com/article.pl?sid=06/01/08/1725231</font></a></span></span></span></span></span></font></span></font>
				</font>
		</p>
		<p>
				<font size="2">
						<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">
								<font size="2">
										<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">
												<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">
														<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">
																<span style="COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">
																		<font face="Verdana">
																				<span lang="EN-US" style="FONT-FAMILY: 宋体">  <b>可视化工具:</b></span>
																		</font>
																</span>
														</span>
												</span>
										</span>
								</font>
						</span>
				</font>
		</p>
		<p>
				<font size="2">
						<font face="Verdana">    Fabric 是一个用于用户界面开发的有力工具，面向创建可视化Java Bean的用户。Fabric的执行技术'Park'可以轻松的集合XML-based用户界面语言到rich 界面。链接地址：</font>
						<a href="http://www.platespiller.com/download.jsp">
								<font face="Verdana" color="#000080">http://www.platespiller.com/download.jsp</font>
						</a>
				</font>
				<font face="Verdana">
				</font>
		</p>
		<p>
				<font face="Verdana">
						<font size="2">    <b>搜索引擎:</b><br /><br />    Compass 0.7.0: Compass 具备一个强大的、事务的、高性能的对象/搜索引擎映射，与一个Java持久层框架。下载地址</font>
				</font>
				<a href="http://www.compassframework.org/display/SITE/Downloads">
						<font face="Verdana">
								<font color="#000080" size="2">http://www.compassframework.org/display/SITE/Downloads</font>
						</font>
				</a>
				<br />
				<br />
				<font face="Verdana">
						<font size="2">
								<strong>    JDK Date和Calendar的替代工具:<br /></strong>
								<br />    Joda-Time提供了一组Java类包，用于处理包括ISO8601标准在内的date和time。利用它可以把JDK Date和Calendar类完全替换掉，而且仍然能够提供很好的集成。 Joda-Time主要的特点包括：易于使用，易于扩展，提供一组完整的功能，有着比JDK Calendar更好的整体性能等等。下载链接</font>
				</font>
				<a href="http://sourceforge.net/project/showfiles.php?group_id=97367&amp;package_id=104212">
						<font face="Verdana">
								<font style="BACKGROUND-COLOR: rgb(255,255,255)" color="#000080" size="2">http://sourceforge.net/project/showfiles.php?group_id=97367&amp;package_id=104212</font>
						</font>
				</a>
				<br />
				<br />
				<font size="2">
						<font face="Verdana">    </font>
						<font face="Verdana">
								<strong>Java 3D 工具:<br /><br /></strong>    Java XTools是一个用来提高Java 以及Java 3D 功能特性的工具。下载地址</font>
				</font>
				<font face="Verdana">
				</font>
				<a href="http://freshmeat.net/projects/xtools/?branch_id=39620&amp;release_id=217167">
						<font face="Verdana">
								<font color="#000080" size="2">http://freshmeat.net/projects/xtools/?branch_id=39620&amp;release_id=217167</font>
						</font>
				</a>
				<br />
				<br />
				<font face="Verdana" size="2">    </font>
				<font face="Verdana">
						<font size="2">
								<strong>地理信息系统服务器:<br /></strong>
								<br />    GeoServer 1.3.0-PR1: GeoServer是OpenGIS的web服务器规范的J2EE实现。下载链接</font>
				</font>
				<a href="http://freshmeat.net/projects/geoserver/?branch_id=44295&amp;release_id=217272">
						<font face="Verdana">
								<font color="#000080" size="2">http://freshmeat.net/projects/geoserver/?branch_id=44295&amp;release_id=217272</font> </font>
				</a>
				<font face="Verdana">
						<br />
						<br />    </font>
				<font size="2">
						<font face="Verdana">GeoServer 开发组近日宣布，地理信息系统服务器GeoServer 1.3.1 beta 发布了。GeoServer是OpenGIS的web服务器规范的J2EE实现。该新版本中最显著的改进就是增加了GeoTools 2.2.x，增加了许多新功能。下载链接</font>
						<a href="http://docs.codehaus.org/display/GEOS/2006/05/06/GeoServer+1.3.1+beta+release">
								<font face="Verdana" color="#000080">http://docs.codehaus.org/display/GEOS/2006/05/06/GeoServer+1.3.1+beta+release</font>
						</a>
						<br />
				</font>
				<br />
				<font face="Verdana">    <font size="2"><strong>测试工具：</strong></font><br /><br /><font size="2">    TestNG是根据JUnit 和NUnit思想而构建的一个测试框架，但是TestNG增加了许多新的功能使得它变得更加强大与容易使用。链接地址</font></font>
				<a href="http://testng.org/" target="_new">
						<font face="Verdana" color="#000080" size="2">http://testng.org/</font>
				</a>
				<br />
				<br />
				<font size="2">
						<font face="Verdana">    FindBugs可以用来找出系统源代码中存在的Bug，与设计上存在的问题，非常好的一个捉虫软件。链接地址：</font>
						<a href="http://findbugs.sourceforge.net/">
								<font face="Verdana" color="#000080">http://findbugs.sourceforge.net/</font>
						</a>
				</font>
				<br />
				<br />
				<font face="Verdana">
						<font size="2">    <strong>压缩工具包:</strong><br /></font>
						<br />
						<font size="2">    TrueZIP 是一个ZIP压缩工具包，为你提供ZIP相关功能，你可以调用这个ZIP压缩工具包进行压缩操作。TrueZIP则针对java.util.zip中的缺点进行了完善。链接地址</font>
				</font>
				<a href="https://truezip.dev.java.net/">
						<font face="Verdana" color="#000080" size="2">https://truezip.dev.java.net/</font>
				</a>
				<br />
				<br />
				<font face="Verdana" size="2">    <strong>报表制作工具：</strong><br /><br />    OpenReports 提供基于web 的灵活报表解决方案，支持 PDF，HTML 和XLS 报表格式，基于WebWork，Hibernate 和 Velocity 开发完成，并且还提供一个整合了Tomcat 的OpenReports-Tomcat 文件下载. 新版本包括了一系列的bug fix。<br />    下载地址：</font>
				<a href="http://oreports.com/index.php?option=com_content&amp;task=view&amp;id=24&amp;Itemid=30">
						<font face="Verdana" color="#000080" size="2">http://oreports.com/index.php?option=com_content&amp;task=view&amp;id=24&amp;Itemid=30</font>
				</a>
		</p>
<img src ="http://www.blogjava.net/flyingis/aggbug/23260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-12-10 13:41 <a href="http://www.blogjava.net/flyingis/articles/23260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOC容器比较--Spring VS Pico VS Yan/Nuts</title><link>http://www.blogjava.net/flyingis/articles/23042.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Thu, 08 Dec 2005 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/articles/23042.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/23042.html</wfw:comment><comments>http://www.blogjava.net/flyingis/articles/23042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/23042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/23042.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<table class="confluenceTable">
				<tbody>
						<tr>
								<th class="confluenceTh">
										<font size="2">Features  </font>
								</th>
								<th class="confluenceTh">
										<font size="2">Spring  </font>
								</th>
								<th class="confluenceTh">
										<font size="2">Pico  </font>
								</th>
								<th class="confluenceTh">
										<font size="2">Yan/Nuts </font>
								</th>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">xml configuration <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes  </font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through Nano Container <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes </font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Life cycle <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Singleton only <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Singleton only <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Both singleton and prototype <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Parametered and ad-hoc life cycle <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through &lt;lifecycle&gt; tag <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Constructor Injection <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes </font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Setter Injection <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Factory Method Injection <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Referencing Field <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">FieldRetrievingFactoryBean <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Implement ComponentAdapter <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through &lt;field&gt; tag. <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Anonymous sub-bean <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes </font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Ad-hoc bean combination <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No </font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through &lt;sequence&gt; or &lt;callcc&gt; tags <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Concise collection literal <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">named local bean <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through &lt;local&gt; tag <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Bean Definition Reuse <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">through "abstract" bean <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">
												<br clear="all" />
										</font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through &lt;function&gt; tag <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">import module <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">module private beans <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through "export" and "hide" attribute of &lt;module&gt; <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Selective import by bean names <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through "includes" and "excludes" attribute of &lt;import&gt; <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Import with namespace <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through "namespace" attribute of &lt;import&gt; <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Singleton bean with prototype property <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Requires Cglib and bytecode generation <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">ComponentAdapter combination <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through component combination <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Dependency Injection for objects not managed by container <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Supported at the cost of Spring API dependency <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Through &lt;function&gt; and &lt;factory&gt; tag <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Extensible tag library <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No. But FactoryBean is a substitute <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">By implementing subclasses of Nut <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Configuration unit-testable within configuration file. <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">By using &lt;sequence&gt; together with &lt;assertEqual&gt;, &lt;assertSame&gt;, &lt;if&gt;, &lt;unless&gt;, &lt;fail&gt; etc. <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">autoproxy <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">
												<br clear="all" />
										</font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Custom PropertyEditor <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">No <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Container hierarchy <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">AOP support <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Both Spring AOP and AspectJ <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Via dynaop <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Any AOP solution can be plugged in. An integration package for spring AOP is provided out-of-box. <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Declarative Transactional support <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Yes <br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2"> </font>
								</td>
								<td class="confluenceTd">
										<font size="2">No. But Spring's declarative transaction support is integrated. <br clear="all" /></font>
								</td>
						</tr>
						<tr>
								<td class="confluenceTd">
										<font size="2">Scripting language support<br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Not yet<br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Nano Container<br clear="all" /></font>
								</td>
								<td class="confluenceTd">
										<font size="2">Not yet<br clear="all" /></font>
								</td>
						</tr>
				</tbody>
		</table>
		<font size="2">原文链接：</font>
		<a href="http://docs.codehaus.org/pages/viewpage.action?pageId=39307">
				<font size="2">http://docs.codehaus.org/pages/viewpage.action?pageId=39307</font>
		</a>
<img src ="http://www.blogjava.net/flyingis/aggbug/23042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-12-08 21:56 <a href="http://www.blogjava.net/flyingis/articles/23042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse实用快捷键大全[转载]</title><link>http://www.blogjava.net/flyingis/articles/17337.html</link><dc:creator>Flyingis</dc:creator><author>Flyingis</author><pubDate>Sat, 29 Oct 2005 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/flyingis/articles/17337.html</guid><wfw:comment>http://www.blogjava.net/flyingis/comments/17337.html</wfw:comment><comments>http://www.blogjava.net/flyingis/articles/17337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flyingis/comments/commentRss/17337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flyingis/services/trackbacks/17337.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">Ctrl+1 快速修复(最经典的快捷键,就不用多说了)<br />Ctrl+D: 删除当前行 <br />Ctrl+Alt+↓ 复制当前行到下一行(复制增加)<br />Ctrl+Alt+↑ 复制当前行到上一行(复制增加)<br />Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)<br />Alt+↑ 当前行和上面一行交互位置(同上)<br />Alt+← 前一个编辑的页面<br />Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)<br />Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性<br />Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)<br />Shift+Ctrl+Enter 在当前行插入空行(原理同上条)<br />Ctrl+Q 定位到最后编辑的地方<br />Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)<br />Ctrl+M 最大化当前的Edit或View (再按则反之)<br />Ctrl+/ 注释当前行,再按则取消注释<br />Ctrl+O 快速显示 OutLine<br />Ctrl+T 快速显示当前类的继承结构<br />Ctrl+W 关闭当前Editer<br />Ctrl+K 参照选中的Word快速定位到下一个<br />Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)<br />Ctrl+/(小键盘) 折叠当前类中的所有代码<br />Ctrl+×(小键盘) 展开当前类中的所有代码<br />Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)<br />Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)<br />Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)<br />Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)<br />Ctrl+Shift+F4 关闭所有打开的Editer<br />Ctrl+Shift+X 把当前选中的文本全部变味小写<br />Ctrl+Shift+Y 把当前选中的文本全部变为小写<br />Ctrl+Shift+F 格式化当前代码<br />Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)<br /><br />下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)<br />Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)<br />Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)<br />Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)<br />Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)<br />Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)<br />Alt+Shift+I 合并变量(可能这样说有点不妥Inline)<br />Alt+Shift+V 移动函数和变量(不怎么常用)<br />Alt+Shift+Z 重构的后悔药(Undo)<br /><br />编辑<br />作用域 功能 快捷键 <br />全局 查找并替换 Ctrl+F <br />文本编辑器 查找上一个 Ctrl+Shift+K <br />文本编辑器 查找下一个 Ctrl+K <br />全局 撤销 Ctrl+Z <br />全局 复制 Ctrl+C <br />全局 恢复上一个选择 Alt+Shift+↓ <br />全局 剪切 Ctrl+X <br />全局 快速修正 Ctrl1+1 <br />全局 内容辅助 Alt+/ <br />全局 全部选中 Ctrl+A <br />全局 删除 Delete <br />全局 上下文信息 Alt+？<br />Alt+Shift+?<br />Ctrl+Shift+Space <br />Java编辑器 显示工具提示描述 F2 <br />Java编辑器 选择封装元素 Alt+Shift+↑ <br />Java编辑器 选择上一个元素 Alt+Shift+← <br />Java编辑器 选择下一个元素 Alt+Shift+→ <br />文本编辑器 增量查找 Ctrl+J <br />文本编辑器 增量逆向查找 Ctrl+Shift+J <br />全局 粘贴 Ctrl+V <br />全局 重做 Ctrl+Y <br /> <br />查看<br />作用域 功能 快捷键 <br />全局 放大 Ctrl+= <br />全局 缩小 Ctrl+- <br /> <br />窗口<br />作用域 功能 快捷键 <br />全局 激活编辑器 F12 <br />全局 切换编辑器 Ctrl+Shift+W <br />全局 上一个编辑器 Ctrl+Shift+F6 <br />全局 上一个视图 Ctrl+Shift+F7 <br />全局 上一个透视图 Ctrl+Shift+F8 <br />全局 下一个编辑器 Ctrl+F6 <br />全局 下一个视图 Ctrl+F7 <br />全局 下一个透视图 Ctrl+F8 <br />文本编辑器 显示标尺上下文菜单 Ctrl+W <br />全局 显示视图菜单 Ctrl+F10 <br />全局 显示系统菜单 Alt+- <br /> <br />导航<br />作用域 功能 快捷键 <br />Java编辑器 打开结构 Ctrl+F3 <br />全局 打开类型 Ctrl+Shift+T <br />全局 打开类型层次结构 F4 <br />全局 打开声明 F3 <br />全局 打开外部javadoc Shift+F2 <br />全局 打开资源 Ctrl+Shift+R <br />全局 后退历史记录 Alt+← <br />全局 前进历史记录 Alt+→ <br />全局 上一个 Ctrl+, <br />全局 下一个 Ctrl+. <br />Java编辑器 显示大纲 Ctrl+O <br />全局 在层次结构中打开类型 Ctrl+Shift+H <br />全局 转至匹配的括号 Ctrl+Shift+P <br />全局 转至上一个编辑位置 Ctrl+Q <br />Java编辑器 转至上一个成员 Ctrl+Shift+↑ <br />Java编辑器 转至下一个成员 Ctrl+Shift+↓ <br />文本编辑器 转至行 Ctrl+L <br /> <br />搜索<br />作用域 功能 快捷键 <br />全局 出现在文件中 Ctrl+Shift+U <br />全局 打开搜索对话框 Ctrl+H <br />全局 工作区中的声明 Ctrl+G <br />全局 工作区中的引用 Ctrl+Shift+G <br /><br />文本编辑<br />作用域 功能 快捷键 <br />文本编辑器 改写切换 Insert <br />文本编辑器 上滚行 Ctrl+↑ <br />文本编辑器 下滚行 Ctrl+↓ <br /> <br />文件<br />作用域 功能 快捷键 <br />全局 保存 Ctrl+X <br />Ctrl+S <br />全局 打印 Ctrl+P <br />全局 关闭 Ctrl+F4 <br />全局 全部保存 Ctrl+Shift+S <br />全局 全部关闭 Ctrl+Shift+F4 <br />全局 属性 Alt+Enter <br />全局 新建 Ctrl+N <br /> <br />项目<br />作用域 功能 快捷键 <br />全局 全部构建 Ctrl+B <br /> <br />源代码<br />作用域 功能 快捷键 <br />Java编辑器 格式化 Ctrl+Shift+F <br />Java编辑器 取消注释 Ctrl+\ <br />Java编辑器 注释 Ctrl+/ <br />Java编辑器 添加导入 Ctrl+Shift+M <br />Java编辑器 组织导入 Ctrl+Shift+O <br />Java编辑器 使用try/catch块来包围 未设置，太常用了，所以在这里列出,建议自己设置。<br />也可以使用Ctrl+1自动修正。 <br /> <br />运行<br />作用域 功能 快捷键 <br />全局 单步返回 F7 <br />全局 单步跳过 F6 <br />全局 单步跳入 F5 <br />全局 单步跳入选择 Ctrl+F5 <br />全局 调试上次启动 F11 <br />全局 继续 F8 <br />全局 使用过滤器单步执行 Shift+F5 <br />全局 添加/去除断点 Ctrl+Shift+B <br />全局 显示 Ctrl+D <br />全局 运行上次启动 Ctrl+F11 <br />全局 运行至行 Ctrl+R <br />全局 执行 Ctrl+U <br /> <br />重构<br />作用域 功能 快捷键 <br />全局 撤销重构 Alt+Shift+Z <br />全局 抽取方法 Alt+Shift+M <br />全局 抽取局部变量 Alt+Shift+L <br />全局 内联 Alt+Shift+I <br />全局 移动 Alt+Shift+V <br />全局 重命名 Alt+Shift+R <br />全局 重做 Alt+Shift+Y</font>
<img src ="http://www.blogjava.net/flyingis/aggbug/17337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flyingis/" target="_blank">Flyingis</a> 2005-10-29 14:08 <a href="http://www.blogjava.net/flyingis/articles/17337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>