<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>BlogJava-Shao Fan</title><link>http://www.blogjava.net/shaofan/</link><description>关于JAVA与软件工程</description><language>zh-cn</language><lastBuildDate>Mon, 16 Nov 2009 05:14:02 GMT</lastBuildDate><pubDate>Mon, 16 Nov 2009 05:14:02 GMT</pubDate><ttl>60</ttl><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-nc-nd/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/shaofan" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>关于三层架构的一些想法</title><link>http://feedproxy.google.com/~r/shaofan/~3/zfxdgeJOmwI/143662.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sat, 08 Sep 2007 11:45:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2007/09/08/143662.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/143662.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2007/09/08/143662.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/143662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/143662.html</trackback:ping><description>目前开发人员对系统开发的一个共识是使用三层架构，分为表示层，业务层，和持久层。而这三层之间的依赖关系如何？比较常见的一种看法是&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000dd6;"&gt;表示层 --&amp;gt; 业务层 --&amp;gt; 持久层&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
这表明了层与层之间的调用关系，表示层通过调用业务层来完成任务，而业务层则调用持久层。从另一个角度来看，一种依赖关系是&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #000dd6;"&gt;表示层 --&amp;gt; 领域模型(Domain Model) &amp;lt;-- 持久层&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
即&lt;strong&gt;表示层和持久层都应该理解(recognize)领域模型&lt;/strong&gt;。而领域模型则是业务层的一部分。业务层正是系统的价值所在。虽说表示和持久也很重要，在某些系统中可以说是很关键，但是&lt;strong&gt;它们的最终目的都是为业务服务，所以业务层应该是系统的核心&lt;/strong&gt;。&lt;br /&gt;
&lt;br /&gt;
基于以上的认识，在系统设计的时应首先分析需求得到领域模型，找出系统中的实体、对象（静态的一面），并明确大致的业务流程(动态的一面)。 而另两层应尽最大努力为业务层服务，且尽量减少业务层受另两层的限制。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
各层的职责：&lt;br /&gt;
&lt;br /&gt;
表示层：负责显示信息，及从系统外部得到输入。表示层的设计决定系统界面的可用性，及信息输入和展示的可靠性。表示层只知道如何展示信息，及收集用户输入，并不知道该如何对这些输入进行处理来完成业务。&lt;br /&gt;
&lt;br /&gt;
业务层：完成业务逻辑。业务层设计决定客户价值是否能够得到实现。这是系统的关键。外在的表现是功能性。业务层设计和实现的失误表现在用户端即功能缺失，功能不可靠等。如果需要对业务层的业务规则进行解耦，则可以使用规则引擎如Drools，把业务规则分离出来。但分离后的业务规则仍属于业务层。业务层知道如何对用户输入进行处理，能够应用业务规则完成用户所需的业务，但它不知道数据如何读取和保存。&lt;br /&gt;
&lt;br /&gt;
持久层：负责用户信息的持久化。持久层的失误表现在外即数据处理(储存，展示等)不可靠。持久层完全不知道业务，只专注于数据存储和读取。所谓持久化并不一定是指数据库，任何方式的持久化(通过文件，网络的持久化等)都应由持久层完成。&lt;br /&gt;
&lt;br /&gt;
各层的设计都会直接影响系统性能。&lt;br /&gt;
&lt;br /&gt;
三层的体积大小和复杂度在不同的系统中可能会有很大的不同。比如说GOOGLE的搜索引擎，它的界面很简单，可以想像表示层是比较容易实现的，而它的业务层，关系到处理关键字，分析搜索结果，决定排名等，而持久层则要负责处理超大量的数据。业务层和持久层则相当复杂。而有的系统持久层会很小，比如杀毒软件，媒体播放软件等。业务层小而另两层大的例子暂时还没有想到:)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;img src ="http://www.blogjava.net/shaofan/aggbug/143662.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2007-09-08 19:45 &lt;a href="http://www.blogjava.net/shaofan/archive/2007/09/08/143662.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=zfxdgeJOmwI:9EmvwQgYBv0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=zfxdgeJOmwI:9EmvwQgYBv0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=zfxdgeJOmwI:9EmvwQgYBv0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=zfxdgeJOmwI:9EmvwQgYBv0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2007/09/08/143662.html</feedburner:origLink></item><item><title> Python中help()怎么用？</title><link>http://feedproxy.google.com/~r/shaofan/~3/mo7M7V0Hchs/122036.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Mon, 04 Jun 2007 22:28:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2007/06/05/122036.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/122036.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2007/06/05/122036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/122036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/122036.html</trackback:ping><description>&lt;p&gt;&lt;span class="postbody"&gt;help是一个内置函数，所谓内置函数，就是在Python中被自动加载的函数，任何时候都可以用。参数分两种：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;span class="postbody"&gt;如果传一个字符串做参数的话，它会自动搜索以这个字符串命名的模块，方法，等。&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;span class="postbody"&gt;如果传入的是一个对象，就会显示这个对象的类型的帮助。&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span class="postbody"&gt; 比如输入help(&amp;#8217;print&amp;#8217;)，它就会寻找以&amp;#8217;print&amp;#8217;为名的模块，类，等，找不到就会看到提示信息。而print在python里是一个保留字，和pass,return同等，而非对象，所以help(print)也会出错((kkkkkkk))。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;举个例子：&lt;br&gt;
&lt;coolcode lang="python"&gt;&lt;br&gt;
&lt;div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"&gt;&lt;!--&lt;br&gt;&lt;br&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br&gt;http://www.CodeHighlighter.com/&lt;br&gt;&lt;br&gt;--&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;help(&amp;#8217;sys&amp;#8217;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;会列出sys模块的帮助&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;a&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;help(a)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;会显示list的帮助&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;help(a.append)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;会显示list的append方法的帮助&lt;/span&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/coolcode&gt;&lt;/p&gt;
&lt;p&gt;python安装自带的library reference，2.1节是关于内置函数的。&lt;/p&gt;
&lt;p&gt;&lt;span class="postbody"&gt;Reference Manual的6.6节可以找到关于print的东东。&lt;/span&gt;&lt;/p&gt;&lt;img src ="http://www.blogjava.net/shaofan/aggbug/122036.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2007-06-05 06:28 &lt;a href="http://www.blogjava.net/shaofan/archive/2007/06/05/122036.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=mo7M7V0Hchs:l2VPNGgZl1s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=mo7M7V0Hchs:l2VPNGgZl1s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=mo7M7V0Hchs:l2VPNGgZl1s:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=mo7M7V0Hchs:l2VPNGgZl1s:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2007/06/05/122036.html</feedburner:origLink></item><item><title>Struts2客户端验证的一个bug</title><link>http://feedproxy.google.com/~r/shaofan/~3/XU5RP5QhVGo/121663.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sun, 03 Jun 2007 09:56:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2007/06/03/121663.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/121663.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2007/06/03/121663.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/121663.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/121663.html</trackback:ping><description>Struts2默认theme是xhtml，它用表格来对表单中的控件进行排版。它也提供一个客户端的js验证功能，但是它的js脚本却有些问题，在某些情况下，前次验证的提示信息无法被清除，提示信息会不断的累积显示在屏幕上。而按照设计，每次提交表单时应只显示每次验证的出错信息。&lt;br&gt;&lt;br&gt;它的客户端验证的流程大概是这样，用户提交表单时，对各个控件的输入按预先设置的规则进行验证，如果有问题，则清除表单里原有的出错提示信息，并写入新的提示。其设计的功能是把出错信息写表格里出错控件的上方，以便用户看得更加清楚。问题就出在其用来清除原出错信息的函数，其代码是这样的(在struts.jar的template/xhtml目录下可以找到)：&lt;br&gt;&lt;br&gt;
&lt;div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"&gt;&lt;!--&lt;br&gt;&lt;br&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br&gt;http://www.CodeHighlighter.com/&lt;br&gt;&lt;br&gt;--&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;1&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;clearErrorMessages(form)&amp;nbsp;{&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;2&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;3&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;table&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;form.childNodes[&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;4&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;table&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;undefined&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;)&amp;nbsp;{&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;5&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;form.childNodes[&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;];&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;6&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;7&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;8&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;clear&amp;nbsp;out&amp;nbsp;any&amp;nbsp;rows&amp;nbsp;with&amp;nbsp;an&amp;nbsp;"errorFor"&amp;nbsp;attribute&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;&amp;nbsp;9&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;rows&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;table.rows;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;rowsToDelete&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Array();&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(rows&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;){&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;rows.length;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;r&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;rows[i];&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(r.getAttribute(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;errorFor&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;))&amp;nbsp;{&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rowsToDelete.push(r);&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;now&amp;nbsp;delete&amp;nbsp;the&amp;nbsp;rows&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;rowsToDelete.length;&amp;nbsp;i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;r&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;rowsToDelete[i];&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table.deleteRow(r.rowIndex);&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;table.removeChild(rowsToDelete[i]);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;&amp;nbsp;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;br&gt;&lt;br&gt;看这个函数的前三行，它试图取得form的第1个或第2个子节点，并把它作为table来处理(看接下来的几行)。要想清除表格里的错误信息，首先要取得表格本身，这没错，但是&lt;span style="font-weight: bold;"&gt;如果第1个或第2个子节点不是table的话，脚本就会出错，造成原出错信息无法清除，这样每次提交后的提示信息就会累积在屏幕上。&lt;br&gt;&lt;br&gt;&lt;/span&gt;要解决这个问题有两个办法：&lt;br&gt;
&lt;ul&gt;
    &lt;li&gt;写代码时要小心，保证form的第1或2个子节点是table，不要在生成table前加其他代码。&lt;/li&gt;
    &lt;li&gt;或，修改xhtml的validation.js，使它总能获得正确的table元素，重新打包到struts.jar。&lt;/li&gt;
