﻿<?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-随笔分类-Java</title><link>http://www.blogjava.net/shaofan/category/7888.html</link><description>关于JAVA与软件工程</description><language>zh-cn</language><lastBuildDate>Sat, 08 Sep 2007 14:30:01 GMT</lastBuildDate><pubDate>Sat, 08 Sep 2007 14:30:01 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>0</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>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>0</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>用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>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><![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>自私的NetBeans</title><link>http://www.blogjava.net/shaofan/archive/2006/06/13/52569.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Tue, 13 Jun 2006 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/06/13/52569.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/52569.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/06/13/52569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/52569.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/52569.html</trackback:ping><description><![CDATA[如果你不幸装了NetBeans并且启用了外置的服务器，那么它会自动在你的web server的web.xml里添加一个filter，名叫HttpMonitorFilter。你用NetBeans时，它会过滤所有的http请求，这样NetBeans就可以显示所有的相关信息。但是如果不用NetBeans，比如我，用eclipse + Tomcat ，那就会得到这个异常：<br /><br /><div class="code"><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">NotifyUtil::java.net.ConnectException: Connection refused: connect<br />  at java.net.PlainSocketImpl.socketConnect(Native Method)<br />  at java.net.PlainSocketImpl.doConnect(Unknown Source)<br />  at java.net.PlainSocketImpl.connectToAddress(Unknown Source)<br />  at java.net.PlainSocketImpl.connect(Unknown Source)<br />  at java.net.Socket.connect(Unknown Source)<br />  at java.net.Socket.connect(Unknown Source)<br />  at sun.net.NetworkClient.doConnect(Unknown Source)<br />  at sun.net.www.http.HttpClient.openServer(Unknown Source)<br />  at sun.net.www.http.HttpClient.openServer(Unknown Source)<br />  at sun.net.www.http.HttpClient.(Unknown Source)<br />  at sun.net.www.http.HttpClient.(Unknown Source)<br />  at sun.net.www.http.HttpClient.New(Unknown Source)<br />  at sun.net.www.http.HttpClient.New(Unknown Source)<br />  at sun.net.www.http.HttpClient.New(Unknown Source)<br />  at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)<br />  at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)<br />  at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)<br />  at org.netbeans.modules.web.monitor.server.NotifyUtil$RecordSender.run(NotifyUtil.java:237)</span></div><br /><init><init></init></init></div><br /><br /><b>解决方法是</b>：<br /><br />第一步. 删除 Tomcat目录中common\lib下的两个和netbeans有关的jar文件(以org-netbeans开头的)<br /><br />第二步. 修改tomcat目录下的conf\web.xml，删除相关Filter的定义，就是这一段：<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">HTTPMonitorFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            org.netbeans.modules.web.monitor.server.MonitorFilter<br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">netbeans.monitor.ide</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">127.0.0.1:8082</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">HTTPMonitorFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/*</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">REQUEST</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">FORWARD</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">INCLUDE</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">ERROR</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br /><img src ="http://www.blogjava.net/shaofan/aggbug/52569.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-13 20:37 <a href="http://www.blogjava.net/shaofan/archive/2006/06/13/52569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建立一个最简单的Webwork应用程序</title><link>http://www.blogjava.net/shaofan/archive/2006/06/04/50211.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sun, 04 Jun 2006 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/06/04/50211.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/50211.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/06/04/50211.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/50211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/50211.html</trackback:ping><description><![CDATA[适用于webwork 2.2.2，详见随包文档。源文件下载：<a href="/Files/shaofan/Hello.rar">Hello.rar</a><br /><br />一共五步：<br /><br />1.建立web应用程序的目录结构<br />2.拷贝库文件：ww安装目录下的lib\default中的所有jar，以及webwork-2.2.2.jar，复制到WEB-INF\lib下。<br />3.生成配置文件：web.xml在WEB-INF下, xwork.xml在WEB-INF\classes下<br /><br />web.xml:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;?</span><span style="color: rgb(255, 0, 255);">xml version="1.0" encoding="ISO-8859-1"</span><span style="color: rgb(0, 0, 255);">?&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;!</span><span style="color: rgb(255, 0, 255);">DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">web-app</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">display-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">My First Hello Webwork</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">display-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">webwork</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">com.opensymphony.webwork.dispatcher.FilterDispatcher</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">webwork</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/*</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">welcome-file-list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">welcome-file</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">index.jsp</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">welcome-file</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">welcome-file-list</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">taglib</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">taglib-uri</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/webwork</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">taglib-uri</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">taglib-location</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/WEB-INF/lib/webwork-2.2.2.jar</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">taglib-location</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">taglib</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">web-app</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br /><br />xwork.xml:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;!</span><span style="color: rgb(255, 0, 255);">DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">xwork</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 128, 0);">&lt;!--</span><span style="color: rgb(0, 128, 0);"> Include webwork defaults (from WebWork JAR). </span><span style="color: rgb(0, 128, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">include </span><span style="color: rgb(255, 0, 0);">file</span><span style="color: rgb(0, 0, 255);">="webwork-default.xml"</span><span style="color: rgb(255, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br /><br />    </span><span style="color: rgb(0, 128, 0);">&lt;!--</span><span style="color: rgb(0, 128, 0);"> Configuration for the default package. </span><span style="color: rgb(0, 128, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">package </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="default"</span><span style="color: rgb(255, 0, 0);"> extends</span><span style="color: rgb(0, 0, 255);">="webwork-default"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">package</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">xwork</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br /><br />4. 编写action和jsp<br />5. 在xwork.xml中添加相应配置，如在package之间加入：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">default-interceptor-ref </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="completeStack"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">action </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="helloww"</span><span style="color: rgb(255, 0, 0);"> class</span><span style="color: rgb(0, 0, 255);">="net.blogjava.shaofan.helloww.Hello"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />            </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">result </span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="success"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">greetings.jsp</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">result</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">action</span><span style="color: rgb(0, 0, 255);">&gt;</span></div><br /><br />下步计划：<br />* 了解package<br />* ww的taglibs<br />* 在action和jsp间传递数据的机制(struts中使用formbean,利用session,request等)<br /><br /><img src ="http://www.blogjava.net/shaofan/aggbug/50211.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-04 09:13 <a href="http://www.blogjava.net/shaofan/archive/2006/06/04/50211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换HTML内容为PDF格式(2)</title><link>http://www.blogjava.net/shaofan/archive/2006/06/01/49390.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Wed, 31 May 2006 23:56:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/06/01/49390.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/49390.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/06/01/49390.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/49390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/49390.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在这篇文章里，Nick Afshartous描述了一种把HTML的内容转换为PDF格式的方法。这种方法相当有用，比如说，一个web程序可以在它的页面上提供如“下载为 PDF”的功能。这种功能方便了打印和储存，以供日后使用。Afshartous的转换方法只使用开源的组件。也有一些商业产业可供使用。因此，在这篇文章里描述的这种方法既在价格上可以承担，又能够获得所用组件的源码。(1600字；2006年4月10日) &nbsp;&nbsp;<a href='http://www.blogjava.net/shaofan/archive/2006/06/01/49390.html'>阅读全文</a><img src ="http://www.blogjava.net/shaofan/aggbug/49390.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-01 07:56 <a href="http://www.blogjava.net/shaofan/archive/2006/06/01/49390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换HTML内容为PDF格式(1)</title><link>http://www.blogjava.net/shaofan/archive/2006/05/30/48866.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Mon, 29 May 2006 22:15:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/05/30/48866.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/48866.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/05/30/48866.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/48866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/48866.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在这篇文章里，Nick Afshartous描述了一种把HTML的内容转换为PDF格式的方法。这种方法相当有用，比如说，一个web程序可以在它的页面上提供如“下载为PDF”的功能。这种功能方便了打印和储存，以供日后使用。Afshartous的转换方法只使用开源的组件。也有一些商业产业可供使用。因此，在这篇文章里描述的这种方法既在价格上可以承担，又能够获得所用组件的源码。(1600字；2006年4月10日)<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/shaofan/archive/2006/05/30/48866.html'>阅读全文</a><img src ="http://www.blogjava.net/shaofan/aggbug/48866.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-05-30 06:15 <a href="http://www.blogjava.net/shaofan/archive/2006/05/30/48866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>差点栽在JAVA路径设置的问题上</title><link>http://www.blogjava.net/shaofan/archive/2006/05/29/48654.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sun, 28 May 2006 23:28:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/05/29/48654.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/48654.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/05/29/48654.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/48654.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/48654.html</trackback:ping><description><![CDATA[
		<b>
				<font size="5">今</font>
		</b>天差点栽在JAVA路径设置上。<br /><br />本来是想用ANT的。但是在命令行输入ant，得到了这样的提示：<br /><br />Usage: java [-options] class [args...]<br />           (to execute a class)<br />   or  java [-options] -jar jarfile [args...]<br />           (to execute a jar file)<br /><br />       ......<br />       ......<br /><br />奇怪。想来是刚重装了系统，JAVA_HOME没有设好。于是检查了一遍。问题依旧。那是不是虚拟机的问题？虚拟机缷掉重装。折腾了半天，问题还是没有解决。<br /><br />逼得我只能静下心来仔细想想问题所在了。ant的命令执行的是一个批处理文件，在这个批处理中它会调用java.exe来运行ant。出现这样的问题，必定是java.exe的用法格式不对了。于是打开ant.bat，发现它的执行有几个分支。在每个分支上加上一句echo b1, echo b2，再次运行，确定是哪个分支被执行。被运行的语句分支就是这个了：<br /><br />:runAntWithClasspath<br />"%_JAVACMD%" %ANT_OPTS% -classpath "%ANT_HOME%\lib\ant-launcher.jar" "-Dant.home=%ANT_HOME%" org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp "%CLASSPATH%" %ANT_CMD_LINE_ARGS%<br />goto end<br /><br />OK。现在几乎可以肯定是那一堆%%的变量里出了问题。拿出我们程序员百试不爽的绝招的时候了：打印每个变量。哈哈，问题出来了：<br /><br />"D:\lib\apache-ant-1.6.5\\lib\ant-launcher.jar"<br /><br />看到了吗？"lib"前面居然是两个反斜杠杠。OK。发现了问题所在，现在是解决的时候了。打开系统变量ANT_HOME，果然，它被设置为"D:\lib\apache-ant-1.6.5\"。把最后的反斜杠去掉。再试运行ant，得到：<br /><br />Buildfile: build.xml does not exist!<br />Build failed<br /><br />ant可以正常运行，问题解决了。<br /><br />这个小小的问题前后用了我快一个小时的时间。但是最后真正发现并解决问题的时间也不过十分钟而已。看来还是太浮躁了。如果一开始就用心去想，也不会有这么多的浪费。想想，为什么那后面会多一个\，其实也很简单，从WINDOWS的地址栏直接拷贝的咯。Windows啊......我知道不能怪Windows，但总要找个出气桶，对不对？<br /><br />自以为用了几年JAVA已经挺熟了，没想到差点栽到最低级的失误里了。反省反省。。。。。。<img src ="http://www.blogjava.net/shaofan/aggbug/48654.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-05-29 07:28 <a href="http://www.blogjava.net/shaofan/archive/2006/05/29/48654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE 5 发布了!!</title><link>http://www.blogjava.net/shaofan/archive/2006/05/17/46529.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Wed, 17 May 2006 00:04:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/05/17/46529.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/46529.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/05/17/46529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/46529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/46529.html</trackback:ping><description><![CDATA[
		<span style="color: Red;">
				<font color="#000000" size="6">Sun</font>
				<font color="#000000">的Java EE 5终于发布了（上一版本称作J2EE）！这一版本可说是万众瞩目了，目前在SUN的站点上已经提供下载。值得关注的特点是：</font>
				<br />
				<br />
				<font color="#000000">"第一个商业的,比较完善的Java EE 5 实现</font>
		</span>
		<font color="#000000">
				<br />简化开发--对编程模式的重新组织<br />支持EJB3.0--POJO<br />支持Java Persistence API , ORM更简单<br />JAX-WS 2.0 以及 JAXB 2.0 使得开发web services 以及SOA应用更加便捷<br />JavaServer Faces 1.2--更简易开发AJAX<br />效率更高, 同时管理和部署功能更强大<br />启动速度提高30%, 占用内存减少30%.<br />web services 效率提高至少5倍.<br />web services 管理更强大<br />整合了NetBeans以及支持Eclipse plug-in<br />提供了整合NetBeans的可视化的SOA 开发以及部署<br /></font>
		<span style="color: Red;">
				<font color="#000000">Sun's Java System Application Server PE 9.0是完全开源的"</font>
				<br />
				<br />                                                 <font color="#000000">----摘自</font><a href="http://www.matrix.org.cn/resource/news/728_SUN+JavaEE5+SDK.html">www.Matrix.org.cn</a><br /><br /><font color="#000000">它的结构如下图：</font><br /><img src="http://img387.photo.163.com/rainy14f/46864571/1265499298.gif" /><br /><br /><font color="#000000">Matrix上的相关文章：http://www.matrix.org.cn/resource/news/728_SUN+JavaEE5+SDK.html<br />SUN网站上的下载地址：http://java.sun.com/javaee/downloads/index.jsp</font><br /></span>
