﻿<?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-Javadream-随笔分类-技术感语</title><link>http://www.blogjava.net/oxl/category/11116.html</link><description>A long way and a dream.</description><language>zh-cn</language><lastBuildDate>Sun, 27 Sep 2009 15:23:55 GMT</lastBuildDate><pubDate>Sun, 27 Sep 2009 15:23:55 GMT</pubDate><ttl>60</ttl><item><title>使GDB能打印宏的方法</title><link>http://www.blogjava.net/oxl/archive/2009/09/15/295081.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 14 Sep 2009 17:44:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2009/09/15/295081.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/295081.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2009/09/15/295081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/295081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/295081.html</trackback:ping><description><![CDATA[$ gcc -gdwarf-2 -g3 sample.c -o sample
<img src ="http://www.blogjava.net/oxl/aggbug/295081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2009-09-15 01:44 <a href="http://www.blogjava.net/oxl/archive/2009/09/15/295081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置Log4j</title><link>http://www.blogjava.net/oxl/archive/2008/11/27/242978.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Thu, 27 Nov 2008 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2008/11/27/242978.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/242978.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2008/11/27/242978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/242978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/242978.html</trackback:ping><description><![CDATA[http://blog.csdn.net/azheng270/archive/2008/03/12/2173430.aspx<br />
<img src ="http://www.blogjava.net/oxl/aggbug/242978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2008-11-27 12:16 <a href="http://www.blogjava.net/oxl/archive/2008/11/27/242978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中使用log4j</title><link>http://www.blogjava.net/oxl/archive/2008/11/27/242976.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Thu, 27 Nov 2008 04:09:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2008/11/27/242976.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/242976.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2008/11/27/242976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/242976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/242976.html</trackback:ping><description><![CDATA[http://www.java3z.com/cwbwebhome/article/article2/2943.html?id=1638<br />
<img src ="http://www.blogjava.net/oxl/aggbug/242976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2008-11-27 12:09 <a href="http://www.blogjava.net/oxl/archive/2008/11/27/242976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2很强</title><link>http://www.blogjava.net/oxl/archive/2008/11/26/242676.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Tue, 25 Nov 2008 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2008/11/26/242676.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/242676.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2008/11/26/242676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/242676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/242676.html</trackback:ping><description><![CDATA[今晚我用了一个晚上去搞那鸟form，呵呵，原来基础真的很重要，遇到不懂才翻书真的很慢。<br />
<br />
Struts2真的很强，它帮我搞定了重复提交或直接访问提交地址时遇到的问题，呵呵，token万岁。<br />
<br />
有点不知所语了，呵。<br />
<br />
<img src ="http://www.blogjava.net/oxl/aggbug/242676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2008-11-26 00:34 <a href="http://www.blogjava.net/oxl/archive/2008/11/26/242676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext 2 学习笔记（三）：Ext模块</title><link>http://www.blogjava.net/oxl/archive/2008/02/11/179595.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 11 Feb 2008 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2008/02/11/179595.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/179595.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2008/02/11/179595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/179595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/179595.html</trackback:ping><description><![CDATA[<span style="font-family: Courier;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;定义一个模块，你可以像使用类一样使用它，你完全可以把它当成是类。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;它利用js的一些特性实现私有和公有，就和applayout.js中定义的名命空间一样。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;module&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;私有变量</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;message&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'Hello,&nbsp;Ext&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;beginner.';<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;公用变量或函数</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;'oxl',<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name;<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.other();<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(message);<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;other:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Welcome&nbsp;to&nbsp;Ext&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">\'s&nbsp;world.');<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">}();</span></div>
</span>
<img src ="http://www.blogjava.net/oxl/aggbug/179595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2008-02-11 11:35 <a href="http://www.blogjava.net/oxl/archive/2008/02/11/179595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext 2 学习笔记（二）：Ext命名空间</title><link>http://www.blogjava.net/oxl/archive/2008/02/11/179594.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 11 Feb 2008 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2008/02/11/179594.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/179594.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2008/02/11/179594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/179594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/179594.html</trackback:ping><description><![CDATA[<span style="font-family: Courier;">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;btn1Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello,&nbsp;world.</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;填充图片的本地引用</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">Ext.BLANK_IMAGE_URL&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'..</span><span style="color: #000000;">/</span><span style="color: #000000;">ext</span><span style="color: #000000;">/</span><span style="color: #000000;">resources</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #0000ff;">default</span><span style="color: #000000;">/</span><span style="color: #000000;">s.gif';<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;申明名字空间，用于下面的定义。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">Ext.namespace(</span><span style="color: #000000;">"</span><span style="color: #000000;">myNameSpace</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;定义名字空间。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;注意这里，因为function是立即运行的（因为最后还有个括号），所以myNameSpace.app得到的是这个函数返回的结果。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;因为函数内定义的变量是不能被外部访问的，利用这种方式可以把变量定义为私有的方式。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;因为返回的是一个对象，所以app得到的结果就是一个对象，所以就可以通过.运算符得到这个返回对象的变量和方法，</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这样就可以利用这点申明为公用的变量。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">myNameSpace.app&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;私有变量</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;btn1;<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;privVar1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;私有函数</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;btn1Handler&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(button,&nbsp;event)&nbsp;{<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这里很巧妙，虽然表面上说是私有函数可以访问私有变量，可是这里利用了函数栈的概念，</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;即函数可以访问上一层函数定义的变量，这里的privVar1就是上一层函数中定义的变量了。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('privVar1</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;privVar1);<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;因为这里的this指向的window对象，所以这里的this.btn1Text为undefined.</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;当把它赋给一个对象的时候，this指向这个对象，也就是像下的调用一样。&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.btn1Text</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.btn1Text);<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;公共空间</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btn1Text:&nbsp;'Button&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">',<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btn1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Ext.Button({<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderTo:&nbsp;'btn1</span><span style="color: #000000;">-</span><span style="color: #000000;">ct',<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text:&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.btn1Text,<br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler:&nbsp;btn1Handler,<br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope:&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;调用btn1Handler函数，这里函数里的this指向的是window</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btn1Handler();<br />
</span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">}();<br />
</span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">Ext.apply(myNameSpace.app,&nbsp;{<br />
</span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;btn1Text:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Hello,&nbsp;Ext&nbsp;2.0</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
</span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这里所说的重写特权函数也无法访问私有变量或私有函数，其实是因为他不在函数上下文，无法访问函数上一层定义的变量而已。</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;init:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{<br />
</span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btn1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Ext.Button({<br />
</span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderTo:&nbsp;'btn1</span><span style="color: #000000;">-</span><span style="color: #000000;">ct',<br />
</span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text:&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.btn1Text,<br />
</span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler:&nbsp;btn1Handler,<br />
</span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope:&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
</span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(e)&nbsp;{<br />
</span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('错误:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">'&nbsp;+&nbsp;e.message&nbsp;+&nbsp;'</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;发生在行:&nbsp;'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.lineNumber);<br />
</span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">});</span></div>
</span>
<img src ="http://www.blogjava.net/oxl/aggbug/179594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2008-02-11 11:19 <a href="http://www.blogjava.net/oxl/archive/2008/02/11/179594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext 2 学习笔记（一）：js变量作用域</title><link>http://www.blogjava.net/oxl/archive/2008/02/11/179590.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 11 Feb 2008 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2008/02/11/179590.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/179590.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2008/02/11/179590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/179590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/179590.html</trackback:ping><description><![CDATA[全局范围内申明的变量其实就是window对象的属性，比如说：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;test;</span></div>
<br />
我们可以用下面的方式得到它：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">window.test<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #0000ff;">this</span><span style="color: #000000;">.test</span></div>
<br />
因为在顶级范围，this指向window对象，可以这么认为，this指向window作用域。<br />
<br />
我们定义一个对象：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;obj1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">oxl</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;func:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{alert(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name);}};<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;obj2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{name:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">blogjava</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;func:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">()&nbsp;{alert(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name);}};</span></div>
<br />
<br />
这个时候，obj1和obj2都是window的属性，我们可以通过obj1.name访问obj1的name属性（obj2也同样），通过obj1.func()访问obj1的func方法。注意，这里使用this访问对象的name属性，因为这时func是obj1的方法，所以this指向的是obj1，所以，this.name其实就是obj1.name。<br />
<br />
我们又可以这样去调用obj1的方法：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">obj1.func.call(obj2);</span></div>
<br />
这时，在obj1.func函数中，所有的this都是指向obj2，与obj1没有任何关系，所以这时this.name其实就是obj2.name。<br />
<br />
总结：从上面我们可以这样认为，this总是指向自己的作用域范围，全局范围中它指向window，而在对象中，它指向对象，如果指定一个对象做为它的作用域，它指向这个对象。在Ext中就用到这样的方式，因为在onReady函数的第二个参数就作用域指定，估计也是用call方式指定作用域外。<br />
<img src ="http://www.blogjava.net/oxl/aggbug/179590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2008-02-11 10:20 <a href="http://www.blogjava.net/oxl/archive/2008/02/11/179590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2 学习笔记（一）</title><link>http://www.blogjava.net/oxl/archive/2007/08/08/135198.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 08 Aug 2007 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/08/08/135198.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/135198.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/08/08/135198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/135198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/135198.html</trackback:ping><description><![CDATA[<p>一，FactoryBean<br>&nbsp;&nbsp;&nbsp;实现FactoryBean接口的bean类，在获取bean时并不是得到这个bean类的实例，而是通过这个FactoryBean的getObject方法得到实例，具体的类型由getObjectType方法返回。这种FactoryBean会被Spring自动检测并进行判断，而申明时像平时的bean那样申明，不过在定义property等属性时，则是对FactoryBean实例进行设置，而不是对生成的bean设置，认清这一点很重要。比如说常用的Spring DataSource就是一个FactoryBean。<br>下面是一个实例：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;com.sanlea.study.spring2.ch03;<br><br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.springframework.beans.factory.FactoryBean;<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;UserFactoryBean&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;FactoryBean&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;email;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setName(String&nbsp;name)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setEmail(String&nbsp;email)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.email&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;email;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Object&nbsp;getObject()&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;Exception&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;User();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setName(name&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setEmail(email&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;user;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">unchecked</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Class&nbsp;getObjectType()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;User.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;isSingleton()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>}<br></span></div>
<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: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;定义一个FactoryBean(实现Spring接口的Bean,比如Spring中就有一些关于DataSource的FactoryBean)&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="fbUserInstance"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="com.sanlea.study.spring2.ch03.UserFactoryBean"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;这里设置的属性设置的是UserFactoryBean实例的属性,而不是UserFactoryBean实例生成的bean的属性&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="mm"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="email"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="mm@yinsha.com"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>二、工厂方法创建bean<br>&nbsp;&nbsp;&nbsp;这是利用类的工厂方法创建实例的方法，主要是兼容旧有的代码，还有一些则是必须由一个类生成另一个类的实例的方法。比如说我要实例一个JDBC Connection类，那就要进行很多的步聚，如注册驱动，设置连接相关参数等等，这些并不能直接一个new就搞定，必须要有一定的步骤才能完成，所以就能用方法进行实例化了，在Spring也支持这种方式，主要是指定factory-method属性，如果工厂是一个bean的话就要指定factory-bean了。<br>下面是一个实例：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;com.sanlea.study.spring2.ch03;<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;StaticFactoryBean&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;comment;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setComment(String&nbsp;comment)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.comment&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;comment;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;print()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">comment:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;comment);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;StaticFactoryBean(String&nbsp;name)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;StaticFactoryBean&nbsp;getInstance(String&nbsp;name)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;StaticFactoryBean(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<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: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;静态工厂方法创建Bean&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="staticFactoryBean"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="com.sanlea.study.spring2.ch03.StaticFactoryBean"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory-method</span><span style="COLOR: #0000ff">="getInstance"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">constructor-arg&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="juggler"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="comment"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="a&nbsp;good&nbsp;man,&nbsp;but&nbsp;so&nbsp;sad"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div>
<img src ="http://www.blogjava.net/oxl/aggbug/135198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-08-08 11:47 <a href="http://www.blogjava.net/oxl/archive/2007/08/08/135198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>思考轻量级JEE Web程序架构</title><link>http://www.blogjava.net/oxl/archive/2007/08/01/133818.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 01 Aug 2007 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/08/01/133818.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/133818.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/08/01/133818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/133818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/133818.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">注：标题写得有点夸张，这是本人的文学修养问题，不在讨论范围之内。这里的前提是使用贫血模型模式和轻量级JEE Web，没有考虑分布式。<br><br>这些天在看Hibernate的资料，除了对它的强大感到惊人之外，更多的就是烦恼，因为太多本来确定的理论现在都变得相当站不住脚，而且有些东西百思不得其解。这得从DAO层开始讲起，一般的架构是这样的：<br>&nbsp;&nbsp;&nbsp;&nbsp; Web层<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp; Service层<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp;&nbsp;&nbsp; DAO层<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&nbsp;&nbsp;&nbsp; 数据库</p>
因为DAO层主要负责对象持久的操作，而Service层则是除持久操作外操作，所以各自分工，层次分明。但是因为在按各种条件检索数据的时候，Service层需要向Web层提供相应的接口，比如说接用户名查订单需要一个接口，按时间查订单需要一个接口等等，但是这样使得DAO层同时也必须提供同样的接口，这样，当有新的需求时就要添加两个接口，而且通常Service层只是简单的调用一下DAO层而已。<br><br>而另有一种方法就是Service类继承DAO类，覆盖相应的方法，这使得只修改Dao的方法就可以了。但是就有了问题，因为Service层的接口要求的参数和DAO层的参数会不一样，这造成重载了相应的方法而不是覆盖相应的方法，也就是说Service类无端多了很多接口，使得调用有些混乱。<br><br>从实际来看，常用后面那种方法，而且和上一层程序员搞好默契，哪些方法可以用，哪些不可以。但是这带来的问题就是一不小心调用错了就麻烦了。而前一种虽然修改麻烦一点，但至少使得Service层是干净的接口，没有不用得上的接口。<br><br>其实在日常的开发中总是这样认为，DAO有没有一个万能的接口可以用于检索对象？就旭上面所说的，按用户名查订单等这样的操作，有没有一个通用的接口去实现呢？DAO不是做不到，而是开发这样的功能相当复杂，而且难以重用，似乎这是一个理想，一个难以实现的理想了。<br><br>从上面的讨论中我们可以看得到，DAO就是持久层，他负责对象的CRUD，而且我们希望有一个通用的检索对象的接口。<br><br>终于，我们的Hibernate横空出世了（超级赛亚人？）。他的Session实现了对象的CRUD，与此同时接供了基于HQL的Query接口，用于按条件检索对象，从这个意义上来说，他就是一个DAO实现，我们可以直接在Service层使用Hibernate做为的DAO。<br><br>可是为什么还有这么多人要在Hibernate之上建立DAO呢？无非就是做一个可更换持久层的系统（如JDO），又或者把Hibernate的一些Session操作隐藏起来，使得Service层的代码更为简洁明了。对于后面的说法还可以说得过去，可是前面的讲法就不妥了，因为通用的检索接口各个ORM实现都不相同，那么DAO很难做得到通用，这就又回到前面没有Hibernate之前的困境了；而与此同时，使用DAO也会有一些问题，就是必定是跨了多个Session进行的操作，那么在Update操作时就会把整个对象（这个对象是游离态的）进行所有字段的进行更新，实际上只有一两个字段被修改了，对于一些计数操作，这样的方式的性能相当差劲（比如说一篇文章有多少人阅读过了这样的计数）。<br><br>其实会这么样，我会直接在Service使用Hibernate做为DAO，在大多数中小型应用中，很少（几乎没有）有人会要求更换持久层中间件的，所以根本不用担心，而且维护也并没有想象中复杂，因为始终还是得对新的DAO层进行了解的，不是吗？ 
<img src ="http://www.blogjava.net/oxl/aggbug/133818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-08-01 16:50 <a href="http://www.blogjava.net/oxl/archive/2007/08/01/133818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中定义Bean我用Constructor</title><link>http://www.blogjava.net/oxl/archive/2007/07/16/130598.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 16 Jul 2007 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/07/16/130598.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/130598.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/07/16/130598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/130598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/130598.html</trackback:ping><description><![CDATA[Spring文档推荐使用setter，可是我觉得使用Construtor理为准确一些，因为如果用setter的话，Bean就潜意识地认为会有容器给他注入依赖，那么这个Bean就依赖于某个容器。而使用Constructor的话，就明确告诉使用bean时必须的依赖，这样的bean就算是避开容器也照样可以运作。
<img src ="http://www.blogjava.net/oxl/aggbug/130598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-07-16 15:57 <a href="http://www.blogjava.net/oxl/archive/2007/07/16/130598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解WW的ValueStack</title><link>http://www.blogjava.net/oxl/archive/2007/07/06/128646.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Fri, 06 Jul 2007 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/07/06/128646.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/128646.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/07/06/128646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/128646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/128646.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Comic Sans MS">跟着《Webwork in Action》学到了OGNL，一直对ValueStack的概念很模糊，而书里也没有介绍清楚，我一直以来连ValueStack里Action是在栈顶呢还是在哪里一层都不清楚，怎么把一个自定义的对上push到ValueStack上，如果在action的execute中push，他是在栈顶呢，还是次于Action呢？<br><br>其实在WW中，ValueStack的栈结构是这样的，在执行Action之前把Action压入栈，这时Action就是栈顶，然后在Action.execute()时再把自定义的bean压入栈，那么这时这个自定义的bean就在栈顶了。所以在下面这样的JSP代码中，是先从自定义bean查起，然后才到Action。
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ww:property&nbsp;</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>在ActionContext上下文中，默认是从OgnlValueStack去查找，因为这样，所以在在查找OgnlValueStack的值时是不用#来标明它所在的值栈。而像Session和Application这样的Map，则需要前缀，像这样：#session.xxx,#application.xxx。<br><br>至于怎么在ActionContext中添加类似于Session的Map，只有一个方法就是调用put方法。<br><br>讲得很粗略，不过内里已经了清楚了。</span>
<img src ="http://www.blogjava.net/oxl/aggbug/128646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-07-06 17:48 <a href="http://www.blogjava.net/oxl/archive/2007/07/06/128646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>试用Eclipse 3.3的JEE，不稳定</title><link>http://www.blogjava.net/oxl/archive/2007/07/04/128060.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 04 Jul 2007 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/07/04/128060.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/128060.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/07/04/128060.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/128060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/128060.html</trackback:ping><description><![CDATA[刚试用Eclipse 3.3的JEE，还没把WW配置好就挂掉了，太不稳定了。<br><br>还是IDEA好，不过IDEA也太吃内存太慢了，娘的，JAVA IDE还真没个好用的。
<img src ="http://www.blogjava.net/oxl/aggbug/128060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-07-04 12:02 <a href="http://www.blogjava.net/oxl/archive/2007/07/04/128060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 标准IO流的理解</title><link>http://www.blogjava.net/oxl/archive/2007/07/02/127558.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 02 Jul 2007 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/07/02/127558.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/127558.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/07/02/127558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/127558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/127558.html</trackback:ping><description><![CDATA[Java 流包括字节流和字符流，字节流通过IO设备以字节数据的方式读入，而字符流则是通过字节流读入数据转化成字符&#8220;流&#8221;的形式由用户驱使。<br><br>流可以通过包装进行功能上的扩充，比如说BufferedStream，可以缓冲流，提高读取的性能，其实在Java中都是以这种操作IO的。<br><br><span style="COLOR: red">但是我们不能把BufferedStream当成是实际可用的流，其实它们必须包装一个代表真实的IO设备的流才能操作，</span>比如说System.in和System.out，或者是数组和字符串（另一种包装的流）。<br><br>比如说InputStream可以这样用：<br>InputStream in = new BufferedInputStream(new BufferedInputStream(System.in));<br><br>而字符流呢？<br>其实字符流没有实际的形式，只能是通过包装一些特别的输入流才能进行字符操作，比如说包装字节流InputStream：<br>Reader reader = new InputStreamReader(System.in);<br>再比如说包装字符数组：<br>char[] in = new char[1024];<br>Reader reader = new CharArrayReader(in);<br><br>了解这些后，就能明白流的操作规律了。
<img src ="http://www.blogjava.net/oxl/aggbug/127558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-07-02 15:26 <a href="http://www.blogjava.net/oxl/archive/2007/07/02/127558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork文件上传中要做的事情</title><link>http://www.blogjava.net/oxl/archive/2007/06/27/126512.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 27 Jun 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/06/27/126512.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/126512.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/06/27/126512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/126512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/126512.html</trackback:ping><description><![CDATA[<p><span style="FONT-FAMILY: Comic Sans MS">webwork.properties加入以下内容：</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Comic Sans MS; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">webwork.multipart.saveDir</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d:\\tmp<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>webwork.multipart.parser</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">jakarta</span></div>
<br><span style="FONT-FAMILY: Comic Sans MS">/WEB-INF/lib加入下面的库：<br></span>
<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; FONT-FAMILY: Comic Sans MS; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">commons-io.jar<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>commons-fileupload.jar</span></div>
<br>Action内的实例变量可以是数据，不过他们必须遵从这样的格式：<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; FONT-FAMILY: Comic Sans MS; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>file<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>fileContnetType<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>fileFileName</div>
<img src ="http://www.blogjava.net/oxl/aggbug/126512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-06-27 11:00 <a href="http://www.blogjava.net/oxl/archive/2007/06/27/126512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天试用IDEA</title><link>http://www.blogjava.net/oxl/archive/2007/05/18/118309.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Fri, 18 May 2007 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/05/18/118309.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/118309.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/05/18/118309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/118309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/118309.html</trackback:ping><description><![CDATA[觉得很方便，不过就是很吃内存，我单位这台机512M内存根本就不够用。<br><br>还好，在家的机器有1G内存，还好能运行。<br><br><img src ="http://www.blogjava.net/oxl/aggbug/118309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-05-18 12:16 <a href="http://www.blogjava.net/oxl/archive/2007/05/18/118309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决PHP UTF-8问题。</title><link>http://www.blogjava.net/oxl/archive/2007/01/19/94887.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Fri, 19 Jan 2007 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/01/19/94887.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/94887.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/01/19/94887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/94887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/94887.html</trackback:ping><description><![CDATA[修改php.ini文件：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(128, 0, 0); font-weight: bold;">[</span><span style="color: rgb(128, 0, 0);">mbstring</span><span style="color: rgb(128, 0, 0); font-weight: bold;">]</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);"> language for internal character representation.</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.language </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Neutral<br /><br />mbstring.strict_detection </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> On<br /><br />default_charset </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> UTF-</span><span style="color: rgb(0, 0, 0);">8</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);"> internal/script encoding.</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> Some encoding cannot work as internal encoding.</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> (e.g. SJIS, BIG5, ISO-2022-*)</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.internal_encoding </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> UTF-</span><span style="color: rgb(0, 0, 0);">8</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);"> http input encoding.</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.http_input </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> UTF-</span><span style="color: rgb(0, 0, 0);">8</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);"> http output encoding. mb_output_handler must be</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> registered as output buffer to function</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.http_output </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> UTF-</span><span style="color: rgb(0, 0, 0);">8</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);"> enable automatic encoding translation according to</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> mbstring.internal_encoding setting. Input chars are</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> converted to internal encoding by setting this to On.</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> Note: Do _not_ use automatic encoding translation for</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);">       portable libs/applications.</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.encoding_translation </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> On<br /><br /></span><span style="color: rgb(0, 128, 0);">;</span><span style="color: rgb(0, 128, 0);"> automatic encoding detection order.</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> auto means</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.detect_order </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> UTF-</span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">ASCII<br /><br /></span><span style="color: rgb(0, 128, 0);">;</span><span style="color: rgb(0, 128, 0);"> substitute_character used when character cannot be converted</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> one from another</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.substitute_character </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> none</span><span style="color: rgb(0, 128, 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);"> overload(replace) single byte functions by mbstring functions.</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> etc. Possible values are 0,1,2,4 or combination of them.</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> For example, 7 for overload everything.</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> 0: No overload</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> 1: Overload mail() function</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> 2: Overload str*() functions</span><span style="color: rgb(0, 128, 0);"><br />;</span><span style="color: rgb(0, 128, 0);"> 4: Overload ereg*() functions</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">mbstring.func_overload </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">7</span></div><br />然后是修改my.ini：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(128, 0, 0); font-weight: bold;">[</span><span style="color: rgb(128, 0, 0);">mysql</span><span style="color: rgb(128, 0, 0); font-weight: bold;">]</span><span style="color: rgb(0, 0, 0);"><br />default-character-set</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">utf8<br /></span><span style="color: rgb(128, 0, 0); font-weight: bold;">[</span><span style="color: rgb(128, 0, 0);">mysqld</span><span style="color: rgb(128, 0, 0); font-weight: bold;">]</span><span style="color: rgb(0, 0, 0);"><br />default-character-set</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">utf8<br />default-storage-engine</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">MyISAM<br />init_connect</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">'SET NAMES utf8'</span></div><br /><img src ="http://www.blogjava.net/oxl/aggbug/94887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-01-19 11:29 <a href="http://www.blogjava.net/oxl/archive/2007/01/19/94887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gvinum under FreeBSD 6 [转]</title><link>http://www.blogjava.net/oxl/archive/2007/01/17/94351.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 17 Jan 2007 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2007/01/17/94351.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/94351.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2007/01/17/94351.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/94351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/94351.html</trackback:ping><description><![CDATA[
		<p>1. make all partition by <strong>/usr/sbin/sysinstall</strong></p>
		<p>Configure -&gt; Fdisk and Label</p>
		<p>2. write standard label ( to all disks used by vinum )</p>
		<p>
				<strong>bsdlabel -w /dev/da1s1</strong>
		</p>
		<p>3. edit disk label , modify “4.2BSD” to “vinum” ( to all disks used by vinum )</p>
		<p>
				<strong>bsdlabel -e /dev/da1s1</strong>
		</p>
		<p>4. edit a config as below , saved as xxx.conf</p>
		<p>
				<em>drive d1 device /dev/da1s1a<br />drive d2 device /dev/da2s1a<br />drive d3 device /dev/da3s1a<br />drive d4 device /dev/da4s1a<br />volume data<br />plex org raid5 491k<br />sd drive d1<br />sd drive d2<br />sd drive d3<br />sd drive d4<br /></em>
		</p>
		<p>5. create volume</p>
		<p>
				<strong>gvinum create xxx.conf</strong>
		</p>
		<p>6. add boot loader config</p>
		<p>
				<strong>echo ‘geom_vinum_load=”YES”‘ &gt;&gt;/boot/loader.conf</strong>
		</p>
		<p>7. <strong>reboot</strong></p>
		<p>8. make sure the gvinum kernel module was loaded , use “kldstat”</p>
		<p>Id Refs Address Size Name<br />1 4 0xc0400000 63070c kernel<br />2 1 0xc0a31000 fc5c <strong>geom_vinum.ko</strong></p>
		<p>9. initialize raid</p>
		<p>
				<strong>gvinum start data</strong>
		</p>
		<p>( Note : “data” must match the volume name in xxx.conf )</p>
		<p>10. check if the initialize finished , use “<strong>gvinum list</strong>”</p>
		<p>State: I xx% =&gt; State: <strong>up</strong></p>
		<p>11. format partition</p>
		<p>
				<strong>newfs /dev/gvinum/data</strong>
		</p>
		<p>( Note : “data” must match the volume name in xxx.conf )</p>
		<p>12. turn on soft updates</p>
		<p>
				<strong>tunefs -n enable /dev/gvinum/data</strong>
		</p>
		<p>13. mount partition ( ex ; mount to /home )</p>
		<p>
				<strong>mount /dev/gvinum/data /home</strong>
		</p>
		<p>14. edit /etc/fstab</p>
		<p>
				<em>/dev/gvinum/data /home ufs rw 2 2</em>
		</p>
<img src ="http://www.blogjava.net/oxl/aggbug/94351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2007-01-17 09:39 <a href="http://www.blogjava.net/oxl/archive/2007/01/17/94351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>另一种方法，用js代替Query</title><link>http://www.blogjava.net/oxl/archive/2006/09/13/69418.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 13 Sep 2006 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/09/13/69418.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/69418.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/09/13/69418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/69418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/69418.html</trackback:ping><description><![CDATA[
		<p>常会有一些小的类别列表，比如说类型，地区等，这些东西一般不怎么改变，而且还是以options的形式出现，所以可以把它以Js形式生成文件，那么每一次就只是下载这个js就行，而不用Query生成html代码了。</p>
<img src ="http://www.blogjava.net/oxl/aggbug/69418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-09-13 17:13 <a href="http://www.blogjava.net/oxl/archive/2006/09/13/69418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习的方法（转）</title><link>http://www.blogjava.net/oxl/archive/2006/09/12/69174.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Tue, 12 Sep 2006 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/09/12/69174.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/69174.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/09/12/69174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/69174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/69174.html</trackback:ping><description><![CDATA[
		<p>    作为程序员，应该是最为辛苦的一件事情，通宵达旦的熬夜，把自己的血汗无偿的捐献给了Boss ，同时还得小心自己落伍，明天要学习，再学习，因为技术更新实在是太快，JDK1.4还没有搞定， JDK5.0已经开始普及了，等俺们开始用上了5.0，6.0已经开始发布测试版了，7.0也在磨刀霍霍之中，危机感始终是笼罩在自己头上，怎么办？ 难道我们程序员就是这样的生活？ </p>
		<p>    真想好好的休息一下，放松自己的神经！ 但是不能！怎么办？ 工作两年了，真的是感觉到了这种辛苦。那怎么才能够改变这种现象呢？方法，改变我们学习的方法，这是我最近一直在思考的事情。新技术曾出不穷，我们不可能永远跟得上脚步，所以我们要掌握自己的主动权。 </p>
		<p>   第一，要有好的心态，我们选择了这一行，没有什么可以抱怨的。</p>
		<p>   第二，经常反省自己，看能不能变得更好。 每天都会有收获，所以呢，每天都可以发现自己的不足。Matrin Folwer说，如果，两年后，你还是认为两年前的自己已经很优秀的话，那说明你没有进步。 </p>
		<p>   第三，要总结，把自己每天的心得都记下来，记录自己的脚步。 </p>
		<p>   第四，要钻研，要做就把它做好。碰到困难更是要迎难而上，这时候才是学习的最好机会。</p>
		<p>   第五，不要有畏惧心理，不要怕做不好。相信自己。</p>
		<p>   第六，要学会使用文档，俺的头这一点最让人佩服，不会的问题，看文档，很快就可以搞定，当然，前提是他英语实在是高。没有语言障碍。 </p>
		<p>    第七，就是上面说的，作为程序员，要学好英语。这是很重要。 </p>
		<p>    还有就是，程序员每天该做的事，好东西。<br /></p>
<img src ="http://www.blogjava.net/oxl/aggbug/69174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-09-12 15:50 <a href="http://www.blogjava.net/oxl/archive/2006/09/12/69174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP树状缓冲策略</title><link>http://www.blogjava.net/oxl/archive/2006/09/11/68974.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 11 Sep 2006 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/09/11/68974.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/68974.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/09/11/68974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/68974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/68974.html</trackback:ping><description><![CDATA[
		<p>1、对子类别进行文件缓冲，即记录母类别的子类别数进告进行缓冲。<br />2、别的一切不进行文件缓冲，利用函数的static变量进行PHP缓冲。</p>
<img src ="http://www.blogjava.net/oxl/aggbug/68974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-09-11 15:58 <a href="http://www.blogjava.net/oxl/archive/2006/09/11/68974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Intel VS AMD 争吧，努力降吧。</title><link>http://www.blogjava.net/oxl/archive/2006/07/29/60687.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Sat, 29 Jul 2006 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/29/60687.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/60687.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/29/60687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/60687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/60687.html</trackback:ping><description><![CDATA[
		<p>我这台一号机就要送垃圾处理站了，你们快快争吧，努力往下降吧。哈……</p>
<img src ="http://www.blogjava.net/oxl/aggbug/60687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-29 09:03 <a href="http://www.blogjava.net/oxl/archive/2006/07/29/60687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL查询优化系列讲座之数据类型与效率 (转)</title><link>http://www.blogjava.net/oxl/archive/2006/07/28/60507.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Fri, 28 Jul 2006 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/28/60507.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/60507.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/28/60507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/60507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/60507.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Courier New" size="2">　　这一部分提供了如何选择数据类型来帮助提高查询运行速度的一些指导：</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　在可以使用短数据列的时候就不要用长的。如果你有一个固定长度的CHAR数据列，那么就不要让它的长度超出实际需要。如果你在数据列中存储的最长的值有40个字符，就不要定义成CHAR(255)，而应该定义成CHAR(40)。如果你能够用MEDIUMINT代替BIGINT，那么你的数据表就小一些（磁盘I/O少一些），在计算过程中，值的处理速度也快一些。如果数据列被索引了，那么使用较短的值带来的性能提高更加显著。不仅索引可以提高查询速度，而且短的索引值也比长的索引值处理起来要快一些。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　如果你可以选择数据行的存储格式，那么应该使用最适合存储引擎的那种。对于MyISAM数据表，最好使用固定长度的数据列代替可变长度的数据列。例如，让所有的字符列用CHAR类型代替VARCHAR类型。权衡得失，我们会发现数据表使用了更多的磁盘空间，但是如果你能够提供额外的空间，那么固定长度的数据行被处理的速度比可变长度的数据行要快一些。对于那些被频繁修改的表来说，这一点尤其突出，因为在那些情况下，性能更容易受到磁盘碎片的影响。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 在使用可变长度的数据行的时候，由于记录长度不同，在多次执行删除和更新操作之后，数据表的碎片要多一些。你必须使用OPTIMIZE TABLE来定期维护其性能。固定长度的数据行没有这个问题。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 如果出现数据表崩溃的情况，那么数据行长度固定的表更容易重新构造。使用固定长度数据行的时候，每个记录的开始位置都可以被检测到，因为这些位置都是固定记录长度的倍数，但是使用可变长度数据行的时候就不一定了。这不是与查询处理的性能相关的问题，但是它一定能够加快数据表的修复速度。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　尽管把MyISAM数据表转换成使用固定长度的数据列可以提高性能，但是你首先需要考虑下面一些问题：</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 固定长度的数据列速度较快，但是占用的空间也较大。CHAR(n)列的每个值（即使是空值）通常占n个字符，这是因为把它存储到数据表中的时候，会在值的后面添加空格。VARCHAR(n)列占有的空间较小，因为只需要分配必要的字符个数用于存储值，加上一两个字节来存储值的长度。因此，在CHAR和VARCHAR列之间进行选择的时候，实际上是时间与空间的对比。如果速度是主要的考虑因素，那么就使用CHAR数据列获取固定长度列的性能优势。如果空间很重要，那么就使用VARCHAR数据列。总而言之，你可以认为固定长度的数据行可以提高性能，虽然它占用了更大的空间。但是对于某些特殊的应用程序，你可能希望使用两种方式来实现某个数据表，然后运行测试来决定哪种情况符合应用程序的需求。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 即使愿意使用固定长度类型，有时候你也没有办法使用。例如，长于255个字符的字符串就无法使用固定长度类型。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　MEMORY数据表目前都使用固定长度的数据行存储，因此无论使用CHAR或VARCHAR列都没有关系。两者都是作为CHAR类型处理的。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　对于InnoDB数据表，内部的行存储格式没有区分固定长度和可变长度列（所有数据行都使用指向数据列值的头指针），因此在本质上，使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。因而，主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR，因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　对于BDB数据表，无论使用固定长度或可变长度的数据列，差别都不大。两种方法你都可用试一下，运行一些实验测试来检测是否存在明显的差别。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　把数据列定义成不能为空（NOT NULL）。这会使处理速度更快，需要的存储更少。它有时候还简化了查询，因为在某些情况下你不需要检查值的NULL属性。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　考虑使用ENUM数据列。如果你拥有的某个数据列的基数很低（包含的不同的值数量有限），那么可以考虑把它转换为ENUM列。ENUM值可以被更快地处理，因为它们在内部表现为数值。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　使用PROCEDURE ANALYSE()。运行PROCEDURE ANALYSE()可以看到数据表中列的情况：</font>
		</p>
		<p>
				<font face="Courier New" size="2">SELECT * FROM tbl_name PROCEDURE ANALYSE();<br />SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256); </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　输出的每一列信息都会对数据表中的列的数据类型提出优化建议。第二个例子告诉PROCEDURE ANALYSE()不要为那些包含的值多于16个或者256字节的ENUM类型提出建议。如果没有这样的限制，输出信息可能很长；ENUM定义通常很难阅读。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　根据的PROCEDURE ANALYSE()输出信息，你可能发现，可以修改自己的数据表来利用那些效率更高的数据类型。如果你决定改变某个数据列的类型，需要使用ALTER TABLE语句。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　使用OPTIMIZE TABLE来优化那些受到碎片影响的数据表。被大量修改的数据表，特别是那些包含可变长度数据列的表，容易遭受碎片的影响。碎片很糟糕，因为它会导致用于存储数据表的磁盘块形成无用空间（空洞）。随着时间的推移，为了得到有效的数据行，你必须读取更多的块，性能就会降低。这会出现在任何可变长度的数据行上，但是对于BLOB或TEXT数据列尤其突出，因为它们的长度差异太大了。在正常情况下使用OPTIMIZE TABLE会防止数据表的性能降低。OPTIMIZE TABLE可以用于MyISAM和BDB数据表，但是defragments只能用于MyISAM数据表。任何存储引擎中的碎片整理方法都是用mysqldump来转储（dump）数据表，接着使用转储的文件删除并重新建立那些数据表：</font>
		</p>
		<p>
				<font face="Courier New" size="2">% mysqldump --opt db_name tbl_name &gt; dump.sql<br />% mysql db_name &lt; dump.sql </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　把数据打包放入BLOB或TEXT数据列。使用BLOB或TEXT数据列存储打包（pack）的数据，并在应用程序中进行解包（unpack），使你能够在一次检索操作中得到需要的任何信息，而不需要进行多次检索。它对那些很难用标准的数据表结构表现的数据值和频繁变化的数据值也是有帮助的。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　解决这个问题的另一种方法是让那些处理Web窗体的应用程序把数据打包成某种数据结构，然后把它插入到单个BLOB或TEXT数据列中。例如，你可以使用XML表示调查表回复，把那些XML字符串存储在TEXT数据列中。由于要对数据进行编码（从数据表中检索数据的时候还需要解码），它会增加客户端的开销，但是可以简化数据结构，而且它还消除了那些因为改变了调查表的内容而必须改变数据表结构的需求。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　另一方面，BLOB和TEXT值也会引起自己的一些问题，特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的"空洞"，以后填入这些"空洞"的记录可能长度不同（前面讨论的OPTIMIZE TABLE提出解决这个问题的一些建议）。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　使用合成的（synthetic）索引。合成的索引列在某些时候是有用的。一种办法是根据其它的列的内容建立一个散列值，并把这个值存储在单独的数据列中。接下来你就可以通过检索散列值找到数据行了。但是，我们要注意这种技术只能用于精确匹配的查询（散列值对于类似&lt;或&gt;=等范围搜索操作符是没有用处的）。我们可以使用MD5()函数生成散列值，也可以使用SHA1()或CRC32()，或者使用自己的应用程序逻辑来计算散列值。请记住数值型散列值可以很高效率地存储。同样，如果散列算法生成的字符串带有尾部空格，就不要把它们存储在CHAR或VARCHAR列中，它们会受到尾部空格去除的影响。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　合成的散列索引对于那些BLOB或TEXT数据列特别有用。用散列标识符值查找的速度比搜索BLOB列本身的速度快很多。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　在不必要的时候避免检索大型的BLOB或TEXT值。例如，SELECT *查询就不是很好的想法，除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则，你可能毫无目的地在网络上传输大量的值。这也是BLOB或TEXT标识符信息存储在合成的索引列中对我们有所帮助的例子。你可以搜索索引列，决定那些需要的数据行，然后从合格的数据行中检索BLOB或TEXT值。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　把BLOB或TEXT列分离到单独的表中。在某些环境中，如果把这些数据列移动到第二张数据表中，可以让你把原数据表中的数据列转换为固定长度的数据行格式，那么它就是有意义的。这会减少主表中的碎片，使你得到固定长度数据行的性能优势。它还使你在主数据表上运行SELECT *查询的时候不会通过网络传输大量的BLOB或TEXT值。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　高效率地载入数据</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　在大多数情况下，你所关注的是SELECT查询的优化，因为SELECT查询是最常见的查询类型，而且如何优化它们又不是太简单。与此形成对比，把数据载入数据库的操作就相对直接了。然而，你仍然可以利用某些策略来改善数据载入操作的效率。基本的原理如下所示：</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 批量载入比单行载入的效率高，因为在每条记录被载入后，键缓存（key cache）不用刷新（flush）；可以在这批记录的末尾刷新键缓存。键缓存刷新的频率减少得越多，数据载入的速度就越快。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 没有索引的数据表的载入速度比有索引的要快一些。如果存在索引，不但要把记录添加到数据文件中，还必须修改索引来反映新增的记录。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 较短的SQL语句比较长的SQL语句快，因为它们所涉及到服务器端分析过程较少，同时通过网络把它们从客户端发送到服务器上的速度也更快。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　其中有些因素看起来是次要的（尤其是最后一个），但是如果你载入的数据很多，那么即使很小的效率差异也会导致一定的性能差别。我们可以从前面的一般原理得出几条如何快速载入数据的实践结论： </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· LOAD DATA（所有形式的）比INSERT效率高，因为它是批量载入数据行的。服务器只需要分析和解释一条语句，而不是多条语句。同样，索引只需要在所有的数据行被处理过之后才刷新，而不是每行刷新一次。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 不带LOCAL的LOAD DATA比带有LOCAL的LOAD DATA的速度要快。不带LOCAL的时候，文件必须位于服务器上，而且你必须拥有FILE权限，但是服务器却可以直接从磁盘上读取文件。使用LOAD DATA LOCAL的时候，客户端读取文件并通过网络把它发送给服务器，速度慢一些。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 如果你必须使用INSERT，那么试着使用在一个语句中指定多个数据行的形式：</font>
		</p>
		<p>
				<font face="Courier New" size="2">INSERT INTO tbl_name VALUES(...),(...),... ; </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　在这个语句中指定的数据行越多，效果就越好。这会减少必要的语句数量，并最小化索引刷新的次数。这一条结论看起来与前面所讨论的"语句越短，执行速度越快"相矛盾，但是实际上并不矛盾。这儿所讨论的是同时插入多个数据行的一个INSERT语句所花费的开销比功能相同的多个单行INSERT语句的花费的开销要小一些，并且多行语句消耗的索引刷新开销也少一些。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　如果你使用mysqldump生成数据库备份文件，那么MySQL 4.1会默认地生成多行INSERT语句：它会激活--opt (优化)选项，而这个选项会激活--extended-insert选项，该选项生成多行INSERT语句，还存在其它一些选项也可以使数据被载入的时候，转储文件被处理的效率更高。对于MySQL 4.1以前的版本，你可以明确地指定--opt或--extended-insert选项。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　使用mysqldump的时候要避免使用--complete-insert选项；它生成的INSERT语句是每个数据行一条语句的，语句总共会很长，比多行语句需要的分析操作更多。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 如果你必须使用INSERT语句，那么在可能的情况下，对它们进行分组以减少索引的刷新。对于事务性的存储引擎，在单个事务中提交，而不是在自动提交（autocommit）模式下提交INSERT语句可以实现这样的功能：</font>
		</p>
		<p>
				<font face="Courier New" size="2">START TRANSACTION;<br />INSERT INTO tbl_name ... ;<br />INSERT INTO tbl_name ... ;<br />INSERT INTO tbl_name ... ;<br />COMMIT; </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　对于非事务性的存储引擎，获取数据表上的写入锁，它被锁定的时候提交INSERT语句：</font>
		</p>
		<p>
				<font face="Courier New" size="2">LOCK TABLES tbl_name WRITE;<br />INSERT INTO tbl_name ... ;<br />INSERT INTO tbl_name ... ;<br />INSERT INTO tbl_name ... ;<br />UNLOCK TABLES; </font>
		</p>
		<p>
				<br />
				<font face="Courier New" size="2">　　无论采用哪种方法，你得到的好处都是相同的：索引在所有的语句都被执行之后才刷新一次，而不是每个INSERT语句刷新一次索引。后面介绍了在自动提交模式下或数据表没有被锁定的时候发生的情况。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 对于MyISAM数据表，减少索引刷新的另外一个策略是使用DELAYED_KEY_WRITE表选项。使用这个选项的时候，数据行会像平常一样立即写入数据文件中，但是键缓存只是偶尔刷新一次，而不是在每次插入操作之后都需要刷新。如果要在服务器上全面地使用延迟索引刷新，那么就需要使用--delay-key-write选项来启动mysqld。在这种情况下，每个数据表的索引块写入操作都会被延迟，直到这些数据块必须为其它的索引值提供空间、或者执行了FLUSH TABLES命令、或者数据表被关闭的时候才执行操作。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　如果你选择了对MyISAM数据表使用延迟键写入，那么不正常的服务器关闭可能会引起索引值的丢失。这不是致命的问题，因为MyISAM索引可以依据数据行来进行修复，但是如果想让修复过程出现，你就必须使用--myisam-recover=FORCE选项来启动服务器。这个选项会使服务器在打开MyISAM数据表的时候检查它们，如果有必要就自动地修复它们。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　对于复制（replication）从属服务器，你可能希望使用--delay-key-write=ALL来延迟所有的MyISAM数据表索引的刷新，不管在主服务器上最初是如何建立它们的。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 使用压缩的客户端/服务器协议来减少网络上数据传输的数量。对于大多数MySQL客户端来说，我们都可以使用--compress命令行选项来指定它。通常，这个选项只是在较慢的网络上使用，这是因为压缩操作会花费大量的处理器时间。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 让MySQL替你插入默认值。也就是说，无论如何都不要给INSERT语句中那些可以赋予默认值的列指定值。平均起来，你的语句更短，减少了通过网络发送到服务器的字符数量。此外，由于语句包含的值较少，服务器执行的分析和值转换操作也较少。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 对于MyISAM数据表，如果你必须把大量的数据载入一个新表，最好建立不带索引的表，载入数据，然后建立索引，这样的工作次序的速度要快一些。一次性地建立索引比每行都更新索引的速度要快一些。对于已经带有索引的表，如果预先删除或禁止索引，后来再重新建立或者激活索引，那么数据载入的速度也要快一些。这些策略不能应用于InnoDB或BDB表，它们没有对分离的索引建立过程进行优化。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　如果你考虑使用删除或禁止索引的策略，把数据载入MyISAM数据表，那么在评估获得的优势的时候，就需要考虑整个环境。如果你把少量的数据载入大型的数据表中，那么在没有任何特殊准备工作的情况下，重新建立索引花费的时间可能比载入数据的时间还要长。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　要删除并且重新建立索引，需要使用DROP INDEX和CREATE INDEX，或者使用与索引相关的ALTER TABLE。禁止和激活索引有两种办法： </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· 你可用使用ALTER TABLE的DISABLE KEYS和ENABLE KEYS形式：</font>
		</p>
		<p>
				<font face="Courier New" size="2">ALTER TABLE tbl_name DISABLE KEYS;<br />ALTER TABLE tbl_name ENABLE KEYS; </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　这些语句关闭或打开表中非唯一（non-unique）索引的更新过程。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　ALTER TABLE的DISABLE KEYS和ENABLE KEYS子句是索引禁止和激活操作的推荐方法，因为服务器也是这样操作的（如果你使用LOAD DATA语句把数据载入空的MyISAM表中，服务器会自动地执行这样的优化操作）。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　· Myisamchk工具可以执行索引维护。它直接在数据表文件上进行操作，因此使用它的时候，你必须拥有数据表文件的写入权限。<br />使用myisamchk禁止MyISAM表的索引的方法是，首先你要确保已经告诉了服务器让该数据表独立出来，接着把它移动到适当的数据库目录中，并运行下面的命令：</font>
		</p>
		<p>
				<font face="Courier New" size="2">% myisamchk --keys-used=0 tbl_name </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　载入数据之后，重新激活索引：</font>
		</p>
		<p>
				<font face="Courier New" size="2">% myisamchk --recover --quick --keys-used=n tbl_name </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　其中的n是位掩码（bitmask），它指明了要激活的索引。Bit 0（第一个位）与索引1对应。例如，如果某张表拥有三个索引，那么n的值应该是7（二进制的111）。你也可以使用--description选项来检测索引的数量：</font>
		</p>
		<p>
				<font face="Courier New" size="2">% myisamchk --description tbl_name </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　前面的数据载入原则也可以应用于混合查询环境（客户端执行多种不同的操作）。例如，你应该避免在那些频繁被修改（写入）的数据表上运行长时间的SELECT查询。这会引发大量的争用（contention），导致写入操作的性能较差。一个可能的解决办法是，如果你的写入操作主要是INSERT操作，那么把新记录添加到辅助表中，接着周期性地把这些记录添加到主表中。如果你必须立即访问这些新记录，那么这个策略是不行的，但是如果你能够承担得起短期内不访问这些数据的代价，那么使用辅助表可以在两个方面带来好处。首先，它减少了主表上的SELECT查询争用的问题，因此它们执行得更快。其次，把辅助表中的批量数据载入主表中所花费的时间总和也比单独载入记录花费的时间总和要小一些；键缓存只需要在每次批量载入结束后刷新一次，而不用每个数据行载入后都刷新一次。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">　　使用这种策略的一个应用是把Web服务器的Web页面访问日志载入MySQL数据库的时候。在这种情况下，保证实体立即进入主表的优先级并不高（没有这个必要性）。</font>
		</p>
		<p>
				<font face="Courier New" size="2">　　如果你在MyISAM表上使用了混合的INSERT和SELECT语句，你就可以利用并发性插入操作的优点了。这个特性允许插入和检索操作同时进行，而不需要使用辅助表。你可以查看"使用并发性插入操作"部分。 <br /></font>
		</p>
<img src ="http://www.blogjava.net/oxl/aggbug/60507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-28 10:52 <a href="http://www.blogjava.net/oxl/archive/2006/07/28/60507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对学习计算机专业的人一些忠告 (转)</title><link>http://www.blogjava.net/oxl/archive/2006/07/27/60364.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Thu, 27 Jul 2006 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/27/60364.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/60364.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/27/60364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/60364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/60364.html</trackback:ping><description><![CDATA[
		<p>　　对一个初学者来说，IT界的技术风潮是不可以追赶的，而且也没有能力去追赶。我时常看见自己的DDMM们把课本扔了，去卖些价格不菲的诸如C#, VB.Net 这样的大部头，这让我感到非常痛心。而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑。C#就象当年的ASP一样，“忽如一夜春风来，千树万树梨花开”，结果许多学校的信息学院成了“Web 学院”。96,97级的不少大学生都去做Web 了。当然我没有任何歧视某一行业的意识。我只是觉得如果他们把追赶这些时髦技术的时间多花一点在基础的课程上应该是可以走得更远的。 </p>
		<p>　　几个误区 </p>
		<p>　　初学者对C#风潮的追赶其实也只是学习过程中经常遇到的几个误区之一。我将用一些实际的例子来说明这些现象，你可以按部就班的看看自己是不是属于其中的一种或者几种： </p>
		<p>　　认为计算机技术等于编程技术: </p>
		<p>　　有些人即使没有这个想法，在潜意识中也有这样的冲动。让我奇怪的是，许多信息学院的学生也有这样的念头。认为计算机专业就是编程专业，与编程无关的，或者不太相关的课程他统统都不管，极端的学生只要书上没带“编程”两个字他就不看。 </p>
		<p>　　其实编程只是计算机技术应用过程中一种复杂性最低的劳动，这就是为什么IT业最底层的人是程序员（CODER）。计算机技术包括了多媒体，计算机网络，人工智能，模式识别，管理信息系统等等这些方面。编程工作只是在这些具体技术在理论研究或者工程实践的过程中表达算法的过程。编程的人不一定对计算机技术的了解就一定很高。而一个有趣的现象是，不少大师级的计算机技术研究者是不懂编程的。网上的炒作和现实中良好的工作待遇把编程这种劳动神秘化了。其实每一个程序员心里都明白，自己这些东西，学的时候并不比其它专业难，所以自然也不会高档到哪里去。 </p>
		<p>　　咬文嚼字的孔已己作风: </p>
		<p>　　我见过一本女生的《计算机网络原理》教材，这个女生象小学生一样在书上划满了横杠杠，笔记做得满满的，打印出来一定比教材还厚。我不明白的是，象计算机网络原理这样的课程有必要做笔记？我们的应试教育的确害了不少学生，在上《原理》这一类课程的时候许多学生象学《马列原理》一样逐字背诵记忆。这乃是我见过的最愚蠢的行为。所谓《原理》，即是需要掌握它为什么这样做，学习why，而不是how（怎样做）。极端认真的学生背下以太网的网线最大长度，数据帧的长度，每个字段的意义，IP报头的格式等等，但是忘了路由的原则，忘了TCP/IP协议设计的宗旨。总之许多人花了大量的时间把书背得滚瓜烂熟却等于什么也没学。 </p>
		<p>　　在学习编程的时候这些学生也是这样，他们确切的记得C++语法的各个细节。看完了C++教程后看《Thinking in C++》（确实是好书），《Inside C++》，《C++ reference》，this C++, that C++……，然后是网上各种各样的关于C++语法的奇闻逸事，然后发现自己又忘了C++的一些语法，最后回头继续恶补…。有个师弟就跟我说：“C++ 太难了，学了这里忘了那里，学了继承忘了模板。”我的回答道：“你不去学就容易了”。我并没有教坏他，只是告诉他，死抠C++的语法就和孔已己炫耀茴香豆的茴字有几种写法一样毫无意义。你根本不需要对的C++语法太关心，动手编程就是了，有不记得的地方一查MSDN就立马搞定。我有个结论就是，实际的开发过程中对程序语法的了解是最微不足道的知识。这是为什么我在为同学用Basic（我以前从没有学过它）写一个小程序的时候，只花了半个小时看了看语法，然后再用半个小时完成了程序，而一个小时后我又完全忘记了Basic 的所有关键字。 </p>
		<p>　　不顾基础，盲目追赶时髦技术： </p>
		<p>　　终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来，变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的，而且IT技术进步是如此的快，不跟进就是失业。但是对于初学者来说（尤其是时间充裕的大中专在校生），这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西，学习why 而不是how。时髦的技术往往容易掌握，而且越来越容易掌握，这是商业利益的驱使，为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样，越容易掌握的东西，学习的人越多，而且淘汰得越快。每一次新的技术出来，都有许多初学者跟进，这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间，而等他学会了，这种技术也快淘汰了。基础的课程，比方数据结构，*作系统原理等等虽然不能让你立马就实现一个linux（这是许多人嘲笑理论课程无用的原因），但它们能够显著的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术（比方Win32 SDK 程序的设计，DDK的编程）来说甚至是不可或缺的。</p>
		<p>如果你是学生，或者如果你有充足的时间。我建议你仔细的掌握下面的知识。我的建议是针对那些希望在IT技术上有所成就的初学者。同时我还列出了一些书目，这些书应该都还可以在书店买到。说实在的，我在读其他人的文章时最大的心愿就是希望作者列出一个书单。 </p>
		<p>　　大学英语－不要觉得好笑。我极力推荐这门课程是因为没有专业文档的阅读能力是不可想象的。中文的翻译往往在猴年马月才会出来，而现在的许多出版社干脆就直接把E文印刷上去。学习的方法是强迫自己看原版的教材，开始会看不懂，用多了自然熟练。吃得苦下得狠心绝对是任何行业都需要的品质。 </p>
		<p>　　计算机体系结构和汇编语言－关于体系结构的书遍地都是，而且也大同小异，倒是汇编有一本非常好的书。《80x86汇编语言程序设计教程》（清华大学出版社，黑色封面，杨季文著）。你需要着重学习386后保护模式的程序设计。否则你在学习现代操作系统底层的一些东西的时候会觉得是在看天书。 </p>
		<p>　　计算机操作系统原理－我们的开发总是在特定的操作系统上进行，如果不是，只有一种可能：你在自己实现一个操作系统。无论如何，操作系统原理是必读的。这就象我们为一个芯片制作外围设备时，芯片基本的工作时序是必需了解的。这一类书也很多，我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社，我看的是E文版的，中文的书名想必是Windows 2000 技术内幕之类吧)。 </p>
		<p>　　数据结构和算法－这门课程能够决定一个人程序设计水平的高低，是一门核心课程。我首选的是清华版的（朱战立，刘天时）。很多人喜欢买C++版的，但我觉得没有必要。C++的语法让算法实现过程变得复杂多了，而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的。 </p>
		<p>　　软件工程－这门课程是越到后来就越发现它的重要，虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》（黄色，清华）。不要花太多的时间去记条条框框，看不懂就跳过去。在每次自己完成了一个软件设计任务（不管是练习还是工作）以后再来回顾回顾，每次都会有收获。 </p>
		<p>　　Windows 程序设计－《北京大学出版社，Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在这本书中，没有C++，没有GUI，没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后，你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC，你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。 </p>
		<p>　　上面的几门课程我认为是必学的重要课程（如果你想做Windows 程序员）。 </p>
		<p>　　对于其它的课程有这样简单的选择方法：如果你是计算机系的，请学好你所有的专业基础课。如果不是，请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了，请翻到书的最后，看看它的参考文献，找到它们并学习它们，再回头看这本书。如果一本书的书名中带有“原理”两个字，你一定不要去记忆它其中的细节，你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。 </p>
		<p>　　你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书。 </p>
		<p>　　日三省乎己 </p>
		<p>　　每天读的书太多，容易让人迷失方向。一定要在每天晚上想想自己学了些什么，还有些什么相关的东西需要掌握，自己对什么最感兴趣，在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用，这样能够让你不是追赶技术潮流而是引领技术潮流。同时，努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。 </p>
		<p>　　把最多的时间花在学习上 </p>
		<p>　　这是对初学者最后的忠告。把每个星期玩SC或者CS的时间压缩到最少，不玩它们是最好的。同时，如果你的ASP技术已经能够来钱，甚至有公司请你兼职的话，这就证明你的天份能够保证你在努力的学习之后取得更好的收益，你应该去做更复杂的东西。眼光放长远一些，这无论是对谁都是适用的。</p>
		<p>
				<br />---<br /><br />很有体会，几年内按着他所说的轨迹学下去。</p>
<img src ="http://www.blogjava.net/oxl/aggbug/60364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-27 15:24 <a href="http://www.blogjava.net/oxl/archive/2006/07/27/60364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBoss创始人Marc Fleury：先赚钱后做开源 </title><link>http://www.blogjava.net/oxl/archive/2006/07/25/60001.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Tue, 25 Jul 2006 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/25/60001.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/60001.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/25/60001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/60001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/60001.html</trackback:ping><description><![CDATA[
		<p>1998年，在硅谷SUN公司的SAP实验室，一个年轻人正坐在电脑前面思考，然后写着什么东西。不，他没有在写程序，他在写辞呈。他正在做出人生的一个重大决定：他要辞掉在SUN的这份工作，投身到open source的开发。旁边好多朋友在劝他，这样的做法是"moving down the food chain"（应该是丢掉铁饭碗的意思），这是他整个职业生涯的下坡路。但是这个年轻人却义无反顾地微笑着，眼睛里充满着自信，他相信几年以后他会为他今天的决定自豪，他相信这不是他职业生涯的下坡路，而是他真正的成功职业生涯的开始。此时，他走过人生的前三十头的回忆在他脑中闪回。 </p>
		<p>
				<br />　　他出生在法国，父亲是成功的商人。他从小的目标似乎是一个成功的商人，然而在16岁那年他做出了一个重要的抉择：他选择学习理工而放弃了学习经商。他知道他的选择是对的，就象他父亲劝他的，工程技术在未来会越来越重要，从工程技术转化为商人是如此的容易，然而反之却是相当的难。于是三年时间里，当同龄的美国人都在玩耍的时候，他在为进入Grandes Ecoles（据说是法国最好的学校）而奋战着。他成功了，他在法国的Ecole Polytechnique毕业了，他甚至还在法国的伞兵里当过中尉，之后他拿到了Ecole Nationale Superieure rue d'Ulm的理论物理学硕士学位，然后拿到了Ecole Polytechnique的物理学博士学位，他甚至作为访问科技家在麻省理工学院的电子实验室里呆了一段时间。然而他找到了一份很不错的工作：在法国的 sun公司负责销售。然而就象少年时的想法一样，他知道他要做的不是销售，他要做技术和开发，于是终于他来到了硅谷，来到这个SUN的SAP实验室，一个无数人向往的地方。</p>
		<p>
				<br />　　但是现在，他要离开这里了，他知道他是对的，他看到了Internet迅速发展，他看到了Open Source活动的迅速进展，他想成为Linus Torvalds一样的开源先锋。于是在硅谷赚了足够生活的钱后，他选择了离开。当时硅谷的房价高得吓人，于是他问妻子："我们去哪儿？"。妻子告诉他： "我们回家吧，回我的老家！"于是1999年他们一起回到了亚特兰大，在那里他开始他的开源软件开发生涯。</p>
		<p>
				<br />　　这个年青人就是Marc Fleury，就是他一手创建了JBoss，这个全世界都在使用的开源应用服务器；是他推动整个Java开源社区的发展，是他让Open Source变成了专业化的服务，让Open Source变为了一种可以生存的手段；是他的号召力和影响力把Hibernate, JGroups, Javassist等一大批的优秀的开源软件招于帐下。</p>
		<p>
				<br />　　Marc Fleury是一个很有趣的人。他长得有点瘦小（尤其是跟Bill Burke站在一起的时候，呵呵），但是还算英俊的外表、充满自信的表现力，鹰一样锐利的眼神让人觉得他是如此精明。尽管带着一点法国口音（Hani说的，偶听不出来），但他的表现力和感染力是无与伦比的，他的每一次采访和演讲都充满着激情和幽默，经常妙语惊人。他也很会哗众取宠，在每年的 TheServerSide Symposium上，他和JBoss的员工们都会穿一些奇形怪状的衣服，戴奇怪的面具参加。Marc Fleury老是打扮成蝙蝠侠里的那个恶棍the joker（中文版应该就是小丑吧）的模样出席，惨白的脸、红红的嘴唇、乱乱的头发，蛮吓人的。</p>
		<p>
				<br />　　Marc Fleury对他的Open Source产业的经营有他非常成功的方式，尽管有时会招人非议，比如说他那个十美元的文档。他对自己的定位非常清楚，他会用操作系统状况来比喻现在的应用服务器，在高端的商业应用是Unix，接下来的Windows就象蚂蚁一样蚕食着剩下的市场，这时只有象Linux那样免费的开源操作系统才能与之竞争。在J2EE存在类似的情况，BEA和IBM永远会存在，他们高高在上，然而他们往地下一看的时候，地上都在蚂蚁，把所有的杂草都蚕食掉了，这就是微软的.net，不管承不承认，它将无所不在，只有象JBoss这样免费开源的东西才能在这个领域展开对.net的竞争。</p>
		<p>
				<br />　　JBoss的另一个成功之处是他的用人和招人方式，吸引了全世界无数优秀的人的加盟。他最喜欢用电影The Maxtrix里那句经典台词来比喻open source，还记得Neo被Morpheus带救到一个小房子里，然后掏出两颗药丸的场景吗？这是Marc Fleury的改编版："If you take the red pill I'll show you how deep the rabbit hole goes. If you take the blue pill you stay in corporate land and you believe whatever you want to believe."Marc Fleury就用take the red pill来形容投身到开源软件开发的。</p>
		<p>
				<br />　　如今JBoss的总体架构设计师Bill Burke就是这样被招安过来的。当时Bill Burke还是在做一个商业应用，买不起BEA的东西，就在google上搜到了JBoss，发现了一些bug，修改完后发了个email给Marc Fleury，Marc Fleury问完Bill的情况后发了一条只有一句的话的Email:"Do want to take the red pill？"。于是Bill Burke就成了JBoss的一员。</p>
		<p>
				<br />　　Hibernate的招安自不用说，地球人都知道这件事啦，因为Gavin King觉得JBoss是唯一可以开发开源软件而靠提供服务的公司。（后来Rod Johnson的interface21其实也是类似的模式）。</p>
		<p>
				<br />　　其实在hibernate被招安之前没几天还有一个很著名的软件加盟了JBoss，那就是JGroups。这是一个学院派的开发产品，Bela Ban是瑞士苏黎士大学的博士，随后到纽约康奈尔大学读博士后时开发了JGroups。它是当今开发cluster软件或distributed cache（tangosol cohenernce没用JGroups，后来Cameron Purdy和Bela Ban还辩论过）的实际标准，JBoss在cluster技术一直是建立在JGroups之上的。Bela Ban现在也是JBoss Cache的设计师。</p>
		<p>
				<br />　　另一个有趣的学院派产品是Javassist，它是东京理工大学的一个博士Shigeru Chiba毕业设计的产品，后来毕业了感觉做了这么酷的东西不用上太可惜了，于是就打了个电话给Marc Fleury，于是Javassist就加盟了JBoss。Javassist是JBoss AOP的基础，可以动态用String操作生成代码然后执行。呵呵，感觉挺cool的，反正Bill Burke说用了Javassist后开发AOP太easy了。</p>
		<p>
				<br />　　现在的Marc Fleury无疑已经处于非常成功的状态。但对于他来说，这个旅程才刚刚开始，他的目标是成为专业化的transparent AO middleware开源软件公司，JBoss公司将成为这个领域的领头羊。象很多人一样，他相信AOP会给整个产业带来巨大的影响，而透明的AO中间件将成为中间件市场的主力。Marc Fleury，期待你的新的成功吧！</p>
		<p>
				<br /> </p>
<img src ="http://www.blogjava.net/oxl/aggbug/60001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-25 14:43 <a href="http://www.blogjava.net/oxl/archive/2006/07/25/60001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCKEDITOR中文使用说明</title><link>http://www.blogjava.net/oxl/archive/2006/07/24/59827.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Mon, 24 Jul 2006 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/24/59827.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/59827.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/24/59827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/59827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/59827.html</trackback:ping><description><![CDATA[
		<p>性能</p>
		<p>首先,FCKEDITOR的性能是非常好的,用户只需很少的时间就可以载入FCKEDITOR所需文件.对于其他在线编辑器来说,这几乎是个很难解决的难题,因为在开启编辑器时需要装载太多的文件.比如CUTEEDITOR,虽然功能比FCKEDITOR还要强大,可是,它本身也够庞大了,至于FREETEXTBOX等,其易用性与FCKEDITOR相比,尚有差距,可以说,FCKEDITOR是一个别具匠心的在线编辑器,它里面融入了作者高深的面向对象的JAVASCRIPT功力,集易用性与强大的功能与一体.</p>
		<p>.与编辑器相关的所有图像,脚本以及调用页<br />.语言文件<br />.编辑器的皮肤文件<br />.工具样的贴图等</p>
		<p>这些将导致在服务器和客户端间产生相当的流量.如果有许多文件被调用,那么即便每个文件很小.也会让用户等得不耐烦.</p>
		<p>
				<br />在2.0版中,开发人员有两种方法来解决这个问题.<br />那就是指定装载顺序和脚本压缩</p>
		<p>装载顺序<br />从2.0版开始,编辑器按以下步骤装载资源:<br />.基本页(就是编辑器所在页)以及装入编辑器的JS脚本<br />.用来建立编辑器的脚本<br />.编辑器的语言和皮肤.<br />.建立编辑器.<br />.载入预置的编辑文档内容.<br />.从现在开始,用户可以阅读和编辑文档了,不过,拖拽支持以及工具栏都是不可用的<br />.载入编辑器引擎脚本<br />.建立工具栏,并且可用<br />.从现在开始,编辑器的所有功能都已经完整<br />.载入工具栏图标</p>
		<p>脚本压缩</p>
		<p>在打包任何新版本时,编辑器的JS脚本将会进行预处理.预处理步骤如下:<br />.移除所有代码注释<br />.移除所有无用的空白字符.<br />.将脚本合并成几个文件</p>
		<p>使用上面的方法,我们可以将脚本文件的大小压缩到原来的50%.<br />压缩后,原始的代码仍然存在于一个名为_Source的文件夹中</p>
		<p>
				<br />如何打包?<br />编辑器已经自带了打包程序,它位于FCKEDITOR的根文件夹中_PACKAGER文件夹中,名为Fckeditor.Packager.exe,将其复制到FCKEDITOR根文件夹中并运行,即可自动将JS脚本打包并压缩<br />需要注意的是该程序是一个.NET程序,必须安装.NET FRAMEWORK才能使用</p>
		<p>想要获取支持?<br />如果你捐赠15000欧元,你就可以获得1年的免费技术支持(比较贵的说,相当于人民币15万,不过西欧的费用相当惊人)</p>
		<p>如何安装?</p>
		<p>1.下载最新版的FCKEDITOR<br />2.解压缩到你的站点根文件夹中名为FCKEDITOR的文件夹中(名称必须为FCKEDITOR,因为配置文件中已经使用此名称来标示出FCKEDITOR的位置)<br />3.现在,编辑器就可以使用了,如果想要查看演示,可以按下面方法访问:<br /><a href="http://&lt;your-site&gt;/FCKeditor/_samples/default.html">http://&lt;your-site&gt;/FCKeditor/_samples/default.html</a></p>
		<p>注意:你可以将FCKEDITOR放置到任何文件夹,默认情况下,将其放入到FCKEDITOR文件夹是最为简单的方法.如果你放入的文件夹使用别的名称,请修改配置文件夹中编辑器BasePath参数,如下所示:<br />oFckeditor.BasePath="/Components/fckeditor/";</p>
		<p>另外,FCKEDITOR文件夹中所有以下划线开头的文件夹及文件,都是可选的,可以安全的从你的发布中删除.它们并不是编辑器运行时必需的</p>
		<p>
				<br />如何将FCKEDITOR整合进我的页面?</p>
		<p>由于目前的版本提供的FCKEDITOR仅提供了JAVASCRIPT式的整合,因此,这里仅讲述如何应用JAVASCRIPT来整合FCKEDITOR到站点中,当然,其他各种语言的整合,你可以参考_samples文件夹中的例子来完成<br />1,假如编辑器已经安装在你的站点的/FCKEDITOR/文件夹下.那么,第一步我们需要做的就是在页面的HEAD段中放入SCRIPT标记以引入JAVASCRIPT整合模块.例如:<br />&lt;script type="text/javascript" src="/fckeditor/fckeditor.js"&gt;&lt;/script&gt;</p>
		<p>其中路径是可更改的</p>
		<p>2,现在,FCKEDITOR类已经可以使用了.有两个方法在页面中建立一个FCKEDITOR编辑器:<br />方法1:内联方式(建议使用):在页面的FORM标记内需要插入编辑器的地方置入以下代码:<br />script type="text/javascript"&gt;<br />   var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ;<br />  oFCKeditor.Create() ;<br />&lt;/script&gt;</p>
		<p>方法2:TEXTAREA标记替换法(不建议使用):在页面的ONLOAD事件中,添加以下代码以替换一个已经存在的TEXTAREA标记</p>
		<p>&lt;html&gt;<br />  &lt;head&gt;<br />    &lt;script type="text/javascript"&gt;<br />      window.onload = function()<br />      {<br />        var oFCKeditor = new FCKeditor( 'MyTextarea' ) ;<br />        oFCKeditor.ReplaceTextarea() ;<br />      }<br />    &lt;/script&gt;<br />  &lt;/head&gt;<br />  &lt;body&gt;<br />    &lt;textarea id="MyTextarea" name="MyTextarea"&gt;This is &lt;b&gt;the&lt;/b&gt; initial value.&lt;/textarea&gt;<br />  &lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>3.现在,编辑器可以使用了</p>
		<p>FCKEDITOR类参考:<br />下面是用来在页面中建立编辑器的FCKEDITOR类的说明</p>
		<p>构造器:<br />FCKeditor( instanceName[, width, height, toolbarSet, value] )<br />instanceName:编辑器的唯一名称(相当于ID)<br />WIDTH:宽度<br />HEIGHT:高度<br />toolbarSet:工具条集合的名称<br />value:编辑器初始化内容</p>
		<p>属性:<br />instanceName:编辑器实例名<br />width:宽度,默认值为100%<br />height:高度,默认值是200<br />ToolbarSet:工具集名称,参考FCKCONFIG.JS,默认值是Default<br />value:初始化编辑器的HTML代码,默认值为空<br />BasePath:编辑器的基路径,默认为/Fckeditor/文件夹,注意,尽量不要使用相对路径.最好能用相对于站点根路径的表示方法,要以/结尾<br />CheckBrowser:是否在显示编辑器前检查浏览器兼容性,默认为true<br />DisplayErrors:是否显示提示错误,默为true;</p>
		<p>集合:<br />Config[Key]=value;<br />这个集合用于更改配置中某一项的值,如<br />oFckeditor.Config["DefaultLanguage"]="pt-br";</p>
		<p>方法:<br />Create()<br />建立并输出编辑器</p>
		<p>RepaceTextArea(TextAreaName)<br />用编辑器来替换对应的文本框</p>
		<p>如何配置FCKEDITOR?<br />FCKEDITOR提供了一套用于定制其外观,特性及行为的设置集.主配置文件名为Fckconfig.js<br />你既可以编辑主配置文件,也可以自己定义单独的配置文件.配置文件使用JAVASCRIPT语法.</p>
		<p>修改后,在建立编辑器时,可以使用以下语法:<br />var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ;<br />oFCKeditor.Config['CustomConfigurationsPath'] = '/myconfig.js'  ;<br />oFCKeditor.Create() ;</p>
		<p>提醒:当你修改配置后,请清空浏览器缓存以查看效果</p>
		<p>配置选项:</p>
		<p>AutoDetectLanguage=true/false 自动检测语言<br />BaseHref="" 相对链接的基地址<br />ContentLangDirection="ltr/rtl" 默认文字方向<br />ContextMenu=字符串数组,右键菜单的内容<br />CustomConfigurationsPath="" 自定义配置文件路径和名称<br />Debug=true/false 是否开启调试功能,这样,当调用FCKDebug.Output()时,会在调试窗中输出内容<br />DefaultLanguage="" 缺省语言<br />EditorAreaCss="" 编辑区的样式表文件<br />EnableSourceXHTML=true/false 为TRUE时,当由可视化界面切换到代码页时,把HTML处理成XHTML<br />EnableXHTML=true/false 是否允许使用XHTML取代HTML<br />FillEmptyBlocks=true/false 使用这个功能,可以将空的块级元素用空格来替代<br />FontColors="" 设置显示颜色拾取器时文字颜色列表<br />FontFormats="" 设置显示在文字格式列表中的命名<br />FontNames="" 字体列表中的字体名<br />FontSizes="" 字体大小中的字号列表<br />ForcePasteAsPlainText=true/false 强制粘贴为纯文本<br />ForceSimpleAmpersand=true/false 是否不把&amp;符号转换为XML实体<br />FormatIndentator="" 当在源码格式下缩进代码使用的字符<br />FormatOutput=true/false 当输出内容时是否自动格式化代码<br />FormatSource=true/false 在切换到代码视图时是否自动格式化代码<br />FullPage=true/false 是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容<br />GeckoUseSPAN=true/false 是否允许SPAN标记代替B,I,U标记<br />IeSpellDownloadUrl=""下载拼写检查器的网址<br />ImageBrowser=true/false 是否允许浏览服务器功能<br />ImageBrowserURL="" 浏览服务器时运行的URL<br />ImageBrowserWindowHeight="" 图像浏览器窗口高度<br />ImageBrowserWindowWidth="" 图像浏览器窗口宽度<br />LinkBrowser=true/false 是否允许在插入链接时浏览服务器<br />LinkBrowserURL="" 插入链接时浏览服务器的URL<br />LinkBrowserWindowHeight=""链接目标浏览器窗口高度<br />LinkBrowserWindowWidth=""链接目标浏览器窗口宽度<br />Plugins=object 注册插件<br />PluginsPath="" 插件文件夹<br />ShowBorders=true/false 合并边框<br />SkinPath="" 皮肤文件夹位置<br />SmileyColumns=12 图符窗列数<br />SmileyImages=字符数组 图符窗中图片文件名数组<br />SmileyPath="" 图符文件夹路径<br />SmileyWindowHeight 图符窗口高度<br />SmileyWindowWidth 图符窗口宽度<br />SpellChecker="ieSpell/Spellerpages" 设置拼写检查器<br />StartupFocus=true/false 开启时FOCUS到编辑器<br />StylesXmlPath="" 设置定义CSS样式列表的XML文件的位置<br />TabSpaces=4 TAB键产生的空格字符数<br />ToolBarCanCollapse=true/false 是否允许展开/折叠工具栏<br />ToolbarSets=object 允许使用TOOLBAR集合<br />ToolbarStartExpanded=true/false 开启是TOOLBAR是否展开<br />UseBROnCarriageReturn=true/false 当回车时是产生BR标记还是P或者DIV标记</p>
		<p>如何自定义样式列表呢?<br />FCKEDITOR的样式工具栏中提供了预定义的样式,样式是通过XML文件定义的,默认的XML样式文件存在于FCkEditor根文件夹下的FckStyls.xml文件中<br />这个XML文件的结构分析如下:<br />&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />&lt;Styles &gt;<br />    &lt;Style name="My Image" element="img"&gt;<br />        &lt;Attribute name="style" value="padding: 5px" /&gt;<br />        &lt;Attribute name="border" value="2" /&gt;<br />    &lt;/Style &gt;<br />    &lt;Style name="Italic" element="em" /&gt;<br />    &lt;Style name="Title" element="span"&gt;<br />        &lt;Attribute name="class" value="Title" /&gt;<br />    &lt;/Style &gt;<br />    &lt;Style name="Title H3" element="h3" /&gt;<br />&lt;/Styles&gt;</p>
		<p>每一个STYLE标记定义一种样式,NAME是显示在下拉列表中的样式名,ELEMENT属性指定此样式所适用的对象,因为FCKEDITOR中的样式是上下文敏感的,也就是说,选择不同的对象,仅会显示针对这类对象定义的样式</p>
		<p>拼写检查</p>
		<p>FCKEDITOR带了两种拼写检查工具,一种是ieSpell,默认情况下使用这种,使用这种方式的拼写检查,要求客户下载并安装iespell这个小软件,另外,也提供SpellPager的方式来进行拼写检查,不过,由于SPELLPAGER是由PHP编写的服务器端脚本,因此,要求你的WEB服务器必须支持PHP脚本语言方可<br />更改拼写检查器的方式请参见有关配置文件的详细说明</p>
		<p>压缩脚本</p>
		<p>为了提供脚本载入的效率,FCKEDITOR采用以下方法对脚本尽量压缩以减少脚本尺寸:<br />1,移除掉脚本中的注释<br />2.移除掉脚本中所有无意义的空白<br />另外,FCKEDITOR还提供了一个专门用于压缩脚本的工具以便 你在发布时能减小文件尺寸,<br />你可以将_Packager文件夹中的Fckeditor.Packager.exe复制到FCKEDITOR根文件夹来运行并压缩脚本</p>
		<p>本地化FCKEDITOR<br />如果FCKEDITOR没有提供您所需要的语言(实际上全有了),你也可以自行制作新的语言<br />,你只需要复制出EN.JS,然后在其基础上进行翻译.另外,语言名称与对应的脚本文件名必须遵循RFC 3066标准,但是,需要小写,例如:Portuguess Language对应的脚本文件名必须为pt.js<br />如果需要针对某个国家的某种语系,则可以在语系缩写后加上横线及国家缩写即可</p>
		<p>在使用时,系统会自动侦测客户端语系及国别而运用适当的界面语言.</p>
		<p>当建立一种新的语言后,你必须在"Edit/lang/fcklanguagemanager.js"中为其建立一个条目,如下所示:<br />FCKLanguageManager.AvailableLanguages = <br />{</p>
		<p>
				<br />en : 'English',<br />pt : 'Portuguese' <br />} </p>
		<p>需要提醒的是,文件必须保存为UTF-8格式</p>
		<p>
				<br />如何与服务器端脚本进行交互?<br />请查看例子以得到相关内容</p>
		<p>另外,在ASP.NET中以以下步骤使用<br />1.把FCKEDITOR添中到工具箱<br />2.托拽FCKEDITOR控件到页面<br />3.为其指定名称<br />4.FCKEDITOR类的所有属性不光可以在代码中使用,而且可以作为FCKEDITOR控件的属性直接使用,例如,要改变皮肤,可以在UI页面中指定SkinPath="/fckeditor/editor/skins/office2003"即可,其实FCKEDITOR的ASP.NET版本可以做得更好,你可以找到FCKEDITOR ASP.NET 2.1的源文件,然后修改该控件的设计,为其暴露更多有用的属性,重新编译即可<br />5,POSTBACK后的数据,使用FCKEDITOR控件的value属性获得<br />6.默认状态下,FCKEDITOR作者并没有提供特定于ASP.NET的文件上传及文件浏览器,不过,你可以轻易的在FILEMANANGER的ASP.NET文件夹中找到空白的ASP.NET版文件浏览器,加入你自己用于浏览/上传的代码即可<br />7.由于默认状态下,ASP.NET不允许提交含有HTML及JAVASCRIPT的内容,因此,你必须将使用FCKEDITOR的页面的ValidateRequest设为false.(&lt;<a href="mailto:%@page">%@page</a> validteRequest="false" %&gt;即可)<br /></p>
<img src ="http://www.blogjava.net/oxl/aggbug/59827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-24 15:41 <a href="http://www.blogjava.net/oxl/archive/2006/07/24/59827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下的分区概念</title><link>http://www.blogjava.net/oxl/archive/2006/07/21/59483.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Fri, 21 Jul 2006 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/21/59483.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/59483.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/21/59483.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/59483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/59483.html</trackback:ping><description><![CDATA[一、分区概念：<br />首先我们先得清楚什么是分区，俗气来说，就像windows下的c盘、d盘。。。，是很来存储我们平日里使用的数据和程序的。<br />在系统中，我们每个硬盘只能有四个分区，也叫做主分区。也就这样我们每个硬盘只能有四个主分区。但是，当硬盘很大，或者是为了更好地使用硬盘，我们可能会要很多的分区，远远大于四个分区，这样四个主分区就不能够为我们所能満足了。那么得有更好的方法进行解决，于是就有了扩展分区和逻辑分区。我们用一个主分区作扩展分区，并在上面建立逻辑分区，而且逻辑分区的个数是不限的，其容量受扩展分区容量的限制。<br />综上所述，也就是，一个硬盘有四个主分区，其中一个用于做扩展分区，并且逻辑分区建于该扩展分区之上，可以有无数个逻辑分区。<br /><br />二、windows下的分区概念(标识方式)：<br />在windows下有自己的一套傻瓜方式，也就是用C: D: E: .....这个的英文字母方式来标识每一个分区。无论是主分区，还是逻辑分区，都按硬盘和硬盘磁道顺序一个一个的数c,d,e,f。通常在Windows下，只有一个主分区和若干个逻辑分区(高手可能会有三个主分区和若干个逻辑分区，只要他们愿意。)，这是装机仔常用的方式，也是最傻瓜最容易的。<br /><br />三、Linux下的分区概念(标识方式)：<br />在Linux下则复杂一些，Linux下很计较分区的分区方式，也就是说它很计较分区是主分区还是逻辑分区。<br />在Linux下，第一个EIDE总线接的第一个硬盘标识为hda，第二个为hdb，那么第二个EIDE总线接的第一个硬盘标识为hdc,第二个就是hdd.看出规律了吗：<br />第一个EIDE总线:<br />hda<br />hdb<br />第二个EIDE总线：<br />hdc<br />hdd<br />(看，又是abcd了。。。。哈。。。。)<br /><br />在Linux下，四个主分区按顺序分别标识为:hdx1,hdx2,hdx3,hdx4(x是你的硬盘参数，如x=a,就是hda1,hda2,hda3,hda4,下文我们就用hda作例子...吧，)。那么逻辑分区就从hda5开始数起，hda5,hda6,hda7.......。<br /><br />四、windows下的分区和Linux下的分区的联系。<br />在一主分区多逻辑分区的大众化方式中，主要有以下的联系。<br />c: d: e: f: ........<br />hda1 hda5 hda6 hda7 ........<br /><br />"哎。。。。我又没有分其它的主分区，为什么d:盘还是从hda5开始数啊？。。。"问的好，这就是Linux下的方式，它默认你有四个主分区，其实只是hda1才真正有用。记住哦，从D盘开始就是hda5了，不要格错盘哦，我可说过了哦。哈。。。。。。<br />”那么我又怎么知道我是有多少个主分区啊？“这个得用一些”危险“的工具，你可以用fdisk(DOS)来检看，也可以用分区摩术师，主分区一般会有(PRIMARY)字样，逻辑分区一般会有(LOGICAL),那么你就可以知道自己机子上的分区状况了。<br /><br />五、主引扇区(MBR)的概念。<br />MBR是系统启动时最先读取的硬盘扇区，也是启动操作系统的一个关结点，主要用于启动操作系统，里面装着启动操作系统的程序，比如lilo,grub。哈。。。，由于本人的知识浅薄，也很难说得清楚，有兴趣的朋友可以到www.linuxaid.com.cn去找一下这一方面的资料。<br /><br />六、Linux下的swap分区。<br />主要用于虚拟内存，一般是你主存的两倍，如果你的主存高于256M，那么你完全可以不设虚存，但是如果你在linux下运行 X (图形界面)的话，那么你最好创建swap分区，否则你的X可能会运行的很慢。<br /><br />七、善后处理：<br />哈。。。。有的人装linux是一时的兴趣，玩够了以后就想删掉，结果用工具删后，却不能启动Windows，这主要是MBR下的启动程序没有找到Linux所须的文件而致。<br />解决的方法如下：<br />用DOS启动盘启动系统，键入：fdisk /mbr<br />至于Redflag linux3.2或3.0的Grub方式，可能上面的命令并不能起作用。那么就得用windows2000的安装盘了。进行控制台修复方式，键入fixmbr(就是这个吧，我忘记了)，哈。。。。这样就解决了。要是还是不行，那我就不知道怎么做了。如果有高手指教，多谢多谢！！<br /><img src ="http://www.blogjava.net/oxl/aggbug/59483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-21 22:37 <a href="http://www.blogjava.net/oxl/archive/2006/07/21/59483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复习：Red Hat Linux系统启动过程</title><link>http://www.blogjava.net/oxl/archive/2006/07/20/59109.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Thu, 20 Jul 2006 00:42:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/20/59109.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/59109.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/20/59109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/59109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/59109.html</trackback:ping><description><![CDATA[大至步骤如下：<br />1、加载并初始化内核。<br />2、检测和配置设备。<br />3、创建自发的系统进程<br /><br />以上三步由bootloader和系统内核自动完成，几乎没有什么控制权。注意第三步，是系统最终准备，在此之前的所有错误信息都必须注意，因为系统配置出错带来的系统运行不正常是常见的，2003年伟兄的一台主机就是这样的情况。<br /><br />4、操作员干预，其实就是进入单用户模式，也就是sulogin，在Red Hat 中常会要求输入root密码，那么如果是因忘记root密码而修改密码的话，那么就不能单纯进入单用户模式，必须在bootloader修改启动参数。<br /><br />5、执行系统启动脚本：rc.*，按照不同的运行级，运行脚本。<br />6、多用户操作。rc3,rc4,rc5<br /><br />其实大多数系统恢复都在单用户模式，但是如果是root文件系统损坏，那么就不可能进入得了单用户模式，这里就应该强行进入更简单的单用户模式，从而可以修复root文件系统。<img src ="http://www.blogjava.net/oxl/aggbug/59109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-20 08:42 <a href="http://www.blogjava.net/oxl/archive/2006/07/20/59109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unix/Linux系统管理员必须要会的东东！</title><link>http://www.blogjava.net/oxl/archive/2006/07/19/59085.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 19 Jul 2006 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/19/59085.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/59085.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/19/59085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/59085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/59085.html</trackback:ping><description><![CDATA[系统管理的主要支柱之一就是使用使用脚本来自动完成管理任务。要成为高效的管理人员，必须能够阅读并修改sh脚本。<br /><br />学习Perl，使用perl带编写新的脚本驱动你的工作。<br /><br />对于系统管理员来说，准确了解他们的系统是如何工作的非常重要。当系统发生故障时，可视化工具通常对于确定并修正问题来说没有什么帮助。最后，手工配置往往更好：更快、更灵活、更可靠，而且更易于用脚本实现。<img src ="http://www.blogjava.net/oxl/aggbug/59085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-19 22:41 <a href="http://www.blogjava.net/oxl/archive/2006/07/19/59085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strlen(char *s)</title><link>http://www.blogjava.net/oxl/archive/2006/07/19/59070.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Wed, 19 Jul 2006 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/19/59070.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/59070.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/19/59070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/59070.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/59070.html</trackback:ping><description><![CDATA[
		<p>返回字符串不包括"\0"的长度。<br /><br />下面是解释：<br /><br />NAME<br />       strlen - calculate the length of a string</p>
		<p>SYNOPSIS<br />       #include &lt;string.h&gt;</p>
		<p>       size_t strlen(const char *s);</p>
		<p>DESCRIPTION<br />       The  strlen()  function  calculates  the  length  of  the string s, <font color="#ff0000">not<br />       including the terminating `\0' character.<br /><br /><br /><br /></font><font color="#000000">在unix中，读入一行时都会在后面加入"\n"紧跟一个"\0"，所以strlen往往得不到正确的答案。应该是strlen(s) - 1<br /><br />所以清除换行符的方法是<br />char test[MAX_LINE];<br />//....read from stdin<br />test[strlen(test) - 1] = '\0';</font></p>
<img src ="http://www.blogjava.net/oxl/aggbug/59070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-19 21:39 <a href="http://www.blogjava.net/oxl/archive/2006/07/19/59070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Borland将转让IDE Delphi九月前换东家 </title><link>http://www.blogjava.net/oxl/archive/2006/07/18/58867.html</link><dc:creator>oxl</dc:creator><author>oxl</author><pubDate>Tue, 18 Jul 2006 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/oxl/archive/2006/07/18/58867.html</guid><wfw:comment>http://www.blogjava.net/oxl/comments/58867.html</wfw:comment><comments>http://www.blogjava.net/oxl/archive/2006/07/18/58867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oxl/comments/commentRss/58867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oxl/services/trackbacks/58867.html</trackback:ping><description><![CDATA[　　据外电报道，软件开发工具Delphi的东家Borland公司日前表示，已经有12家公司表示愿意买下其开发工具业务，而Borland和其中一家公司达成了意向，正在完成具体转让工作。
<p>　　Borland此次转让的开发工具包括JBuilder和Windows版Delphi。该公司表示，转让过程将在今年九月份之前完成。</p><p>　　此前，Borland公司已经对外表明，该公司未来将聚焦软件生命周期管理产品，因此，传统的软件开发工具，以及InterBase数据库都将单独对外转让。</p><p>　　Borland公司并未对外透露和哪一家公司达成了转让意向。不过，媒体分析认为，两个开发工具最有可能的买家是IBM、甲骨文甚至Google公司。不过，IBM和Google公司都对此消息拒绝置评，而甲骨文则表示他们关心的是自己的软件。</p><p>　　Borland公司是昔日的软件开发工具巨头，其Delphi在中国等市场拥有大量用户，和微软曾经是难分伯仲的对手。不过，随着微软.NET平台的推出，以及开发工具市场的增长潜力有限，Borland公司已谋生退意。不过，分析人士表示，这些开发工具目前至少拥有450万用户，因此还是很有价值。<br /><br /><br />---<br /><br />为Delphi默哀5分钟，曾经合作过的兄弟。</p><img src ="http://www.blogjava.net/oxl/aggbug/58867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oxl/" target="_blank">oxl</a> 2006-07-18 23:06 <a href="http://www.blogjava.net/oxl/archive/2006/07/18/58867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>