&lt;/ul&gt;
刚看了一下Struts的JIRA，已经有人报告了这个问题(id &lt;a  href="https://issues.apache.org/struts/browse/WW-1802"&gt;WW-1802&lt;/a&gt;)，而且这个bug在2.1版本中已经解决了。&lt;br&gt; &lt;img src ="http://www.blogjava.net/shaofan/aggbug/121663.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2007-06-03 17:56 &lt;a href="http://www.blogjava.net/shaofan/archive/2007/06/03/121663.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=XU5RP5QhVGo:_tSj1nfQiQo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=XU5RP5QhVGo:_tSj1nfQiQo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=XU5RP5QhVGo:_tSj1nfQiQo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=XU5RP5QhVGo:_tSj1nfQiQo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2007/06/03/121663.html</feedburner:origLink></item><item><title>简单对比一下Python/Django和Java/Struts/JSP的请求处理结构</title><link>http://feedproxy.google.com/~r/shaofan/~3/lTJUVjKyRLY/109007.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Fri, 06 Apr 2007 11:11:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2007/04/06/109007.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/109007.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2007/04/06/109007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/109007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/109007.html</trackback:ping><description>假设：用两者写一个最小的WEB程序。&lt;br&gt;过程可以参照：&lt;br&gt;1.struts的就太多了,随便哪个都可以&lt;br&gt;2.python/django可以看limodou写的&lt;a target="_blank" href="http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/"&gt;Django step by step&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;
&lt;table style="width: 874px; height: 274px;" bgcolor="#ffffff" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr bgcolor="#dde6ff"&gt;
            &lt;td&gt;&lt;br&gt;&lt;/td&gt;
            &lt;td style="font-weight: bold;"&gt;Java/Struts/JSP&lt;/td&gt;
            &lt;td align="left" valign="middle"&gt;&amp;nbsp;&lt;span style="font-weight: bold;"&gt;Python/Django&lt;/span&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr bgcolor="#dde6ff"&gt;
            &lt;td style="font-weight: bold;"&gt;开发步骤&lt;/td&gt;
            &lt;td&gt;1.在web.xml里配置struts的servlet&lt;br&gt;2.在struts-config.xml里配置URL和action的映射&lt;br&gt;3.写action&lt;br&gt;4.写JSP&lt;/td&gt;
            &lt;td align="left" valign="middle"&gt;1.在urls.py里配置URL到方法的映射&lt;br&gt;2.写相应的方法&lt;br&gt;3.写HTML模板&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr bgcolor="#dde6ff"&gt;
            &lt;td style="font-weight: bold;" align="left" valign="middle"&gt;调用过程&lt;/td&gt;
            &lt;td align="left" valign="middle"&gt;1.根据web.xml的映射调用struts的servlet controller&lt;br&gt;2.servlet controller根据struts-config.xml的映射调用相应的action&lt;br&gt;3.action处理请求&lt;br&gt;4.JSP渲染显示&lt;/td&gt;
            &lt;td align="left" valign="middle"&gt;1.根据urls.py的映射调用相应的方法&lt;br&gt;2.方法处理请求&lt;br&gt;3.HTML渲染显示&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;br&gt;&lt;br&gt;相比之下前者用了两层才把一个HTTP请求映射到实际处理的方法：第一次是servlet的映射，第二次是struts action的映射。&lt;br&gt;而django则一次就从URL映射到相应的方法了。&lt;br&gt;&lt;br&gt;另外一个比较显著的区别，也是基于java和python的语言上的区别吧，java的所有方法必需包含在一个类中，因此action mapping配置时是映射到类，而action在实现类则应实现事先约定的方法(通过继承或实现接口)。而django则直接得多，可以直接在配置里写明处理请求的方法名。&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;img src ="http://www.blogjava.net/shaofan/aggbug/109007.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2007-04-06 19:11 &lt;a href="http://www.blogjava.net/shaofan/archive/2007/04/06/109007.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=lTJUVjKyRLY:BrzG3b__nXc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=lTJUVjKyRLY:BrzG3b__nXc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=lTJUVjKyRLY:BrzG3b__nXc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=lTJUVjKyRLY:BrzG3b__nXc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2007/04/06/109007.html</feedburner:origLink></item><item><title>关于DOM的另一篇</title><link>http://feedproxy.google.com/~r/shaofan/~3/2_HqGGofbbA/107803.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sun, 01 Apr 2007 10:45:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2007/04/01/107803.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/107803.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2007/04/01/107803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/107803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/107803.html</trackback:ping><description>&lt;p&gt;DOM (Document Object Model)是一套语言无关的XML解析的接口定义。它定义了在XML解析中需要的类型，方法，以及属性，比如如何获得一个XML标签，如何改变标签的内容，如何改变它的属性，等等。&lt;/p&gt;
		&lt;p&gt;DOM只是一个定义，并不是具体的实现，它的目的就是为了让大家在各个平台上都能用相同的方式来处理XML，这样一来，我只要了解DOM，基本上在各个平台上都可以方便的处理XML，而不用重新学习了。比如说，Java, JavaScript, Python都有DOM的实现，用它们来处理XML，方式基本上都是一样的（当然也有非DOM的XML解析方式）。在Java下，实现DOM的类库就有很多，比如JDom,Xerces， 用GOOGLE一搜就一大把。现在Java 5.0内置的就是Xerces。而JavaScript本身就内置了DOM的实现。Python也默认安装了DOM的库。&lt;/p&gt;
		&lt;p&gt;正因为DOM致力于实现各个平台上对XML一致的处理方式，它定义了一堆自己的接口。因此在用DOM的时候，会有很多非NATIVE的东东。比如说，返回节点的子节点的方法，childNodes，返回的类型是NodeList。我第一次在Java上用，就以为是返回一个List，然后用get(n)方法来取得某元素。而实际上NodeList是用item(n)的方法来取得某元素的。这就让我觉得很怪。而DOM正是用这种方式来获得“语言无关”的能力的。&lt;/p&gt;
		&lt;p&gt;DOM是用IDL(Interface Definition Language)来定义的。完整的定义可以在这里找到 &lt;a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html"&gt;http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html&lt;/a&gt;。IDL也很容易看懂。定义的1.1节列出了所有的接口。&lt;/p&gt;
		&lt;p&gt;这些接口里，最重要而且常用的是Node,NodeList,Document,Element,Text,Attr这几个。DOM把XML文档看作一棵树，树上的每个元素都是Node。每个Node都属于某个类型，比如Element,attribute,text等。这些类型就表明这个节点在XML文档里的类型了。&lt;/p&gt;
		&lt;p&gt;比如Node里有个属性：&lt;/p&gt;
		&lt;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"&gt;
				&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;span style="COLOR: #000000"&gt;  readonly attribute unsigned &lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;short&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;  nodeType;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;根据这个定义，对于取得的节点，我们就可以通过读取nodeType这个属性来判断这个节点的类型。在Java里，所有的属性都是用getter来取得的，因此对某节点n，就可以用n.getNodeType()取得它的类型。Node接口里也定义了类型常量：&lt;/p&gt;
		&lt;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"&gt;
				&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;span style="COLOR: #000000"&gt;  const unsigned short      ELEMENT_NODE                   = 1;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      ATTRIBUTE_NODE                 = 2;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      TEXT_NODE                      = 3;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      CDATA_SECTION_NODE             = 4;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      ENTITY_REFERENCE_NODE          = 5;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      ENTITY_NODE                    = 6;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      PROCESSING_INSTRUCTION_NODE    = 7;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      COMMENT_NODE                   = 8;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      DOCUMENT_NODE                  = 9;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      DOCUMENT_TYPE_NODE             = 10;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      DOCUMENT_FRAGMENT_NODE         = 11;&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;  const unsigned short      NOTATION_NODE                  = 12;&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;用这些常量和和n.getNodeType()的结果比较，就可以知道它是不是某种类型。&lt;/p&gt;
		&lt;p&gt;Node接口中也定义了一些方法，比如：&lt;/p&gt;
		&lt;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"&gt;
				&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;span style="COLOR: #000000"&gt; Node     appendChild(in Node newChild)    raises(DOMException);&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;表明appendChild方法需要一个Node类型的参数，返回一个Node。 具体的说明可以点文档上的链接进去，也很容易看懂。&lt;/p&gt;
		&lt;p&gt;Node接口里定义了操纵节点的方法，比如增加子节点，返回父节点，插入新节点，返回节点类型，等等。Document,Element等接口都继承Node接口，因此在它们上面都可以使用操纵节点的方法。&lt;/p&gt;
		&lt;p&gt;
				&lt;strong&gt;Document&lt;/strong&gt;:代表整个XML文档。所有DOM元素都不能用类似Java里new的方式来生成，而是要通过调用Document里的相应方法来生成。因此它提供了生成诸如Element, Attr, Text的方法。比如createElement, createTextNode, createComment等。它也提供了名为getElementsByTagName的方法，用来通过标签名称来取得其对象。比如getElementByTagName("ul")就可以获得所有ul标签。它也提供一些文档的属性，比如xmlEncoding,inputEncoding等。它的一个属性,documentElement代表文档的根节点。所有对XML元素的操作，基本上都是从Document开始的。&lt;/p&gt;
		&lt;p&gt;
				&lt;strong&gt;Element&lt;/strong&gt;:代表一个XML标签。它可以有属性，子标签，等。比如&amp;lt;ul id="booklist"&amp;gt;&amp;lt;li&amp;gt;hello&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;。标签ul是一个Element,它有一个属性叫id，属性的值是booklist。它有一个子结点li。li也是一个标签，它也有个子节点hello，是一个Text类型的节点。这个接口提供操纵其标签属性的方法，比如getAttribute,setAttribute,removeAttribute等。它也提供了和Document中一样的getElementsByTagName的方法，用来获得在这个节点下的元素。&lt;/p&gt;
		&lt;p&gt;
				&lt;strong&gt;Attr&lt;/strong&gt;:代表标签中的属性。比如上面的id。它也是一个Node。它有名字，值，也可以获得它的所属标签。&lt;/p&gt;
		&lt;p&gt;
				&lt;strong&gt;Text&lt;/strong&gt;:代表一段文字，比如上面的hello，它也一个Node，但比较特殊，它不是直接继承Node，而是继承CharacterData接口，后者继承了Node。但是它不能有子节点。&lt;/p&gt;
		&lt;p&gt;用JavaScript给一个例子。假设有一个HTML文档：&lt;/p&gt;
		&lt;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"&gt;
				&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;html&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;head&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;title&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;Try DOM&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;title&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;head&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;body&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;
						&lt;br /&gt;
						&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;ul&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;
						&lt;br /&gt;
						&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;li&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;hello&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;li&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;
						&lt;br /&gt;
						&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;li&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;world&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;li&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;
						&lt;br /&gt;
						&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;ul&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;
						&lt;br /&gt;
						&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;body&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;
				&lt;span style="COLOR: #800000"&gt;html&lt;/span&gt;
				&lt;span style="COLOR: #0000ff"&gt;&amp;gt;&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;下面是增加一个li的JavaScript方法：&lt;/p&gt;
		&lt;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"&gt;
				&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;span style="COLOR: #000000"&gt;ulList &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; document.getElementsByTagName(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;ul&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;ul     &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; ulList.item(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;0&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;txt    &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; document.createTextNode(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;I am new li&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;li     &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; document.createElement(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;li&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;li.appendChild(txt);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;ul.appendChild(li);&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;用Java来写，是这样：&lt;/p&gt;
		&lt;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"&gt;
				&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;
				&lt;span style="COLOR: #000000"&gt;NodeList ulList &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; document.getElementsByTagName(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;ul&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;Node        ul       &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; ulList.item(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;0&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;Text          txt      &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; document.createTextNode(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;I am new li&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;Element    li        &lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt; document.createElement(&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;li&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;
				&lt;span style="COLOR: #000000"&gt;);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;li.appendChild(txt);&lt;br /&gt;&lt;img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /&gt;ul.appendChild(li);&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;可以看到处理方式和数据类型都是一样的。如果要了解更多，可以看看DOM的定义，都是IDL。&lt;/p&gt;
&lt;img src ="http://www.blogjava.net/shaofan/aggbug/107803.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2007-04-01 18:45 &lt;a href="http://www.blogjava.net/shaofan/archive/2007/04/01/107803.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=2_HqGGofbbA:EqPBIstgwfk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=2_HqGGofbbA:EqPBIstgwfk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=2_HqGGofbbA:EqPBIstgwfk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=2_HqGGofbbA:EqPBIstgwfk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2007/04/01/107803.html</feedburner:origLink></item><item><title>Linux中对不同版本的软件进行管理(update-alternatives)</title><link>http://feedproxy.google.com/~r/shaofan/~3/xx55OKkRuKY/89801.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sun, 24 Dec 2006 17:43:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2006/12/25/89801.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/89801.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/12/25/89801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/89801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/89801.html</trackback:ping><description>&lt;p&gt;Ubuntu/Debian中的update-alternative用来对系统中不同版本的同个软件进行管理。&lt;br /&gt;比如，系统中可能装有GNU的Java编译器，和SUN的Java编译器。可以用update-alternatives来设置当前使用它们中的哪一个。&lt;/p&gt;
		&lt;p&gt;它的原理是在/usr/bin中建立一个link，指向/etc/alternatives中的一个文件，而些文件又是一个link，指向当前使用的命令。比如java命令，查看如下：&lt;/p&gt;
		&lt;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"&gt;
				&lt;span style="COLOR: #000000"&gt; $ which java&lt;br /&gt;/usr/bin/java&lt;br /&gt;$ ls -l /usr/bin/java&lt;br /&gt;lrwxrwxrwx /usr/bin/java -&amp;gt; /etc/alternatives/java&lt;br /&gt;$ ls -l /etc/alternatives/java&lt;br /&gt;lrwxrwxrwx /etc/alternatives/java -&amp;gt; /usr/lib/j2re1.5-sun/bin/java&lt;br /&gt;$ ls -l /usr/lib/j2re1.5-sun/bin/java&lt;br /&gt;-rwxr-xr-x /usr/lib/j2re1.5-sun/bin/java&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;参数--display可以某个软件的当前配置，如：&lt;/p&gt;
		&lt;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"&gt;
				&lt;span style="COLOR: #000000"&gt; $ /usr/sbin/update-alternatives --display java&lt;br /&gt;java - status is auto.&lt;br /&gt;link currently points to /usr/lib/j2re1.5-sun/bin/java&lt;br /&gt;/usr/lib/kaffe/bin/java - priority 300&lt;br /&gt;slave java.1.gz: /usr/share/man/man1/java.kaffe.1.gz&lt;br /&gt;/usr/lib/j2re1.5-sun/bin/java - priority 315&lt;br /&gt;slave java.1.gz: /usr/lib/j2re1.5-sun/man/man1/java.1.gz&lt;br /&gt;Current `best' version is /usr/lib/j2re1.5-sun/bin/java.&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;status有auto和manual两种。一旦用户更改了系统的默认设置，它就变为manual。在auto的状态下，系统会根据几套配置的priority来判断当前应该使用哪套配置。&lt;/p&gt;
		&lt;p&gt;每套配置可以设定多个link，它们被称为slave。上面的例子中，有两套java的配置。一套是/usr/lib/kafe/bin/java，另一套是/usr/lib/j2re1.5-sun/bin/java，它们各有一个slave。在些例中这些slave设置的是java命令的 manual。当更改了配置时，用man命令查看的帮助也会相应更改。&lt;/p&gt;
		&lt;p&gt;参数--config可以用来更改当前的配置。&lt;/p&gt;
		&lt;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"&gt;
				&lt;span style="COLOR: #000000"&gt; $ sudo /usr/sbin/update-alternatives --config java &lt;br /&gt;There are 2 alternatives which provide `java'.&lt;br /&gt;Selection Alternative&lt;br /&gt;-----------------------------------------------&lt;br /&gt;1 /usr/lib/kaffe/bin/java&lt;br /&gt;*+ 2 /usr/lib/j2re1.5-sun/bin/java&lt;br /&gt;Press enter to keep the default*, or type selection number: 1&lt;br /&gt;Using `/usr/lib/kaffe/bin/java' to provide `java'.&lt;/span&gt;
		&lt;/div&gt;
		&lt;p&gt;参数--install用来设置一套新的配置。具体参见 &lt;a href="http://blog.stevenkroon.com/2006/08/29/debian-update-alternatives/"&gt;http://blog.stevenkroon.com/2006/08/29/debian-update-alternatives/&lt;/a&gt;&lt;/p&gt;
&lt;img src ="http://www.blogjava.net/shaofan/aggbug/89801.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2006-12-25 01:43 &lt;a href="http://www.blogjava.net/shaofan/archive/2006/12/25/89801.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=xx55OKkRuKY:G35sGufjJ2I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=xx55OKkRuKY:G35sGufjJ2I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=xx55OKkRuKY:G35sGufjJ2I:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=xx55OKkRuKY:G35sGufjJ2I:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2006/12/25/89801.html</feedburner:origLink></item><item><title>用javascript直接调用java程序</title><link>http://feedproxy.google.com/~r/shaofan/~3/_vPnBPatxK8/68407.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Thu, 07 Sep 2006 19:59:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2006/09/08/68407.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/68407.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/09/08/68407.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/68407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/68407.html</trackback:ping><description>Web开发真是越来越有意思了。现在居然可以在JavaScript里直接调用Java写的方法。大水牛Buffalo的最新版1.2.3发行离现在已有半年时间了，现在才注意到。在客户端的代码相当简单：&lt;br /&gt;&lt;br /&gt;&lt;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"&gt;&lt;span style="COLOR: #000000"&gt;buffalo.remoteCall(&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;userService.listAll&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;"&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;,[],&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;function&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(reply){&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;　//&lt;/span&gt;&lt;span style="COLOR: #008000"&gt; 不用担心，reply.getResult会从聪明的判断服务器端远程调用的结果类型。&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;　var&lt;/span&gt;&lt;span style="COLOR: #000000"&gt; userList &lt;/span&gt;&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;&lt;span style="COLOR: #000000"&gt; reply.getResult(); &lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: #0000ff"&gt;　var&lt;/span&gt;&lt;span style="COLOR: #000000"&gt; firstUserFamilyName &lt;/span&gt;&lt;span style="COLOR: #000000"&gt;=&lt;/span&gt;&lt;span style="COLOR: #000000"&gt; userList[&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;0&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;].name.familyName;&lt;br /&gt;});&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;给Web程序加上Buffalo也相当容易。只要下载几个jar文件放到lib目录下，外加几个JS文件，然后在web.xml里加一个Servlet即可。用的时候是需要有个properties文件来定义哪些JAVA方法可以被JS调用。而服务器端的JAVA代码不需要做任何改动。&lt;br /&gt;&lt;br /&gt;暂时手头上还想不起来哪些地方会用，但是这个东东可是我很久以前曾经想过的，现在有人实现了，还是很激动人心的啊。Buffalo的主页是 &lt;a href="http://www.amowa.net/buffalo/zh/index.html"&gt;http://www.amowa.net/buffalo/zh/index.html&lt;/a&gt; 。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src ="http://www.blogjava.net/shaofan/aggbug/68407.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2006-09-08 03:59 &lt;a href="http://www.blogjava.net/shaofan/archive/2006/09/08/68407.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=_vPnBPatxK8:9sZa6HT6-us:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=_vPnBPatxK8:9sZa6HT6-us:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=_vPnBPatxK8:9sZa6HT6-us:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=_vPnBPatxK8:9sZa6HT6-us:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2006/09/08/68407.html</feedburner:origLink></item><item><title>一个Linux下显示目录树的脚本</title><link>http://feedproxy.google.com/~r/shaofan/~3/RmOzIFMpol0/61122.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Tue, 01 Aug 2006 00:57:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2006/08/01/61122.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/61122.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/08/01/61122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/61122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/61122.html</trackback:ping><description>最近因为Globus的原因，不得不用Linux了。以前几次想学，都因为难得要领放弃了。这次装了&lt;a href="http://www.ubuntu.org.cn"&gt;Ubuntu&lt;/a&gt;，又碰巧在它的论坛上看到&lt;a href="http://forum.ubuntu.org.cn/viewtopic.php?t=18740"&gt;一篇很不错的教程&lt;/a&gt;，终于有些“入门”的感觉了。看来找到合适的教程真的是很重要啊。这几天用下来，感觉还真的很不错。用Python写了个显示目录树的小程序。也不知道有没有现成的，反正很简单，刚好就练练手，功能也够我自己用了:)&lt;br /&gt;&lt;br /&gt;&lt;a href="/Files/shaofan/dtree.rar"&gt;下载Python脚本&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img539.photo.163.com/rainy14f/46864571/1716495189.jpg" /&gt;&lt;br /&gt;&lt;img src ="http://www.blogjava.net/shaofan/aggbug/61122.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2006-08-01 08:57 &lt;a href="http://www.blogjava.net/shaofan/archive/2006/08/01/61122.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=RmOzIFMpol0:SmjW1ZqjtTo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=RmOzIFMpol0:SmjW1ZqjtTo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=RmOzIFMpol0:SmjW1ZqjtTo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=RmOzIFMpol0:SmjW1ZqjtTo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2006/08/01/61122.html</feedburner:origLink></item><item><title>关于Firefox无法保存设置的问题</title><link>http://feedproxy.google.com/~r/shaofan/~3/-89uslK9iyg/59866.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Mon, 24 Jul 2006 10:21:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2006/07/24/59866.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/59866.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/07/24/59866.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/59866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/59866.html</trackback:ping><description>最近Firefox出了点问题。我这里用http proxy上网，连接设置里要设置相应的proxy。但发现每次重启ff，连接设置都被重置为“直接连接”。即使改回“通过proxy连接”，下次重启又被重置了。&lt;br /&gt;&lt;br /&gt;马上google一把，发现类似的问题大致有两种解决办法：&lt;br /&gt;1.进入safe mode，会出现一个对话框，把三个选项都勾上，重启。&lt;br /&gt;2.在地址栏输入about:config，会出现所有的配置，把要改的改了即可。&lt;br /&gt;3.直接修改prefs.js文件。&lt;br /&gt;&lt;br /&gt;但这三个方法对偶的FF都不管用。&lt;br /&gt;&lt;br /&gt;最后的解决方法是，删除&lt;br /&gt;C:\Documents and Settings\&amp;lt;user name&amp;gt;\Application Data\Mozilla\Firefox\Profiles\&amp;lt;xxxxxxxx.default&amp;gt;\ &lt;br /&gt;下的user.js，然后再修改prefs.js。然后一切都正常了。&lt;br /&gt;&lt;br /&gt;原来，ff最基本的配置文件是prefs.js。而user.js的优先级应该是比prefs.js高，因此每次重启它都从user.js读取配置。而通过正常途径，如在选项菜单里改设置，无法在user.js里保存（不知道为什么）。所以就造成了每次重启配置被重置的情况，其实就是设置无法被保存。把user.js删掉以后，ff就从prefs.js里读取配置了，而且新的设置也可以正常保存。&lt;br /&gt;&lt;br /&gt;不管是从选项菜单里修改配置，还是以上的第二种方法，最终的结果都是配置被保存在prefs.js文件里，效果都是一样的。&lt;br /&gt;&lt;br /&gt;目前已知的会私自修改FF配置的软件只有Hide IP Plantium，而以上情况正是在安装Hide IP Plantium以后出现的。用的时候要注意。&lt;br /&gt;&lt;br /&gt;相关的讨论在mozillazine里有很多。不得不承认，这类的英文资源要比中文的多得多。看这里的详细讨论：&lt;br /&gt;&lt;a target="_blank" href="http://forums.mozillazine.org/viewtopic.php?t=413875&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;postsperpage=15&amp;amp;start=15"&gt;http://forums.mozillazine.org/viewtopic.php?t=413875&amp;amp;postdays=0&amp;amp;postorder=asc&amp;amp;postsperpage=15&amp;amp;start=15&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src ="http://www.blogjava.net/shaofan/aggbug/59866.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2006-07-24 18:21 &lt;a href="http://www.blogjava.net/shaofan/archive/2006/07/24/59866.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=-89uslK9iyg:iPHBuxjXr5E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=-89uslK9iyg:iPHBuxjXr5E:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=-89uslK9iyg:iPHBuxjXr5E:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=-89uslK9iyg:iPHBuxjXr5E:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2006/07/24/59866.html</feedburner:origLink></item><item><title>近日学习CSS的一些零碎笔记</title><link>http://feedproxy.google.com/~r/shaofan/~3/Ba3FZYF1iwc/54103.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Tue, 20 Jun 2006 22:22:00 GMT</pubDate><guid isPermaLink="false">http://www.blogjava.net/shaofan/archive/2006/06/21/54103.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/54103.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/06/21/54103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/54103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/54103.html</trackback:ping><description>1.理解页面流(flow)，理解几种不同的定位方式：static, relative, absolute等&lt;br /&gt;Positioning and other definitions:&lt;a target="_blank" class="" title="" href="http://css.maxdesign.com.au/floatutorial/definitions.htm"&gt;http://css.maxdesign.com.au/floatutorial/definitions.htm&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;2.HTML页面表达内容逻辑，把样式控制写到CSS文件中&lt;br /&gt;&lt;br /&gt;3.浮动(float)的DIV要配合width属性来用&lt;br /&gt;&lt;br /&gt;4.怎样控制层的位置：用float，padding，width，height这些属性来控制&lt;br /&gt;Float Tutorial: &lt;a target="_blank" class="" title="" href="http://css.maxdesign.com.au/floatutorial/index.htm"&gt;http://css.maxdesign.com.au/floatutorial/index.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5.设置可见的border或background-color来帮助排版&lt;br /&gt;&lt;br /&gt;6.出现内层的DIV跑到外层之外的情况时，可以在外层DIV的&amp;lt;/DIV&amp;gt;前加上一个clear层来解决问题。就是这样：&lt;br /&gt;   &amp;lt;div class="container"&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;    ...&lt;br /&gt;    &amp;lt;div class="clear"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;  css:&lt;br /&gt;  .clear{&lt;br /&gt;    clear:both;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;7.样式表的选择符(Selector)：&lt;br /&gt;   Type/Class/ID等&lt;br /&gt;  Selector Tutorial:&lt;a target="_blank" class="" title="" href="http://css.maxdesign.com.au/selectutorial/index.htm"&gt;http://css.maxdesign.com.au/selectutorial/index.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;8.关于表单的样式设计：&lt;br /&gt;让我们更好的设计表单:浅议Web的表单设计 &lt;a target="_blank" class="" title="" href="http://tech.163.com/06/0529/04/2I8UPHTB0009158Q.html"&gt;http://tech.163.com/06/0529/04/2I8UPHTB0009158Q.html&lt;/a&gt;&lt;br /&gt;用CSS制作具有亲和力的表单 作者：greengnn &lt;br /&gt;&lt;a target="_blank" class="" title="" href="http://www.jluvip.com/blog/article.asp?id=192"&gt;http://www.jluvip.com/blog/article.asp?id=192&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;9.各种浏览器对各种标签用不同的方式渲染，如p, h1, ul等，它们会有不同的padding和margin，为了在各种浏览器下都正常的显示，可以把它们清零，如：&lt;br /&gt;*{&lt;br /&gt;    padding:0;&lt;br /&gt;    margin:0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;10.使用list来显示数据或菜单&lt;br /&gt;List Tutorial:&lt;br /&gt;&lt;a target="_blank" class="" title="" href="http://css.maxdesign.com.au/listamatic/"&gt;http://css.maxdesign.com.au/listamatic/&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" class="" title="" href="http://css.maxdesign.com.au/listamatic2/"&gt;http://css.maxdesign.com.au/listamatic2/&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" class="" title="" href="http://css.maxdesign.com.au/listutorial/"&gt;http://css.maxdesign.com.au/listutorial/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;11.关于各种标准，布局，技巧等的网站：&lt;br /&gt;网页设计师：&lt;a target="_blank" class="" title="" href="http://www.w3cn.org/"&gt;http://www.w3cn.org/&lt;/a&gt;&lt;br /&gt;CSS教程：&lt;a target="_blank" class="" title="" href="http://www.netvtm.com/w3s/css/"&gt;http://www.netvtm.com/w3s/css/&lt;/a&gt;&lt;br /&gt;网页制作指导 - 致力于网页制作知识的普及：&lt;a target="_blank" class="" title="" href="http://www.jianzhan8.cn/"&gt;http://www.jianzhan8.cn/&lt;/a&gt;&lt;br /&gt;当然还有必不可少的经典论坛blueidea：&lt;a href="http://www.blueidea.com/bbs/list.asp?GroupName=%CD%F8%D2%B3%B1%EA%D7%BC%BB%AF%D7%A8%C0%B8"&gt;http://www.blueidea.com/bbs/list.asp?GroupName=%CD%F8%D2%B3%B1%EA%D7%BC%BB%AF%D7%A8%C0%B8&lt;/a&gt;&lt;img src ="http://www.blogjava.net/shaofan/aggbug/54103.html" width = "1" height = "1" /&gt;&lt;br&gt;&lt;br&gt;&lt;div align=right&gt;&lt;a style="text-decoration:none;" href="http://www.blogjava.net/shaofan/" target="_blank"&gt;shaofan&lt;/a&gt; 2006-06-21 06:22 &lt;a href="http://www.blogjava.net/shaofan/archive/2006/06/21/54103.html#Feedback" target="_blank" style="text-decoration:none;"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=Ba3FZYF1iwc:nlBvyuzANPU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=Ba3FZYF1iwc:nlBvyuzANPU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/shaofan?a=Ba3FZYF1iwc:nlBvyuzANPU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/shaofan?i=Ba3FZYF1iwc:nlBvyuzANPU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><feedburner:origLink>http://www.blogjava.net/shaofan/archive/2006/06/21/54103.html</feedburner:origLink></item></channel></rss>
