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