﻿<?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-cAng^Er</title><link>http://www.blogjava.net/xiaosao/</link><description>不懂我的人 , 离不了我 , 该了解了解我 !而懂我的人 , 更离不了我 , 因为他们爱我 。</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:59:11 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:59:11 GMT</pubDate><ttl>60</ttl><item><title>&lt;转&gt;标题栏新消息提示效果</title><link>http://www.blogjava.net/xiaosao/archive/2011/06/15/352379.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 15 Jun 2011 10:24:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2011/06/15/352379.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/352379.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2011/06/15/352379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/352379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/352379.html</trackback:ping><description><![CDATA[<p>标题栏新消息提示如图：</p>
<p sizcache="4" sizset="29"><a href="http://www.css88.com/wp-content/uploads/2011/01/titlr.gif" jquery1308132261125="32"><img class="alignnone size-full wp-image-2964" title="titlr" height="101" alt="" src="http://www.css88.com/wp-content/uploads/2011/01/titlr.gif" width="235" /></a></p>
<p>公司的项目中用到了这个新消息提示的效果，主要用于提示用户有新消息。具体实现代码如下：</p>
<div class="syntaxhighlighter  jscript" id="highlighter_75869">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>01</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">newMessageRemind={ </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>02</code></td>
<td class="content"><code class="jscript plain">_step: 0, </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>03</code></td>
<td class="content"><code class="jscript plain">_title: document.title, </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>04</code></td>
<td class="content"><code class="jscript plain">_timer: </code><code class="jscript keyword">null</code><code class="jscript plain">, </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>05</code></td>
<td class="content"><code class="jscript comments">//显示新消息提示 </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>06</code></td>
<td class="content"><code class="jscript plain">show:</code><code class="jscript keyword">function</code><code class="jscript plain">(){ </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>07</code></td>
<td class="content"><code class="jscript keyword">var</code> <code class="jscript plain">temps = newMessageRemind._title.replace(</code><code class="jscript string">"【　　　】"</code><code class="jscript plain">, </code><code class="jscript string">""</code><code class="jscript plain">).replace(</code><code class="jscript string">"【新消息】"</code><code class="jscript plain">, </code><code class="jscript string">""</code><code class="jscript plain">); </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>08</code></td>
<td class="content"><code class="jscript plain">newMessageRemind._timer = setTimeout(</code><code class="jscript keyword">function</code><code class="jscript plain">() { </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>09</code></td>
<td class="content"><code class="jscript plain">newMessageRemind.show(); </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>10</code></td>
<td class="content"><code class="jscript comments">//这里写Cookie操作 </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>11</code></td>
<td class="content"><code class="jscript plain">newMessageRemind._step++; </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>12</code></td>
<td class="content"><code class="jscript keyword">if</code> <code class="jscript plain">(newMessageRemind._step == 3) { newMessageRemind._step = 1 }; </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>13</code></td>
<td class="content"><code class="jscript keyword">if</code> <code class="jscript plain">(newMessageRemind._step == 1) { document.title = </code><code class="jscript string">"【　　　】"</code> <code class="jscript plain">+ temps }; </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>14</code></td>
<td class="content"><code class="jscript keyword">if</code> <code class="jscript plain">(newMessageRemind._step == 2) { document.title = </code><code class="jscript string">"【新消息】"</code> <code class="jscript plain">+ temps }; </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>15</code></td>
<td class="content"><code class="jscript plain">}, 800); </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>16</code></td>
<td class="content"><code class="jscript keyword">return</code> <code class="jscript plain">[newMessageRemind._timer, newMessageRemind._title]; </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>17</code></td>
<td class="content"><code class="jscript plain">}, </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>18</code></td>
<td class="content"><code class="jscript comments">//取消新消息提示 </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>19</code></td>
<td class="content"><code class="jscript plain">clear: </code><code class="jscript keyword">function</code><code class="jscript plain">(){ </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>20</code></td>
<td class="content"><code class="jscript plain">clearTimeout(newMessageRemind._timer ); </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>21</code></td>
<td class="content"><code class="jscript plain">document.title = newMessageRemind._title; </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>22</code></td>
<td class="content"><code class="jscript comments">//这里写Cookie操作 </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>23</code></td>
<td class="content"><code class="jscript plain">} </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>24</code></td>
<td class="content"><code class="spaces">&nbsp;</code>&nbsp;</td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>25</code></td>
<td class="content"><code class="jscript plain">};</code></td></tr></tbody></table></div></div></div>
<p>调用显示新消息提示：newMessageRemind.show();</p>
<p>调用取消新消息提示：newMessageRemind.clear();</p>
<p sizcache="4" sizset="30">查看demo：<a href="http://www.css88.com/demo/newMessageRemind/" jquery1308132261125="33">http://www.css88.com/demo/newMessageRemind/</a></p>
<p><strong>另：单纯的这个代码会出现这么一个问题：</strong><br />就是当你打开一个站点很多张页面的时候，如过有新消息，那么所有页面都会不停的闪，当你查看消息后其他页面仍会提示。</p>
<p>我们公司是通过使用Cookie的方式解决的，当查看新消息后所有标题闪动的页面将全部取消提示。</p>
<p class="announce" sizcache="4" sizset="31"><span style="font-weight: bold; text-shadow: 0 1px 0 #ddd">声明:</span> 本文采用 <a title="署名-非商业性使用-相同方式共享" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" rel="nofollow" jquery1308132261125="34">BY-NC-SA</a> 协议进行授权 | <a href="http://www.css88.com/" jquery1308132261125="35">WEB前端开发</a><br />转载请注明转自《<a title="标题栏新消息提示效果" href="http://www.css88.com/archives/2963" rel="bookmark" jquery1308132261125="36">标题栏新消息提示效果</a>》</p><img src ="http://www.blogjava.net/xiaosao/aggbug/352379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-06-15 18:24 <a href="http://www.blogjava.net/xiaosao/archive/2011/06/15/352379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;return闭包函数</title><link>http://www.blogjava.net/xiaosao/archive/2011/06/15/352374.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 15 Jun 2011 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2011/06/15/352374.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/352374.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2011/06/15/352374.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/352374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/352374.html</trackback:ping><description><![CDATA[<p><strong>高手绕道！</strong>这跟闭包本身没什么大的关系，也不知道怎么取标题，随便凑了个数，望见谅！</p>
<p>今天一个刚学js的朋友给了我一段代码问为什么方法不执行，代码如下：</p>
<div class="syntaxhighlighter  jscript" id="highlighter_371156">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">function</code>&nbsp; <code class="jscript plain">makefunc(x)&nbsp; { </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript keyword">return</code> <code class="jscript keyword">function</code> <code class="jscript plain">(){ </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript keyword">return</code>&nbsp; <code class="jscript plain">x; </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">} </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">} </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="jscript plain">alert(makefunc(0));</code></td></tr></tbody></table></div></div></div>
<p>其实不是不执行，只是朋友的意思这里alert出来的应该是&#8220;0&#8221;，而不是function (){return x;}。<br />不是脚本写错了，只是没搞懂return，从当前函数退出，并从那个函数返回一个值。如果返回的是一个函数，那么返回的也是函数本身。<br />可以这样修改上面的代码,就是alert(makefunc(0)())：</p>
<div class="syntaxhighlighter  jscript" id="highlighter_488489">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">function</code>&nbsp; <code class="jscript plain">makefunc(x)&nbsp; { </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript keyword">return</code> <code class="jscript plain">(</code><code class="jscript keyword">function</code> <code class="jscript plain">(){ </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript keyword">return</code>&nbsp; <code class="jscript plain">x; </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">})(); </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">} </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="jscript plain">alert(makefunc(0)());</code></td></tr></tbody></table></div></div></div>
<p>如果要返回函数执行的结果那么首先要让这个函数执行，例如：</p>
<div class="syntaxhighlighter  jscript" id="highlighter_887566">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript keyword">function</code>&nbsp; <code class="jscript plain">makefunc(x)&nbsp; { </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript keyword">return</code> <code class="jscript plain">(</code><code class="jscript keyword">function</code> <code class="jscript plain">(){ </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript keyword">return</code>&nbsp; <code class="jscript plain">x; </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>4</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">})(); </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>5</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">} </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>6</code></td>
<td class="content"><code class="jscript plain">alert(makefunc(0));</code></td></tr></tbody></table></div></div></div>
<p>这里有一个匿名函数，</p>
<div class="syntaxhighlighter  jscript" id="highlighter_575274">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript plain">(</code><code class="jscript keyword">function</code> <code class="jscript plain">(){ </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript keyword">return</code>&nbsp; <code class="jscript plain">x; </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">})();</code></td></tr></tbody></table></div></div></div>
<p>在第一个括号内是匿名函数，第二个括号用于调用该匿名函数，您可以在第二个括号中传入所需的参数。例如：</p>
<div class="syntaxhighlighter  jscript" id="highlighter_301279">
<div class="lines">
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>1</code></td>
<td class="content"><code class="jscript plain">(</code><code class="jscript keyword">function</code><code class="jscript plain">( x , y){ </code></td></tr></tbody></table></div>
<div class="line alt2">
<table>
<tbody>
<tr>
<td class="number"><code>2</code></td>
<td class="content"><code class="spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="jscript plain">alert( x + y); </code></td></tr></tbody></table></div>
<div class="line alt1">
<table>
<tbody>
<tr>
<td class="number"><code>3</code></td>
<td class="content"><code class="jscript plain">})(2 ,3 );</code></td></tr></tbody></table></div></div></div>
<p class="announce" sizcache="4" sizset="29"><span style="font-weight: bold; text-shadow: 0 1px 0 #ddd">声明:</span> 本文采用 <a title="署名-非商业性使用-相同方式共享" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" rel="nofollow" jquery1308131317516="33">BY-NC-SA</a> 协议进行授权 | <a href="http://www.css88.com/" jquery1308131317516="34">WEB前端开发</a><br />转载请注明转自《<a title="return闭包函数" href="http://www.css88.com/archives/3738" rel="bookmark" jquery1308131317516="35">return闭包函数</a>》</p><img src ="http://www.blogjava.net/xiaosao/aggbug/352374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-06-15 17:56 <a href="http://www.blogjava.net/xiaosao/archive/2011/06/15/352374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;页面翻转,让你的页面旋转一下</title><link>http://www.blogjava.net/xiaosao/archive/2011/06/10/352061.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Fri, 10 Jun 2011 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2011/06/10/352061.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/352061.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2011/06/10/352061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/352061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/352061.html</trackback:ping><description><![CDATA[<p>n.styleSheet.cssText = r;这个写法是亮点,动态载入过css,但从来都没这么载入过,在公司的项目中试了下,不一样的感觉.很搞怪.<br /><br />原帖:<a href="http://www.webchina110.cn/?p=328">http://www.webchina110.cn/?p=328</a><br />今天网上闲逛，看到克军写了一句话，恶搞一下。凭着这句话的吸引力，我点进去了。</p>
<p>哇，居然页面倒过来了，页头和页脚翻了一个根头，其实我以前还在想，背景图片是不是可以这样呢，今天至少在页面上看到了。</p>
<p>真好奇，立即启动火狐看了一下，哈哈，找到原因了，马上在试了一下IE，搞定，也OK，哈哈，如果不知道的同学们，我想你们也想知道这是怎么回事吧。</p>
<p>其实就是这个东东在做怪。。。</p>
<p><span style="font-size: 12px; line-height: 18px; font-family: Consolas, Monaco, 'Courier New', Courier, monospace; white-space: pre; background-color: #ffffff">-moz-transform: rotate(180deg);</span></p>
<p><span style="font-size: 12px; line-height: 18px; font-family: Consolas, Monaco, 'Courier New', Courier, monospace; white-space: pre; background-color: #ffffff">-webkit-transform: rotate(180deg); </span></p>
<p><span style="font-size: 12px; line-height: 18px; font-family: Consolas, Monaco, 'Courier New', Courier, monospace; white-space: pre; background-color: #ffffff">filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);</span></p>
<p><span style="font-size: 12px; line-height: 18px; font-family: Consolas, Monaco, 'Courier New', Courier, monospace; white-space: pre; background-color: #ffffff">三行代码，分别用来支持moz，webkit和IE的内核的浏览器。</span></p>
<p><span style="font-size: 12px; line-height: 18px; font-family: Consolas, Monaco, 'Courier New', Courier, monospace; white-space: pre; background-color: #ffffff">我们看看克军是怎么做的呢，他使用了JS，让代码立即执行的方式。。给页面增加一个&lt;sytle&gt;和相应的样式，并且为body增加相应的class.下面我将他的js代码贴出来。嘿嘿！</span></p><pre id="line534"><span id="firefox-tidy-id" style="background-color: #ddddff">;(function(){<br />var d = document, n = d.createElement('style'), r='.flip { -moz-transform: rotate(180deg);-webkit-transform: rotate(180deg);filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); }';<br />n.type = 'text/css';<br />if(n.styleSheet)<br />{<br />&nbsp;n.styleSheet.cssText = r;<br />}<br />else<br />{<br />&nbsp;n.appendChild(d.createTextNode(r))<br />}<br />d.getElementsByTagName('head')[0].appendChild(n);<br />d.body.className += ' flip';<br />}</span></pre>
<p>为了使用document方便，他把document传给了变量d,建立了一个style标签为变量n，把样式的内容传给<br />了变量r，克军的命名都很简洁。<br />在为这个n其实就是style标签了type这个属性。<br />下面是进行判断页面中style有不有属性，如果没有，直接将r，也就是样式的内容放入n中。<br />如果有，就得使用建立文本并且追加的方式。<br />我不知道我的解释对不对哈，反正大概意思就是这样的，欢迎指正。<br />一切准备就绪以后，就将n添加到head中去，在将class增加到body上，这样页面一加载。。。。你的页面就会被旋转180度，当然你可以旋转90度，10度，数字是可以调整的哟。</p>
<p><strong>2010.09.30 &nbsp;今天在使用过程中，最后发现，原来ie只支持4个值，分别旋转值可以是1，2，3或4。这些数字分别代表90，180，270，或360度旋转。<br /></strong></p><img src ="http://www.blogjava.net/xiaosao/aggbug/352061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-06-10 18:08 <a href="http://www.blogjava.net/xiaosao/archive/2011/06/10/352061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;Web前端工程师技能列表</title><link>http://www.blogjava.net/xiaosao/archive/2011/06/10/352060.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Fri, 10 Jun 2011 10:04:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2011/06/10/352060.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/352060.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2011/06/10/352060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/352060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/352060.html</trackback:ping><description><![CDATA[<p>要打造<strong>一流的Web产品</strong>开发团队，在团队成员基础能力上一定要下功夫。对于Web前端产品开发来说，仅仅掌握Web1.0时代简单的&#8221;网页套接&#8221;是完全不够的。我结合自己的团队配备，特此罗列了Web前端产品工程师所涉及的技能列表如下：</p>
<p>通过许多实际项目，个人认为一个完备的前端产品开发团队，必须拥有如下的人才配备，也希望大家补充：</p>
<ul><li>团队全体成员达到所有技能中的a级标准</li><li>团队全体成员必须掌握两项技能中的b级标准，并保证所有的b级标准在该团队中有50%以上成员能达到</li><li>团队全体成员必须掌握一项技能中的c级标准，并保证所有的c级标准在该团队中有25%以上成员能达到 </li></ul>
<p>具体技能描述：</p>
<ul><li><strong>【必备】UserInterface</strong></li><li style="list-style-type: none">
<ol><li>PhotoShop/Fireworks Design<br />a &#8211; 配合美工将草图形成具体的符合WebPage的设计<br />b &#8211; 有快速制作分层高品质PSD、PNG的能力<br />c &#8211; 能迅速将PSD、PNG的内容构思成div+css或者table等HTML代码</li><li>Flash Design<br />a &#8211; 基本动画效果<br />b &#8211; 复杂的交互体系设计，了解第三方swf辅助设计软件<br />c &#8211; 复杂的交互体系设计以及较强的对各类外埠资源（PNG、JPG、MP3、WAV等）的整合能力。精通部分第三方辅助设计软件（AE、SwishMax、Swift3D等） </li></ol></li><li><strong>【必备】Browser-side (Web Application)</strong></li><li style="list-style-type: none">
<ol><li>XHTML/CSS<br />a &#8211; 基本的layout实现<br />b &#8211; 严格跨平台的layout实现以<br />c &#8211; 优雅的HTML code，尽可能符合标准并有SEO的考虑因素。在任何平台、浏览器下基本保持一致。不要求了解各种CSS的hacks，但要求知道遇到问题应该如何查阅资料以在第一时间内解决。能够为JavaScript开发人员提供最好操作的DOM结构，让JS开发人员在开发的时候认为&#8221;一切都已经准备就绪了&#8221;，而不是&#8221;捉襟见肘&#8221;。</li><li>JavaScript/Ajax/DOM<br />a &#8211; 基本的DOM操作，了解AJAX，可以实现数据通信<br />b &#8211; 基本的DOM操作，能写高效率的OOP代码，以降低维护成本<br />c &#8211; 基于需求，进行不同的开发，选择合适的框架，做到代码效率最高，用户体验最好，代码下载量最小，并且可以在单独甚至更多产品线中最大限度重用代码</li><li>Flash Developement<br />a &#8211; 基于Timeline的ActionScript操作，能实现简单交互<br />b &#8211; 掌握a外，能实现数据层通信（与服务器以及本地SharedObject）<br />c &#8211; 精通AS1-3，能根据需求进行各类RIA开发。无论是要求支持FlashPlayer8的，还是FlashPlayer9的，都能做到开发效率最高、灵活性最大（比如对HTML层的接口设计，等等）。 </li></ol></li><li><strong>【必备】Client-side (Desktop Application)</strong> 
<ol><li>Apollo<br />a &#8211; 产品级的封装，基本技术了解（如何打包、如何加入HTML和JavaScript等）<br />b &#8211; 掌握a的同时，能利用Apollo的API独立设计、开发OS的文件I/O功能。<br />c &#8211; 掌握基本技能的同时，对&#8221;3D概念体系&#8221;有所认知。这里&#8221;3D&#8221;即：Design（设计）、Development（开发）、Deploy（产品部署）。能用Apollo</li><li>Windows Presentation Foundation、WPF/E（Silverlight）<br />（待定，欢迎补充） </li></ol></li><li><strong>【增补】Server-side</strong> （修改：经考虑，这个技能不参与评级）<br />本来列举了&#8221;1、Server端简单的技术、脚本&#8221;和&#8221;2、MediaServer（Red5）接口&#8221;作为&#8221;<strong>Web前端工程师技能列表</strong>&#8220;的一种（服务器、数据逻辑层技能的）评判标准。但似乎很多朋友对于前端工程师是否应该掌握Server端技能的必要性表示怀疑。确实，要掌握好上述的展现层技能不是意见容易的事情，而且前端工程师的确非常辛苦。但是，站在另一方面来说，辛苦的原因是什么，我不知道在你日夜奋战div+CSS的时候思考过没有。就我的经验，前端的辛苦在于以下几个方面： 
<p>&nbsp;</p>
<ol><li><strong>重复劳动多</strong>，大量的div+css都是重复的，即便可以复制粘贴，但几千行的div海洋中去寻找一个入口恐怕都非常痛苦</li><li><strong>需求变更多</strong>，往往你折腾几个小时终于把跨平台问题解决好了，而且在IE6、7和Firefox下面都能显示同样的效果了，甚至连JavaScript交互都已经快搞定了。突然上面说需求要变。这无疑是莫大的痛苦。 </li></ol>
<p>也许表面上看，这跟Server端技能无关，但我觉得有好的Server端的意识，一定会有所帮助（当然不可能解决所有的问题）。毕竟信息结构和数据库是密切相关的，而Server是连接数据库的唯一渠道（至少大多数B/S应用是如此）。掌握Server端的基本技能，对于同逻辑层开发人员设计接口是非常重要的。而且HTML表现层在开发时与数据的分离，也与Server端的各种模板技术有关。例如PHP中的Smarty模板（我曾经用的）、jsp的model2概念等等。HTML结构如何设计，如何让HTML重用，甚至在HTML层进行OOP的开发（我现在在新产品线中设计的前端开发流程），都需要Server端的支持。最起码，你要告诉php程序员你需要什么。如果你完全对PHP一无所知的话，那也无从谈起了。<br />此外，对于创业团队，往往人手非常有限。为了让运营成本降到最低，所有的技术人员都有义务对Server端技术有所了解。如果为了修改一个网页的标题还要跑去喊PHP程序员连接Remote Server的话，那实在是增加了整个公司的运营成本。<br />总结：我认为，可以不了解技术细节，但应该知道原理，最好能掌握一两套设计思想（毕竟数据逻辑都在这里走，光看HTML和JavaScript，对人的见识还是有局限的，这种局限限制了我自己很久的时间），那将是一比宝贵的财富。 </p></li><li><strong>【增补】Mobile-side</strong>（不参与评级） 
<ol><li>Flashlite<br />（待定，欢迎补充）</li><li>Java？<br />（待定，欢迎补充） </li></ol></li></ul>
<p>看到很多朋友留言说前端工程师没前途，我在想，同时掌握移动设备的技能是否也是拓展前途的一个必要性？这里再多说几句，关于技术人员的前途，目前在国内确实得用&#8221;惨淡&#8221;来形容。浮躁的氛围让技术人才往往过早放弃了自己的技术生涯，而尔虞我诈的整体道德水平也让单纯的技术人员痛不欲生（我身边太多了，恩，不说具体细节了，呵呵）。</p>
<p>作为一个技术人员，开发人员，在保持纯粹地敬业心态（这是前提，这么没有，啥也别谈）外，更要学会如何保护自己，如何壮大自身，社会不会同情你，只有你自己才能保护你自己。</p>
<p id="gulink">本文来自：<a title="【更新整理】Web前端工程师技能列表" href="http://www.awflasher.com/blog/archives/906">http://www.awflasher.com/blog/archives/906</a></p><img src ="http://www.blogjava.net/xiaosao/aggbug/352060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-06-10 18:04 <a href="http://www.blogjava.net/xiaosao/archive/2011/06/10/352060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;webkit webApp 开发技术要点总结</title><link>http://www.blogjava.net/xiaosao/archive/2011/06/09/351982.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Thu, 09 Jun 2011 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2011/06/09/351982.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/351982.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2011/06/09/351982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/351982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/351982.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文地址：http://www.cnblogs.com/pifoo/archive/2011/05/28/webkit-webapp.html如果你是一名前端er,又想在移动设备上开发出自己的应用，那怎么实现呢？幸好，webkit内核的浏览器能帮助我们完成这一切。接触 webkit webApp的开发已经有一段时间了，现把一些技巧分享给大家 ：1. viewport：也就是可视区域。对于桌面浏览器...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaosao/archive/2011/06/09/351982.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaosao/aggbug/351982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-06-09 14:24 <a href="http://www.blogjava.net/xiaosao/archive/2011/06/09/351982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;Jquery插件Thickbox的使用总结及自定义设置 </title><link>http://www.blogjava.net/xiaosao/archive/2011/04/26/349052.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Tue, 26 Apr 2011 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2011/04/26/349052.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/349052.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2011/04/26/349052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/349052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/349052.html</trackback:ping><description><![CDATA[http://www.cnblogs.com/dupeng0811/archive/2011/03/11/1981270.html<br />
<div id="cnblogs_post_body">
<p>ThickBox运行需要的文件</p>
<p>官方下载：</p>
<p class="csharpcode">Download <a href="http://jquery.com/demo/thickbox/thickbox-code/thickbox.js">thickbox.js</a> or <a href="http://jquery.com/demo/thickbox/thickbox-code/thickbox-compressed.js">thickbox-compressed.js</a>, <a href="http://jquery.com/demo/thickbox/thickbox-code/thickbox.css">ThickBox.css</a>, and the loading graphic (<a href="http://jquery.com/demo/thickbox/images/loadingAnimation.gif">loadingAnimation.gif</a>) to your local machine (or cut and paste the code from the tabs). Along with these three files, a copy of the <a href="http://jquery.com/src/jquery-latest.js">jQuery JavaScript library</a> is needed. For this site, and ThickBox, I am using the <a href="http://jquery.com/src/jquery-latest.pack.js">compressed version of jQuery.</a></p>
<p>首先在 HTML 文件的 head中导入jquery.js 和thickbox.js文件，导入 thickbox.css 文件;并且jquery.js 文件放在前面：</p>
<pre class="csharpcode"><span style="color: #0000ff">&lt;</span><span style="color: #800000">script</span> <span style="color: #ff0000">src</span>=<span style="color: #0000ff">"../Scripts/jquery-latest.pack.js"</span> <span style="color: #ff0000">mce_src</span>=<span style="color: #0000ff">"Scripts/jquery-latest.pack.js"</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">"text/javascript"</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">script</span> <span style="color: #ff0000">src</span>=<span style="color: #0000ff">"../Scripts/thickbox.js"</span> <span style="color: #ff0000">mce_src</span>=<span style="color: #0000ff">"Scripts/thickbox.js"</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">"text/javascript"</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">link</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"../Styles/thickbox.css"</span> <span style="color: #ff0000">mce_href</span>=<span style="color: #0000ff">"Styles/thickbox.css"</span> <span style="color: #ff0000">rel</span>=<span style="color: #0000ff">"stylesheet"</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">"text/css"</span> <span style="color: #0000ff">/&gt;</span>  </pre>
<p>最后你只要给元素添加 class=&#8221;thickbox&#8221; 属性就可以开始用 thickbox</p>
<p>实现了一张图片的弹出展示功能：</p>
<pre class="csharpcode"><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"&#8221;bg.jpg&#8221;"</span> <span style="color: #ff0000">mce_href</span>=<span style="color: #0000ff">"&#8221;bg.jpg&#8221;"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">&#8221;thickbox&#8221;</span> <span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">img</span> <span style="color: #ff0000">src</span>=<span style="color: #0000ff">"&#8221;bg.jpg&#8221;"</span> <span style="color: #ff0000">mce_src</span>=<span style="color: #0000ff">"&#8221;bg.jpg&#8221;"</span> <span style="color: #ff0000">alt</span>=<span style="color: #0000ff">&#8221;图片&#8221;</span><span style="color: #0000ff">/&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>
//只需要指定图片的class为thickbox</pre>
弹出框使用方法：
<pre class="csharpcode"><span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"Default.aspx?keepThis=true&amp;TB_iframe=true&amp;height=400&amp;width=500"</span> <span style="color: #ff0000">title</span>=<span style="color: #0000ff">"主页"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"thickbox"</span> &lt;/<span style="color: #ff0000">a</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">onclick</span>=<span style="color: #0000ff">"&lt;web.path:path/&gt;/bannedUserList!unBannedUserList?height=400&amp;width=800&amp;inlineId=myOnPageContent"</span> <span style="color: #ff0000">title</span>=<span style="color: #0000ff">"弹出层"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"thickbox"</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">"button"</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">"Ban Another"</span> <span style="color: #0000ff">/&gt;</span>
//内嵌内容
<span style="color: #0000ff">&lt;</span><span style="color: #800000">input</span> <span style="color: #ff0000">alt</span>=<span style="color: #0000ff">"#TB_inline?height=300&amp;width=400&amp;inlineId=myOnPageContent"</span> <span style="color: #ff0000">title</span>=<span style="color: #0000ff">"标题"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"thickbox"</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">"button"</span> <span style="color: #ff0000">value</span>=<span style="color: #0000ff">"Show"</span> <span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"#TB_inline?height=155&amp;width=300&amp;inlineId=hiddenModalContent&amp;modal=true"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"thickbox"</span><span style="color: #0000ff">&gt;</span>显示隐藏内容a&gt;
//遮罩层
URL后面加?KeepThis=true&amp;TB_iframe=true&amp;height=400&amp;width=600
参数字符串中加 modal=true
?KeepThis=true&amp;TB_iframe=true&amp;height=400&amp;width=600&amp;modal=true
这样当关闭ThickBox时会调用ThickBox iframe (self.parent.tb_remove())内部的一个tb_remove()函数
所有其他参数字符都必须在TB_iframe 参数之前。URL中所有"TB" 之后的将被移除。
<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"index.html?keepThis=true&amp;TB_iframe=true&amp;height=250&amp;width=400"</span> <span style="color: #ff0000">title</span>=<span style="color: #0000ff">"标题"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"thickbox"</span><span style="color: #0000ff">&gt;</span>打开一个页面<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"index.html?keepThis=true&amp;TB_iframe=true&amp;height=300&amp;width=500"</span> <span style="color: #ff0000">title</span>=<span style="color: #0000ff">"标题"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"thickbox"</span><span style="color: #0000ff">&gt;</span>打开一个页面<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">a</span> <span style="color: #ff0000">href</span>=<span style="color: #0000ff">"index.html?placeValuesBeforeTB_=savedValues&amp;TB_iframe=true&amp;height=200&amp;width=300&amp;modal=true"</span> <span style="color: #ff0000">title</span>=<span style="color: #0000ff">"标题"</span> <span style="color: #ff0000">class</span>=<span style="color: #0000ff">"thickbox"</span><span style="color: #0000ff">&gt;</span>打开一个页面<span style="color: #0000ff">&lt;/</span><span style="color: #800000">a</span><span style="color: #0000ff">&gt;</span>  </pre>
<p>&nbsp;</p>
<p>自定义设置：</p>
<p>1、弹出窗口(div)右上角的关闭按钮为显示为"close or esc key"，而不是中文的; 如果想把它变成[X]或"关闭"应该怎么来办呢？</p>
<pre class="csharpcode">将thickbox.js文件打开，查找关键字"<span style="color: #8b0000">or esc key</span>"，将其删除，并将前面的close更改为[X]或"<span style="color: #8b0000">关闭</span>"，然后把文件另存为UTF-8格式，如果不保存为UTF-8的话，将会出现乱码。</pre>
2、thickbox 弹出层的遮住层透明度修改
<p>打开thickbox.css查找.TB_overlayBG 进行更改</p>
<pre class="csharpcode">.<span style="color: #800000">TB</span>_<span style="color: #800000">overlayBG</span> {
<span style="color: #ff0000">background-color</span>:<span style="color: #0000ff">#000</span>;
<span style="color: #ff0000">filter</span>:<span style="color: #0000ff">alpha(opacity=75)</span>;
<span style="color: #ff0000">-moz-opacity</span>: <span style="color: #0000ff">0.75</span>;
<span style="color: #ff0000">opacity</span>: <span style="color: #0000ff">0.75</span>;
}</pre>
<p>3、关闭层：如果我们需要自己添加一个关闭按钮或者图片可以使用：</p>
<pre class="csharpcode">onclick="self.parent.tb_remove();"  </pre>
<p>4、关闭层刷新父页面,修改关闭方法 ：</p>
<pre class="csharpcode"><span style="color: #0000ff">function</span> tb_remove() {
$("<span style="color: #8b0000">#TB_imageOff</span>").unbind("<span style="color: #8b0000">click</span>");
$("<span style="color: #8b0000">#TB_closeWindowButton</span>").unbind("<span style="color: #8b0000">click</span>");
$("<span style="color: #8b0000">#TB_window</span>").fadeOut("<span style="color: #8b0000">fast</span>",<span style="color: #0000ff">function</span>(){$('#TB_window,#TB_overlay,#TB_HideSelect').trigger("<span style="color: #8b0000">unload</span>").unbind().remove();});
$("<span style="color: #8b0000">#TB_load</span>").remove();
<span style="color: #0000ff">if</span> (<span style="color: #0000ff">typeof</span> <span style="color: #0000ff">document</span>.body.style.maxHeight == "<span style="color: #8b0000">undefined</span>") {<span style="color: #008000">//if IE 6</span>
$("<span style="color: #8b0000">body</span>","<span style="color: #8b0000">html</span>").css({height: "<span style="color: #8b0000">auto</span>", width: "<span style="color: #8b0000">auto</span>"});
$("<span style="color: #8b0000">html</span>").css("<span style="color: #8b0000">overflow</span>","");
}
<span style="color: #0000ff">document</span>.onkeydown = "";
<span style="color: #0000ff">document</span>.onkeyup = "";
<span style="color: #008000">//刷新父页面，未指定</span>
<span style="color: #0000ff">window</span>.<span style="color: #0000ff">location</span>.reload();
<span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span>;
}</pre>
<p>5、thickbox插件默认情况是点击灰色的遮罩层就会关闭取消</p>
<pre class="csharpcode">把两个$("<span style="color: #8b0000">#TB_overlay</span>").click(tb_remove);去掉就可以取消掉</pre>
<p>6、updatepanel回发后thickbox失效的解决方法</p>
<pre class="csharpcode">只需把以下代码粘贴至页面中就OK了。
&lt;script type="<span style="color: #8b0000">text/javascript</span>" language="<span style="color: #8b0000">javascript</span>"&gt;
<span style="color: #0000ff">function</span> pageLoad()
{
<span style="color: #0000ff">var</span> isAsyncPostback = Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack();
<span style="color: #0000ff">if</span> (isAsyncPostback)
{
tb_init('a.thickbox, area.thickbox, input.thickbox');
}
}
&lt;/script&gt;</pre>
</div>
<img src ="http://www.blogjava.net/xiaosao/aggbug/349052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-04-26 16:59 <a href="http://www.blogjava.net/xiaosao/archive/2011/04/26/349052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;ThickBox 3.1参数详解</title><link>http://www.blogjava.net/xiaosao/archive/2011/04/26/349046.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Tue, 26 Apr 2011 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2011/04/26/349046.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/349046.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2011/04/26/349046.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/349046.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/349046.html</trackback:ping><description><![CDATA[http://www.cookseo.com/blog/web/ThickBox/<br />
前几天写了一篇关于<strong>ThickBox 3.1</strong>的文章：[<a href="http://www.cookseo.com/blog/css/ThickBox3.1/" target="_blank">ThickBox 3.1完美修正版下载</a>]，今天在使用这个东西的时候发现里面有许多参数没有详细解释，今天抽空整理出来，现和大家分享一下：<br />
<br />
先说几个参数：<br />
class="thickbox" 调用特效；<br />
height 打开页面的高度；<br />
width 打开页面的宽度；<br />
title="Iframe(Auto Hide)" title的内容；<br />
keepThis=true TB_iframe=true 这两个参数没搞明白什么意思，但通过框架来调用页面时不可缺少；<br />
#TB_inline 调用当前页面的层；<br />
inlineId 当前页面层的ID；<br />
modal=true 表示禁用title，去掉即可显示title及可自动关闭；<br />
<br />
1、调用框架，固定宽度和高度，超出显示滚动条 Iframe(auto hide):<br />
<p class="code"><code>&lt;a&nbsp;href="http://www.cookseo.com?keepThis=true&amp;TB_iframe=true&amp;height=500&amp;width=820"&nbsp;title="ThickBox&nbsp;3.1:调用框架，固定宽度和高度，超出显示滚动条"&nbsp;class="thickbox"&gt;OECSPACE&lt;/a&gt;</code></p>
<br />
2、打开页面，固定宽度和高度，无滚动条，禁用title, fixed width, fixed height<br />
<p class="code"><code>&lt;a&nbsp;href="boxs.html?keepThis=true&amp;TB_iframe=true&amp;height=100&amp;width=220&amp;modal=true"&nbsp;title="ThickBox&nbsp;3.1:modal=true表示禁用title，去掉即可显示title及可自动关闭"&nbsp;class="thickbox"&gt;Open&nbsp;iFrame&nbsp;Modal&lt;/a&gt;</code></p>
<br />
3、Ajax载入，自动宽度和高度，禁用title，页面无法查看源代码<br />
<p class="code"><code>&lt;a&nbsp;href="box.html?height=350&amp;width=350&amp;modal=true"&nbsp;title="ThickBox&nbsp;3.1:Ajax载入，页面无法查看源代码"&nbsp;class="thickbox"&gt;Example&lt;/a&gt;</code></p>
<br />
4、链接显示隐藏的层，层存在于页面中。<br />
<p class="code"><code>&lt;a&nbsp;href="#TB_inline?height=200&amp;width=300&amp;inlineId=hiddenModalContent&amp;modal=true"&nbsp;title="ThickBox&nbsp;3.1:链接显示隐藏层"&nbsp;class="thickbox"&gt;Show&nbsp;hidden&nbsp;modal&nbsp;content&lt;/a&gt;<br />
<br />
&lt;div&nbsp;id="hiddenModalContent"&nbsp;style="display:none"&gt;<br />
&lt;p&gt;ThickBox&nbsp;hidden&nbsp;modal&nbsp;content.&nbsp;Click&nbsp;to&nbsp;hide.&lt;/p&gt;<br />
&lt;p&nbsp;style="text-align:center"&gt;&lt;input&nbsp;type="submit"&nbsp;value="&nbsp;O&nbsp;K&nbsp;"&nbsp;onclick="tb_remove()"&nbsp;/&gt;&lt;/p&gt;<br />
&lt;/div&gt;</code></p>
<br />
5、按钮显示隐藏的层，层存在于页面中。<br />
<p class="code"><code>&lt;input&nbsp;alt="#TB_inline?height=150&amp;width=400&amp;inlineId=myOnPageContent&nbsp;"&nbsp;title="ThickBox&nbsp;3.1:按钮显示隐藏层"&nbsp;class="thickbox"&nbsp;type="button"&nbsp;value="Show"&nbsp;/&gt;<br />
<br />
&lt;div&nbsp;id="myOnPageContent"&nbsp;style="display:none"&gt;<br />
&lt;p&gt;ThickBox&nbsp;hidden&nbsp;modal&nbsp;content.Auto&nbsp;Hide.&lt;/p&gt;<br />
&lt;/div&gt;</code></p>
<br />
6、单张图片调用<br />
<p class="code"><code>&lt;a&nbsp;href="images/plant1.jpg"&nbsp;title="plant"&nbsp;class="thickbox"&gt;&lt;img&nbsp;src="images/plant1_t.jpg"&nbsp;alt="ThickBox&nbsp;3.1"&nbsp;/&gt;&lt;/a&gt;</code></p>
<br />
7、多张图片调用<br />
<p class="code"><code>&lt;a&nbsp;href="images/plant1.jpg"&nbsp;title="plant1"&nbsp;class="thickbox"&nbsp;rel="gallery-plants"&gt;&lt;img&nbsp;src="images/plant1_t.jpg"&nbsp;alt="ThickBox&nbsp;3.1&nbsp;1"&nbsp;/&gt;&lt;/a&gt;<br />
&lt;a&nbsp;href="images/plant2.jpg"&nbsp;title="plant2"&nbsp;class="thickbox"&nbsp;rel="gallery-plants"&gt;&lt;img&nbsp;src="images/plant2_t.jpg"&nbsp;alt="ThickBox&nbsp;3.1&nbsp;2"&nbsp;/&gt;&lt;/a&gt;<br />
&lt;a&nbsp;href="images/plant3.jpg"&nbsp;title="plant3"&nbsp;class="thickbox"&nbsp;rel="gallery-plants"&gt;&lt;img&nbsp;src="images/plant3_t.jpg"&nbsp;alt="ThickBox&nbsp;3.1&nbsp;3"&nbsp;/&gt;&lt;/a&gt;</code></p>
<br />
另外，如果不想点击图片关闭的话，找到thickbox.js，到128行，把下面的代码：<br />
<p class="code"><code>$("#TB_window").append("&lt;a&nbsp;href=''&nbsp;id='TB_ImageOff'&nbsp;title='Close'&gt;&lt;img&nbsp;id='TB_Image'&nbsp;src='"+url+"'&nbsp;width='"+imageWidth+"'&nbsp;height='"+imageHeight+"'&nbsp;alt='"+caption+"'/&gt;&lt;/a&gt;"&nbsp;+&nbsp;"&lt;div&nbsp;id='TB_caption'&gt;"+caption+"&lt;div&nbsp;id='TB_secondLine'&gt;"&nbsp;+&nbsp;TB_imageCount&nbsp;+&nbsp;TB_PrevHTML&nbsp;+&nbsp;TB_NextHTML&nbsp;+&nbsp;"&lt;/div&gt;&lt;/div&gt;&lt;div&nbsp;id='TB_closeWindow'&gt;&lt;a&nbsp;href='#'&nbsp;id='TB_closeWindowButton'&nbsp;title='Close'&gt;close&lt;/a&gt;&nbsp;or&nbsp;Esc&nbsp;Key&lt;/div&gt;");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</code></p>
改成：<br />
<p class="code"><code>$("#TB_window").append("&lt;img&nbsp;id='TB_Image'&nbsp;src='"+url+"'&nbsp;width='"+imageWidth+"'&nbsp;height='"+imageHeight+"'&nbsp;alt='"+caption+"'/&gt;"&nbsp;+&nbsp;"&lt;div&nbsp;id='TB_caption'&gt;"+caption+"&lt;div&nbsp;id='TB_secondLine'&gt;"&nbsp;+&nbsp;TB_imageCount&nbsp;+&nbsp;TB_PrevHTML&nbsp;+&nbsp;TB_NextHTML&nbsp;+&nbsp;"&lt;/div&gt;&lt;/div&gt;&lt;div&nbsp;id='TB_closeWindow'&gt;&lt;a&nbsp;href='#'&nbsp;id='TB_closeWindowButton'&nbsp;title='Close'&gt;close&lt;/a&gt;&nbsp;or&nbsp;Esc&nbsp;Key&lt;/div&gt;");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</code></p>
即可，说白了就是把链接去掉。
<img src ="http://www.blogjava.net/xiaosao/aggbug/349046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2011-04-26 16:15 <a href="http://www.blogjava.net/xiaosao/archive/2011/04/26/349046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;如何求素数</title><link>http://www.blogjava.net/xiaosao/archive/2008/05/28/203457.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 28 May 2008 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/05/28/203457.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/203457.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/05/28/203457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/203457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/203457.html</trackback:ping><description><![CDATA[<p>1。自然数是0，1，2&#8230;&#8230;<br />
2。素数是2，3，5&#8230;&#8230;（不包括1的只能背1和它本身整除的自然数）<br />
<br />
import java.util.Scanner;<br />
<br />
public class Prime {</p>
<p>&nbsp;&nbsp;&nbsp; //最基本的做法<br />
</p>
<p>&nbsp;&nbsp;&nbsp; private int prime1(int num) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i = 0, s = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; label1: for (int n = 2; n &lt;= num; n++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int m = 2; m * m &lt;= n; m++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (n % m == 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue label1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //System.out.println("第" + i + "个素数是：" + n);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return s;<br />
&nbsp;&nbsp;&nbsp; }<br />
</p>
<p>&nbsp;&nbsp;&nbsp; //<strong><font size="4"><font color="blue">6N&#177;1法</font></font></strong></p>
<p>&nbsp;&nbsp;&nbsp; private int prime2(int num){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int i = 0, s = 0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int n = 2; n &lt;=3; n ++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //System.out.println("第" + i + "个素数是：" + n);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; label1: for(int n = 1; ; n++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; label2: for (int m = 0; m &lt;= 1; m++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int tmp = 2 * (3 * n + m) - 1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (tmp &gt; num)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break label1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int k = 2; k * k &lt;= tmp; k++)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (tmp % k == 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (m == 0)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue label2;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; continue label1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; i++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //System.out.println("第" + i + "个素数是：" + tmp);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return s;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Scanner in = new Scanner(System.in);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int num = in.nextInt();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; long start = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int sum = new Prime().prime1(num);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; long end = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("方法一共" + sum + "个素数");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("用时：" + (end - start));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; start = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sum = new Prime().prime2(num);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; end = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("方法二共" + sum + "个素数");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("用时：" + (end - start));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p>
<p>输入：1000000</p>
<p>运行结果：</p>
<p><strong><font color="#0000ff" size="4">方法一共78498个素数<br />
用时：3434<br />
方法二共78498个素数<br />
用时：3453</font></strong></p>
<p>（看来基本方法比<strong><font size="4"><font color="blue">6N&#177;1法</font></font></strong>还要更快些，奇怪了，我的程序写的没什么问题阿）<br />
</p>
<p><strong><font color="#0000ff" size="4"><br />
</font></strong></p>
<p><strong><font color="#0000ff" size="4">【1】求10000以内的所有素数。<br />
</font></strong>素数是除了1和它本身之外再不能被其他数整除的自然数。由于找不到一个通项公式来表示所有的素数，所以对于数学家来说，
素数一直是一个未解之谜。像著名的
哥德巴赫猜想、孪生素数猜想，几百年来不知吸引了世界上多少优秀的数学家。尽管他们苦心钻研，呕心沥血，但至今仍然未见分晓。<br />
自从有了计算机之后，人们借助于计算机的威力，已经找到了2<sup>216091</sup>以内的所有素数。<br />
求素数的方法有很多种，最简单的方法是根据素数的定义来求。对于一个自然数N，用大于1小于N的各个自然数都去除一下N，如果都除不尽，则N为素数，否则N为合数。<br />
但是，如果用素数定义的方法来编制计算机程序，它的效率一定是非常低的，其中有许多地方都值得改进。<br />
第一，对于一个自然数N，只要能被一个非1非自身的数整除，它就肯定不是素数，所以不<br />
必再用其他的数去除。<br />
第二，对于N来说，只需用小于N的素数去除就可以了。例如，如果N能被15整除，实际<br />
上就能被3和5整除，如果N不能被3和5整除，那么N也决不会被15整除。<br />
第三，对于N来说，不必用从2到N一1的所有素数去除，只需用小于等于&#8730;N(根号N)的所有素数去除就可以了。这一点可以用反证法来证明：<br />
如果N是合数，则一定存在大于1小于N的整数d1和d2，使得N=d1&#215;d2。<br />
如果d1和d2均大于&#8730;N，则有：N＝d1&#215;d2&gt;&#8730;N&#215;&#8730;N＝N。<br />
而这是不可能的，所以，d1和d2中必有一个小于或等于&#8730;N。<br />
基于上述分析，设计算法如下：<br />
(1)用2，3，5，7逐个试除N的方法求出100以内的所有素数。<br />
(2)用100以内的所有素数逐个试除的方法求出10000以内的素数。<br />
首先，将2，3，5，7分别存放在a[1]、a[2]、a[3]、a[4]中，以后每求出一个素数，只要不大于100，就依次存放在A数组中的一个单元
中。当我们求100—10000之间的素数时，可依次用a[1]－a[2]的素数去试除N，这个范围内的素数可以不保存，直接打印。<br />
<br />
<font size="4"><strong><font color="blue">【2】用筛法求素数。</font></strong></font><br />
简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家，他在寻找素数时，采用了一种与众不同的方法：先将2－N的各数写在纸上：<br />
<img src="http://www.ywhs.net/yzren/pic/noip/prime_01.png" alt="" /><br />
在2的上面画一个圆圈，然后划去2的其他倍数；第一个既未画圈又没有被划去的数是3，将它画圈，再划去3的其他倍数；现在既未画圈又没有被划去的第一个数
是5，将它画圈，并划去5的其他倍数&#8230;&#8230;依次类推，一直到所有小于或等于N的各数都画了圈或划去为止。这时，表中画了圈的以及未划去的那些数正好就是小于
N的素数。<br />
<img src="http://www.ywhs.net/yzren/pic/noip/prime_02.png" alt="" /><br />
这很像一面筛子，把满足条件的数留下来，把不满足条件的数筛掉。由于这种方法是厄拉多塞首先发明的，所以，后人就把这种方法称作厄拉多塞筛法。<br />
在计算机中，筛法可以用给数组单元置零的方法来实现。具体来说就是：首先开一个数组：a[i]，i=1，2，3，&#8230;，同时，令所有的数组元素都等于下标
值，即a[i]=i，当i不是素数时，令a[i]=0
。当输出结果时，只要判断a[i]是否等于零即可，如果a[i]=0，则令i=i+1，检查下一个a[i]。<br />
筛法是计算机程序设计中常用的算法之一。<br />
<br />
<strong><font size="4"><font color="blue">【3】用6N&#177;1法求素数。</font></font></strong><br />
任何一个自然数，总可以表示成为如下的形式之一：<br />
6N，6N+1，6N+2，6N+3，6N+4，6N+5 (N=0，1，2，&#8230;)<br />
显然，当N&#8805;1时，6N，6N+2，6N+3，6N+4都不是素数，只有形如6N+1和6N+5的自然数有可能是素数。所以，除了2和3之外，所有的素数都可以表示成6N&#177;1的形式(N为自然数)。<br />
根据上述分析，我们可以构造另一面筛子，只对形如6 N&#177;1的自然数进行筛选，这样就可以大大减少筛选的次数，从而进一步提高程序的运行效率和速度。<br />
<img src="http://www.ywhs.net/yzren/pic/noip/prime_03.png" alt="" /><br />
在程序上，我们可以用一个二重循环实现这一点，外循环i按3的倍数递增，内循环j为0－1的循环，则2(i+j)-1恰好就是形如6N&#177;1的自然数。</p>
<p>http://www.blogjava.net/renyangok/archive/2006/11/20/82278.html</p>
<img src ="http://www.blogjava.net/xiaosao/aggbug/203457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-05-28 12:34 <a href="http://www.blogjava.net/xiaosao/archive/2008/05/28/203457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上传图片并生成略缩图 </title><link>http://www.blogjava.net/xiaosao/archive/2008/04/23/195226.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 23 Apr 2008 11:10:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/04/23/195226.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/195226.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/04/23/195226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/195226.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/195226.html</trackback:ping><description><![CDATA[<p>参数说明<br />
FileBox:上传表单中的表单名<br />
SavePath:保存路径<br />
ThumbnailWidth:略缩图宽<br />
ThumbnailHeight:略缩图高<br />
FilePath:文件保存路径（输出参数）<br />
FileName:文件名称（输出参数）<br />
LastError:（输出错误）<br />
public static bool UploadImages(System.Web.UI.HtmlControls.HtmlInputFile FileBox,string SavePath,Int32 ThumbnailWidth,Int32 ThumbnailHeight,out String FilePath,out String FileName,out string LastError)<br />
{<br />
DateTime datTime=System.DateTime.Now;<br />
String strTemp;<br />
string strFileName = FileBox.PostedFile.FileName;<br />
bool blnResult;<br />
LastError="";<br />
System.Drawing.Image xImage;<br />
System.Drawing.Bitmap xBitmap;<br />
int PhotoHeight,PhotoWidth;<br />
string BasePath=System.Web.HttpContext.Current.Server.MapPath("../");<br />
Rectangle NewPhoto;<br />
System.Drawing.Imaging.ImageFormat xObject;<br />
string Extension="";<br />
FileName="";<br />
FilePath="";<br />
<br />
try<br />
{<br />
if(strFileName=="")<br />
{<br />
LastError="请点击浏览选择要上传的文件!";<br />
return false;<br />
}<br />
if(Convert.ToDecimal(FileBox.PostedFile.ContentLength)&lt;= 2000000 &amp;&amp;Convert.ToDecimal(FileBox.PostedFile.ContentLength)&gt;1500)<br />
{<br />
//查看扩展名是否合法<br />
Extension=Path.GetExtension(strFileName);<br />
Extension=Extension.ToLower();<br />
if(Extension==".gif" || Extension==".jpg" || Extension==".jpeg" || Extension==".bmp")<br />
{<br />
switch(Extension)<br />
{<br />
case ".gif":<br />
xObject=System.Drawing.Imaging.ImageFormat.Gif;<br />
break;<br />
case ".bmp":<br />
xObject=System.Drawing.Imaging.ImageFormat.Bmp;<br />
break;<br />
default:<br />
xObject=System.Drawing.Imaging.ImageFormat.Jpeg;<br />
<br />
break;<br />
}<br />
}<br />
else<br />
{<br />
LastError="上传的文件不是有效的图片文件，请上传格式为：.gif.jpg.bmp的文件！";<br />
return false;<br />
}<br />
//-----------------------------<br />
//生成保存的文件路径及文件名<br />
//-----------------------------<br />
strTemp = datTime.ToShortDateString().Replace( "-", "");<br />
FileName = datTime.ToLongTimeString().Replace(":","")+ Extension;<br />
FilePath = SavePath + strTemp + "/";<br />
Friendlib.Function.CreateDirectory(BasePath + FilePath);<br />
//保存大图<br />
xImage=System.Drawing.Bitmap.FromStream(FileBox.PostedFile.InputStream);<br />
<br />
xImage.Save(BasePath+FilePath+FileName);<br />
xImage.Dispose();<br />
//-----------------------------<br />
//开始生成缩略图<br />
//-----------------------------<br />
xBitmap=new Bitmap(BasePath+FilePath+FileName);//------------------<br />
<br />
PhotoHeight=xBitmap.Height;<br />
PhotoWidth=xBitmap.Width;<br />
// //判断图片的形状 <br />
if(Convert.ToDecimal(PhotoHeight)/Convert.ToDecimal(PhotoWidth)&gt;Convert.ToDecimal(ThumbnailHeight)/Convert.ToDecimal(ThumbnailWidth))//高有余 <br />
{ <br />
PhotoHeight=Convert.ToInt16((Convert.ToDecimal(ThumbnailHeight)/Convert.ToDecimal(ThumbnailWidth))*Convert.ToDecimal(PhotoWidth)); <br />
NewPhoto=new Rectangle(0,0,PhotoWidth,PhotoHeight); <br />
} <br />
else if(Convert.ToDecimal(PhotoHeight)/Convert.ToDecimal(PhotoWidth)&lt;Convert.ToDecimal(ThumbnailHeight)/Convert.ToDecimal(ThumbnailWidth)) <br />
{ <br />
PhotoWidth=Convert.ToInt16((Convert.ToDecimal(ThumbnailWidth)/Convert.ToDecimal(ThumbnailHeight))*Convert.ToDecimal(PhotoHeight)); <br />
NewPhoto=new <br />
Rectangle(Convert.ToInt16((Convert.ToDecimal(xBitmap.Width)-Convert.ToDecimal(PhotoWidth))/2),0,PhotoWidth,PhotoHeight); <br />
} <br />
else <br />
{ <br />
NewPhoto= newRectangle(0,0,PhotoWidth,PhotoHeight); &lt; BR&gt; } <br />
System.Drawing.Image myBitmap; <br />
myBitmap=xBitmap.Clone(NewPhoto,System.Drawing.Imaging.PixelFormat.DontCare); <br />
System.Drawing.Image.GetThumbnailImageAbort myCallback = new <br />
System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); <br />
System.Drawing.Image myThumbnail = <br />
myBitmap.GetThumbnailImage(ThumbnailWidth,ThumbnailHeight, myCallback, <br />
IntPtr.Zero); myThumbnail.Save(BasePath + FilePath +"s"+FileName,xObject); <br />
myThumbnail.Dispose(); myBitmap.Dispose(); xBitmap.Dispose(); return true; } <br />
else <br />
{ <br />
blnResult=false; LastError="不能上传大于2M及小于1.5K的图片!"; <br />
} <br />
}&lt; BR&gt; catch (Exception ex) { <br />
throw new System.Exception((ex.Message + ("\r\n" + ex.StackTrace))); <br />
} <br />
return blnResult;<br />
}<br />
private static bool ThumbnailCallback() { return false; }<br />
//http://www.blogjava.net/happyfish/archive/2005/05/11/4162.html 原文地址<br />
</p>
<img src ="http://www.blogjava.net/xiaosao/aggbug/195226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-04-23 19:10 <a href="http://www.blogjava.net/xiaosao/archive/2008/04/23/195226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java面试笔试题大汇总 及c/c++面试试题(转载) </title><link>http://www.blogjava.net/xiaosao/archive/2008/04/23/195223.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 23 Apr 2008 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/04/23/195223.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/195223.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/04/23/195223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/195223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/195223.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JAVA相关基础知识1、面向对象的特征有哪些方面&nbsp;&nbsp;&nbsp;1.抽象：抽象就是忽略一个主题中与当前目标无关的那些方面，以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题，而只是选择其中的一部分，暂时不用部分细节。抽象包括两个方面，一是过程抽象，二是数据抽象。2.继承：继承是一种联结类的层次模型，并且允许和鼓励类的重用，它提供了一种明确表述共性...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaosao/archive/2008/04/23/195223.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaosao/aggbug/195223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-04-23 19:08 <a href="http://www.blogjava.net/xiaosao/archive/2008/04/23/195223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>变态级JAVA程序员面试32问</title><link>http://www.blogjava.net/xiaosao/archive/2008/04/23/195220.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 23 Apr 2008 10:34:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/04/23/195220.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/195220.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/04/23/195220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/195220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/195220.html</trackback:ping><description><![CDATA[&nbsp;第一，谈谈final, finally, finalize的区别。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第四，&amp;和&amp;&amp;的区别。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第五，HashMap和Hashtable的区别。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第六，Collection 和 Collections的区别。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第七，什么时候用assert。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第八，GC是什么? 为什么要有GC? </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第九，String s = new String("xyz");创建了几个String Object?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十二，sleep() 和 wait() 有什么区别?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十三，Java有没有goto?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十四，数组有没有length()这个方法? String有没有length()这个方法?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十七，给我一个你最常见到的runtime exception。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十八，error和exception有什么区别?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十九，List, Set, Map是否继承自Collection接口?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十，abstract class和interface有什么区别?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十三，启动一个线程是用run()还是start()?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十四，构造器Constructor是否可被override?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十五，是否可以继承String类?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十八，编程题: 用最有效率的方法算出2乘以8等於几?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第三十二，编程题: 写一个Singleton出来。</p>
<p>以下是答案</p>
<p>第一，谈谈final, finally, finalize的区别。<br />
final—修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载<br />
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。<br />
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?<br />
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。<br />
Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&amp;page=1<br />
注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第四，&amp;和&amp;&amp;的区别。<br />
&amp;是位运算符。&amp;&amp;是布尔逻辑运算符。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第五，HashMap和Hashtable的区别。<br />
都属于Map接口的类，实现了将惟一键映射到特定的值上。<br />
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <br />
Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第六，Collection 和 Collections的区别。<br />
Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。<br />
Collection是个java.util下的接口，它是各种集合结构的父接口。</p>
<p>第七，什么时候用assert。<br />
断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 AssertionError。它用于调试目的： <br />
&nbsp; assert(a &gt; 0); // throws an AssertionError if a &lt; = 0 <br />
断言可以有两种形式：&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; assert Expression1 ; <br />
&nbsp; assert Expression1 : Expression2 ; <br />
Expression1 应该总是产生一个布尔值。 <br />
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。<br />
断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记：&nbsp; <br />
&nbsp; javac -source 1.4 Test.java<br />
要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <br />
要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <br />
要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <br />
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <br />
第八，GC是什么? 为什么要有GC? (基础)。<br />
GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <br />
&nbsp; System.gc()<br />
&nbsp; Runtime.getRuntime().gc()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第九，String s = new String("xyz");创建了几个String Object?<br />
两个对象，一个是&#8220;xyx&#8221;,一个是指向&#8220;xyx&#8221;的引用对象s。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?<br />
Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?<br />
short s1 = 1; s1 = s1 + 1;有错，s1是short型，s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十二，sleep() 和 wait() 有什么区别? 搞线程的最爱<br />
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非(a)&#8220;醒来&#8221;的线程具有更高的优先级<br />
(b)正在运行的线程因为其它原因而阻塞。<br />
wait()是线程交互时，如果线程对一个同步对象x 发出一个wait()调用，该线程会暂停执行，被调对象进入等待状态，直到被唤醒或等待时间到。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十三，Java有没有goto?<br />
Goto—java中的保留字，现在没有在java中使用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十四，数组有没有length()这个方法? String有没有length()这个方法？<br />
数组没有length()这个方法，有length的属性。<br />
String有有length()这个方法。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?<br />
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被&#8220;屏蔽&#8221;了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?<br />
Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。<br />
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十七，给我一个你最常见到的runtime exception。<br />
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, <br />
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第十八，error和exception有什么区别?<br />
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。<br />
exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。</p>
<p>第十九，List, Set, Map是否继承自Collection接口?<br />
List，Set是</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Map不是</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十，abstract class和interface有什么区别?<br />
声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。<br />
接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。</p>
<p>第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?<br />
都不能</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?<br />
接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十三，启动一个线程是用run()还是start()?<br />
启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。</p>
<p>&nbsp;&nbsp;&nbsp; 第二十四，构造器Constructor是否可被override?<br />
构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十五，是否可以继承String类?<br />
String类是final类故不可以继承。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?<br />
不能，一个对象的一个synchronized方法只能由一个线程访问。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?<br />
会执行，在return前执行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <br />
第二十八，编程题: 用最有效率的方法算出2乘以8等於几?<br />
有C背景的程序员特别喜欢问这种问题。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2 &lt;&lt;&nbsp; 3</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?<br />
不对，有相同的hash code。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? <br />
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <br />
第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?<br />
switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 第三十二，编程题: 写一个Singleton出来。<br />
&nbsp;&nbsp;&nbsp;&nbsp; Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。<br />
一般Singleton模式通常有几种种形式:<br />
第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。<br />
public class Singleton {<br />
private Singleton(){}<br />
//在自己内部定义自己一个实例，是不是很奇怪？<br />
//注意这是private 只供内部调用<br />
private static Singleton instance = new Singleton();<br />
//这里提供了一个供外部访问本class的静态方法，可以直接访问 <br />
public static Singleton getInstance() {<br />
return instance; <br />
} <br />
} <br />
第二种形式: <br />
public class Singleton { <br />
private static Singleton instance = null;<br />
public static synchronized Singleton getInstance() {<br />
//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次 <br />
//使用时生成实例，提高了效率！<br />
if (instance==null)<br />
instance＝new Singleton();<br />
return instance; } <br />
} <br />
其他形式:<br />
定义一个类，它的构造函数为private的，所有方法为static的。<br />
一般认为第一种形式要更加安全些 <br />
第三十三 Hashtable和HashMap <br />
Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; HashMap允许将null作为一个entry的key或者value，而Hashtable不允许 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在 <br />
多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap <br />
就必须为之提供外同步。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Hashtable和HashMap采用的hash/rehash算法都大概一样，所以性能不会有很大的差异。</p>
<img src ="http://www.blogjava.net/xiaosao/aggbug/195220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-04-23 18:34 <a href="http://www.blogjava.net/xiaosao/archive/2008/04/23/195220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 2000/2005 分页SQL — 单条SQL语句 </title><link>http://www.blogjava.net/xiaosao/archive/2008/04/23/195199.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 23 Apr 2008 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/04/23/195199.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/195199.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/04/23/195199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/195199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/195199.html</trackback:ping><description><![CDATA[<font face="Verdana">有关分页 SQL 的资料很多，有的使用存储过程，有的使用游标。本人不喜欢使用游标，我觉得它耗资、效率低；使用存储过程是个不错的选择，因为存储过程是经过预编译的，执行效率高，也更灵活。先看看单条 SQL 语句的分页 SQL 吧。<br />
<br />
方法1：<br />
适用于 SQL Server 2000/2005<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TOP</span><span style="color: #000000">&nbsp;页大小&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;table1<br />
</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #808080">NOT</span><span style="color: #000000">&nbsp;</span><span style="color: #808080">IN</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TOP</span><span style="color: #000000">&nbsp;页大小</span><span style="color: #808080">*</span><span style="color: #000000">(<span style="color: #000000">页</span>数</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">) id&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;table1&nbsp;</span><span style="color: #0000ff">ORDER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
</span><span style="color: #0000ff">ORDER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;id</span></div>
</font><br />
<font face="Verdana">方法2：<br />
适用于 SQL Server 2000/2005<br />
</font>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TOP</span><span style="color: #000000">&nbsp;页大小&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;table1<br />
</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #ff00ff">ISNULL</span><span style="color: #000000">(</span><span style="color: #ff00ff">MAX</span><span style="color: #000000">(id),</span><span style="font-weight: bold; color: #800000">0</span><span style="color: #000000">)&nbsp;<br />
</span><span style="color: #0000ff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TOP</span><span style="color: #000000">&nbsp;页大小</span><span style="color: #808080">*</span><span style="color: #000000">(<span style="color: #000000">页</span>数</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">) id&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;table1&nbsp;</span><span style="color: #0000ff">ORDER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )&nbsp;</span><span style="color: #000000">A<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
</span><span style="color: #0000ff">ORDER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;id</span></div>
<br />
<font face="Verdana">方法3：<br />
适用于 SQL Server 2005</font><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">TOP</span><span style="color: #000000">&nbsp;页大小&nbsp;</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">SELECT</span><span style="color: #000000">&nbsp;ROW_NUMBER()&nbsp;</span><span style="color: #0000ff">OVER</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">ORDER</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">BY</span><span style="color: #000000">&nbsp;id)&nbsp;</span><span style="color: #0000ff">AS</span><span style="color: #000000">&nbsp;RowNumber,</span><span style="color: #808080">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">FROM</span><span style="color: #000000">&nbsp;table1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;A<br />
</span><span style="color: #0000ff">WHERE</span><span style="color: #000000">&nbsp;RowNumber&nbsp;</span><span style="color: #808080">&gt;</span><span style="color: #000000">&nbsp;页大小</span><span style="color: #808080">*</span><span style="color: #000000">(页数</span><span style="color: #808080">-</span><span style="font-weight: bold; color: #800000">1</span><span style="color: #000000">)</span></div>
<br />
说明，页大小：每页的行数；页数：第几页。使用时，请把&#8220;页大小&#8221;和&#8220;页大小*(页数-1)&#8221;替换成数字。<br />
http://www.cnblogs.com/anjou/archive/2007/10/17/926944.html<br />
<img src ="http://www.blogjava.net/xiaosao/aggbug/195199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-04-23 18:15 <a href="http://www.blogjava.net/xiaosao/archive/2008/04/23/195199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 解析Java对象的equals()和hashCode()的使用</title><link>http://www.blogjava.net/xiaosao/archive/2008/04/11/192142.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Fri, 11 Apr 2008 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/04/11/192142.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/192142.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/04/11/192142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/192142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/192142.html</trackback:ping><description><![CDATA[<p>在Java语言中，equals()和hashCode()两个函数的使用是紧密配合的，你要是自己设计其中一个，就要设计另外一个。在多数情况
下，这两个函数是不用考虑的，直接使用它们的默认设计就可以了。但是在一些情况下，这两个函数最好是自己设计，才能确保整个程序的正常运行。最常见的是当
一个对象被加入收集对象（collection
object）时，这两个函数必须自己设计。更细化的定义是：如果你想将一个对象A放入另一个收集对象B里，或者使用这个对象A为查找一个元对象在收集对
象B里位置的钥匙，并支持是否容纳，删除收集对象B里的元对象这样的操作，那么，equals()和hashCode()函数必须开发者自己定义。其他情
况下，这两个函数是不需要定义的。</p>
<strong>equals():</strong>
<p>它是用于进行两个对象的比较的，是对象内容的比
较，当然也能用于进行对象参阅值的比较。什么是对象参阅值的比较？就是两个参阅变量的值得比较，我们
都知道参阅变量的值其实就是一个数字，这个数字可以看成是鉴别不同对象的代号。两个对象参阅值的比较，就是两个数字的比较，两个代号的比较。这种比较是默
认的对象比较方式，在Object这个对象中，这种方式就已经设计好了。所以你也不用自己来重写，浪费不必要的时间。</p>
对象内容的比较才是设计equals()的真正目的，Java语言对equals()的要求如下，这些要求是必须遵循的。否则，你就不该浪费时间：
<ul>
    <li>对称性：如果x.equals(y)返回是&#8220;true&#8221;，那么y.equals(x)也应该返回是&#8220;true&#8221;。 </li>
    <li>反射性：x.equals(x)必须返回是&#8220;true&#8221;。 </li>
    <li>类推性：如果x.equals(y)返回是&#8220;true&#8221;，而且y.equals(z)返回是&#8220;true&#8221;，那么z.equals(x)也应该返回是&#8220;true&#8221;。 </li>
    <li>还有一致性：如果x.equals(y)返回是&#8220;true&#8221;，只要x和y内容一直不变，不管你重复x.equals(y)多少次，返回都是&#8220;true&#8221;。 </li>
    <li>任何情况下，x.equals(null)，永远返回是&#8220;false&#8221;；x.equals(和x不同类型的对象)永远返回是&#8220;false&#8221;。</li>
</ul>
<strong>hashCode():<br />
</strong>这
个函数返回的就是一个用来进行赫希操作的整型代号，请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。后者不仅仅是个代号还具有在内存中才查找对
象的位置的功能。hashCode()所返回的值是用来分类对象在一些特定的收集对象中的位置。这些对象是HashMap, Hashtable,
HashSet，等等。这个函数和上面的equals()函数必须自己设计，用来协助HashMap, Hashtable,
HashSet，等等对自己所收集的大量对象进行搜寻和定位。<br />
<br />
这些收集对象究竟如何工作的，想象每个元对象hashCode是一个箱子的
编码，按照编码，每个元对象就是根据hashCode()提供的代号归入相应的箱子里。所有的箱子加起来就是一个HashSet，HashMap，或
Hashtable对象，我们需要寻找一个元对象时，先看它的代码，就是hashCode()返回的整型值，这样我们找到它所在的箱子，然后在箱子里，每
个元对象都拿出来一个个和我们要找的对象进行对比，如果两个对象的内容相等，我们的搜寻也就结束。这种操作需要两个重要的信息，一是对象的
hashCode()，还有一个是对象内容对比的结果。<br />
<br />
hashCode()的返回值和equals()的关系如下：<br />
<ul>
    <li>如果x.equals(y)返回&#8220;true&#8221;，那么x和y的hashCode()必须相等。 </li>
    <li>如果x.equals(y)返回&#8220;false&#8221;，那么x和y的hashCode()有可能相等，也有可能不等。</li>
</ul>
<p><br />
为
什么这两个规则是这样的，原因其实很简单，拿HashSet来说吧，HashSet可以拥有一个或更多的箱子，在同一个箱子中可以有一个
或更多的独特元对象（HashSet所容纳的必须是独特的元对象）。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个
元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。<br />
<br />
<strong>设计这两个函数所要注意到的：</strong><br />
如果你设计的对象类型并不使用于收集性对象，那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法，任何用户一时用不到的功能，就先不要设计，以免给日后功能扩展带来麻烦。</p>
<p>如果你在设计时想别出心裁，不遵守以上的两套规则，那么劝你还是不要做这样想入非非的事。我还没有遇到过哪一个开发者和我说设计这两个函数要违背前面说的两个规则，我碰到这些违反规则的情况时，都是作为设计错误处理。</p>
<p>当
一个对象类型作为收集型对象的元对象时，这个对象应该拥有自己处理equals()，和/或处理hashCode()的设计，而且要遵守前面所说
的两种原则。equals()先要查null和是否是同一类型。查同一类型是为了避免出现ClassCastException这样的异常给丢出来。查
null是为了避免出现NullPointerException这样的异常给丢出来。</p>
如果你的对象里面容纳的数据过多，那么这两个函数
equals()和hashCode()将会变得效率低。如果对象中拥有无法serialized的数据，equals()有可能在操作中出现错误。想象
一个对象x，它的一个整型数据是transient型（不能被serialize成二进制数据流）。然而equals()和hashCode()都有依靠
这个整型数据，那么，这个对象在serialization之前和之后，是否一样？答案是不一样。因为serialization之前的整型数据是有效的
数据，在serialization之后，这个整型数据的值并没有存储下来，再重新由二进制数据流转换成对象后，两者（对象在serialization
之前和之后）的状态已经不同了。这也是要注意的。<br />
<br />
&nbsp;<br />
原文 ：http://blog.csdn.net/RichardSundusky/archive/2007/02/12/1508028.aspx<br />
<img src ="http://www.blogjava.net/xiaosao/aggbug/192142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-04-11 12:11 <a href="http://www.blogjava.net/xiaosao/archive/2008/04/11/192142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Groovy轻松入门——通过与Java的比较，迅速掌握Groovy （更新于2007.09.23）</title><link>http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Fri, 29 Feb 2008 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/182943.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/182943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/182943.html</trackback:ping><description><![CDATA[<font color="#cc0000"><strong>原文：<font color="#990000"><a href="http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html">http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html</a></font> | <a id="AjaxHolder_Comments_CommentList_ctl01_NameLink" href="http://www.blogjava.net/BlueSUN/" target="_blank">山风小子</a><br />
注意：本教程是针对Groovy最新版本编写的</strong> </font><br />
<br />
Groovy和Java的相同点有：<br />
<font color="#0000cc">3+, </font><font color="#0000cc">4+, 6+, 8+, 10+, 12+, 13, 14, 15, 18+, 20+, 21, 22, 23, 28+, 29+, </font><font color="#0000cc">30+, 31+, 32+</font> <br />
<font color="#0000cc">+表示Groovy不但涵盖了Java的语法，而且还有增强部分<br />
<br />
Groovy和Java的不</font> <font color="#0000cc">同</font> <font color="#0000cc">点有：<br />
0, 1, 2, 5, 7, 9, 11, 16, 17, 19, 24, 25, 26, 27</font>&nbsp;<br />
<br />
<font color="#0000cc">下面所列序号不分先后顺序：</font><br />
<br />
<font color="#990000">0. 在Groovy可以用def定义无类型的变量(定义变量方面def与JavaScript中的var相似)，和返回值为无类型的方法，而在Java中没有def<br />
</font><font color="#009900">Groovy:<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Man&nbsp;{<br />
&nbsp;&nbsp;def&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;def&nbsp;introduce()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">I'm&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;return可以省略</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;}<br />
}</span></div>
<br />
</font><font color="#990000">1. Java中的equals方法对应Groovy中的== , 而Java中的==（判断是否引用同一对象）对应Groovy中的is方法</font><br />
eg.<br />
<font color="#009900">Test1.java :</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Test&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name1&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name2&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;String(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,0)">山风小子</span></span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Groovy中写为&nbsp;name1&nbsp;==&nbsp;name2</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1.equals(name2))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Groovy中写为&nbsp;name1.is(name2)</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1&nbsp;</span><span style="color: rgb(0,0,0)">==</span><span style="color: rgb(0,0,0)">&nbsp;name2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
}</span></div>
<br />
与Test1.java相对应的<br />
<font color="#009900">Test1.groovy :</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">String&nbsp;name1&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,0)">山风小子</span></span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;你也可以这样写：&nbsp;def&nbsp;name1&nbsp;=&nbsp;"山风小子"&nbsp;&nbsp;其中的def可以理解为JavaScript中定义变量的var</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">String&nbsp;name2&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;String(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,0)">山风小子</span></span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">请注意Groovy的句尾的分号时可选的，即可要可不要，前提是一行代码一条语句<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Java中写为&nbsp;name1.equals(name2)</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">==</span><span style="color: rgb(0,0,0)">&nbsp;name2)&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;equal</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Java中写为&nbsp;name1&nbsp;&nbsp;==&nbsp;name2</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(name1.is(name2))&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
}&nbsp;</span><span style="color: rgb(0,0,255)">else</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">not&nbsp;identical</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);&nbsp;<br />
}</span></div>
<br />
<font color="#990000">2. Java中的数组定义int[] a = {1, 2, 3}; 在Groovy写成int[] a = [1, 2, 3]<br />
3. Java中的for循环for (int i = 0; i &lt; len; i++) {...} 在Groovy中还可以写成for (i in 0..len-1) {...} 或者 for (i in 0..&lt;len) {...}<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">&nbsp;len;&nbsp;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
</span></div>
<font color="#009900">Groovy:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font size="+0"><font color="#990000"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">&nbsp;len;&nbsp;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
<br />
</span></font></font><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;或者<br />
</span></font></font><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(i&nbsp;in&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">..len</span><span style="color: rgb(0,0,0)">-</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(i&nbsp;in&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">..</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">len)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}<br />
</span></div>
<br />
4. Java中的方法返回写为return; 或者return obj; 在Groovy的方法中return是可选的<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
}</span></div>
<font color="#009900">Groovy:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">String&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">def&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
}</span></div>
<br />
5. Java中的inner class即内部类，在Groovy中用Closure实现（Closure是Java7正在考虑的一个特性，比inner class在语义方面更完善）<br />
6. Groovy中的注释比Java多了首行注释#!，其他与Java相同比如单行注释：//&nbsp;&nbsp;&nbsp; 多行注释：/*&nbsp; */&nbsp;&nbsp; 或者是&nbsp; 支持javadoc的/**&nbsp;&nbsp; */<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;多行注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;javadoc&nbsp;注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;单行注释</span></div>
<br />
<font color="#009900">Groovy:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">#! 首行</span></font></font><font color="#990000"><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">注释，使Unix shell能够定位Groovy启动程序以运行Groovy代码，例如</span></font></font></font><br />
<font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">#!/usr/bin/groovy<br />
</span></font></font><span style="color: rgb(0,128,0)"><br />
/*</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;多行注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">/**</span><span style="color: rgb(0,128,0)"><br />
&nbsp;*&nbsp;javadoc&nbsp;注释<br />
&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;单行注释</span></div>
<br />
<br />
7. Java5中的for-each：for (Type t : iteratable) {...}&nbsp; 在Groovy中，for (t in iteratable) {...}<br />
<font color="#009900">Java:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(Type&nbsp;t&nbsp;:&nbsp;iterable)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
<font color="#009900">Groovy:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(t&nbsp;in&nbsp;iterable)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
8. Groovy中switch语句与Java中相同，不过支持更多类型了，比如String<br />
9. Groovy的while语句跟Java相同，但废弃了do-while （考虑到语义方面的问题，而且do-while可以用其他形式的循环语句代替，使用频率低）<br />
10. Java中的String常量表示为"Hello, 山风小子"，在Groovy中可如下表示<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;双引号</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;单引号也可以</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)">Hello,&nbsp;山风小子</span><span style="color: rgb(0,0,0)">'</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">多行字符串</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">"""</span><span style="color: rgb(0,0,0)">Hello,</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"""<br />
</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">'''</span><span style="color: rgb(0,0,0)">Hello,</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">山风小子<br />
</span><span style="color: rgb(0,0,0)">'''<br />
</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;替代字符串</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">def&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;${name}</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">或者</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span></div>
</font><font color="#990000">11.在Groovy中定义类，定义方法与Java中定义类相同，唯一区别在于Groovy中类，属性以及方法默认都是public的，而在Java中默认是package的，另外，在Groovy中可以用def来定义方法，请看注释。<br />
<font color="#009900">Java:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;name);<br />
&nbsp;&nbsp;}<br />
}</span></div>
</font><font color="#009900">Groovy:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;name&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">println<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />与Java中System.out.println(<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)相同</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">/*</span><span style="color: rgb(0,128,0)">&nbsp;sayHello也可以这样定义<br />
&nbsp;&nbsp;def&nbsp;sayHello()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;"Hello,&nbsp;$name"<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">*/</span><span style="color: rgb(0,0,0)"><br />
}</span></div>
<br />
<font color="#990000">12.对象创建在Java写为Thought t = new Thought(); 在Groovy也可以这样写，不过还多了种写法：def t = new Thought();<br />
13.静态方法调用在Java和Groovy中相同，即ClassName.staticMethodName();<br />
14.实现接口和继承父类方面Groovy也与Java完全相同，即实现接口class ClassName implements InterfaceName {...}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 继承父类：class ClassName extends SuperClass {...}<br />
15.定义接口方面Groovy与Java完全相同，即interface InterfaceName {...}&nbsp; //在Groovy中默认为public的<br />
16.正则表达式常量在Java中没有，在Groovy中表示为 /pattern/ <br />
17.Hash常量(类型为java.util.HashMap)在Java没有，在Groovy中表示为 def frequence = ["the": 5, "hello": 2, "world": 2]<br />
18.类变量即static变量，Groovy与Java相同，static String name = "山风小子"，在Groovy也可写为static name = "山风小子"<br />
19.在varargs方法方面，Groovy与Java稍有区别，如下所示：<br />
<font color="#009900">Java:</font><br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;Java:&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;varargsMethod(Type<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
<font color="#009900">Groovy:<br />
</font>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">def&nbsp;varargsMethod(Type[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">do&nbsp;something</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">}</span></div>
<br />
20.引用当前对象，Groovy和Java相同，在Java中用this表示，在Groovy中也用this表示，而且在Groovy中，this可以出现在static范围中，指向所在类的类对象，本例中，this等同于</font><font color="#990000">ThisInStaticScope.class（Java写法</font><font color="#990000">）</font><font color="#990000">或</font><font color="#990000">ThisInStaticScope（Groovy写法）</font><font size="+0"><font color="#990000"></font></font><font color="#990000">
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;ThisInStaticScope&nbsp;{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;请不要诧异，参数类型可以省略。如果方法声明中有</span><font size="+0"><font color="#990000"><font size="+0"><font color="#990000"><span style="color: rgb(0,128,0)">修饰</span></font></font><span style="color: rgb(0,128,0)">关键字比如</span></font></font><span style="color: rgb(0,128,0)">public，synchronized，static等</span><font size="+0"><font color="#990000"></font></font><span style="color: rgb(0,128,0)">，则返回值类型可以省略。</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">static</span><span style="color: rgb(0,0,0)">&nbsp;main(args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
21.子类中调用父类方法，Groovy和Java也相同，在Java中 super.methodName() ，在Groovy中 super.methodName()<br />
22.命名空间的定义，Groovy和Java相同，在Java中 package edu.ecust.bluesun;&nbsp;&nbsp; 在Groovy中 package edu.ecust.bluesun&nbsp;&nbsp;&nbsp;&nbsp; （分号可省略）<br />
23.在导入类方面，Groovy和Java相同，在Java中 import edu.ecust.bluesun.GroovyTest;&nbsp; 在Groovy中 import edu.ecust.bluesun.GroovyTest<br />
24.List常量(类型为java.util.ArrayList)在Java中没有， 在Groovy中表示为 def list = [3, 11, "Hello", "山风小子", "!"]<br />
25.在异常处理方面，Groovy与Java相同，除了不强制程序员捕获检查异常(checked exception)外 (这跟C#很像，如果我没记错的话 :) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并且在方法声明时，也可以不写throws语句。<br />
26.方法的默认参数，Java中没有，Groovy中表示如下：<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Hello&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">如果没有参数传入，默认打印出&nbsp;Hello,&nbsp;山风小子</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;def&nbsp;greet(name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello,&nbsp;$name</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">)&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">也可省略括号()</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;}<br />
}</span></div>
27.在Groovy中，语句如果单独占一行的话，句尾的分号(;)可以省略，而在Java中每条语句后面必须跟有分号(;)<br />
28.在Groovy中，如果不是Boolean或boolean类型，非null或非空(空字符串，[]，[:])为true，null为false，而Java中对象不可以表示true或false；如果是Boolean或boolean类型，与Java中的一样。<br />
29.在Groovy中，万事万物都是对象！而Java中不是这样，基本类型(primitive type)就不是对象。<br />
30.在Java中，Class对象表示为ClassName.class，而在Groovy中，可以直接用ClassName表示Class对象<br />
31.Groovy会自动导入java.lang.*, java.util.*, java.net.*, java.io.*, java.math.BigInteger, java.math.BigDecimal,&nbsp;&nbsp; groovy.lang.*, groovy.util.*，而Java则只自动导入java.lang.*<br />
32.Groovy不仅有? :三元操作符，还有?:两元操作符，但Java只有? :三元操作符。<br />
</font><font color="#990000"><font color="#009900">Groovy:<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: rgb(0,0,0)">def&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">&nbsp;如果a为&#8220;空&#8221;（null，空串""，[]，[:]），那么结果为?:之后的那个值;&nbsp;如果不为&#8220;空&#8221;，那么结果就是a</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">def&nbsp;result&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">?</span><span style="color: rgb(0,0,0)">:&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">default&nbsp;result</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
println&nbsp;result<br />
<br />
a&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">山风小子</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
result&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;a&nbsp;</span><span style="color: rgb(0,0,0)">?</span><span style="color: rgb(0,0,0)">:&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">default&nbsp;result</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)"><br />
println&nbsp;result</span></div>
<br />
<br />
<br />
</font></font><font color="#990000"><br />
<font color="#660000"><font color="#cc0000">由上可知，Groovy几乎完全兼容Java的语法，难怪&#8216;江南白衣&#8217;称Groovy是Java的&#8216;私生子&#8217;；但由于Groovy不仅借鉴了Java 95%以上的特性，而且还借鉴了许多卓越的动态语言，比如Python, Ruby等，使Groovy成为极其高效敏捷的编程语言，而不仅仅是Java的副本。所以其实Java++可以作为Groovy的别名，即具有动态特性的Java。<br />
</font></font><br />
最后，我想补充一句：Groovy的特性远不至所列的这些，比如还有Mixins，builder系列:MarkupBuilder,SwingBuilder等，很多都是Groovy中有而Java中没有，因此就不一一列举了，想继续深入学习Groovy，可访问Groovy官方网站：<a href="http://groovy.codehaus.org/">http://groovy.codehaus.org</a>&nbsp;，里面有很多例子和教程供大家参阅，也可以参考在下的Groovy高效编程系列（其中一些是在下的笔记）。网上也有《Groovy In Action》电子书下载，大家不妨搜一下。<br />
<br />
<br />
<font color="#000099"><strong>参考文献<br />
</strong></font><font color="#660000">Differences from Java:</font><a href="http://groovy.codehaus.org/Differences+from+Java">http://groovy.codehaus.org/Differences+from+Java</a></font>
<img src ="http://www.blogjava.net/xiaosao/aggbug/182943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-02-29 15:30 <a href="http://www.blogjava.net/xiaosao/archive/2008/02/29/182943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Groovy和Grails简介</title><link>http://www.blogjava.net/xiaosao/archive/2008/02/21/181031.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Thu, 21 Feb 2008 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/02/21/181031.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/181031.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/02/21/181031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/181031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/181031.html</trackback:ping><description><![CDATA[<h3>转载：原文地址 http://dev2dev.bea.com.cn/techdoc/200601194089.html</h3>
<h3>摘要</h3>
<p>　　Java Web应用程序框架是企业Java得以成功的重要原因之一。人们怀疑如果没有Apache Struts框架Java EE是否能够如此成功。虽然底层编程语言很重要，但通常是框架使编程语言成为引人注目的中心的。如果您经常访问讨论论坛，就会注意到Ruby语言和Ruby On Rails框架之间也是这种情况。Ruby已经出现十多年了，然而只是在Ruby On Rails框架流行之后，开发人员才开始注意到Ruby语言。</p>
<p>　　诸如Ruby、PHP和Python之类的脚本语言最近几年越来越流行，因此，需要开发一个Java脚本备选语言和类似Rails的针对Java环境的框架。Groovy就是这个脚本语言，而Grails就是这个框架。</p>
<p>　　在本文中我将讨论Groovy的Web开发功能，然后继续讨论Grails框架。我将开发一个示例Grails Web应用程序，并讨论此框架的各种特性。</p>
<h3>Groovy是什么？</h3>
<p>　　<a href="http://groovy.codehaus.org/" target="_blank">Groovy</a>是一种语言，其语法类似于Java，但比Java更简单。它通常被视为脚本/灵活/动态的语言，但是我不喜欢这类形容词，因为我认为它们只会令人困惑。如果说Java是一位明智的中年男子，那么Groovy就是他十几岁的儿子。Groovy具有父亲的许多特点，但是更为狂野且更为有趣。他们也可以很好地合作。</p>
<p>　　Groovy的规则比Java少得多。例如，要在Java中获得标准的"Hello World"输出，您需要编写一个类、一个具有合适参数的主方法，等等。但是在Groovy中，如果不想编写所有样板代码，您可以抛开类定义和主方法，仅编写一行代码即可打印出"Hello World"。</p>
<p>　　以下是打印Hello World的文件 Hello.groovy 的内容：</p>
<pre class="code">println "Hello World" </pre>
<p>　　Java平台仅关心使字节码得到执行。同样，此平台不强迫您使用Java语言。只要提供了字节码，工作就会进行。Groovy代码会被编译为字节码，而对于Java平台来说，字节码是从Java代码还是Groovy代码生成的并没有任何区别。</p>
<p>　　以下是一个Groovy例子，它显示了Groovy对清单、映射和范围的内置支持，并证明了Groovy的简单性及其利用Java的强大功能的能力：</p>
<pre class="code">// Print Date
def mydate = new java.util.Date()
println mydate
//Iterate through a map
def numbersMAP = ['1':'ONE', '2':'TWO']
for (entry in numbersMAP) {
println "${entry.key} = ${entry.value}"
}
//Introducing the range
def range = 'a'..'d'
//Lists
def numberlist = [1, 2, 3, 4, 5, 6, 7, 8]
println numberlist;
println "Maximum value: ${numberlist.max()}"
</pre>
<p>　　请注意以上代码直接使用java.util.Date ，对收集的内置支持减少了使用清单、映射和范围所需的代码。还有许多其他有趣的Groovy特性，例如闭包和简化的XML处理。您可以在<a href="http://groovy.codehaus.org/" target="_blank">groovy.codehaus.org</a>上找到详细清单。</p>
<p>　　现在让我们来讨论如何将Groovy用于Web开发。</p>
<h3>使用Groovy进行Web开发</h3>
<p>　　大多数Java EE教程都从一个基本servlet例子开始。对于Groovy Web开发来说，您将从groovlet（在groovy中servlet的对应概念）开始。如果您在servlet中摆脱了类和doXX() 方法声明，那么剩下的内容就与groovlet很像了。以下是一个名为 Login.groovy 的groovlet例子，您需要将它置于Web应用程序的最高级目录：</p>
<pre class="code">def username= request.getParameter("username")
def password= request.getParameter("password")
if (username == "java" &amp;&amp; password == "developer") {
response.sendRedirect("home.jsp")
session = request.getSession(true);
session.setAttribute("name", username)
}
else {
println """
&lt;h1&gt;Login Invalid&lt;/h1&gt;
&lt;p&gt;Your IP has been logged &gt; ${request.remoteHost}&lt;/p&gt;
"""
paramMap = request.getParameterMap()
println "&lt;p&gt;You Submitted:&lt;/p&gt;"
for (entry in paramMap) {
println "${entry.key} = ${entry.value}&lt;br/&gt;"
}
}
</pre>
<p>　　您可以仅创建一个简单的HTML表单，然后将此表单的行为属性发送到 action="Login.groovy"。然后将以下标签添加到web.xml：</p>
<pre class="code">&lt;servlet&gt;
&lt;servlet-name&gt;Groovy&lt;/servlet-name&gt;
&lt;servlet-class&gt;groovy.servlet.GroovyServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;Groovy&lt;/servlet-name&gt;
&lt;url-pattern&gt;*.groovy&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
</pre>
<p>　　现在只需将要求的Groovy jar 文件添加到WEB-INF/lib 目录，您的Groovy Web应用程序就准备好在任意Java EE应用服务器上运行了。</p>
<p>　　您应该已经注意到代码中没有分号，而且使用了隐式变量如request和response。其他隐式变量有context、application、session、out、sout和 html。</p>
<p>　　GSP是JSP在groovy中的对应概念。您无需使用println生成HTML；只需将Groovy代码嵌入HTML页面。本文中的例子将在提到Grails时使用GSP。</p>
<p>　　请注意，因为所有代码最终都要转换为字节码，所以groovlet和GSP能够与servlet和JSP轻松协作。因此您无需区分groovlet和GSP或者servlet和JSP。</p>
<p>　　现在让我们讨论前途无量的Grails框架。如果成功的话，Grails能够极大地改变开发Java Web应用程序的方式。Ruby on Rails对Ruby的影响，Grails也能够对Groovy实现。</p>
<h3>Grails特性和架构</h3>
<p>　　Grails试图使用Ruby On Rails的&#8220;规约编程&#8221;（coding by convention）范例来降低对配置文件和其他样板代码的需求。使用&#8220;规约编程&#8221; ，如果文件的名称本身就能说明此文件的用途，那么您就不需要在配置文件中再次声明这些内容了。此框架会查看文件名，并自己弄清文件用途。通过使用&#8220;规约编程&#8221; ，Grails还将自动生成Web应用程序中需要的许多内容。通过使用Grails，您将能够在很短的时间内、以最小的复杂性使Web应用程序就绪。请看以下例子。</p>
<p>　　Grails基于开源技术，例如Spring、Hibernate和SiteMesh。如果您已经擅长这些技术，那么这是件好事；但是如果您由于某种原因不喜欢这些技术，或者您认为不仅需要学习Grails，还需要学习其他三种框架，那么这就不是件好事了。虽然这些技术能够帮助Grails执行得更好，但是学习四种框架对于大多数人来说是一个很高的门槛。Grails文档目前主要关注它与Spring、Hibernate和其他程序的集成，然而我认为它需要采用相反的方法，将Grails推行为一个简单快速的Web应用程序开发框架。开发人员无需担心或考虑底层发生了什么。</p>
<p>　　幸运的是，一旦您开始使用Grails，您将发现Grails隐藏了这些框架的大多数底层复杂性。如果您忘掉在底层运行的是Spring、Hibernate和其他程序，那么事情就会变得简单。</p>
<p>　　<a href="http://grails.org/Advanced+Topics" target="_blank">Grails应用程序的三个层</a>是：</p>
<ol>
    <li>由视图和控制器组成的Web层
    <li>由域类和服务组成的业务逻辑层
    <li>由域类和数据源组成的持久层 </li>
</ol>
<p>　　大多数框架都有数十种特性，其中只有很少几种得到了广泛使用。对于Grails来说，这种关键特性是指&#8220;规则编程&#8221;（coding by convention）范例和构件的自动生成。</p>
<p>　　Grails的其他特性包括对Ajax、验证、单元测试和功能测试的内置支持。它使用免费的开源Canoo WebTest项目来实现Web应用程序的功能测试。Grails还提供与Quartz Scheduler的集成。</p>
<p>　　现在是时候安装Grails框架并且编写您的第一个应用程序了。</p>
<h3>Grails安装</h3>
<p>　　安装过程非常简单。以下是Grails下载页面：<a href="http://grails.codehaus.org/Download" target="_blank">http://grails.org/Download</a>。您可以从<a href="http://dist.codehaus.org/grails/grails-bin-0.2.1.zip">http://dist.codehaus.org/grails/grails-bin-0.2.1.zip</a>下载version 0.2.1。请注意Grails源代码和文档作为单独的下载提供。下载zip文件之后，只需将其内容解压缩到一个目录即可，在我的案例中此目录是 C:\groovy\grails-0.2.1\。</p>
<p>　　创建一个名为GRAILS_HOME 的新环境变量，并将其值设为 C:\groovy\grails-0.2.1\。接下来将GRAILS_HOME\bin 添加到PATH 环境变量。这样安装就完成了。通过在命令提示符界面中运行grails 命令您可以检查安装是否成功。您应该获得此命令的使用信息。</p>
<p>　　既然您有了一个运行中的Grails安装，那么您已经为创建Grails Web应用程序做好了准备。</p>
<h3>开发Grails应用程序：应用程序结构</h3>
<p>　　多年来我一直计划开发一个可以帮助我管理衣服的应用程序——这个应用程序应该能够告诉我我最喜欢的T恤衫放在哪里、是否洗过、是否熨过，等等。总有一天我会靠销售这个应用程序挣上几百万，但是现在我将把它用作Grails例子。</p>
<p>　　第一步是创建一个Grails项目目录结构。在这一步我将在C:\groovy\grailsapps 创建一个新目录，并在此级别打开一个命令提示符窗口。在此窗口中，执行命令grails create-app。要求您输入应用程序名称。输入 ClothesMgt。Grails将显示它为您创建的全部目录和文件。图1显示了最后得到的命令结构。</p>
<p align="center"><img height="400" alt="Groovy和Grails简介图-1" src="http://dev2dev.bea.com.cn/images/image061226001.gif" width="124" border="0" /></p>
<p>　　图1：Grails项目目录结构</p>
<p>　　此命令将创建约800 KB大小的文件和目录。这里的想法是此框架遵循已经建立的Web应用程序开发惯例，因此它创建的文件和目录在大多数Web应用程序中是有用的。虽然有些人可能不喜欢这种强制使用某种结构的想法，但是这种基于惯例的自动生成正是Grails的RAD特性的基础。</p>
<p>　　如果更仔细地看一下这些目录，您就会发现存在用于诸如控制器、视图、测试、配置文件和标签库之类东西的目录。您还会发现存在一些基本JavaScript和CSS文件。那么现在应用程序的基本结构已经有了。您只需做些填空，应用程序即可就绪。</p>
<p>　　请注意自动生成目录和文件的命令是可选的。您可以手动创建全部文件和目录。如果熟悉Apache Ant，那么您甚至可以打开GRAILS_HOME 目录中的\src\grails\build.xml 文件，来仔细查看每个Grails命令的用途。</p>
<h3>数据库</h3>
<p>　　在此例中我将使用一个 运行于localhost的名为Clothes_Grails的MySQL数据库。Grails内置一个HSQL数据库，这对测试简单的应用程序或仅试用Grails非常有用。如果您使用HSQL DB，那么无需执行以下几步。我将使用MySQL来证明您能够非常轻松地使用HSQL之外的数据库。</p>
<p>　　从<a href="http://www.mysql.com/products/connector/j/" target="_blank">http://www.mysql.com/products/connector/j/</a> 下载MySQL驱动器，并将mysql-connector-java-&lt;version number&gt;-stable-bin.jar 文件放置在ClothesMgt\lib 目录中。接下来您需要编辑 ClothesMgt\grails-app\conf\ApplicationDataSource.groovy文件。</p>
<p>　　现在此文件的内容应该类似以下内容：</p>
<pre class="code">class ApplicationDataSource {
boolean pooling = true
String dbCreate = "create-drop"
String url = "jdbc:mysql://localhost/Clothes_Grails"
String driverClassName = "com.mysql.jdbc.Driver"
String username = "grails"
String password = "groovy"
}
</pre>
<p>　　现在让我们看一下如何使用此数据库和对象关系映射。</p>
<h3>域类</h3>
<p>　　Grails的对象关系映射(GORM)功能在内部使用Hibernate 3，但是您无需了解或更改任何Hibernate设置。Grails具有称为&#8220;域类&#8221;的东西，这些域类的对象被映射到数据库。您可以使用关系来链接域类，它们也提供用于CRUD（创建/读取/更新/删除）操作的功能非常强大的动态方法。</p>
<p>　　在此例中，我们将创建三个域类，其名称分别是Shirt、Trouser和Cabinet。要创建域类，只需运行命令 grails create-domain-class。请记住在您的项目目录（而不是它的上级目录）内运行此命令。这是一个常见错误，虽然我已经提醒了您，您还是会犯至少一次这样的错误。</p>
<p>　　您必须提供给create-domain-class 命令的唯一输入是类的名称。运行此命令三次，将Shirt、Trouser和Cabinet作为三个域类的名称。Grails现在将在目录 grails-app/domain/中创建这些域类。它们将仅具有两个属性id 和 version。我将为这些类添加属性，以便使它们更能代表衬衫、裤子和衣橱。</p>
<p>　　<em>清单1：Cabinet.groovy</em></p>
<pre class="code">class Cabinet {
Long id
Long version
String name
String location
def relatesToMany = [ shirts : Shirt, trousers : Trouser ]
Set shirts = new HashSet()
Set trousers = new HashSet()
String toString() { "${this.class.name} :  $id" }
boolean equals(other) {
if(other?.is(this))return true
if(!(other instanceof Cabinet)) return false
if(!id || !other?.id || id!=other?.id) return false
return true
}
int hashCode() {
int hashCode = 0
hashCode = 29 * (hashCode + ( !id ? 0 : id ^ (id &gt;&gt;&gt; 32)) )
}
}
</pre>
<p>　　<em>清单2： Trouser.groovy</em></p>
<pre class="code">class Trouser {
Long id
Long version
String name
String color
Cabinet cabinet
def belongsTo = Cabinet
String toString() { "${this.class.name} :  $id" }
boolean equals(other) {
if(other?.is(this))return true
if(!(other instanceof Trouser)) return false
if(!id || !other?.id || id!=other?.id) return false
return true
}
int hashCode() {
int hashCode = 0
hashCode = 29 * (hashCode + ( !id ? 0 : id ^ (id &gt;&gt;&gt; 32) ) )
}
}
</pre>
<p>　　<em>清单3： Shirt.groovy</em></p>
<pre class="code">class Shirt {
Long id
Long version
String name
String color
Cabinet cabinet
def belongsTo = Cabinet
String toString() { "${this.class.name} :  $id" }
boolean equals(other) {
if(other?.is(this))return true
if(!(other instanceof Shirt)) return false
if(!id || !other?.id || id!=other?.id) return false
return true
}
int hashCode() {
int hashCode = 0
hashCode = 29 * (hashCode + ( !id ? 0 : id ^ (id &gt;&gt;&gt; 32)))
}
}
</pre>
<p>　　我添加的仅有的几行声明了字段名称和颜色，然后声明了Cabinet、Shirt和Trouser之间的关系。每个Shirt和Trouser都属于Cabinet，而Cabinet具有shirt和trouser的集合。belongsTo 属性在此案例中是可选的，因为在一对多关系中，Grails会将&#8220;一&#8221;这一方视为所有者。因此您就无需显式声明了。在这里我进行显式声明只是为了使这种关系更明显。</p>
<p>　　接下来我们将讨论Grails应用程序的控制器和视图部分。</p>
<h3>控制器和视图</h3>
<p>　　既然域类已经就绪，让我们使用generate-all命令自动生成基本CRUD Web应用程序。运行grails generate-all 命令三次，当被询问时提供域类名称。generate-all 命令的目的是生成每个域类的控制器和视图，但是由于<a href="http://jira.codehaus.org/browse/GRAILS-245" target="_blank">bug-245</a>，Grails 0.2.1不能生成控制器。您必须手动生成控制器，其方法是对每个域类使用generate-controller 命令。</p>
<p>　　现在您应该在grails-app\controllers 目录中看到三个<a href="http://grails.codehaus.org/Controllers" target="_blank">控制器</a>。这些控制器负责处理Web应用程序中针对特定域类的请求。因此ShirtController.groovy 将处理Web应用程序中与Shirt域类相关的CRUD请求，等等。现在控制器具有多个闭包，每个闭包映射到一个URI。<a href="http://groovy.codehaus.org/Closures" target="_blank">闭包</a>是Groovy语言很好的一个特性，然而要习惯它还是需要一些时间的。清单4显示了Shirtcontroller.groovy的一段摘录。</p>
<p>　　<em>清单4：ShirtController.groovy 摘录</em></p>
<pre class="code">class ShirtController {
def index = { redirect(action:list,params:params) }
def list = {
[ shirtList: Shirt.list( params ) ]
}
def show = {
[ shirt : Shirt.get( params.id ) ]
}
def delete = {
def shirt = Shirt.get( params.id )
if(shirt) {
shirt.delete()
flash.message = "Shirt ${params.id} deleted."
redirect(action:list)
}
else {
flash.message = "Shirt not found with id ${params.id}"
redirect(action:list)
}
}
// ...
}
</pre>
<p>　　在此例中，ShirtController 中的list闭包将处理URI是/shirt/list的请求，等等。您可在控制器中使用您习惯在Java Web应用程序中使用的东西，例如请求、会话和servletContext。</p>
<p>　　<strong>请注意：</strong>闭包也将值作为显式<em>返回</em>语句返回，或者作为闭包体中的最后一个语句的值返回。不要因为Grails生成的代码中没有return 而困惑。</p>
<p>　　一旦控制器完成了对请求的处理，它必须委托给合适的视图。Grails使用惯例机制实现此操作。因此ShirtController 中的list闭包将委托给视图 /grails-app/views/shirt/list.gsp 或 /grails-app/views/shirt/list.jsp。 尽管您在使用Grails，全部视图可以是JSP文件而不是GSP。我几乎没有编写任何代码，但是我已经准备好了一个Web应用程序。</p>
<p>　　让我们尝试部署和运行我们的应用程序。</p>
<h3>在Java EE Server上部署和运行Grails</h3>
<p>　　Grails具有一个内置Resin服务器，您可使用grails run-app 命令运行应用程序。此命令会将应用程序部署到Resin服务器并启动服务器。因此您现在可以在<em>http://localhost:8080/ClothesMgt</em> 访问此应用程序。您还可以同样轻松地将应用程序部署到任意JavaEE服务器。我尝试将它部署到Tomcat。要实现此操作，我所需要做的是运行grails war 命令，将生成的war文件复制到Tomcat中的<em>webapps目录！</em></p>
<p>　　在此案例中生成的war文件的名称为 ClothesMgt.war。一旦部署到Tomcat，您就应该能够在http://localhost:8080/ClothesMgt/ 上访问它，并看到如图2所示的屏幕。</p>
<p align="center"><img height="389" alt="Groovy和Grails简介图-2" src="http://dev2dev.bea.com.cn/images/image061226002.gif" width="458" border="0" /></p>
<p>　　<em>图2：Grails 应用程序</em></p>
<p>　　通过此应用程序，能够获得Shirt、Trouser和Cabinet的全部CRUD功能。可以显示衣橱的全部数据、向衣橱添加新衬衫和裤子、编辑它们的值和删除记录——实现这些操作都无需编写任何业务逻辑、视图或数据访问代码。仅在几分钟内您就在JavaEE服务器上部署好了一个合适的Web应用程序。很酷吧？！</p>
<p>　　让我们更进一步来定制Grails。</p>
<h3>创建自定义控制器</h3>
<p>　　我现在将把新功能和页面添加到Web应用程序，同时重用已经存在的域类。shirt/list 和 trouser/list 会分别显示衬衫和裤子的清单，现在让我们添加一个新的显示，来同时显示衬衫和裤子的清单。要创建一个新的显示，您需要一个新的控制器和视图。</p>
<p>　　使用 generate-controller 和 generate-views 命令，可以轻松实现使用域类自动生成视图和控制器。然而，在此案例中我希望创建一个与域类不直接关联的控制器。因此我将使用grails create-controller命令。当被提示输入控制器名称时，声明Display。Grails将在grails-app/controllers/ 目录创建一个名为DisplayController.groovy 的控制器，在grails-tests 目录创建一个测试套件。如清单5所示编辑控制器。</p>
<p>　　<em>清单5：DisplayController.groovy</em></p>
<pre class="code">class DisplayController {
def index = {redirect(action:list,params:params)}
def list = {
params['max'] = 10
return [ shirtList: Shirt.list( params ),
trouserList: Trouser.list( params )]
}
}
</pre>
<p>　　index 闭包将请求重定向到清单。在list 闭包中我将最大参数设为10，然后使用动态方法Shirt.list 和 Trouser.list。然后返回<a href="http://groovy.codehaus.org/Collections">Groovy Map</a>，它有两个清单——衬衫清单和裤子清单。</p>
<p>　　作为Java开发人员，当看到Shirt.list()时会自然认为是在Shirt域类中的list 方法。然而，如果打开Shirt.groovy，会发现并没有此方法。对于Java开发人员来说，不了解Groovy的特性就使用Grails不仅是令人困惑的，而且是死胡同。动态方法是Grails的特殊特性，它是构建于Groovy语言的一个非常特殊的特性<a href="http://www.indicthreads.com/interviews/429/groovy_grails_scripting_enterprise_java.html">元对象协议</a> (MOP)之上的。如此证明可以使用动态方法查询域类。因此，在控制器中，您将注意到在域类上调用的方法似乎在域类中不存在。您可以在<a href="http://grails.org/GORM#GORM-DomainClassQuerying">这里</a>阅读关于使用动态方法查询的更多信息。可以在<a href="http://grails.org/Dynamic+Methods+Reference">这里</a>找到对Grails控制器和域类中可用的动态方法的参考资料。</p>
<p>　　既然控制器能够处理请求、获取清单并转发到视图，我需要创建相应视图。</p>
<h3>创建自定义视图</h3>
<p>　　当创建控制器时，Grails还在grails-app\views 目录创建了一个新的<em>显示</em>目录，并将以下映射添加到web.xml 文件中。</p>
<pre class="code">&lt;servlet-mapping&gt;
&lt;servlet-name&gt;grails&lt;/servlet-name&gt;
&lt;url-pattern&gt;/display/*&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
</pre>
<p>　　目前Grails有一个generate-views 命令，此命令能够生成基于域类的视图，然而没有能够自动生成视图的create-view 命令。请看图3中的例子。</p>
<p align="center"><img height="372" alt="Groovy和Grails简介图-3" src="http://dev2dev.bea.com.cn/images/image061226003.gif" width="458" border="0" /></p>
<p>　　<em>图3：一个显示Trousers的默认视图</em></p>
<p>　　因为我希望创建一个独立于域类的视图，所以让我们手动创建视图文件。在目录grails-app\views\display\中，创建一个名为 list.gsp的文件，如清单6所示。</p>
<p>　　<em>清单6：list.gsp</em></p>
<pre class="code">&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;
&lt;title&gt;Display Shirt And Trouser List&lt;/title&gt;
&lt;link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}"&gt;&lt;/link&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="nav"&gt;
&lt;span class="menuButton"&gt;&lt;a href="${createLinkTo(dir:'')}"&gt;Home&lt;/a&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div class="body"&gt;
&lt;h1&gt;Shirt List&lt;/h1&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Id&lt;/th&gt;&lt;th&gt;Cabinet&lt;/th&gt; &lt;th&gt;Color&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;
&lt;/tr&gt;
&lt;g:each in="${shirtList}"&gt;
&lt;tr&gt;
&lt;td&gt;${it.id}&lt;/td&gt; &lt;td&gt;${it.cabinet.name}&lt;/td&gt;
&lt;td&gt;${it.color}&lt;/td&gt; &lt;td&gt;${it.name}&lt;/td&gt;
&lt;/tr&gt;
&lt;/g:each&gt;
&lt;/table&gt;
&lt;h1&gt;Trouser List&lt;/h1&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;Id&lt;/th&gt; &lt;th&gt;Cabinet&lt;/th&gt;
&lt;th&gt;Color&lt;/th&gt; &lt;th&gt;Name&lt;/th&gt;
&lt;/tr&gt;
&lt;g:each in="${trouserList}"&gt;
&lt;tr&gt;
&lt;td&gt;${it.id}&lt;/td&gt; &lt;td&gt;${it.cabinet.name}&lt;/td&gt;
&lt;td&gt;${it.color}&lt;/td&gt; &lt;td&gt;${it.name}&lt;/td&gt;
&lt;/tr&gt;
&lt;/g:each&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>　　与我之前使用的方式类似，您现在也可以使用run-app 命令运行应用程序，或者创建一个war文件并将其部署到Tomcat。您应该在<em>http://localhost:8080/ClothesMgt/display/</em>下看到新的视图，如图4所示。</p>
<p align="center"><img height="383" alt="Groovy和Grails简介图-4" src="http://dev2dev.bea.com.cn/images/image061226004.gif" width="458" border="0" /></p>
<p>　　<em>图4：新创建的列出衬衫和裤子清单的视图</em></p>
<p>　　现在让我们快速讨论一下Grails服务。</p>
<h3>服务</h3>
<p>　　如果您想知道如何分开业务逻辑以及放置业务逻辑的位置，答案在<a href="http://grails.org/Services">Grails 服务</a>中。服务以SomeNameService.groovy 格式命名，且被置于 /grails-app/services/目录。服务可利用依赖注入特性，您能够轻松地从控制器内部调用这些服务。</p>
<p>　　让我们来看一个使用服务的例子。首先，使用create-service 命令创建新服务。运行此命令并命名服务Order。Grails将创建两个文件——grails-app/services/OrderService.groovy 和 grails-tests/OrderTests.groovy。</p>
<p>　　现在编辑OrderService.groovy，如清单7所示。当引入新的orderGoods() 方法时会自动生成serviceMethod() 。</p>
<p>　　<em>清单7：OrderService.groovy</em></p>
<pre class="code">class OrderService {
boolean transactional = true
def serviceMethod() {
// TODO
}
def orderGoods() {
return "Order Placed - New shirts and trousers \
will be sent shortly."
}
}
</pre>
<p>　　现在编辑DisplayController，如清单8所示。引入使用OrderService的重排闭包。请注意服务将由Groovy注入。</p>
<p>　　<em>清单8：DisplayController.groovy</em></p>
<pre class="code">class DisplayController {
OrderService orderService
def index = {redirect(action:list,params:params)}
def list = {
params['max'] = 10
return [ shirtList: Shirt.list( params )
, trouserList: Trouser.list( params )]
}
def reorder = {
render(orderService.orderGoods())
}
}
</pre>
<p>　　现在当您访问URL http://localhost:8080/ClothesMgt/display/reorder时，重排闭包将调用 OrderService，响应会被发回到浏览器。您能够以类似方式将全部业务逻辑移入服务，然后使用Grails的注入功能非常轻松地使用它们。</p>
<h3>动态方法和属性</h3>
<p>　　正如之前提到的，域类没有能够从数据库获取数据或更新/删除现有数据的任何方法，例如find()、 findAll() 或 save() 。在控制器中您也没有编写诸如 redirect() 或 render() 之类的方法。但是域类和控制器有它们的计划目的，且允许所有要求的操作。原因是Grails中<a href="http://grails.org/Dynamic+Methods+Reference" target="_blank">动态方法和属性</a>的存在。动态方法被动态添加到类，就好像功能是在程序中编译的一样。</p>
<p>　　这些是可用的方法和属性，无需编写。这些动态方法涵盖了大多数Web应用程序开发中会碰到的常见情况。对于域类来说，存在诸如find()、findAll()、list()、executeQuery()、save()和 delete()之类的动态方法。控制器具有诸如session、request和response之类的动态属性，以及诸如chain()、render()和 redirect()之类的方法。要真正利用Grails的强大功能，您需要了解所有这些动态方法和属性的功能。</p>
<h3>顺便介绍一下：自动重载和@Property</h3>
<p>　　Grails的一个重要特性是能够在开发过程中进行了更改时自动重载文件。因此只需编辑和保存gsp文件，就会自动重载新文件。然而这里创建的类似OrderService 的事务服务不会被重载。您会在服务器控制台看到以下消息<em>"[groovy] Cannot reload class [class OrderService] reloading of transactional service classes is not currently possible. Set class to non-transactional first. "</em>。</p>
<p>　　Grails的自动重载功能会为您节省许多时间，您就无需浪费时间来重启服务器了。我碰到过一些Grails不能自动重载的案例，例如将一个jsp文件重命名到gsp。然而，Grails的这项功能有望在未来版本中得到进一步改进。</p>
<p>　　在Groovy JSR 06 的之前版本中，您必须使用@Property 来定义Groovy中的新属性。因此您会在线看到许多使用@Property的旧的Groovy例子。然而请注意，@Property已经从Groovy JSR 06中移除，在Grails 0.2和之后的版本中也不会再需要它。请参阅<a href="http://docs.codehaus.org/display/GroovyJSR/Property+proposal" target="_blank">@Property 建议</a>来获得更多细节。</p>
<h3>结束语</h3>
<p>　　在本文中，我介绍了Grails框架的基本特性，并使用Grails创建了一个应用程序。Groovy和Grails最大的好处是一切都运行在优秀的旧Java和Java EE上——因此您能够使用Groovy和Grails的RAD特性快速开发应用程序，然后将应用程序部署到可靠的Java EE服务器上。考虑到关于Ruby和Rails的宣传噪音，显然需要一个Java备选方案。Groovy和Grails看起来非常适合这个角色。</p>
<h3>下载</h3>
<p>　　下载本文中的代码：</p>
<ul>
    <li><a href="http://dev2dev.bea.com/2006/10/Dev2Dev_ClothesMgt_Code.zip">本文中的代码</a> (zip)。
    <li>最新版本的<a href="http://clothesmanager.googlecode.com/svn/trunk/" target="_blank">SVN快照</a>。 </li>
</ul>
<h3>参考资料</h3>
<ul>
    <li><a href="http://grails.org/" target="_blank">Grails</a>主页
    <li><a href="http://groovy.codehaus.org/" target="_blank">Groovy</a>主页
    <li><a href="http://docs.codehaus.org/display/GRAILS/Home" target="_blank">Grails Wiki</a>
    <li><a href="http://grails.codehaus.org/Mailing+lists" target="_blank">Grails Mailing 清单</a>
    <li><a href="http://www.onjava.com/pub/a/onjava/2004/09/29/groovy.html" target="_blank">Groovy, Java's New Scripting Language</a> (ONJava, 2004)
    <li><a href="http://java.sun.com/developer/technicalArticles/JavaLP/groovy/" target="_blank">Getting to Know Groovy</a> (Sun, 2005)
    <li><a href="http://www.indicthreads.com/interviews/429/groovy_grails_scripting_enterprise_java.html" target="_blank">Groovy bridges the scripting and the enterprise Java worlds</a> (IndicThreads, 2006) </li>
</ul>
<img src ="http://www.blogjava.net/xiaosao/aggbug/181031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-02-21 12:40 <a href="http://www.blogjava.net/xiaosao/archive/2008/02/21/181031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>删除.svn文件夹的JS脚本</title><link>http://www.blogjava.net/xiaosao/archive/2008/02/19/180700.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Tue, 19 Feb 2008 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2008/02/19/180700.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/180700.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2008/02/19/180700.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/180700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/180700.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <span style="color: #ff00ff">今天在网上游荡发现了个好东西~保存下来！一直都苦于无法一下将旧项目下面的.SVN文件夹利落删除~今天恰巧发现了一个方法，在此很是感谢~~<br />
&nbsp; <span style="color: #000000">原文如下：http://www.ljnid.cn/?id=261</span><br />
&nbsp;&nbsp; <span style="color: #000000">写了个JS脚本，可以删除指定文件夹下面的所有.SVN文件夹<br />
&nbsp;&nbsp; 在windows server 2003下测试通过，不保证XP可以运行<br />
&nbsp;&nbsp; 使用方法：把下面的代码保存为xxx.js<br />
&nbsp; 在控制台用：cscript.exe xxx.js X:\xxx\xx<br />
&nbsp; 其中X:\xxx\xx是你指定的路径</span><br />
<br />
<div class="code">if(WScript.Arguments.length==0)<br />
WScript.quit();<br />
<br />
var fso = new ActiveXObject("Scripting.FileSystemObject");<br />
var fc,folder,folderList=[];<br />
var rootFolder = fso.getFolder(WScript.Arguments(0));<br />
<br />
folderList.push(rootFolder);<br />
while(folderList.length&gt;0){<br />
folder = folderList.pop();<br />
fc = new Enumerator(folder.SubFolders);<br />
while(!fc.atEnd())<br />
{<br />
if(fc.item().name =='.svn')<br />
fso.deleteFolder(fc.item().path,true);<br />
else<br />
folderList.push(fc.item());<br />
<br />
fc.moveNext();<br />
}<br />
}</div>
</span>
<img src ="http://www.blogjava.net/xiaosao/aggbug/180700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2008-02-19 15:59 <a href="http://www.blogjava.net/xiaosao/archive/2008/02/19/180700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;又是转来的&gt; 面试java高级工程师、项目经理等的常见问题</title><link>http://www.blogjava.net/xiaosao/archive/2007/11/09/159386.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Fri, 09 Nov 2007 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2007/11/09/159386.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/159386.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2007/11/09/159386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/159386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/159386.html</trackback:ping><description><![CDATA[<p>http://paulandjoy.javaeye.com/blog/126315<br />
1、 类、对象的概念： <br />
1） 类：具有共同属性和行为的对象的抽象。类是创建对象的模板。 <br />
2） 对象：现实世界中的实体。在计算机中，是指可标识的存储区域。 <br />
3） 类是对象的抽象、对象是类的实例。 <br />
2、 抽象：是从特定的实例中抽取共同性质形成一般化概念的过程。 <br />
3、 接口与抽象类： <br />
1）接口和抽象类都用于抽象，接口是抽象类的抽象。 <br />
2）接口中只有方法声明，没有实现（无方法体）；在接口中声明的方法具有public和abstract属性，一个类可以实现多个接口（即多继承），接口以&#8216;，&#8217;分隔；接口中的方法必须全部实现。 <br />
3）抽象类可以有部分方法实现，抽象类必须通过继承才能使用。 <br />
4、内部类（Inner Class）： <br />
1）内部类是嵌套在另一个类中的类。 <br />
2）内部类用于名称隐藏和程序代码的组织，另外内部类拥有直接访问其外部类所有成员（包括private的）的权限（无需任何关键字修饰）。 <br />
3）内部类不可以在其他类或main方法里实例化，必须使用如下方法（非静态内部类） <br />
外部类.内部类 对象名=new 外部类().new 内部类(); <br />
静态内部类调用方式： <br />
外部类.内部类 对象名=new 外部类.内部类(); <br />
4）非静态内部类不可以声明静态成员；静态内部类的非静态成员可以访问其外部类的静态成员，声明为静态的成员不可以访问外部的非静态成员。 <br />
5、访问修饰符限制： <br />
Private protected friendly(default) public <br />
同类 Y Y Y Y <br />
同包不同类 N Y Y Y <br />
同包子类 N Y Y Y <br />
不同包不同类 N N N Y <br />
不同包子类 N Y N Y <br />
6、Static关键字的使用： <br />
1）类成员，直接使用 类名.成员 调用。 <br />
2）静态方法只能访问静态成员。 <br />
3）静态方法不能使用this、super关键字。 <br />
4）静态方法不能被非静态方法重写或重载。 <br />
7、final关键字： <br />
1）被final修饰的变量为常量不能改变。 <br />
2）被final修饰的方法不可以重写。 <br />
3）被final修饰的类不能被继承。 <br />
8、abstract关键字： <br />
1）被abstract修饰的类不能实例化。 <br />
2）被abstract修饰的方法只能在子类中实现。 <br />
9、native关键字：非Java语言的编写，例如JNI技术。 <br />
10、synchronized关键字：多线程的同步访问控制。 <br />
11、分类列举服务器和组件技术： <br />
1）服务器端技术：Jsp、Servlet； <br />
2）组件技术：JavaBean、EJB。 <br />
12、Http与Https：Https即多了安全的Http，s（Security Socket Layer）指加密套接字协议层（简写SSL）。 <br />
13、OSI（Open System Interconnection）网络抽象模型： <br />
1）由国际标准化组织（ISO）提出。 <br />
2）将互联网分为七层，从下至上分别为：物理层（physical）、数据链路层（data link）、网络层（network）、传送层（transport）、会话层（session）、表示层（presentation）、应用层（application）。底层通过提供接口支持上层功能。各层详解： <br />
物理层：LAN/ATM，为硬件层。 <br />
数据链路层：LAN/ATM <br />
网络层：IP协议，IOS <br />
传输层：TCP/UDP协议，支持Java Socket。 <br />
会话层： <br />
表示层：HTML、XML <br />
应用层：HTTP协议，使用Java Servlet/JSP <br />
&lt;第八层（Web服务层）：SOAP/UDDI&gt; <br />
14、J2EE的容器与服务器： <br />
容器负责EJB组件中生命周期的控制； <br />
服务器包含在容器外，提供系统级操作底层服务，包括事务、事件、多线程&#8230;&#8230;。 <br />
15、继承限制： <br />
父类对象不可以赋给子类对象，因为子类可能具有更多的成员，反之可以。 <br />
16、逻辑操作：c=(a&gt;b)?a:b;等同于下式 <br />
if(a&gt;b) c=a; else c=b; <br />
17、列举常见集合框架类型： <br />
1）List、Set、Map。由这三个接口实现出ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等常用集合框架。 <br />
2）Vector属于重量级组件不推荐使用。 <br />
3）Map类型维护键/值对，Hashtable与HashMap相近但效率略低于HashMap、高于TreeMap，TreeMap优点是可以排序。 <br />
4）Set类型可装入唯一值，HashSet效率高于TreeSet但TreeSet可以维护内部元素的排序状态。 <br />
5）List类型可按某种特定顺序维护元素。ArrayList允许快速随机访问，但如果添加或删除位于中间的元素时效率很低；LikedList提供最佳循序访问及快速的中间位置添加删除元素，并有addFirst、addLast、getFirst、getLast、removeFirst、removeLast方法。 <br />
18、面向对象的特征： <br />
1）继承：通过子类可以实现继承，子类继承父类的所有状态和行为，同时添加自身的状态和行为。 <br />
2）封装：将代码及处理数据绑定在一起的一种编程机制，该机制保证程序和数据不受外部干扰。 <br />
3）多态：包括重载和重写。重载为编译时多态，重写是运行时多态。重载必须是同类中名称相同参数不同（包括个数不同和类型不同），但返回类型不同不构成重载；重写发生于子类对父类的覆盖，子类继承父类方法名相同、参数列表相同、返回类型相同才构成重写。 <br />
19、Java命名规范：必须以英文字母、下划线（&#8217;_&#8217;）或&#8217;$&#8217;开始，其余可以有数字但不允许 包含空格，且组合后的名称不能是Java关键字或保留字。 <br />
匈牙利命名法：以m开始为类成员变量，以g开始为全局变量，以v开始为本地局部变量，常量命名一般不以下划线、美元符开始。 <br />
驼峰命名：一般称由多个单词或缩写组成的变量名，并且该变量名每个单词首字母均为大写（一般类名全部首字母大写，方法或属性名第一个字母小写）的称为驼峰命名。 <br />
20、Java语言共包含47个关键字。 <br />
21、设计模式： <br />
一个设计模式描述了一个被证实可行的方案。这些方案非常普遍，是具有完整定义的最常用的模式。一般模式有4个基本要素：模式名称（pattern name）、问题（problem）、解决方案（solution）、效果（consequences）。 <br />
常见23种模式概述： <br />
1） 抽象工厂模式（Abstract Factory）：提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。 <br />
2） 适配器模式（Adapter）：将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。 <br />
3） 桥梁模式（Bridge）：将抽象部分与它的实现部分分离，使它们都可以独立地变化。 <br />
4） 建造模式（Builder）：将一个复杂对象的构建与它的表示分离，使同样的构建过程可以创建不同的表示。 <br />
5） 责任链模式（Chain of Responsibility）：为解除请求的发送者和接收者之间耦合，而使多个对象都有机会处理这个请求。将这些对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它。 <br />
6） 命令模式（Command）：将一个请求封装为一个对象，从而可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可取消的操作。 <br />
7） 合成模式（Composite）：将对象组合成树形结构以表示&#8220;部分－整体&#8221;的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。 <br />
8） 装饰模式（Decorator）：动态地给一个对象添加一些额外的职责。就扩展功能而言，它能生成子类的方式更为灵活。 <br />
9） 门面模式（Facade）：为子系统中的一组接口提供一个一致的界面，门面模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。 <br />
10） 工厂方法（Factory Method）：定义一个用于创建对象的接口，让子类决定将哪一个类实例化。Factory Method 使一个类的实例化延迟到其子类。 <br />
11） 享元模式（Flyweight）：运用共享技术以有效地支持大量细粒度的对象。 <br />
12） 解释器模式（Interpreter）：给定一个语言，定义它的语法的一种表示，并定义一个解释器，该解释器使用该表示解释语言中的句子。 <br />
13） 迭代子模式（Iterator）：提供一种方法顺序访问一个聚合对象中的各个元素，而又不需暴露该对象的内部表示。 <br />
14） 调停者模式（Mediator）：用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的内部表示。 <br />
15） 备忘录模式（Memento）：在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。 <br />
16） 观察者模式（Observer）：定义对象间的一种一对多的依赖关系，以便当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并自动刷新。 <br />
17） 原始模型模式（Prototype）：用原型实例指定创建对象的种类，并且通过拷贝这个原型创建新的对象。 <br />
18） 代理模式（Proxy）：为其他对象提供一个代理以控制对这个对象的访问。 <br />
19） 单例模式（Singleton）：保证一个类仅有一个实例，并提供一个访问它的全局访问点。 <br />
20） 状态模式（State）：允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。 <br />
21） 策略模式（Strategy）：定义一系列的算法，把它们一个个封装起来，并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。 <br />
22） 模板模式（Template Method）：定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 <br />
23） 访问者模式（Visitor）：表示一个作用于某对象结构中的各元素的操作。该模式可以实现在不改变各元素的类的前提下定义作用于这些元素的新操作。 <br />
1、 你认为一个项目如何进行才正确？（比如：尽一切可能快的完成任务或完全按照类似CMM来操作） <br />
根据林锐博士的观点：企业的根本目标是合法地赚取尽可能多的利润，使企业利益最大化。企业所有的特定目标和行动都是围绕上述根本目标开展的，任何背离根本目标的行动都将对企业造成伤害，应当杜绝。 <br />
基于此任何人都不要强调我将严格遵守XX模式，带领团队开发出具有XX等级的产品，企业需要的是能够带领团队按时、合格的开发出产品的Manager。 <br />
2、 你经常看或仔细研读过的书有哪些？ <br />
不用回答你看过的课本，枚举几个经典的当然前提是必须真的看过至少浏览过主题和目录。比如《Java编程思想》、《Java模式》、《人月神话》等，由于将来要做的是team中的替补leader或真正的leader所以你必须说出软工的东西。 <br />
3、 你认为你应聘我们公司的项目经理，你自身的优势在哪？ <br />
1）融洽，没有领导希望你带领团队每天打嘴仗然后他还要去开屁股（Sorry，这似乎不很文明），你必须说明你能在以往团队中与其他人和谐相处。 <br />
2）技术，千万不要谦虚，对方要的就是技术过硬、能力出众的人才，你只需要说明你成功解决过什么难题并且你对J2EE、XX中间件、XX系统有多么的熟悉。 <br />
4、 如果给你一个Team，公司决定让你的Team开发A产品，OK这恰好是你的强项，你们很快开发出来了，但很沮丧的结果是它（你们的产品）没有销路；经过讨论公司又决定让你的Team开发B产品，OK这恰好又是你的强项，你们很快开发出来了，但很沮丧的结果是它（你们的产品）又没有销路。请问你怎么面对这个问题，你是否觉得决策层很无能甚至要推翻他或者去一个更有前途的公司？ <br />
不要以为这个故事很单纯，这应该是人力在考核你。你一定要告诉她（人力多半是女的），我个人对于失败的项目肯定会难过（是的，我想了很久才想出&#8220;难过&#8221;这个词，它很中性），不过我认为这恰恰认证了公司在革新和新技术探索方面的魄力（自己想怎么说，如果天下人都说这句那才是悲剧呢），我肯定会以个人的名义向领导层提出我自己的建议和看法当然它未必正确，我不会离开公司，因为有点小挫折未尝不是好事。（你应该在这个问题上好好想想，尽量发挥到10分钟） <br />
5、 你认为项目中最重要的是哪些过程？ <br />
分析、设计阶段（也可以加上测试，但千万别说编码或开发阶段），根据《人月神话》的观点：1/3 计划；1/6 编码；1/4 构件测试和早期系统测试；1/4 系统测试，所有的构件已完成 <br />
但根据国内目前的状况一般公司不会有很多的分析与设计时间（这取决于公司规模和时间成本），这样在一个工期很紧张的项目中我们应该尽量分配出进度优先级来，首先拿出客户最希望看到的和最能证明成果的东西来，其他的留待2期甚至3期去作，你可以告诉客户需要进一步调试（专业人员的欺骗手段，实际上就是在进行后续的开发）。 <br />
6、 如果给你一个4－6个人的Team，那么你怎么分配他们、管理他们？ <br />
管理能力和经验的综合题，可能没有人有相同的观点，那你可以按照某些思路来侧面解答：我会挑选一个技术过硬的人作为我的替补和项目的轻骑兵，是的团队中必须有机动人员，否则你的项目十有八九会夭折。其他的人会被平均的分配任务。 <br />
我们会在每周进行全面的任务分配，每个人获取一周的大概工作，然后每天的工作由他自己完成并汇报。（很好，如果答出这些就差不多了，多说可能会出现漏洞） <br />
7、 简述常用的软件开发文档。 <br />
1） 可行性研究报告（某些公司或模型没有） <br />
2） 项目开发计划 <br />
3） 软件需求说明书（必有） <br />
4） 数据要求说明书 <br />
5） 概要设计说明书（必有） <br />
6） 详细设计说明书（必有） <br />
7） 数据库设计说明书（必有） <br />
8） 用户手册（一般会有） <br />
9） 操作手册（必有） <br />
10） 模块开发卷宗 <br />
11） 测试计划（必有） <br />
12） 测试分析报告 <br />
13） 开发进度月报 <br />
14） 项目开发总结报告 <br />
8、 简述类的关系。 <br />
1） 当一个类是&#8220;一种&#8221;另一个类时：is-a关系 <br />
2） 当两个类之间有关联时： <br />
一个类&#8220;包含&#8221;另一个类：has-a关系 <br />
一个类&#8220;使用&#8221;另一个类 <br />
还可以细分有聚合和组合（UML宝典）或聚集和组成（包括国内某些知名学术团体都这么说）。 <br />
聚集（aggregation）表示整体与各部分之间的关系。例如汽车与轮胎，没有了汽车轮胎依然是一个整体。（用空心菱形表示） <br />
组成是一种整体和部分所属更强的聚集关系，每个部分只能属于一个整体，没有整体部分也就没有存在的价值。比如桌子和桌腿，没有桌子也就没有桌腿的价值了。（用实心菱形表示） </p>
<img src ="http://www.blogjava.net/xiaosao/aggbug/159386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-11-09 16:02 <a href="http://www.blogjava.net/xiaosao/archive/2007/11/09/159386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;JavaScript substr() 和 substring() 方法的区别 </title><link>http://www.blogjava.net/xiaosao/archive/2007/10/18/153968.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Thu, 18 Oct 2007 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2007/10/18/153968.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/153968.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2007/10/18/153968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/153968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/153968.html</trackback:ping><description><![CDATA[<p><span style="color: #3366ff">又是转过来的文章，最近在学JavaScripts，用到了substr()和substring()，上网找了下，看到了这个<br />
&nbsp;转载到这里，以便浏览</span><br />
&nbsp; 原文地址：http://www.cnblogs.com/tishifu/archive/2007/08/03/841429.html<br />
<br />
</p>
<p>substr 方法<br />
返回一个从指定位置开始的指定长度的子字符串。</p>
<p>stringvar.substr(start [, length ])</p>
<p>参数<br />
stringvar</p>
<p>必选项。要提取子字符串的字符串文字或 String 对象。</p>
<p>start</p>
<p>必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0。</p>
<p>length</p>
<p>可选项。在返回的子字符串中应包括的字符个数。</p>
<p>说明<br />
如果 length 为 0 或负数，将返回一个空字符串。如果没有指定该参数，则子字符串将延续到 stringvar 的最后。</p>
<p>示例<br />
下面的示例演示了substr 方法的用法。</p>
<p>function SubstrDemo(){<br />
&nbsp;&nbsp; var s, ss;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 声明变量。<br />
&nbsp;&nbsp; var s = "The rain in Spain falls mainly in the plain.";<br />
&nbsp;&nbsp; ss = s.substr(12, 5);&nbsp; // 获取子字符串。<br />
&nbsp;&nbsp; return(ss);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 返回 "Spain"。<br />
}</p>
<p><br />
substring 方法<br />
返回位于 String 对象中指定位置的子字符串。 </p>
<p>strVariable.substring(start, end)<br />
"String Literal".substring(start, end)</p>
<p>参数<br />
start</p>
<p>指明子字符串的起始位置，该索引从 0 开始起算。</p>
<p>end</p>
<p>指明子字符串的结束位置，该索引从 0 开始起算。</p>
<p>说明<br />
substring 方法将返回一个包含从 start 到最后（不包含 end ）的子字符串的字符串。</p>
<p>substring 方法使用 start 和 end 两者中的较小值作为子字符串的起始点。例如， strvar.substring(0, 3) 和 strvar.substring(3, 0) 将返回相同的子字符串。 </p>
<p>如果 start 或 end 为 NaN 或者负数，那么将其替换为0。 </p>
<p>子字符串的长度等于 start 和 end 之差的绝对值。例如，在 strvar.substring(0, 3) 和 strvar.substring(3, 0) 返回的子字符串的的长度是 3。 </p>
<p>示例<br />
下面的示例演示了 substring 方法的用法。</p>
<p>function SubstringDemo(){<br />
&nbsp;&nbsp; var ss;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 声明变量。<br />
&nbsp;&nbsp; var s = "The rain in Spain falls mainly in the plain..";<br />
&nbsp;&nbsp; ss = s.substring(12, 17);&nbsp;&nbsp; // 取子字符串。<br />
&nbsp;&nbsp; return(ss);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 返回子字符串。<br />
}<br />
</p>
<img src ="http://www.blogjava.net/xiaosao/aggbug/153968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-10-18 17:55 <a href="http://www.blogjava.net/xiaosao/archive/2007/10/18/153968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;实战SVN For Apache2（二）</title><link>http://www.blogjava.net/xiaosao/archive/2007/10/17/153667.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 17 Oct 2007 11:47:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2007/10/17/153667.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/153667.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2007/10/17/153667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/153667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/153667.html</trackback:ping><description><![CDATA[原文地址：http://www.cnblogs.com/archive/2005/10/29/264659.html<br />
在上一篇文章中，我们已经实现了对SVN和Apache的安装，并将它们集成在一起工作。这一篇则主要介绍如何对SVN For Apache进行一些配置。
<ol>
    <li>&nbsp;&nbsp;&nbsp;在Apache下为SVN建立多个库。上篇中虽然也建立了一个SVN的库在Apache下，但是我们不可能一个SVN服务器上只有一个项目，或者所有项目共用一个SVN库进行开发，在Apache上为SVN建立多个库可以通过建立多个虚拟目录的方式实现。下面我们就来讲讲具体的步骤（注意，此篇中的配置和上篇中的配置方式有很大区别）<br />
    <br />
    <ol>
        <li>到F盘建立我们的SVN代码存放位置目录：SubversionFiles，并在其中建立一个conf目录，将会把对Apache对SVN的配置文件都放在这里<br />
        <li>再在F:\SubversionFiles下目录Test1和Test2，并将它们变成SVN库（用svnadmin create命令或者用TortoiseSVN来创建都可以）<br />
        <li>在httpd.conf的最后添加如下代码<br />
        <br />
        <font style="background-color: #a9a9a9">#<br />
        # SVN 项目配置文件，格式：Include 配置文件名<br />
        #为每个虚拟目录设置一个配置文件，用Include命令加载</font><font style="background-color: #a9a9a9"><br />
        # <br />
        Include F:/SubversionFiles/conf/*.project<br />
        <br />
        <font style="background-color: #ffffff">即把</font><font style="background-color: #a9a9a9"><font style="background-color: #ffffff">F:/SubversionFiles/conf/目录下的所有*.project文件都包到httpd.conf中来<br />
        </font><br />
        <br />
        </font></font>
        <li><font style="background-color: #ffffff">在F:/SubversionFiles/conf/创建Test1.project和Test2.project文件，Test1</font><font style="background-color: #ffffff">内容如下，Test2可以做相应的修改<br />
        <br />
        </font><font style="background-color: #a9a9a9">#SVN项目名<br />
        <location test1=""></location><br />
        &nbsp;&nbsp;&nbsp;&nbsp; DAV svn<br />
        <br />
        &nbsp;&nbsp;&nbsp; #SVN项目的路径<br />
        &nbsp;&nbsp;&nbsp;&nbsp; SVNPath F:\SubversionFiles\Test1<br />
        <br />
        &nbsp;&nbsp;&nbsp; #SVN项目的路径权限授权文件存放路径<br />
        &nbsp;&nbsp;&nbsp;&nbsp;AuthzSVNAccessFile F:\SubversionFiles\conf\Test1.access<br />
        <br />
        </font><font style="background-color: #a9a9a9">#对于所有用户都需要身份验证<br />
        &nbsp;&nbsp;&nbsp;&nbsp;Satisfy Any<br />
        &nbsp;&nbsp;&nbsp;&nbsp; Require valid-user<br />
        <br />
        #验证方式<br />
        </font><font style="background-color: #a9a9a9">&nbsp;&nbsp;&nbsp;&nbsp;</font><font style="background-color: #a9a9a9">AuthType Basic<br />
        <br />
        &nbsp;&nbsp;&nbsp; #项目的名称<br />
        &nbsp;&nbsp;&nbsp;&nbsp; AuthName "My Test1</font><font style="background-color: #a9a9a9">"<br />
        <br />
        &nbsp;&nbsp;&nbsp; #用户信息<br />
        &nbsp;&nbsp;&nbsp;&nbsp; AuthUserFile&nbsp; F:\SubversionFiles\conf\user<br />
        <br />
        </font><font style="background-color: #a9a9a9"><br />
        <br />
        <br />
        <font style="background-color: #ffffff">以上配置含义是在Apache下建立了一个叫作Test1的SVN虚拟目录，指向F:\SubversionFiles\Test1，授权配置文件是F:\SubversionFiles\conf\Test1.access，用户信息和密码文件是F:\SubversionFiles\conf\user<br />
        <br />
        <br />
        </font></font>
        <li><font style="background-color: #a9a9a9"><font style="background-color: #ffffff">&nbsp;</font><font style="background-color: #ffffff">通过以上配置，我们就在Apache上建立了Test1和Test2两个虚拟目录，也就是两个独立的SVN库，我们还需要两个文件访问权限配置的.access和包含登录用户的user。&nbsp;在F:\SubversionFiles\conf目录中创建用户列表文件user，方法在上篇中已经说过，也就是</font></font><font style="background-color: #a9a9a9"><font style="background-color: #ffffff">htpasswd命令，我们需要创建Xrinehart, X-Killer, Guest三个用户。<br />
        <br />
        </font></font>
        <li><font style="background-color: #a9a9a9"><font style="background-color: #ffffff">接下来，我们为Test1库创建它的访问权限文件</font><font style="background-color: #ffffff">F:\SubversionFiles\conf\Test1.access。在上篇文章中我们是采用对每个用户分别赋予对应权限的方式，如果用户比较多，管理起来就会比较麻烦，这时我们需要用用户组来对用户进行管理。下面我们就来尝试用用户组配置访问权限。Test1.access文件内容如下：<br />
        <br />
        <br />
        </font></font><font style="background-color: #a9a9a9">[groups]<br />
        AdminGroup = Xrinehart<br />
        GuestGroup = guest<br />
        <br />
        [/]<br />
        @AdminGroup = rw<br />
        @GuestGroup = r<br />
        <br />
        X-Killer = rw<br />
        </font><font style="background-color: #a9a9a9"><br />
        <br />
        </font><font style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上面的配置中，通过[groups]节定义了两个用户组：AdminGroup和GuestGroup，并将Xrinehart用户归入AdminGroup用户组，guest用户归入GuestGroup。再在下面的[/]定义了他们对Test1库的根目录的操作权限：AdminGroup组有读写权限，GuestGroup组只有读权限，X-Killer用户拥有读写权限。这里需要注意的是定义权限的时候，用户组需要在前面加@符号来标示。<br />
        <br />
        </font>
        <li>为了测试效果，我们可以将Test2.access文件写为：<br />
        <br />
        <font style="background-color: #a9a9a9">[groups]<br />
        AdminGroup = Xrinehart, X-Killer<br />
        GuestGroup = guest<br />
        <br />
        [/]<br />
        @AdminGroup = r<br />
        @GuestGroup = rw<br />
        <br />
        <br />
        </font>
        <li><font style="background-color: #ffffff">保存好上面的所有配置文件之后，重新启动Apache服务器。此时我们就可以在IE里面通过</font><a href="http://localhost:8080/Test1"><font style="background-color: #ffffff">http://localhost:8080/Test1</font></a><font style="background-color: #ffffff"> 和</font><a href="http://localhost:8080/Test2"><font style="background-color: #ffffff">http://localhost:8080/Test2</font></a><font style="background-color: #ffffff"> 来访问Test1和Test2库了，你可以测试一下，用户权限是否符合下面这个列表所示？做到这里，SVN在Apache上建立多个库的配置也就算完成了。<br />
        <br />
        <br />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test2<br />
        <br />
        Xrinehart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r<br />
        X-Killer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r<br />
        guest&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rw<br />
        </font></li>
    </ol>
    </li>
</ol>
 <img src ="http://www.blogjava.net/xiaosao/aggbug/153667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-10-17 19:47 <a href="http://www.blogjava.net/xiaosao/archive/2007/10/17/153667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转&gt;实战SVN For Apache2（一） </title><link>http://www.blogjava.net/xiaosao/archive/2007/10/17/153664.html</link><dc:creator>cAng^Er</dc:creator><author>cAng^Er</author><pubDate>Wed, 17 Oct 2007 11:39:00 GMT</pubDate><guid>http://www.blogjava.net/xiaosao/archive/2007/10/17/153664.html</guid><wfw:comment>http://www.blogjava.net/xiaosao/comments/153664.html</wfw:comment><comments>http://www.blogjava.net/xiaosao/archive/2007/10/17/153664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaosao/comments/commentRss/153664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaosao/services/trackbacks/153664.html</trackback:ping><description><![CDATA[<p>原文地址：http://www.cnblogs.com/Xrinehart/archive/2005/10/27/262759.aspx<br />
&nbsp; SVN最常见的配置模式便是与Apache集成，这样SVN可以采用WebDev协议方式提供服务。主要的好处有：通过Apache以HTTP方式穿透防火墙，便于在互联网环境使用；提供目录的版本控制；纯2进制的文件对比方式等。下面将介绍如何将SVN集成在Apache上。</p>
<ol>
    <li>准备工作： <br />
    <br />
    <ol>
        <li>下载软件：
        <ol>
            <li><strong>SVN服务器端程序</strong>。到<a href="http://subversion.tigris.org/" target="_self"><strong><font color="#ff1493">官方网站</font></strong></a> 的下载二进制安装文件，来到<a href="http://subversion.tigris.org/project_packages.html#binary-packages" target="_self"><strong><font color="#ff1493">二进制包下载部分</font></strong></a>&nbsp; ，找到 Windows NT, 2000, XP and 2003部分，然后选择"<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91"><strong><font color="#ff1493">this directory</font></strong></a>"，这样我们可以看到许多下载的内容，目前可以下载<a onclick="return launch(this.href, 1)" href="http://subversion.tigris.org/files/documents/15/25364/svn-1.2.3-setup.exe"><strong><font color="#7ecb4b"> </font><font color="#ff1493">svn-1.2.3-setup.exe</font></strong></a>。<br />
            <br />
            <li><strong>TortoiseSVN</strong>，客户端程序。TortoiseSVN是扩展Windows Shell的一套工具，可以看作Windows资源管理器的插件，安装之后Windows就可以识别Subversion的工作目录。<br />
            官方网站是<a href="http://tortoisesvn.tigris.org/"><strong><font color="#ff1493">TortoiseSVN</font></strong></a>，下载方式和前面的svn服务器类似，在<a href="http://tortoisesvn.tigris.org/download.html"><strong><font color="#ff1493">Download</font></strong></a>页面的我们选择Official version for Win2k/XP or higher的版本，然后在sourceforge的<a href="http://sourceforge.net/project/showfiles.php?group_id=138498&amp;package_id=151948" target="_self"><strong><font style="background-color: #ffffff" color="#ff1493">下载页面</font></strong></a>选择目前的最高稳定版本的安装文件<a href="http://prdownloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.2.5.4719-svn-1.2.3.msi?download"><font color="#ff1493">TortoiseSVN-1.2.5.4719-svn-1.2.3.msi</font></a>。（注意：TortoiseSVN有一个特殊对VS.Net运行时一个BUG修正的版本，在<a href="http://sourceforge.net/project/showfiles.php?group_id=138498&amp;package_id=151948" target="_self"><strong><font style="background-color: #ffffff" color="#ff1493">下载页面</font></strong></a>有选择：Special version for Win2k/XP or higher: <strong>(We provide NO support for this!)</strong> uses _svn folders instead of .svn to work around the VS.NET bug with web projects. If you don't use web projects then please use the official version. ）<br />
            <br />
            <li><strong>TortoiseSVN的中文语言包</strong>，注意这个需要下和客户端程序版本相同的。可以在<a href="http://tortoisesvn.tigris.org/download.html"><strong><font color="#ff1493">Download</font></strong></a>页面内的<a href="http://sourceforge.net/project/showfiles.php?group_id=138498&amp;package_id=158749"><font color="#ff1493">Language Packs</font></a>选择下载。<br />
            <br />
            <li>Apache服务器程序。可以到<a href="http://httpd.apache.org/"><font color="#ff1493">Apache官方网站</font></a>下载最新版本的Apache，并且SVN必须运行在Apache2以上版本，在<a href="http://httpd.apache.org/download.cgi"><font color="#ff1493">下载页面</font></a>选择Windows的安装包文件<a href="http://apache.justdn.org/httpd/binaries/win32/apache_2.0.55-win32-x86-no_ssl.msi"><font color="#ff1493">apache_2.0.55-win32-x86-no_ssl.msi</font></a><br />
            <br />
            <li><strong>AnkhSVN</strong>，可选安装VS.Net的SVN插件。有0.5和0.6版本选择，0.6版支持VS2005 Beta2，<a href="http://ankhsvn.tigris.org/servlets/ProjectDocumentList?folderID=2955"><font color="#ff1493">下载页面</font></a>。<br />
            <br />
            </li>
        </ol>
        <li>停止IIS，因为Apache默认安装为80端口，需要关闭IIS避免端口冲突。可以在安装好之后再调整端口。<br />
        <br />
        <br />
        </li>
    </ol>
    <li>开始安装： <br />
    <br />
    <ol>
        <li>先安装Apache服务器。在到填写ServerInfo的时候，若机器已经启用了AD，安装程序会自动填写，否则自己手动填写。安装完成之后到安装目录下找到conf目录下的httpd.config文件，搜索Listen，并将Listen后面的80改为8080（或者你希望的端口），然后重新启动Apache服务器，这时可以用<a href="http://localhost:8080/">http://localhost:8080</a> 来测试是否安装正确。<br />
        <br />
        <li>再安装SVN服务器，没有什么好说的，一路回车就可以了。（安装SVN时，请确保Apache服务器正在运行状态，安装过程中可能会将Apache关闭，重新启动属于正常现象）<br />
        <br />
        </li>
    </ol>
    <li>配置Apache服务器与SVN集成：<br />
    <br />
    <br />
    <ol>
        <li>首先将<font face="Times New Roman, serif">Subversion</font>安装目录<font face="Times New Roman, serif">bin\</font>下面的两个文件：<font face="Times New Roman, serif"><strong>mod_authz_svn.so</strong></font>和<font face="Times New Roman, serif"><strong>mod_dav_svn.so</strong></font>复制到<font face="Times New Roman, serif">Apache</font>安装目录<font face="Times New Roman, serif">modules\</font>目录下。<br />
        <li>有些文章说需要再修改httpd.conf，并做如下修改：<br />
        找到Apache安装目录下的conf目录，用文本编辑器打开httpd.conf，找到一下两行：<br />
        <br />
        <font style="background-color: #a9a9a9">#LoadModule dav_module modules/mod_dav.so<br />
        #LoadModule dav_fs_module modules/mod_dav_fs.so<br />
        </font><br />
        将每行前面的注释符&#8220;#&#8221;去掉。再在所有LoadModule语句的最后添加一下几行：<br />
        <br />
        <font style="background-color: #a9a9a9">#SVN<br />
        LoadModule dav_svn_module modules/mod_dav_svn.so<br />
        LoadModule authz_svn_module modules/mod_authz_svn.so<br />
        </font><br />
        但是我安装完之后发现这个文件已经被做了那些修改，大概是新版的SVN安装程序做了一些优化吧。其实在成功安装SVN之后，Apache服务器已经和SVN初步集成。如图：<br />
        <br />
        <img height="329" alt="Apache.jpg" src="http://www.cnblogs.com/images/cnblogs_com/xrinehart/Apache和SVN集成/Apache.jpg" width="530" border="0" /><br />
        <br />
        注意下面的状态栏已经是Apache/2.0.55 SVN1.2.3 DAV/2<br />
        <br />
        <li>建立一个SVN存放文件的目录，我在F盘下创建一个文件夹：F:/SubversionFiles
        <li>接下来我们必须告诉Apache我们的资源库所在的路径，可以通过Location指令来完成这个设置。因为不希望为每个单独的项目都进行单独的设置，所以我们把所有项目都存放在统一的资源库目录，那么可以使用SVNParentPath指令来指定存放所有项目的路径。在httpd.conf文件最后添加下面配置：<br />
        <br />
        <font style="background-color: #a9a9a9">#SVN<br />
        </font><font style="background-color: #a9a9a9"><br />
        <location svn>&lt;Location /svn&gt;<br />
        &nbsp;&nbsp;&nbsp; DAV svn<br />
        &nbsp;&nbsp;&nbsp; SVNParentPath "F:/SubversionFiles"<br />
        &lt;/Location&gt;<br />
        </location><br />
        </li>
    </ol>
    </font>
    <p>这样我们就可以通过<a href="http://myhost:8080/svn/">http://myhost:8080/svn/</a>&lt;项目名&gt; 来访问存放于资源库F:/SubversionFiles中的指定项目。当然有可能你并不希望某个项目提供这样一种访问方式，这时候你可以使用SVNPath为每个项目进行单独的设置，SVNPath的使用方法如下：<br />
    <location svn="" project1=""></location><br />
    &nbsp;&nbsp;&nbsp; DAV svn<br />
    &nbsp;&nbsp;&nbsp; SVNPath "F:/SubversionFiles/project1"<br />
    </p>
    <p>同样把这段配置放在httpd.conf最后，重启Apache HTTP服务即可通过<a href="http://myhost:8080/svn/project1">http://myhost:8080/svn/project1</a> 来访问project1项目的资源库。</p>
    <ol>
        <li>
        <p>下面作一个测试：</p>
        <ol>
            <li>
            <p>到F:\SubversionFiles下建立一个子目录Test，然后到Aapche下的Bin目录下执行svnadmin create F:\SubversionFiles\Test</p>
            <li>
            <p>打开浏览器输入网址：<a href="http://localhost:8080/svn/Test">http://localhost:8080/svn/Test</a>&nbsp;，应该可以正确访问，但当前该项目下还没有加入任何内容，所以显示为空的</p>
            <li>
            <p>有一点需要提示的是，现在的访问是完全匿名的，任何人都可以对SVN进行操作。所以我们接下来利用Apache的权限管理功能来对SVN进行用户验证集成</p>
            </li>
        </ol>
        <li>
        <p>加入用户身份验证：<br />
        <br />
        在确定对访问用户的权限控制之前，你必须规划好是对整个资源库中的所有项目还是单独的某一个项目进行统一的身份验证， 也就是我们前面讲到的是使用SVNParentPath还是SVNPath的问题。<br />
        <br />
        最简单的身份验证方式是使用Basic HTTP Authentication机制，该方式通过用户名和口令对访问用户进行身份验证。我们可以直接通过Apache提供的支持进行设置。Apache提供一个htpasswd工具来管理用户名和口令。接下来我们利用这个工具来添加两个用户。<br />
        <br />
        在命令行窗口中转到Apache所在的目录，执行下列命令<br />
        <br />
        <font style="background-color: #a9a9a9">说明：创建用户Xrinehart<br />
        输入：htpasswd &#8211;c F:\SubversionFiles\svn_auth_passwd Xrinehart<br />
        说明：使用-c参数来创建一个passwd文件<br />
        输出：<br />
        New password: *****<br />
        Re-type new password: *****<br />
        Adding password for user Xrinehart<br />
        </font><font style="background-color: #c0c0c0"><br />
        </font><font style="background-color: #ffffff">再创建用户的时候就不用-c参数，而是用-m参数，因为文件</font><font style="background-color: #ffffff"><strong>svn_auth_passwd</strong> 已</font><font style="background-color: #ffffff">经创建。<br />
        <br />
        </p>
        <p>打开svn_auth_passwd文件，密码使用MD5加密过了，而且同样的密码加密出来的内容却不相同<br />
        <br />
        接下来我们必须告诉Apache服务器如何使用这个passwd文件，打开httpd.conf找到刚才我们添加的Location配置的位置，修改如下：<br />
        <location svn=""></location><br />
        </font><font style="background-color: #a9a9a9">#<br />
        # SVN<br />
        # <br />
        <location svn><br />
        &nbsp; DAV svn<br />
        &nbsp; SVNParentPath "F:/SubversionFiles"<br />
        <br />
        # how to authenticate a user<br />
        &nbsp;AuthType Basic<br />
        &nbsp;AuthName "Subversion repository"<br />
        &nbsp;AuthUserFile "F:/SubversionFiles/svn_auth_passwd"<br />
        &nbsp; <br />
        &nbsp; # only authenticated users may access the repository<br />
        Require valid-user<br />
        </location><br />
        </font><font style="background-color: #ffffff"><br />
        重新启动Apache HTTP服务器，使用浏览器打开 <a href="http://localhost:8080/svn/Test">http://localhost:8080/svn/Test</a> 你将会看到要求登录的对话框，输入你刚设置的用户名和口令即可。<br />
        <br />
        这样Apache和SVN的集成就基本告成了<br />
        <br />
        </font></p>
        </li>
    </ol>
    </li>
</ol>
<img src ="http://www.blogjava.net/xiaosao/aggbug/153664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaosao/" target="_blank">cAng^Er</a> 2007-10-17 19:39 <a href="http://www.blogjava.net/xiaosao/archive/2007/10/17/153664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>