<img src ="http://www.blogjava.net/shaofan/aggbug/46529.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-05-17 08:04 <a href="http://www.blogjava.net/shaofan/archive/2006/05/17/46529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2005 Java 盘点&amp; 2006 Java 展望[转]</title><link>http://www.blogjava.net/shaofan/archive/2006/03/07/33994.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Tue, 07 Mar 2006 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/03/07/33994.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/33994.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/03/07/33994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/33994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/33994.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 过去的一年，Mustang 没能出来，EJB3刚刚才提交最终草案，Ajax兴起但是五花八门不知道应该用谁，Aspectj 5出来了，但是缺乏惊喜。<br>或许我们会说，过去的2005，Java界缺乏成绩，但是却毫无疑问，Java遥遥领先于其他语言。从11月的语言排行榜Java遥遥领先，到今年的Java图书销售统计上，Java图书销售总数是C#的2倍，PHP的2.5倍，Perl的4倍，Ruby/Python的9倍.<br>这足以让我们对2006充满想象。<br>不过，还是让我们先回顾下2005吧....&nbsp;&nbsp;<a href='http://www.blogjava.net/shaofan/archive/2006/03/07/33994.html'>阅读全文</a><img src ="http://www.blogjava.net/shaofan/aggbug/33994.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-03-07 09:56 <a href="http://www.blogjava.net/shaofan/archive/2006/03/07/33994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>被遗忘的一种提高软件质量的方法 -- 契约式设计 (Design by Contract)</title><link>http://www.blogjava.net/shaofan/archive/2006/03/02/33103.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Wed, 01 Mar 2006 16:55:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/03/02/33103.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/33103.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/03/02/33103.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/33103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/33103.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Design by Contract (DbC)的概念已经出现很长时间了，最先是在Eiffel的一个特色，通过DbC来提高软件质量，目前很多语言也都有相应的实现，但是在GOOGLE上搜索中文网页，得到的资源并不是很多．直觉上来说，DbC确实是一个很好的想法，本着拓宽眼界的原则，就简单了解一下吧．&nbsp;&nbsp;<a href='http://www.blogjava.net/shaofan/archive/2006/03/02/33103.html'>阅读全文</a><img src ="http://www.blogjava.net/shaofan/aggbug/33103.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-03-02 00:55 <a href="http://www.blogjava.net/shaofan/archive/2006/03/02/33103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cannot find action mapping??</title><link>http://www.blogjava.net/shaofan/archive/2006/03/01/32974.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Wed, 01 Mar 2006 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/03/01/32974.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/32974.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/03/01/32974.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/32974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/32974.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天试着把大虾写的系统登录模块加到我们现有的模块里来，他写的时候因为有些试验的成分，所以没有按照我们项目的配置来写，也没有按照我们的模块来划分配置，加过来以后重新配置了模块信息，结果居然无法正常运行。显示错误：“cannot retrieve action mapping&nbsp; 。废了九牛二虎之力，都无法解决。web.xml、struts-config、模块配置，一切看起来都无比的正常，但就是运行不了。真搞不清楚是哪里出了问题。还以为搞不定，晚上要加班了，谁知道，踏破铁鞋无觅处，柳暗花明又一村，在google上搜索关键字"action mapping 找不到"，第一个链接居然就是问题的答案！（还从来没有只点一次就可以找到问题答案的经验，所以兴奋无比^O^）</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总的来说，问题的原因就在于，<STRONG>struts是在第一次收到对action的请求（注意：不包括jsp的请求）时，提取这个请求的url的路径信息，把相应模块的mapping信息设置到请求中去</STRONG>。如果在进入一个模块时，第一次访问的是一个jsp页面，而在这个jsp页面中提交到该模块的一个action，就会出现找不到action mapping的情况。这就是因为，在进到这个模块时，访问的是jsp，这个模块的任何一个action都没有被访问到，所以struts的ActionServlet还没有来得及把这个模块的mapping设置到请求中，自然找不到该模块的action。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，这就引出一个约定，<STRONG>就是系统中尽量避免对Jsp的直接访问，如果要访问也要通过action来forward</STRONG>。虽然看起来麻烦一点，但是安全性、健壮性都会有所提高。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于以上提到的模块mapping的设置原理，具体的文章在这里（不长），值得收藏：</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原文链接：<A href="http://202.100.72.44/news/itschool/pro/pro44134.htm"><FONT color=#993366>http://202.100.72.44/news/itschool/pro/pro44134.htm</FONT></A> </P><img src ="http://www.blogjava.net/shaofan/aggbug/32974.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-03-01 10:44 <a href="http://www.blogjava.net/shaofan/archive/2006/03/01/32974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Javascript和JSP标签在页面动态生成树</title><link>http://www.blogjava.net/shaofan/archive/2006/02/26/32509.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sun, 26 Feb 2006 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/02/26/32509.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/32509.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/02/26/32509.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/32509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/32509.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:     介绍了在JSP页面动态生成Javascript树结构的一种实现．原理是利用JSP标签读取数据（从数据库或其他地方），在页面生成Javascript的树的数据结构，然后由Javascript脚本根据这个结构显示出来．&nbsp;&nbsp;<a href='http://www.blogjava.net/shaofan/archive/2006/02/26/32509.html'>阅读全文</a><img src ="http://www.blogjava.net/shaofan/aggbug/32509.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-02-26 18:47 <a href="http://www.blogjava.net/shaofan/archive/2006/02/26/32509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Tomcat插件在Eclipse上搭建可跟踪调试的J2EE WEB开发环境</title><link>http://www.blogjava.net/shaofan/archive/2006/02/26/32508.html</link><dc:creator>shaofan</dc:creator><author>shaofan</author><pubDate>Sun, 26 Feb 2006 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/shaofan/archive/2006/02/26/32508.html</guid><wfw:comment>http://www.blogjava.net/shaofan/comments/32508.html</wfw:comment><comments>http://www.blogjava.net/shaofan/archive/2006/02/26/32508.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/shaofan/comments/commentRss/32508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaofan/services/trackbacks/32508.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.管理J2EE工程:发布WEB程序,启动/关闭服务器等<br>2.编辑JSP/HTML/XML:有代码提示,语法着色,错误提示等功能<br>3.跟踪调试JSP/SERVLET:可设置断点,单步执行,变量/栈/线程跟踪等&nbsp;&nbsp;<a href='http://www.blogjava.net/shaofan/archive/2006/02/26/32508.html'>阅读全文</a><img src ="http://www.blogjava.net/shaofan/aggbug/32508.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-02-26 18:39 <a href="http://www.blogjava.net/shaofan/archive/2006/02/26/32508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>