﻿<?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-&lt;b&gt;一路北漂来&lt;/b&gt;-随笔分类-Java EE 服务器端</title><link>http://www.blogjava.net/rosen/category/2689.html</link><description>计划没有变化快</description><language>zh-cn</language><lastBuildDate>Sun, 09 May 2010 09:32:52 GMT</lastBuildDate><pubDate>Sun, 09 May 2010 09:32:52 GMT</pubDate><ttl>60</ttl><item><title>Servlet的异步转同步调用</title><link>http://www.blogjava.net/rosen/archive/2010/05/09/320394.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sun, 09 May 2010 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2010/05/09/320394.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/320394.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2010/05/09/320394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/320394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/320394.html</trackback:ping><description><![CDATA[PS：写作本文仅仅为了了却一桩心愿，只是一种尝试，基本上无实际应用价值。<br />
<br />
早在N年多前，给别人做一web应用，期间要使用jsp调客户提供的Socket客户端，去获取远端数据。由于该客户端是异步处理，所以jsp发出请求后到底何时能获得数据，是个问题。遂想了个办法，既jsp固定sleep一个足够长的时间，然后Socket客户端把数据写到某静态变量中，等jsp的sleep超时，jsp再去那个静态区去抓。这种做法倒是能用，只是时好时坏，特别是网络环境差的时候，容易得到null的数据。当然，最后改成了循环sleep，直到把数据刷出来为止。<br />
<br />
问题是解决了，但冒出一个念头，想把访问异步环境的过程转换为同步，既对Servlet进行wait，然后待异步返回后再notify它。说干就干，Servlet代码如下，以Tomcat 5.5为例。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServlet;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletResponse;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Rec&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;HttpServlet&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1L</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;var;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Rec()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doPost(request,&nbsp;response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doPost(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException,&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Thread.currentThread().getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GoProcess&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GoProcess(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;tName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">GoPro</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">servlet&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">tName</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;开始等待<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.wait();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().write(var);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
Tomcat 5.5默认启动25个守护线程，来响应浏览器请求。所以，当每个请求来了之后，Tomcat都会找个可用线程来响应（根据测试，在多标签浏览器中，多次打开相同Servlet，Tomcat只会由同一线程响应），我们可以得到该线程的名字，例如&#8220;http-8080-Processor25&#8221;。来看上面的代码，比较简单，把Servlet实例传递给异步处理线程，然后处理线程启动，Servlet线程自己wait。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Date;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;GoProcess&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Thread&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Rec&nbsp;_rec;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;_tName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;GoProcess(Rec&nbsp;rec,&nbsp;String&nbsp;tName){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_rec&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rec;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_tName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;run(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;lptime&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Math.round(Math.random()</span><span style="color: #000000;">*</span><span style="color: #000000;">100000</span><span style="color: #000000;">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">servlet&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">_tName</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;进入GoPro线程，开始干活。需要</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">lptime</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">毫秒</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(lptime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">处理结束呼唤servlet&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">_tName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">(_rec){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_rec.notify();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_rec.var&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date().toString()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;done!</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
处理线程模拟不同的网络环境进行sleep，可以把sleep之上的代码看成进入异步调用，之后的代码看成异步返回。打开一个firefox和两个ie6窗口，调试结果如下。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor24&nbsp;开始等待<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor24&nbsp;进入GoPro线程，开始干活。需要49277毫秒<br />
servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor25&nbsp;开始等待<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor25&nbsp;进入GoPro线程，开始干活。需要7610毫秒<br />
servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor23&nbsp;开始等待<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor23&nbsp;进入GoPro线程，开始干活。需要20599毫秒<br />
处理结束呼唤servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor25<br />
处理结束呼唤servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor23<br />
处理结束呼唤servlet&nbsp;http-</span><span style="color: #000000;">8080</span><span style="color: #000000;">-Processor24</span></div>
<br />
看起来是能实现异步调用转换为同步阻塞调用的方式。不过就像我在最前面说的，毫无意义！因为一旦网络环境很差，有可能会导致浏览器长时间处于空白加载状态，非常糟糕的用户体验（BTW:没有实验过nio的连接器，猜想这样阻塞访问会严重影响nio的性能）。所以，在真正遇到怎样的问题时还不如用ajax的方式处理，在页面上开辟一小块信息区显示状态，然后ajax轮询服务器端异步返回的结果，一旦返回就立刻体现到页面上。好了，欢迎拍砖。<br />
<br />
<br />
<span style="color: black; font-family: Arial;"><strong>
<font color="#ff0000" size="2">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font>
</strong>
<a href="../../rosen/archive/2010/rosen/archive/2009/10/archive/2009/09/archive/2009/07/archive/2009/06/archive/2009/04/archive/2009/03/archive/2009/02/archive/2008/12/archive/2008/rosen">
<font color="#ff0000" size="2" face="宋体">
<strong>http://www.blogjava.net/rosen</strong></font></a></span><br />
<img src ="http://www.blogjava.net/rosen/aggbug/320394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2010-05-09 13:34 <a href="http://www.blogjava.net/rosen/archive/2010/05/09/320394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 iText 实现 PDF 报表下载</title><link>http://www.blogjava.net/rosen/archive/2008/12/07/244858.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sun, 07 Dec 2008 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2008/12/07/244858.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/244858.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2008/12/07/244858.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/244858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/244858.html</trackback:ping><description><![CDATA[很久没更新 blog 了，工作和一些事情占用了大部分精力，实在是身不由己。今天终于有空整理一下最近用到的东西。<br /><br />有个朋友的项目需要用到 PDF 报表下载，之前我只做过 Excel 的，相信再做一次 PDF 的下载一定很有趣吧。在网上找了一大圈，似乎 iText 比较符合我的要求，而且这个工具很早很早以前就有了，生命力很旺盛。进入 iText 的主页（http://www.lowagie.com/iText/），发现作者很勤劳，最近2个月都有新版本发布。哪知道现在高兴得太早了，一堆问题接踵而至。<br /><br />下载倒是很简单，一个<a xmlns="" href="http://prdownloads.sourceforge.net/itext/iText-2.1.4.jar">iText-2.1.4.jar</a>搞定，然后去找入门文档，进了文档页面，一股浓郁的商业气氛迎面而来，这里只提供了部分文档，除非去买"iText in Action"，随后被踢到 iText by Example 页面。好吧，既然这是老牌工具了，肯定有不少中文资料吧，找了一圈，没发现什么和生成并下载相关的 out of box 文档，很多都是经验性的总结和进阶文章。无奈又啃 iText by Example，在这里找到些有用的资源，<a class="chapter" href="http://itextdocs.lowagie.com/tutorial/general/webapp/index.php" name="general_webapp">iText in a Web Application</a>正是我要找的，不过这个例子很简单。通过 Google 之后，又发现要下载一个 CJK 的包（iTextAsian.jar）才能正确显示中文，好吧我去找。很幸运的是在 iText by Example 里找到了这个 jar 的 link，兴致勃勃的跑去下载，结果这是个无效链接，最后在 sourceForge 上才找到，不容易啊。解决了这些问题，想必能够安稳的使用了吧，由于这个项目比较急，没什么耐心一个个的翻阅 iText by Example，想找点捷径，据说 iText 可以从 html 直接生成 PDF，窃喜！找了 apache common 的 httpclient，动态模拟 http 请求来抓 html，根据控制台的 print，的确把 html 抓到了，然后开始转换到 PDF，先解决了中文显示问题，可是后面的问题解决不了了，html 的 table 和 div 这些，转换到 PDF 都走样了... ...<br /><br />很不爽，看来还是只有老老实实的啃 iText by Example实在点。这次稍微耐心点，一点点的看，首先搞清楚了它的 Font 设置，然后是 Table 和 Cell 的关系，经过反复调试，有点效果了。把代码贴出来，做个标记吧。以免以后又抓狂。<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, 128, 128);">  1</span> <span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);"> org.rosenjiang.servlet;<br /></span><span style="color: rgb(0, 128, 128);">  2</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">  3</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.awt.Color;<br /></span><span style="color: rgb(0, 128, 128);">  4</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.io.IOException;<br /></span><span style="color: rgb(0, 128, 128);">  5</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.HashMap;<br /></span><span style="color: rgb(0, 128, 128);">  6</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.List;<br /></span><span style="color: rgb(0, 128, 128);">  7</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> java.util.Map;<br /></span><span style="color: rgb(0, 128, 128);">  8</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">  9</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> javax.servlet.ServletException;<br /></span><span style="color: rgb(0, 128, 128);"> 10</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> javax.servlet.http.HttpServlet;<br /></span><span style="color: rgb(0, 128, 128);"> 11</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> javax.servlet.http.HttpServletRequest;<br /></span><span style="color: rgb(0, 128, 128);"> 12</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> javax.servlet.http.HttpServletResponse;<br /></span><span style="color: rgb(0, 128, 128);"> 13</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 14</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.springframework.web.context.WebApplicationContext;<br /></span><span style="color: rgb(0, 128, 128);"> 15</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.springframework.web.context.support.WebApplicationContextUtils;<br /></span><span style="color: rgb(0, 128, 128);"> 16</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 17</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> org.rosenjiang.service.UserService;<br /></span><span style="color: rgb(0, 128, 128);"> 18</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.Document;<br /></span><span style="color: rgb(0, 128, 128);"> 19</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.DocumentException;<br /></span><span style="color: rgb(0, 128, 128);"> 20</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.Font;<br /></span><span style="color: rgb(0, 128, 128);"> 21</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.Paragraph;<br /></span><span style="color: rgb(0, 128, 128);"> 22</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.pdf.BaseFont;<br /></span><span style="color: rgb(0, 128, 128);"> 23</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.pdf.PdfPCell;<br /></span><span style="color: rgb(0, 128, 128);"> 24</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.pdf.PdfPTable;<br /></span><span style="color: rgb(0, 128, 128);"> 25</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> com.lowagie.text.pdf.PdfWriter;<br /></span><span style="color: rgb(0, 128, 128);"> 26</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 27</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 0);">/*</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 28</span> <span style="color: rgb(0, 128, 0);"> * ReportServlet<br /></span><span style="color: rgb(0, 128, 128);"> 29</span> <span style="color: rgb(0, 128, 0);"> * @author rosen jiang<br /></span><span style="color: rgb(0, 128, 128);"> 30</span> <span style="color: rgb(0, 128, 0);"> * @since 2008-12<br /></span><span style="color: rgb(0, 128, 128);"> 31</span> <span style="color: rgb(0, 128, 0);">  </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"> <br /></span><span style="color: rgb(0, 128, 128);"> 32</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> ReportServlet </span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);"> HttpServlet {<br /></span><span style="color: rgb(0, 128, 128);"> 33</span> <span style="color: rgb(0, 0, 0);">       <br /></span><span style="color: rgb(0, 128, 128);"> 34</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 128, 0);">/**</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 35</span> <span style="color: rgb(0, 128, 0);">     * Return a PDF document for download.<br /></span><span style="color: rgb(0, 128, 128);"> 36</span> <span style="color: rgb(0, 128, 0);">     * <br /></span><span style="color: rgb(0, 128, 128);"> 37</span> <span style="color: rgb(0, 128, 0);">     </span><span style="color: rgb(0, 128, 0);">*/</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 38</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> doGet (HttpServletRequest request, HttpServletResponse response)<br /></span><span style="color: rgb(0, 128, 128);"> 39</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> IOException, ServletException {<br /></span><span style="color: rgb(0, 128, 128);"> 40</span> <span style="color: rgb(0, 0, 0);">        String account_id </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> request.getParameter(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">account_id</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 41</span> <span style="color: rgb(0, 0, 0);">        String search_date_from </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> request.getParameter(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">search_date_from</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 42</span> <span style="color: rgb(0, 0, 0);">        String to </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> request.getParameter(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">to</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 43</span> <span style="color: rgb(0, 0, 0);">        WebApplicationContext ctx </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> WebApplicationContextUtils.getWebApplicationContext(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.getServletContext());<br /></span><span style="color: rgb(0, 128, 128);"> 44</span> <span style="color: rgb(0, 0, 0);">        UserService userService </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (UserService)ctx.getBean(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">userService</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 45</span> <span style="color: rgb(0, 0, 0);">        List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String, Object</span><span style="color: rgb(0, 0, 0);">&gt;&gt;</span><span style="color: rgb(0, 0, 0);"> list </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> userService.getAccountActivity(account_id, search_date_from, to);<br /></span><span style="color: rgb(0, 128, 128);"> 46</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> create PDF document</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 47</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">        Document document </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Document();<br /></span><span style="color: rgb(0, 128, 128);"> 48</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br /></span><span style="color: rgb(0, 128, 128);"> 49</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">set response info</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 50</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            response.setContentType(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">application/x-msdownload;charset=UTF-8</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 51</span> <span style="color: rgb(0, 0, 0);">            response.setHeader(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Content-Disposition</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">attachment;filename=report.pdf</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 52</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">open output stream</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 53</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            PdfWriter.getInstance(document, response.getOutputStream());<br /></span><span style="color: rgb(0, 128, 128);"> 54</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> open PDF document</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 55</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            document.open();<br /></span><span style="color: rgb(0, 128, 128);"> 56</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> set chinese font</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 57</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            BaseFont bfChinese </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> BaseFont.createFont(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">STSong-Light</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">UniGB-UCS2-H</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, BaseFont.NOT_EMBEDDED);  <br /></span><span style="color: rgb(0, 128, 128);"> 58</span> <span style="color: rgb(0, 0, 0);">            Font f2 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Font(bfChinese, </span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">, Font.NORMAL);<br /></span><span style="color: rgb(0, 128, 128);"> 59</span> <span style="color: rgb(0, 0, 0);">            Font f6 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Font(bfChinese, </span><span style="color: rgb(0, 0, 0);">6</span><span style="color: rgb(0, 0, 0);">, Font.NORMAL);<br /></span><span style="color: rgb(0, 128, 128);"> 60</span> <span style="color: rgb(0, 0, 0);">            Font f8 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Font(bfChinese, </span><span style="color: rgb(0, 0, 0);">8</span><span style="color: rgb(0, 0, 0);">, Font.NORMAL);<br /></span><span style="color: rgb(0, 128, 128);"> 61</span> <span style="color: rgb(0, 0, 0);">            Font f10 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Font(bfChinese, </span><span style="color: rgb(0, 0, 0);">10</span><span style="color: rgb(0, 0, 0);">, Font.NORMAL);<br /></span><span style="color: rgb(0, 128, 128);"> 62</span> <span style="color: rgb(0, 0, 0);">            Font f12 </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Font(bfChinese, </span><span style="color: rgb(0, 0, 0);">12</span><span style="color: rgb(0, 0, 0);">, Font.BOLD);<br /></span><span style="color: rgb(0, 128, 128);"> 63</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">set title</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 64</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            document.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">金融报表</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f12)); <br /></span><span style="color: rgb(0, 128, 128);"> 65</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&lt;br&gt;</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 66</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            document.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,f6)); <br /></span><span style="color: rgb(0, 128, 128);"> 67</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">set sub title</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 68</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            document.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">账户信息</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f10)); <br /></span><span style="color: rgb(0, 128, 128);"> 69</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&lt;br&gt;</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 70</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            document.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f2));<br /></span><span style="color: rgb(0, 128, 128);"> 71</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">process business data</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 72</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(list.size()</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);"> list.get(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">).get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">bankbook_no</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">){<br /></span><span style="color: rgb(0, 128, 128);"> 73</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 0, 255);">float</span><span style="color: rgb(0, 0, 0);"> openBalance </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);"> 74</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">create table with 7 columns</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 75</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">                PdfPTable table </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> PdfPTable(</span><span style="color: rgb(0, 0, 0);">7</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 76</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">100% width</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 77</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">                table.setWidthPercentage(</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);"> 78</span> <span style="color: rgb(0, 0, 0);">                table.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);<br /></span><span style="color: rgb(0, 128, 128);"> 79</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">create cells</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 80</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">                PdfPCell cell </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> PdfPCell();<br /></span><span style="color: rgb(0, 128, 128);"> 81</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">set color</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 82</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">                cell.setBackgroundColor(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Color(</span><span style="color: rgb(0, 0, 0);">213</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">141</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">69</span><span style="color: rgb(0, 0, 0);">));<br /></span><span style="color: rgb(0, 128, 128);"> 83</span> <span style="color: rgb(0, 0, 0);">                cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);<br /></span><span style="color: rgb(0, 128, 128);"> 84</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 128, 0);">//<br /></span><span style="color: rgb(0, 128, 128);"> 85</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">                cell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">交易日</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);"> 86</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);"> 87</span> <span style="color: rgb(0, 0, 0);">                cell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">类型</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);"> 88</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);"> 89</span> <span style="color: rgb(0, 0, 0);">                cell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">备注</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);"> 90</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);"> 91</span> <span style="color: rgb(0, 0, 0);">                cell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ID</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);"> 92</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);"> 93</span> <span style="color: rgb(0, 0, 0);">                cell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">票号</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);"> 94</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);"> 95</span> <span style="color: rgb(0, 0, 0);">                cell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">合计</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);"> 96</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);"> 97</span> <span style="color: rgb(0, 0, 0);">                cell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">余额</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);"> 98</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);"> 99</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">create another cell</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">100</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">                PdfPCell newcell </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> PdfPCell();<br /></span><span style="color: rgb(0, 128, 128);">101</span> <span style="color: rgb(0, 0, 0);">                newcell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);<br /></span><span style="color: rgb(0, 128, 128);">102</span> <span style="color: rgb(0, 0, 0);">                <br /></span><span style="color: rgb(0, 128, 128);">103</span> <span style="color: rgb(0, 0, 0);">                Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String, Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> map </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> HashMap</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String, Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">();<br /></span><span style="color: rgb(0, 128, 128);">104</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);"> i </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">; i </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> list.size(); i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">){<br /></span><span style="color: rgb(0, 128, 128);">105</span> <span style="color: rgb(0, 0, 0);">                    map </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> list.get(i);<br /></span><span style="color: rgb(0, 128, 128);">106</span> <span style="color: rgb(0, 0, 0);">                    String cashInout </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cash_inout</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString();<br /></span><span style="color: rgb(0, 128, 128);">107</span> <span style="color: rgb(0, 0, 0);">                    newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">trade_date</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString(), f8));<br /></span><span style="color: rgb(0, 128, 128);">108</span> <span style="color: rgb(0, 0, 0);">                    table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">109</span> <span style="color: rgb(0, 0, 0);">                    newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">bankbook_type</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString(), f8));<br /></span><span style="color: rgb(0, 128, 128);">110</span> <span style="color: rgb(0, 0, 0);">                    table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">111</span> <span style="color: rgb(0, 0, 0);">                    newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">memo</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString(), f8));<br /></span><span style="color: rgb(0, 128, 128);">112</span> <span style="color: rgb(0, 0, 0);">                    table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">113</span> <span style="color: rgb(0, 0, 0);">                    newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">account_id</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString(), f8));<br /></span><span style="color: rgb(0, 128, 128);">114</span> <span style="color: rgb(0, 0, 0);">                    table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">115</span> <span style="color: rgb(0, 0, 0);">                    newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ticket_no</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString(), f8));<br /></span><span style="color: rgb(0, 128, 128);">116</span> <span style="color: rgb(0, 0, 0);">                    table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">117</span> <span style="color: rgb(0, 0, 0);">                    newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">amount</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString(), f8));<br /></span><span style="color: rgb(0, 128, 128);">118</span> <span style="color: rgb(0, 0, 0);">                    table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">119</span> <span style="color: rgb(0, 0, 0);">                    newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(openBalance</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">, f8));<br /></span><span style="color: rgb(0, 128, 128);">120</span> <span style="color: rgb(0, 0, 0);">                    table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">121</span> <span style="color: rgb(0, 0, 0);">                    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(cashInout.equals(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">I</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)){<br /></span><span style="color: rgb(0, 128, 128);">122</span> <span style="color: rgb(0, 0, 0);">                        openBalance </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> openBalance </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> Float.valueOf(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">amount</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString());<br /></span><span style="color: rgb(0, 128, 128);">123</span> <span style="color: rgb(0, 0, 0);">                    }</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(cashInout.equals(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">O</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)){<br /></span><span style="color: rgb(0, 128, 128);">124</span> <span style="color: rgb(0, 0, 0);">                        openBalance </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> openBalance </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> Float.valueOf(map.get(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">amount</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).toString());<br /></span><span style="color: rgb(0, 128, 128);">125</span> <span style="color: rgb(0, 0, 0);">                    }<br /></span><span style="color: rgb(0, 128, 128);">126</span> <span style="color: rgb(0, 0, 0);">                }<br /></span><span style="color: rgb(0, 128, 128);">127</span> <span style="color: rgb(0, 0, 0);">                </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">print total column</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">128</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">                newcell.setPhrase(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">合计</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">openBalance, f8));<br /></span><span style="color: rgb(0, 128, 128);">129</span> <span style="color: rgb(0, 0, 0);">                table.addCell(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">130</span> <span style="color: rgb(0, 0, 0);">                table.addCell(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">131</span> <span style="color: rgb(0, 0, 0);">                table.addCell(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">132</span> <span style="color: rgb(0, 0, 0);">                table.addCell(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">133</span> <span style="color: rgb(0, 0, 0);">                table.addCell(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">134</span> <span style="color: rgb(0, 0, 0);">                table.addCell(</span><span style="color: rgb(0, 0, 0);">""</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">135</span> <span style="color: rgb(0, 0, 0);">                table.addCell(newcell);<br /></span><span style="color: rgb(0, 128, 128);">136</span> <span style="color: rgb(0, 0, 0);">                document.add(table);<br /></span><span style="color: rgb(0, 128, 128);">137</span> <span style="color: rgb(0, 0, 0);">            }</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">138</span> <span style="color: rgb(0, 0, 0);">                PdfPTable table </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> PdfPTable(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">139</span> <span style="color: rgb(0, 0, 0);">                table.setWidthPercentage(</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">);<br /></span><span style="color: rgb(0, 128, 128);">140</span> <span style="color: rgb(0, 0, 0);">                table.setHorizontalAlignment(PdfPTable.ALIGN_LEFT);<br /></span><span style="color: rgb(0, 128, 128);">141</span> <span style="color: rgb(0, 0, 0);">                PdfPCell cell </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> PdfPCell(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">暂无数据</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br /></span><span style="color: rgb(0, 128, 128);">142</span> <span style="color: rgb(0, 0, 0);">                cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);<br /></span><span style="color: rgb(0, 128, 128);">143</span> <span style="color: rgb(0, 0, 0);">                table.addCell(cell);<br /></span><span style="color: rgb(0, 128, 128);">144</span> <span style="color: rgb(0, 0, 0);">                document.add(table);<br /></span><span style="color: rgb(0, 128, 128);">145</span> <span style="color: rgb(0, 0, 0);">            }<br /></span><span style="color: rgb(0, 128, 128);">146</span> <span style="color: rgb(0, 0, 0);">        }<br /></span><span style="color: rgb(0, 128, 128);">147</span> <span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">(DocumentException de) {<br /></span><span style="color: rgb(0, 128, 128);">148</span> <span style="color: rgb(0, 0, 0);">            de.printStackTrace();<br /></span><span style="color: rgb(0, 128, 128);">149</span> <span style="color: rgb(0, 0, 0);">            System.err.println(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">document: </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> de.getMessage());<br /></span><span style="color: rgb(0, 128, 128);">150</span> <span style="color: rgb(0, 0, 0);">        }</span><span style="color: rgb(0, 0, 255);">finally</span><span style="color: rgb(0, 0, 0);">{<br /></span><span style="color: rgb(0, 128, 128);">151</span> <span style="color: rgb(0, 0, 0);">            </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);"> close the document and the outputstream is also closed internally</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 128, 128);">152</span> <span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">            document.close();<br /></span><span style="color: rgb(0, 128, 128);">153</span> <span style="color: rgb(0, 0, 0);">        }        <br /></span><span style="color: rgb(0, 128, 128);">154</span> <span style="color: rgb(0, 0, 0);">    }<br /></span><span style="color: rgb(0, 128, 128);">155</span> <span style="color: rgb(0, 0, 0);">}</span></div><br /><img src="http://www.blogjava.net/images/blogjava_net/rosen/itext.JPG" alt="itext.JPG" border="0" width="985" height="557" /><br /><br />代码结构清晰，本来也没什么东西，就是通过 Spring 调用 service 方法，获取数据后按照 iText 结构输出即可。不过代码里面有个很愚蠢的动作：<span style="color: rgb(0, 0, 0);">document.add(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Paragraph(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,f6))，主要是找不到如何输出空白行，所以只好出此下策。如果哪位有解法，请告知一下。<br /><br />做技术的确不能太着急，慢慢来，总会找到出口的。<br /><br /></span><span style="color: black; font-family: Arial;" lang="EN-US"><strong><font color="#ff0000" size="2">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font></strong><a href="../../rosen"><font color="#ff0000" size="2" face="宋体"><strong>http://www.blogjava.net/rosen</strong></font></a></span><br /><img src ="http://www.blogjava.net/rosen/aggbug/244858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2008-12-07 13:27 <a href="http://www.blogjava.net/rosen/archive/2008/12/07/244858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSGi起步(OSGi for Beginners)</title><link>http://www.blogjava.net/rosen/archive/2008/06/24/210399.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Tue, 24 Jun 2008 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2008/06/24/210399.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/210399.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2008/06/24/210399.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/210399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/210399.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一年一度的Ig Nobel prize典礼都都会带来一些非常新颖的观点、发现，这些内容甚至超过了Ig Nobel prizes本身。每位获奖者在做完七个字的总结后，还有机会利用24秒的时间对自己的新观点、新发现进行阐述。														 												这是一个极其绝妙的主意，这对每位获奖者都是一个需要完成的挑战。								...&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2008/06/24/210399.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/210399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2008-06-24 21:48 <a href="http://www.blogjava.net/rosen/archive/2008/06/24/210399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 生成 JPG 缩略图</title><link>http://www.blogjava.net/rosen/archive/2007/06/12/9940.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Tue, 12 Jun 2007 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2007/06/12/9940.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9940.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2007/06/12/9940.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9940.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9940.html</trackback:ping><description><![CDATA[
		<p>    在任何一个综合性网站，我们往往需要上传一些图片资料。但随着高分辨率DC的普及，上传的图片容量会很大，比如300万象素DC出来的文件基本不下600K。为了管理方便，大家可能不愿意每次都用ACDsee修改它，而直接上传到服务器。但是这种做法在客户端看来就没有那么轻松了，对于拨号上网的用户简直是一场恶梦，虽然你可以在图片区域设置wide和high！<br />    <br />    问题的解决之道来了！我们可以在类中处理一张大图，并缩小它。<br />    前提是需要JDK1.4，这样才能进行处理。按以下方法做：<br />    <br />      import java.io.File;<br />      import java.io.FileOutputStream;<br />      import java.awt.Graphics;<br />      import java.awt.Image;<br />      import java.awt.image.BufferedImage;</p>
		<p>      import com.sun.image.codec.jpeg.JPEGCodec;<br />      import com.sun.image.codec.jpeg.JPEGImageEncoder;<br />      <br />      public class JpgTest {<br /> <br /> public void JpgTset() throws Exception{<br />     File _file = new File("/Order005-0001.jpg");                       //读入文件<br />     Image src = javax.imageio.ImageIO.read(_file);                     //构造Image对象<br />     int wideth=src.getWidth(null);                                     //得到源图宽<br />     int height=src.getHeight(null);                                    //得到源图长<br />     BufferedImage tag = new BufferedImage(wideth/2,height/2,BufferedImage.TYPE_INT_RGB);<br />     tag.getGraphics().drawImage(src,0,0,wideth/2,height/2,null);       //绘制缩小后的图<br />     FileOutputStream out=new FileOutputStream("newfile.jpg");          //输出到文件流<br />     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);       <br />     encoder.encode(tag);                                               //近JPEG编码<br />     //System.out.print(width+"*"+height);                              <br />     out.close();<br /> }<br />      }<br />    <br />    过程很简单，从本地磁盘读取文件Order005-0001.jpg(2032*1524)，变成Image对象src，接着构造目标文件tag，设置tag的长宽为源图的一半，对tag进行编码，输出到文件流out，最后关闭文件流。<br />    <br />    还有一些问题需要说明：<br />    第一，目前只能支持JPG(JPEG)、GIF、PNG三种格式。<font style="BACKGROUND-COLOR: #ffffff" color="#ff0000"><strong>（这里有些问题，在最下面解释）</strong></font><br />    第二，对于源图的容量有限制，最好不要超过1M，否则会抛内存不足的错误，不过我试验过1.8M的源图，可以成功，但是也很容易抛内存不足。<br />    <br />    引用一位前辈的话：图象运算本身是密集型运算，需要大量的内存存放象素值。我用VC试了一下，4M的图象也有问题，而且越是压缩比大的图片在内存中还原成BITMAP时需要的内存越大。解决的方法，可以重写编码类，先开一定的内存，然后一段一段编码写到临时文件中，输出的时候再一段一段读出来。或利用nio的内存映象来操作。JavaMail由于采用了Builder模式，先生成一个邮件的每一个部分，然后合并成一个完整的邮件对象，这样每个构件都要先生成到内存中，你如果发送一个上百兆的附件，那么在构造Part时肯定内存溢出，所以我就改写了BodyPart的构造，让他和一个临时文件关联，然后用临时文件保存Part而不是构造在内存中，这样任义大小的附件(硬盘能放得下为限)都可以发送了。<br />    <br />    最后，如果大家对图像处理有更高的要求，不妨关注一下开源项目。比如JMagick，可以使用JMagick来实现图片的复制、信息获取、斜角、特效、组合、改变大小、加边框、旋转、切片、改变格式、去色等等功能。<br /><br /><font color="#ff0000"><strong>2007-06-20更新</strong></font><br />其实按照上面的做法只能压缩jpg格式，gif是不能压缩的（由于算法版权问题，直到Java 6.0才能压缩gif），前段时间要用gif压缩，在网上找了个类，可以解决问题。请参考：<a href="http://mindprod.com/jgloss/gifencoder.html">http://mindprod.com/jgloss/gifencoder.html</a>。<br />替换以前代码的相应部分：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">            BufferedImage tag </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> BufferedImage(<br />                    size[</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">], size[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">], BufferedImage.TYPE_INT_RGB);<br />            tag.getGraphics().drawImage(src, </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">, size[</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">], size[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">], </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000">); <br />            out </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> FileOutputStream(path);<br />            GIFEncoder gifEncoder </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000"> GIFEncoder(tag);<br />            gifEncoder.write(out);</span>
		</div>
		<p>当代码运行完毕，用EditPlus之类的文本编辑器打开之后可以发现文件头已经是gif87格式了。<br /><br /><strong><font color="#ff0000" size="2">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font></strong><a href="/rosen"><font face="宋体" color="#ff0000" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a></p>
<img src ="http://www.blogjava.net/rosen/aggbug/9940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2007-06-12 15:19 <a href="http://www.blogjava.net/rosen/archive/2007/06/12/9940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache FileUpload 上传以及 JExcelApi 解析</title><link>http://www.blogjava.net/rosen/archive/2007/01/19/94940.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 19 Jan 2007 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2007/01/19/94940.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/94940.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2007/01/19/94940.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/94940.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/94940.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近遇到点读取 Excel 数据的问题，于是花了点时间找开源工具。要解析 Excel，首当其冲的是上传文件，以前在项目里我们用 SmartUpload 进行上传，不过这个项目似乎已经停止开发了，于是在这里我使用 Apache Commons FileUpload，可以在 http://jakarta.apache.org/commons/fileupload 找到。目前该项目的最新版本是 1.1....&nbsp;&nbsp;<a href='http://www.blogjava.net/rosen/archive/2007/01/19/94940.html'>阅读全文</a><img src ="http://www.blogjava.net/rosen/aggbug/94940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2007-01-19 15:19 <a href="http://www.blogjava.net/rosen/archive/2007/01/19/94940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBI-Java 实现 SOA 的标准途径（翻译）</title><link>http://www.blogjava.net/rosen/archive/2006/05/15/46281.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Mon, 15 May 2006 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/05/15/46281.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/46281.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/05/15/46281.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/46281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/46281.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">业界正在广泛寻求解决</span>
				<span lang="EN-US">B2B </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以及</span>
				<span lang="EN-US">EAI</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（企业应用集成）所存在问题的方案。这些方案不同于基于</span>
				<span lang="EN-US">JMS </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">手段的面向消息中间件技术和</span>
				<span lang="EN-US">Web </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务技术。本文简短地阐述了即将到来的与</span>
				<span lang="EN-US">SOA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（面向服务体系）规范及</span>
				<span lang="EN-US">ESB</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（企业服务总线）基础架构有关的</span>
				<span lang="EN-US">JBI</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				<span lang="EN-US">Java </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">业务集成）标准。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">面向服务体系</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">SOA</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（面向服务体系）是近期推动应用和业务集成领域产生巨大飞跃的新技术之一。</span>
				<span lang="EN-US">SOA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义了一系列详尽的体系规范、范例和实现应用程序间进行松散耦合交互的最佳准则。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">SOA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于定义明确的接口，促进多个应用程序间的松散耦合交互。服务的实现是独立的，且不依赖上下文信息以及其他服务的状态。服务间数据交换主要基于文本类型的格式，使用基于标准的消息模型。服务自身并不知道服务提供者和服务消费者之间传输级的通讯交互。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尽管不是强制要求，当今大部分流行的基于</span>
				<span lang="EN-US">SOA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的系统都利用了</span>
				<span lang="EN-US">Web </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务以及近似技术为服务间交互提供必要的管道管理。</span>
				<span lang="EN-US">WSDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				<span lang="EN-US">Web</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务定义语言）扮演了主要的通讯模型角色；</span>
				<span lang="EN-US">SOAP </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">扮演了消息承载协议、</span>
				<span lang="EN-US">HTTP </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">扮演了网络传输协议。当然，这并不意味着你必须利用上述技术实现基于</span>
				<span lang="EN-US">SOA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的系统。另外，有些术语之前就已经存在了，所以很多企业已利用类似的体系实现了系统的松散耦合交互。不管怎样，主要的不同点在于我们现在已经有标准协议、工具集和软件了，使面向服务体系更健全。</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">SOA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">原则与面向对象范式、原则有着显著不同。主要不同在于服务间交互的接口被定义了更多面向数据的行为。一个孤立的服务也许会采用面向对象原则和技术，但是，服务之间的交互很少采用这些手段。相反，这些接口更适合于基于文档的交换。面向对象的行为是绑定数据，而面向服务从行为中分离数据。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">企业服务总线</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">ESB</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（企业服务总线）为面向服务体系提供了基础架构。通过设计工具定义服务间交互和规则，</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为部署和发现服务提供了运行时环境。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?>
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p>
								<img src="http://www.theserverside.com/tt/articles/content/JBIforSOA/clip01.jpg" /> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<br />    在</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的世界中，服务不会直接彼此交互。“</span>
				<span lang="EN-US">ESB</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”作为一个仲裁者在服务间松散的耦合它们。“</span>
				<span lang="EN-US">ESB</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”将实现协议绑定、消息传输、消息处理，等等。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个服务总线将包括下列关键项：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为服务提供传输绑定</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义和发现已部署服务</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在服务间基于规则的路由和编排消息</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包括文档传递在内的增值服务等</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大部分的</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供商基于自己的</span>
				<span lang="EN-US">SOA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提议来开放标准和技术，包括多种</span>
				<span lang="EN-US">Web </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务标准和协议。他们提供多种调用服务的传输绑定，包括</span>
				<span lang="EN-US">HTTP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">FTP</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以及</span>
				<span lang="EN-US">JMS </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等。大部分</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户利用</span>
				<span lang="EN-US">WS-BPEL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				<span lang="EN-US">Web</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务的业务流程执行语言）来了解已部署服务之间是如何实现业务流程的。</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供商同时也提供服务质量特性，包括容错、故障转移、负载平衡、消息缓冲等等。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt">Java </span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">业务集成</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">JBI</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				<span lang="EN-US">Java </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">业务集成）的提出是基于面向服务体系提倡的方法和原则，为了解决</span>
				<span lang="EN-US">EAI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">B2B </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">若干问题的</span>
				<span lang="EN-US">Java </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准。当前版本（</span>
				<span lang="EN-US">1.0</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）是</span>
				<span lang="EN-US">2005 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">年</span>
				<span lang="EN-US">8 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">月通过的</span>
				<span lang="EN-US">JSR</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				<span lang="EN-US">Java </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规范需求）</span>
				<span lang="EN-US">208 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定案。商业和开源界都欢迎</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">成为他们</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">产品的集成标准。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于仲裁者体系</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义了基于插件方式的架构，以便服务能融入“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”环境。</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了详细的接口，使服务能与“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”环境交互。这些服务要为“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”环境暴露接口，以便“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”环境为服务路由消息。“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”环境在部署在</span>
				<span lang="EN-US">SOA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境中的服务间扮演仲裁者的角色。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> <img src="http://www.theserverside.com/tt/articles/content/JBIforSOA/clip02.gif" /></o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<br />在同一</span>
				<span lang="EN-US">JVM </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”核心主要包括如下组件：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件框架：组件框架把不同类型的组件部署到“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">   </span>
						<span style="mso-spacerun: yes"> </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">归一化消息路由器：归一化消息路由器利用标准机制实现服务间消息交换。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">   </span>
						<span style="mso-spacerun: yes"> </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理框架：管理框架基于</span>
				<span lang="EN-US">JMX </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行部署、管理以及监控“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”中的组件。</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件模型</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”环境中定义了两种组件：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 41.05pt; TEXT-INDENT: -41.05pt; mso-char-indent-count: -3.91">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务引擎组件：该组件负责实现业务逻辑和其他服务。服务引擎组件在其内部可使用多种技术和设计模式。服务引擎组件可提供数据传输和转换这种简单的基础服务，也可实现像</span>
				<span lang="EN-US">WS-BPEL </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例一样复杂的业务处理。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -63pt; mso-char-indent-count: -6.0">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">绑定组件：绑定组件主要为已部署服务提供传输级绑定。绑定组件有多种类型：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -63pt; mso-char-indent-count: -6.0">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">        </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利用标准传输协议与外部系统进行远程通讯。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -63pt; mso-char-indent-count: -6.0">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">        </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使已部署服务能在同一个</span>
				<span lang="EN-US">JVM </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部相互调用。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -63pt; mso-char-indent-count: -6.0">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">        </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务间可使用标准的</span>
				<span lang="EN-US">WS-I</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				<span lang="EN-US">Web </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务协同工作组织）规范通讯。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -63pt; mso-char-indent-count: -6.0">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关键是分离服务引擎和绑定组件，以便业务逻辑不被下面的具体细节所干扰。这种方式促进了体系的灵活性和可扩展性。绑定组件和服务引擎组件在</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部都可以是服务提供者和</span>
				<span lang="EN-US">/</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或服务消费者。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">绑定组件和服务引擎组件为“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”提供接口以便从“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”接收消息。同样的，它们也利用</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的接口来和“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”通讯。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">消息传输模型</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利用消息传输模型分离服务提供者和服务消费者之间的耦合。消息传输模型利用了</span>
				<span lang="EN-US">WSDL</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
				<span lang="EN-US">WSDL </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于描述暴露的服务引擎组件和绑定组件的业务处理。另外，</span>
				<span lang="EN-US">WSDL </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也用于定义抽象服务处理的传输级绑定。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构中一个关键组件是</span>
				<span lang="EN-US">NMR</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（归一化消息路由器，也译作“正规消息路由器”）。</span>
				<span lang="EN-US">NMR </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于</span>
				<span lang="EN-US">WSDL </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了主要的消息传输中枢，</span>
				<span lang="EN-US">NMR </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为部署在“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”中的服务引擎组件和绑定组件间的消息传递提供松散耦合。服务需要有聚合业务处理的接口，每个业务处理由零个或多个消息组成。而一个接口有一个或多个传输级绑定。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”利用归一化格式描述消息。一个归一化消息由以下部分组成：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">消息属性</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">消息有效载荷</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 4.0">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">消息附件</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利用</span>
				<span lang="EN-US">NMR</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规范为服务提供者和消费者的消息交换提供标准接口。</span>
				<span lang="EN-US">NMR </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持服务生产者和消费者之间单向模式和服务响应模式的调用。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">利用</span>
				<span lang="EN-US">JMX </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现运行时的服务安装、配置和监控。服务必须实现</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口集，以便这些服务在</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境中是可管理的。</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境必须提供一套</span>
				<span lang="EN-US">JMX MBeans </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”的管理。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”环境允许服务引擎组件和绑定组件的相关操作如下：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">安装组件：使组件接口可使用归一化消息路由器。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -42pt; mso-char-indent-count: -4.0; mso-para-margin-left: 2.0gd">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">安装</span>
				<span lang="EN-US">artefact</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件：这将允许已部署的</span>
				<span lang="EN-US">artefacts</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件获得与已安装组件同样的机能。例如，可以部署一个“连接服务”来提供具体的数据库连接。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">启动、停止服务以及进行相关服务分组。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为组件及</span>
				<span lang="EN-US">artefact</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组件定义了标准的部署描述符以及打包模型。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">角色</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为基于</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的端到端</span>
				<span lang="EN-US">EAI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解决方案定义了如下角色：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes"> </span>
						<span style="mso-spacerun: yes">   </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引擎开发者：引擎开发者提供遵循</span>
				<span lang="EN-US">NMR </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和管理约束的服务引擎组件。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">绑定开发者：绑定开发者提供遵循</span>
				<span lang="EN-US">NMR </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和管理约束的绑定组件。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-char-indent-count: -2.0; mso-para-margin-left: 4.0gd">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境提供者：</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境提供者为“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”使用</span>
				<span lang="EN-US">J2EE 1.4 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">J2SE 1.4 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或更新的平台提供支持。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 63pt; TEXT-INDENT: -21pt; mso-char-indent-count: -2.0; mso-para-margin-left: 4.0gd">
				<span lang="EN-US">J2EE </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台提供者：</span>
				<span lang="EN-US">J2EE </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台提供者把“</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时”作为提供应用程序服务的一部分。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 68.25pt; TEXT-INDENT: -26.25pt; mso-char-indent-count: -2.5; mso-para-margin-left: 4.0gd">
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用程序开发者：</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用程序开发者利用服务引擎组件、绑定组件以及</span>
				<span lang="EN-US">JBI</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境构建</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用程序。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结论</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当今业界走向越来越开放的标准和规范，</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在使</span>
				<span lang="EN-US">Java </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术利用面向服务体系和</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基础架构实现业务集成方面产生了巨大飞跃。像</span>
				<span lang="EN-US">Oracle </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的商用产品提供商和</span>
				<span lang="EN-US">ServiceMix </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的开源软件都把</span>
				<span lang="EN-US">JBI </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为了他们</span>
				<span lang="EN-US">ESB </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方案的一部分。</span>
				<span lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于作者</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-spacerun: yes">    </span>Meeraj Kinnumpurath </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是位在</span>
				<span lang="EN-US">VOCA </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有限公司（原来叫</span>
				<span lang="EN-US">BACS</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）就职的</span>
				<span lang="EN-US">Java </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">架构师，这家公司是英国最大的票据交换所。他有</span>
				<span lang="EN-US">8 </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">年的</span>
				<span lang="EN-US">Java </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发经验，主要从事企业应用程序开发。他已出版了一些</span>
				<span lang="EN-US">Java</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">J2EE </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以及</span>
				<span lang="EN-US">Web </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务方面的书籍。<br /></span>
				<span lang="EN-US">
						<o:p>
								<br />
								<strong>
										<font size="2">
												<font face="宋体" color="#ff0000">请注意！引用、转贴本文应注明原译者：Rosen Jiang 以及出处：</font>
										</font>
								</strong>
								<a href="/rosen/rosen/rosen/rosen">
										<font face="宋体" color="#ff0000" size="2">
												<strong>http://www.blogjava.net/rosen</strong>
										</font>
								</a>
						</o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/rosen/aggbug/46281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-05-15 21:47 <a href="http://www.blogjava.net/rosen/archive/2006/05/15/46281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>与 Axis 1.x 同行</title><link>http://www.blogjava.net/rosen/archive/2006/01/28/29344.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sat, 28 Jan 2006 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2006/01/28/29344.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/29344.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2006/01/28/29344.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/29344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/29344.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 很久没写原创文章了。今天奉献给大家的是关于 Web Service 方面的文章。说起来惭愧，关于 Web Service，我从大二的时候就开始关注了，那时在做一套学生管理系统，可能是好奇，可能是图新鲜，可能是被跨平台所吸引，在还没弄得很清楚的情况下就迷恋上了这种技术，抱着李维的《Delphi 6/Kylix 2 SOAP/Web Service程序设计篇》狂啃，到了大三也没作出个像样的东西:(。大四上学期，签到 AUO 实习，并在 AUO 做毕设，毕设选题还是 Web Service 方面，论文洋洋洒洒写了一大篇，结果，到了最后的程序实现时，仅仅是以 XML 格式进行数据库和 Web 页面的交互而已。（再惭愧一次）<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 重新捡起 Web Service 是去年的事情，当时评估了多种开源 SSO 实现，总觉得不是很方便，遂打算自己实现。为了使通用性更高，决定让 Web Service 完成。并很自然的选到了 Axis。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; SOAP、WSDL、UDDI，这些名词相信只要了解过 Web Service 的都不陌生，根据 Apache 的定义，Axis 是一种 W3C SOAP 实现，国内有些介绍还特别注明了：Axis 并不完全是 SOAP 引擎，它还包括独立的 SOAP 服务器、嵌入 Servlet 引擎的服务器、支持 WSDL 并提供转化 WSDL 为 Java 类的工具、例子程序、TCP/IP 数据包监视工具，等等。Axis 部署 Web Serive 有两种方式，最简单的是拷贝 java 源代码文件到 web 文件夹下把扩展名改为 .jws 直接调用，可参考这篇文章：<A href="http://www.cn-java.com/target/news.php?news_id=2958">用Axis 1.1 for Java进行Web Services开发(1)</A>。另一种方式是通过 WSDD（Web Services描述文档）部署，可参考：<A href="http://bjzhanghao.cnblogs.com/archive/2004/10/09/50216.aspx">使用Axis发布简单的Web服务</A>。在我的应用中，使用的是后者，以便 Axis 进行自动序列化/反序列化处理。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 实现一次 SSO 登陆验证，最少要传入用户名、密码。为了达到这种目的，在客户端我们构造 User 对象（本文中 User 对象仅包含用户名和密码），并通过 Axis 自动序列化传递出去；到了 SSO 端，Axis 自动反序列化之后还原成 User 对象；最后返回给客户端说明本次登陆的结果，返回的结果不仅仅包含例如“登陆成功”之类的简单信息，也许还有很多其他信息，看来创建一个叫做 Respond 的对象（本文中 Respond 对象仅包含登陆 ID 和结果描述）很有必要了，把 Respond 传回给客户端说明登陆结果。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 暴露给客户端供登陆验证的服务类是 AuthService。该类代码简单表示如下：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;AuthService&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">/**</SPAN><SPAN style="COLOR: #008000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;验证用户名和密码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;String&nbsp;userName&nbsp;&nbsp;&nbsp;&nbsp;用户名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@param</SPAN><SPAN style="COLOR: #008000">&nbsp;String&nbsp;passWord&nbsp;&nbsp;&nbsp;&nbsp;密码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</SPAN><SPAN style="COLOR: #808080">@return</SPAN><SPAN style="COLOR: #008000">&nbsp;Respond&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;登陆验证后返回&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">*/</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Respond&nbsp;login(User&nbsp;user){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;user.getName();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;user.password();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">进行数据库验证<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/dot.gif"><IMG src="http://www.blogjava.net/images/dot.gif">..<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/dot.gif"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Respond&nbsp;respond&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Respond();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;respond.setId(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">123</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;respond.setDesc(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">登陆成功</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;respond;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp; User 和 Respond 以及服务类都写好了。通过命令行方式，我生成了 server-config.wsdd，内容如下：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">&lt;?</SPAN><SPAN style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</SPAN><SPAN style="COLOR: #0000ff">?&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">deployment&nbsp;</SPAN><SPAN style="COLOR: #ff0000">xmlns</SPAN><SPAN style="COLOR: #0000ff">="http://xml.apache.org/axis/wsdd/"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;xmlns:java</SPAN><SPAN style="COLOR: #0000ff">="http://xml.apache.org/axis/wsdd/providers/java"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">globalConfiguration</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="sendMultiRefs"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="disablePrettyXML"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="adminPassword"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="admin"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="attachments.Directory"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="D:\workspace\SSO\web\WEB-INF\attachments"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="dotNetSoapEncFix"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="enableNamespacePrefixOptimization"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="sendXMLDeclaration"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="sendXsiTypes"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="true"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="attachments.implementation"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.attachments.AttachmentsImpl"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">requestFlow</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="java:org.apache.axis.handlers.JWSHandler"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="scope"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="session"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">handler</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="java:org.apache.axis.handlers.JWSHandler"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="scope"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="request"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="extension"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">=".jwr"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">handler</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">requestFlow</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">globalConfiguration</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="LocalResponder"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;type</SPAN><SPAN style="COLOR: #0000ff">="java:org.apache.axis.transport.local.LocalResponder"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="URLMapper"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;type</SPAN><SPAN style="COLOR: #0000ff">="java:org.apache.axis.handlers.http.URLMapper"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="Authenticate"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;type</SPAN><SPAN style="COLOR: #0000ff">="java:org.apache.axis.handlers.SimpleAuthenticationHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">service&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="AuthService"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;provider</SPAN><SPAN style="COLOR: #0000ff">="java:RPC"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="allowedMethods"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="*"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="className"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="com.cdmcs.sso.AuthService"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">beanMapping&nbsp;</SPAN><SPAN style="COLOR: #ff0000">languageSpecificType</SPAN><SPAN style="COLOR: #0000ff">="java:sso.Respond"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;qname</SPAN><SPAN style="COLOR: #0000ff">="ns:resp"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;xmlns:ns</SPAN><SPAN style="COLOR: #0000ff">="urn:BeanService"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">beanMapping&nbsp;</SPAN><SPAN style="COLOR: #ff0000">languageSpecificType</SPAN><SPAN style="COLOR: #0000ff">="java:sso.User"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;qname</SPAN><SPAN style="COLOR: #0000ff">="ns:user"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;xmlns:ns</SPAN><SPAN style="COLOR: #0000ff">="urn:BeanService"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">service</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">service&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="AdminService"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;provider</SPAN><SPAN style="COLOR: #0000ff">="java:MSG"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="allowedMethods"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="AdminService"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="enableRemoteAdmin"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="false"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="className"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.utils.Admin"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">namespace</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">http://xml.apache.org/axis/wsdd/</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">namespace</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">service</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">service&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="Version"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;provider</SPAN><SPAN style="COLOR: #0000ff">="java:RPC"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="allowedMethods"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="getVersion"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="className"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.Version"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">service</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">transport&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="http"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">requestFlow</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="URLMapper"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="java:org.apache.axis.handlers.http.HTTPAuthHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">requestFlow</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="qs:list"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.transport.http.QSListHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="qs:wsdl"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.transport.http.QSWSDLHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="qs.list"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.transport.http.QSListHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="qs.method"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.transport.http.QSMethodHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="qs:method"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.transport.http.QSMethodHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="qs.wsdl"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="org.apache.axis.transport.http.QSWSDLHandler"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">transport</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">transport&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="local"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">responseFlow</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">handler&nbsp;</SPAN><SPAN style="COLOR: #ff0000">type</SPAN><SPAN style="COLOR: #0000ff">="LocalResponder"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">responseFlow</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">transport</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">deployment</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp; 要说明的是，深究上述配置文件具体含义不是本文的目的，要对其具体了解，请参考 Axis 文档。其中，只有下面的 XML 才是我们感兴趣的：<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">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">service&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="AuthService"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;provider</SPAN><SPAN style="COLOR: #0000ff">="java:RPC"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="allowedMethods"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="*"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">parameter&nbsp;</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #0000ff">="className"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;value</SPAN><SPAN style="COLOR: #0000ff">="com.cdmcs.sso.AuthService"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">beanMapping&nbsp;</SPAN><SPAN style="COLOR: #ff0000">languageSpecificType</SPAN><SPAN style="COLOR: #0000ff">="java:sso.Respond"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;qname</SPAN><SPAN style="COLOR: #0000ff">="ns:resp"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;xmlns:ns</SPAN><SPAN style="COLOR: #0000ff">="urn:BeanService"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">beanMapping&nbsp;</SPAN><SPAN style="COLOR: #ff0000">languageSpecificType</SPAN><SPAN style="COLOR: #0000ff">="java:sso.bo.User"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;qname</SPAN><SPAN style="COLOR: #0000ff">="ns:user"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;xmlns:ns</SPAN><SPAN style="COLOR: #0000ff">="urn:BeanService"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">service</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp; 为了完成自动序列化/反序列化，我们使用“beanMapping”元素指定要进行处理的 bean 文件。只有在 WSDD 中定义了这些，才能享受到 Axis 带来的自动序列化/反序列化优势。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 客户端代码：<BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;TestClient&nbsp;{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;endpoint&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://127.0.0.1:8080/services/AuthService?wsdl</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;service&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Service();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call&nbsp;call&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Call)&nbsp;service.createCall();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QName&nbsp;qn&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;QName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">urn:BeanService</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">resp</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QName&nbsp;qx&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;QName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">urn:BeanService</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">user</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">注册&nbsp;bean</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.registerTypeMapping(Respond.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,qn,</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;BeanSerializerFactory(Respond.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,&nbsp;qn),</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;BeanDeserializerFactory(Respond.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,&nbsp;qn));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.registerTypeMapping(User.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,qx,</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;BeanSerializerFactory(User.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,&nbsp;qx),</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;BeanDeserializerFactory(User.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,&nbsp;qx));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setTargetEndpointAddress(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;java.net.URL(endpoint));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call.setOperationName(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;QName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://soapinterop.org/</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">login</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;User();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mul.setName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mul.setPassword(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Respond&nbsp;respond&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(Reopond)&nbsp;call.invoke(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Object[]&nbsp;{user});<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">登陆，返回'</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;respond.getDesc()&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">'。</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV><BR>&nbsp;&nbsp;&nbsp; 正如我们期望的，打印出“登陆成功”。通过上面的范例，我们发现，Axis 的自动序列化/反序列化机制还是很方便的，除了 bean 以外，其他类型的对象也可以让 Axis 来完成，具体参考 Axis 文档，如果要传递的对象 Axis 未提供自动序列化/反序列化支持，请考虑人工实现，参考：<A href="http://www.itzero.net/Article/J2EE/2005_10/3570.html">深度编程Axis序列化/反序列化器开发指南</A>。<BR><BR><BR><STRONG><FONT color=#ff0000 size=2>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A HREF="/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A> <img src ="http://www.blogjava.net/rosen/aggbug/29344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2006-01-28 20:37 <a href="http://www.blogjava.net/rosen/archive/2006/01/28/29344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BIRT 总览（翻译）</title><link>http://www.blogjava.net/rosen/archive/2005/12/17/24348.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Sat, 17 Dec 2005 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/12/17/24348.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/24348.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/12/17/24348.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/24348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/24348.html</trackback:ping><description><![CDATA[<P><STRONG><FONT size=4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG src="http://www.eclipse.org/birt/images/birt_logotype_small.jpg"><BR><BR>报表介绍</FONT></STRONG><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统，特别之处在于它是以 Java 和 J2EE 为基础。BIRT 有两个主要组件：基于 Eclipse 的报表设计器，以及部署到应用服务器上的运行时组件。BIRT 也提供了图标引擎让你能为应用增加图标。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 当前发行的版本是 1.0.1。我们鼓励你下载、试用 BIRT，请通过 <A href="http://www.eclipse.org/birt/index.php?page=community.html">newsgroups and Bugzilla</A> 向我们提意见。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 有了 BIRT，你可以为应用程序构建丰富的报表。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>列表</STRONG> － 列表是最简单的报表。当列表变长时，你可以把相关数据增加到同一分组（基于客户的订单分组，基于供应商的产品分组）。如果数据是数字类型的，你可以轻松的添加到“总数”、“平均”、或其他汇总中。<BR>&nbsp;&nbsp;&nbsp; <STRONG>图表</STRONG> － 当需要图表表现时，数字型数据比较好理解。BIRT 也提供饼状、线状以及柱状图标等。<BR>&nbsp;&nbsp;&nbsp; <STRONG>交叉表</STRONG> － 交叉表（也叫做十字表格或矩阵）用两种维度展示数据：sales per quarter or hits per web page。（交叉表在 1.0.1 中没有提供，但计划在将来提供。）<BR>&nbsp;&nbsp;&nbsp; <STRONG>信函和文档</STRONG> － 通知、信件、以及其他文本文档都很容易通过 BIRT 方便建立。文档包括正文、格式、列表、图表等。<BR>&nbsp;&nbsp;&nbsp; <STRONG>混合报表</STRONG> － 很多报表需要联合以上所有的报表构成单一文档。例如，一份客户声明会列出客户所需要的信息，为当前促进(promotions)提供文本，以及提供并行的出帐和入帐列表。一份财政报表将包括声明、图表、表格，所有这些都将进行全方位的格式化，来匹配共有的配色方案。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <FONT size=4><STRONG>剖析一份报表</STRONG></FONT><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 报表包含四个部分：数据、数据转换、业务逻辑、陈述。<BR>&nbsp;&nbsp;&nbsp; 数据 － 数据库、Web 服务、Java 对象，这些都可以作为 BIRT 报表源。1.0.1 版本提供 JDBC 支持，也支持利用编码来获取其他地方的数据。BIRT 的 ODA(Open Data Access) 框架允许任何人构建新的 UI 以及运行时支持任何类型的表格式数据。未来，单一报表可包含从任意多个数据源获取数据。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>数据转换</STRONG> － 报表通过对数据的分类、统计、过滤以及分组来适应用户需求。当然，数据库能实现这些功能，当遇到普通文件和 Java 对象时 BIRT 必须以 "simple" 数据源方式处理。BIRT 允许复杂的操作，比如总合分组、整体共计的百分比，等等。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>业务逻辑</STRONG> － 真实世界的数据很少提供你理想的结构良好的报表。许多报表要求用具体逻辑把原始数据转换成用户的有用信息。如果该逻辑仅仅用于该报表，你可以用 BIRT 的 JavaScript 脚本支持。如果你的程序中已包含这些逻辑，你可以调用已有的 Java 代码。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>表现</STRONG> － 一旦数据准备好了，你可以在很大的范围内选择表现形式。表格、图表、文字等等都可以。单一数据集可以有多种方式表现，而单一报表可以表现多个数据集。<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>J2EE 应用中的 BIRT<BR></FONT></STRONG>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 报表引擎以 JAR 文件方式打包，可以方便的添加到你的 J2EE 应用中。报表引擎是一系列的 POJO(Plain Old Java Objects)，便于你可以在 JSP 页面集成报表。&nbsp;&nbsp;&nbsp;&nbsp;<BR><IMG height=237 src="http://www.eclipse.org/birt/project/chart1.jpg" width=658><BR>&nbsp;&nbsp;&nbsp; BIRT 与你的应用有四个主要集成点：<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>UI 参数</STRONG> － 多数报表允许用户指定一些输入，这些数据叫做"报表参数"。例如，客户报表要求显示客户数据。你的参数页面可能是静态的：为每个报表进行用户定制设计。或者，可以使用参数元数据提供的动态页面，以便该单一页面为所有的报表提供服务。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>运行报表</STRONG> － 用户提交表单参数时，你的 web 应用通过这些参数向 BIRT 报表引擎说明读取哪个报表设计文件，并读取数据，再产生报表输出。当引擎运行报表时 BIRT 的术语称为"工厂"。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>数据访问</STRONG> － 报表如何从你的应用获得数据已在上面解释了。Java 程序通常利用 Java 对象为 BIRT 工厂提供数据。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>显示</STRONG> － 附加的 JSP 页面，叫做阅读器，允许用户查看报表输出。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 一个报表应用程序包含一个参数页，你可以为每个报表创建自定义的 UI，或者使用 BIRT 带来的参数元数据提供单一报表来处理多种不同报表。<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>样品阅读器</FONT></STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; BIRT 项目提供一个样品 "viewer" 来帮你起步。样品阅读器常被用于在 Eclipse 中预览报表：BIRT 内置一个 Apache Tomcat 服务器，每次预览报表时调用。阅读器也可被用于任何与 JSP 兼容的 J2EE 服务器。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 的 1.0.1 版本提供单一页面的 web 输出。计划在将来的版本中提供多页面输出，而且阅读器 UI 也将提供多页面之间的导航功能。<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>报表设计</FONT></STRONG></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; BIRT 应用开发从报表设计开始。基于 Eclipse 插件提供多种快速构建报表工具。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>数据浏览器</STRONG> － 把你的数据源（连接）以及数据集（查询）组织起来。数据集编辑器允许你测试数据集，以确保报表接收数据的正确性。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 布局视图 － 所见即所得编辑器为你的报表提供以拽方式来创建表现内容。包含一个标准报表条目调色板。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG> 属性编辑器</STRONG> － 以便利的格局表现大多数通用的用户属性使编辑更快速和容易。BIRT 也集成了标准 Eclipse 属性视图，为每个条目提供详细的属性列表。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>报表预览</STRONG> － 你可以在任何时间采用真实数据测试你的报表。预览窗口直接内嵌在 Eclipse 中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>代码编辑器</STRONG> － 在访问数据以及报表生成或浏览时，脚本把业务逻辑添加给报表。在编辑脚本时代码编辑器提供标准的 Eclipse 特性：语法加色、自动完成等等。BIRT 用很简单的脚本来表达，expression builder 能更容易的创建这些表达。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>略图</STRONG> － BIRT 报表被组织为一个树型结构作为整体报表的根，并且为样式、报表内容、数据源、数据集、报表参数等分类。略图视图提供你整个报表结构紧凑的预览。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>Cheat Sheets</STRONG> － 学习新工具永远是种挑战，但是 Eclipse 提供一种创新方案：cheat sheets。它们是一些帮助你完成新任务的文档。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><FONT size=4><STRONG>数据定制</STRONG></FONT><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 正如前面所提到的，报表通常为要表现的数据添加业务逻辑。BIRT 提供多个工具来完成这一操作：<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>栏位计算</STRONG>－数据库为存储组织数据，但这些数据通常为结合表现层而预先整理好。栏位计算让你能定义基于业务逻辑的附加数据集栏位。这种逻辑是一个简单的语法、脚本或调用一个已有的 Java 逻辑。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>输入以及输出参数</STRONG>－许多数据源都支持参数：在查询时传入或传出数据的能力。比如，SQL Select 语句可包含输入参数。存储过程既有传入又有传出参数。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>栏位元数据</STRONG>－当数据源提供的名字是 unintuitive 的，你可以提供栏位别名。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>过滤</STRONG> － 有些数据源，尤其是 SQL，提供良好的内置过滤特性。然而，有些数据源（单纯的文件，应用程序对象）却没有提供过滤特性。另外，过滤器条件是定义在脚本或 Java 代码中的。你可把过滤器定义为报表的一部分，BIRT 引擎会自动调用它们。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>脚本化数据集</STRONG> － 有些报表需要访问专门或不常用的数据。你可以在 Java 或脚本创建访问，利用脚本化数据集可在报表中集成这些逻辑。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>条件格式化<BR></FONT></STRONG>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 有些报表有着固定的格式，其他的却需要条件格式化。例如，某报表列出了交易记录来表现不同的销售与利润之比。或者，一个客户服务报表要按照不同规则进行色彩显示。BIRT 提供多个条件格式化特性：<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>条件可见度</STRONG> － 你可以根据数据隐藏报表元素。在上述的交易报表中，你可以创建销售和交易收入两部分，接着隐藏报表指定记录中不需要的部分。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>值映射</STRONG> － 数据库数据通常使用代码值：M/F 代表男性或女性，1/2 代表销售和收入，等等。值映射让你定义一个从数据库值到显示值的映射。例如，我们可把值“1”对应到“Sale”，把“2”对应到“Return”。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>加强</STRONG> － 简单的标识可让你对特定报表套用样式。例如，在客户服务报表中，我们可以使用绿色表示上一的计划，红色表示下一计划。<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>&nbsp;&nbsp;&nbsp; 脚本</FONT></STRONG></P>
<P>&nbsp;&nbsp;&nbsp; BIRT 提供基于 JavaScript（与知名的 ECMAScript 形式上相同）的脚本。JavaScript 经常作为客户端脚本语言，但是它也可以用于用于表达业务逻辑。特别的，JavaScript 能与你的现有 Java 逻辑进行良好集成，能非常轻松地从 BIRT 报表调用业务逻辑。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 提供从 JavaScript 对象访问报表对象模型（Report Object Model）的整套方案：同时表现报表设计和运行时的状况，允许报表的完全控制处理甚至最复杂的报表格式化工作。<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>项目管理</FONT></STRONG></P>
<P>&nbsp;&nbsp;&nbsp; BIRT 集成了 Eclipse 项目管理特性来组织相关报表。BIRT 也可以与 Eclipse CVS 协作进行源码管理。BIRT 的 XML 报表设计格式让它能容易的比较两份报表，或者两个不同版本的相同报表，并跟踪变更。<BR>&nbsp;&nbsp;&nbsp; <BR><FONT size=4><STRONG>&nbsp;&nbsp;&nbsp; 样式</STRONG></FONT></P>
<P>&nbsp;&nbsp;&nbsp; 任何设计 web 页面的人都知道有时会反复使用相同的样式。CSS 允许 web 设计者从内容中提取样式信息，并复用样式。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 提供类似的特性。当然，BIRT 样式也是基于 CSS 的，这样使得网页应用开发人员能容易得设计 BIRT 表现形式。BIRT 样式可堆叠，允许你在一个地方设置样式后套用到所有报表或报表的一部分或单一报表中。<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>&nbsp;&nbsp;&nbsp; 库</FONT></STRONG></P>
<P>&nbsp;&nbsp;&nbsp; 典型的应用中会包括许多有关联的报表。一个简单的客户应用将包括一个按照字母排序的客户列表、按照地理位置分类的客户群，为客户指定的销售代表，客户身份筛选等等。总之，用户不停的地变化报表以解决具体业务需要。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 这样一来，最终的报表应用将包含多组相关报表。相同的数据源、样式、业务逻辑、报表条目。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 将来的 BIRT 版本将包含组织这些共享资源的支持库。这些库可包含任何报表元素，比如样式、数据源、报表条目、脚本等等。<BR>&nbsp;&nbsp;&nbsp; <BR><STRONG><FONT size=4>国际化</FONT></STRONG></P>
<P>&nbsp;&nbsp;&nbsp; 全世界都可以访问你的 web 应用程序。BIRT 为国际化和本地化提供良好的支持。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>文本本地化</STRONG> － 你可以建立一份把字符串自动变成用户本地语言显示的简单报表。所有的表单和报表文本都能以标准的 Java 本地化规则进行翻译。在运行时，BIRT 使用资源 key 找出文本的正确翻译。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>本地化</STRONG> － BIRT 提供 locale-aware 格式化数据，意味着对于美国用户的日期数据可以以 mm/dd/yy 的格式出现，而欧洲用户则是 dd-mm-yy 格式。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>动态格式化</STRONG> － 中文文本非常紧凑，德文有时又有点冗长，而英文正好是中等大小。BIRT 自动调整报表条目的大小来适合其中的内容，避免每次翻译都要进行报表测试。<BR>&nbsp;&nbsp;&nbsp; <BR><FONT size=4><STRONG>扩展性</STRONG></FONT></P>
<P>&nbsp;&nbsp;&nbsp; 报表应用程序的范围是十分庞大的，BIRT 团队不能为每个应用提供很具体的特性。可利用 BIRT 脚本来扩展 BIRT，另外还可构建 BIRT 扩展插件到 BIRT 中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR><STRONG>&nbsp;&nbsp;&nbsp; 数据访问</STRONG><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 提供 ODA(Open Data Access) 框架来支持自定义数据访问方法。数据访问的范围还包括一个获取数据的运行时组件。也包括构建自定义查询的自定义设计时 UI。例如，打包后的应用程序可以让 ODA 构建数据访问 UI 并运行在自己的数据模型中。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<STRONG> 报表栏目</STRONG><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 为要表现的数据提供一致的报表栏目集。可以在应用程序中自定义附件报表栏目，并像 BIRT 自身的报表栏目一样运行在设计器和引擎中。例如，性能管理应用程序要添加报表栏目来高亮显示停止项、尺度表以及其他用来衡量性能的可视标志。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>图表类型</STRONG><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 图表包提供了很多的图表类型。但是，一些行业需要很特殊的图表样式。开发者可以在 BIRT 图表引擎中创建图表插件来提供这些图表样式。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>输出格式</STRONG><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; BIRT 1.0.1 支持输出到 HTML 和 PDF。当然，也可能需要其他类型输出：Excel、RTF(Rich Text Format)、SVG(Scalable Vector Graphic)、图像、等等。BIRT 在今后会提供其中一些，除开这些的其他格式可能需要的用户就很少了。开发者可利用 BIRT 引擎接口添加转换器以达到目的。<BR><BR><BR><STRONG><FONT face=宋体 color=#ff0000 size=2>请注意！引用、转贴本文应注明原译者：Rosen Jiang 以及出处：</FONT></STRONG><A href="/rosen/rosen/rosen/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></P><img src ="http://www.blogjava.net/rosen/aggbug/24348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-12-17 13:37 <a href="http://www.blogjava.net/rosen/archive/2005/12/17/24348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML 的 RUD</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9952.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9952.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9952.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9952.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9952.html</trackback:ping><description><![CDATA[<P><FONT size=2>&nbsp;&nbsp;&nbsp; 在工作中使用 XML 已经很长时间了，不过长久以来都是进行的读操作，或者在生成 XML 时完全使用 StringBuffer 来构造。进行完整的读取、添加、删除、修改还是最近的事情。在这里我采用的是 DOM4J，其实呢这些内容都很简单，如果愿意，各位大可直接参考官方的 Cookbook（</FONT><A href="http://www.dom4j.org/cookbook.html"><FONT color=#000080 size=2>http://www.dom4j.org/cookbook.html</FONT></A><FONT size=2>）和 Quick Start（</FONT><A href="http://www.dom4j.org/guide.html"><FONT color=#000080 size=2>http://www.dom4j.org/guide.html</FONT></A><FONT size=2>）。<BR>&nbsp;&nbsp;&nbsp; <BR>对于给定的 XML 文件，其结构如下：</FONT></P>
<P>
<TABLE style="WIDTH: 417px; HEIGHT: 217px" cellSpacing=1 cellPadding=1 width=417 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;&lt;?xml version="1.0" encoding="GBK" ?&gt;<BR>&lt;propertysets&gt; </FONT>
<P><FONT size=2>&nbsp;&lt;propertset name="rea_faculty" description="team"&gt;<BR>&nbsp;&nbsp;&lt;field&gt;10290&lt;/field&gt;<BR>&nbsp;&lt;/propertset&gt;<BR>&nbsp;&lt;propertset name="faculty_lea" description="another team"&gt;<BR>&nbsp;&nbsp;&lt;field&gt;10286&lt;/field&gt;<BR>&nbsp;&lt;/propertset&gt;<BR>&nbsp;&lt;propertset name="office" description="teams"&gt;<BR>&nbsp;&nbsp;&lt;field&gt;10287&lt;/field&gt;<BR>&nbsp;&lt;/propertset&gt;<BR>&nbsp;<BR>&lt;/propertysets&gt;</FONT></P></TD></TR></TBODY></TABLE></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;<BR><STRONG><FONT size=2>为以上 XML 文件构造 Propertys 类：</FONT></STRONG></P>
<P>
<TABLE style="WIDTH: 416px; HEIGHT: 483px" cellSpacing=1 cellPadding=1 width=416 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;</FONT><FONT size=2>public class Propertys {<BR>&nbsp;<BR>&nbsp;private String name;<BR>&nbsp;private String description;<BR>&nbsp;private String field;</FONT> 
<P><FONT size=2>&nbsp;public String getDescription() {<BR>&nbsp;&nbsp;return description;<BR>&nbsp;}</FONT></P>
<P><FONT size=2>&nbsp;public void setDescription(String description) {<BR>&nbsp;&nbsp;this.description = description;<BR>&nbsp;}</FONT></P>
<P><FONT size=2>&nbsp;public String getField() {<BR>&nbsp;&nbsp;return field;<BR>&nbsp;}</FONT></P>
<P><FONT size=2>&nbsp;public void setField(String field) {<BR>&nbsp;&nbsp;this.field = field;<BR>&nbsp;}</FONT></P>
<P><FONT size=2>&nbsp;public String getName() {<BR>&nbsp;&nbsp;return name;<BR>&nbsp;}</FONT></P>
<P><FONT size=2>&nbsp;public void setName(String name) {<BR>&nbsp;&nbsp;this.name = name;<BR>&nbsp;}<BR>}</FONT></P></TD></TR></TBODY></TABLE></P>
<P><FONT size=2><STRONG>读取方法（返回包含 Propertys 的列表）：</STRONG></FONT><BR>&nbsp;&nbsp;&nbsp; <BR>
<TABLE style="WIDTH: 416px; HEIGHT: 23px" cellSpacing=1 cellPadding=1 width=416 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;&nbsp;public List getAll() {<BR>&nbsp;&nbsp;List list = new ArrayList();<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;InputStream is = getClass().getResourceAsStream("/navigation.xml");<BR>&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp;Document document = reader.read(is);<BR>&nbsp;&nbsp;&nbsp;Element root = document.getRootElement(); <BR>&nbsp;&nbsp;&nbsp;Iterator lv = root.elementIterator("propertset");<BR>&nbsp;&nbsp;&nbsp;Element el = null;<BR>&nbsp;&nbsp;&nbsp;while (lv.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;Propertys property=new Propertys();<BR>&nbsp;&nbsp;&nbsp;&nbsp;el = (Element) lv.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;property.setName(el.attributeValue("name"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;property.setDescription(el.attributeValue("description"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;property.setField(el.elementText("field"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;list.add(property);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return list;<BR>&nbsp;}</FONT></TD></TR></TBODY></TABLE></P>
<P><FONT size=2><STRONG>添加新节点（成功返回 1 否则 0）：<BR></STRONG></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>
<TABLE style="WIDTH: 417px; HEIGHT: 23px" cellSpacing=1 cellPadding=1 width=417 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;&nbsp;public int saveProperty(Propertys property) {<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;InputStream is = getClass().getResourceAsStream("/navigation.xml");<BR>&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp;Document document = reader.read(is);<BR>&nbsp;&nbsp;&nbsp;Element root = document.getRootElement();<BR>&nbsp;&nbsp;&nbsp;root.addElement("propertset")<BR>&nbsp;&nbsp;&nbsp;&nbsp;.addAttribute("name",property.getName())<BR>&nbsp;&nbsp;&nbsp;&nbsp;.addAttribute("description",property.getDescription())<BR>&nbsp;&nbsp;&nbsp;&nbsp;.addElement("field").addText(property.getField());<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;OutputFormat outformat = OutputFormat.createPrettyPrint();<BR>&nbsp;&nbsp;&nbsp;outformat.setEncoding("GBK");<BR>&nbsp;&nbsp;&nbsp;FileWriter out = new FileWriter(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperty("user.dir")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+"/web/WEB-INF/classes/navigation.xml");<BR>&nbsp;&nbsp;&nbsp;XMLWriter writer=new XMLWriter(out,outformat);<BR>&nbsp;&nbsp;&nbsp;writer.write(document);<BR>&nbsp;&nbsp;&nbsp;writer.close();<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</FONT></TD></TR></TBODY></TABLE></P>
<P><FONT size=2><STRONG>更新节点（按照 name 属性查找）：<BR></STRONG></FONT>&nbsp;&nbsp;&nbsp; <BR>
<TABLE style="WIDTH: 416px; HEIGHT: 523px" cellSpacing=1 cellPadding=1 width=416 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;&nbsp;public int updateProperty(String pro,Propertys property) {<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;InputStream is = getClass().getResourceAsStream("/navigation.xml");<BR>&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp;Document document = reader.read(is);<BR>&nbsp;&nbsp;&nbsp;Element root = document.getRootElement();<BR>&nbsp;&nbsp;&nbsp;Iterator lv = root.elementIterator("propertset");<BR>&nbsp;&nbsp;&nbsp;Element el = null;<BR>&nbsp;&nbsp;&nbsp;while (lv.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;el = (Element) lv.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (el.attributeValue("name").equals(pro)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.setAttributeValue("name",property.getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.setAttributeValue("description",property.getDescription());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.element("field").setText(property.getField());<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}</FONT> 
<P><FONT size=2>&nbsp;&nbsp;&nbsp;OutputFormat outformat = OutputFormat.createPrettyPrint();<BR>&nbsp;&nbsp;&nbsp;outformat.setEncoding("GBK");<BR>&nbsp;&nbsp;&nbsp;FileWriter out = new FileWriter(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperty("user.dir")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+"/web/WEB-INF/classes/navigation.xml");<BR>&nbsp;&nbsp;&nbsp;XMLWriter writer=new XMLWriter(out,outformat);<BR>&nbsp;&nbsp;&nbsp;writer.write(document);<BR>&nbsp;&nbsp;&nbsp;writer.close();<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</FONT></P></TD></TR></TBODY></TABLE></P>
<P><FONT size=2><STRONG>删除节点：</STRONG></FONT><BR>&nbsp;&nbsp;&nbsp; <BR>
<TABLE style="WIDTH: 416px; HEIGHT: 23px" cellSpacing=1 cellPadding=1 width=416 border=1>
<TBODY>
<TR>
<TD><FONT size=2>&nbsp;&nbsp;public int delProperty(String pro) {<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;InputStream is = getClass().getResourceAsStream("/navigation.xml");<BR>&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp;Document document = reader.read(is);<BR>&nbsp;&nbsp;&nbsp;Element root = document.getRootElement();<BR>&nbsp;&nbsp;&nbsp;Iterator lv = root.elementIterator("propertset");<BR>&nbsp;&nbsp;&nbsp;Element el = null;<BR>&nbsp;&nbsp;&nbsp;while (lv.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;el = (Element) lv.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (el.attributeValue("name").equals(pro)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el.detach();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}</FONT> 
<P><FONT size=2>&nbsp;&nbsp;&nbsp;OutputFormat outformat = OutputFormat.createPrettyPrint();<BR>&nbsp;&nbsp;&nbsp;outformat.setEncoding("GBK");<BR>&nbsp;&nbsp;&nbsp;FileWriter out = new FileWriter(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperty("user.dir")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+"/web/WEB-INF/classes/navigation.xml");<BR>&nbsp;&nbsp;&nbsp;XMLWriter writer=new XMLWriter(out,outformat);<BR>&nbsp;&nbsp;&nbsp;writer.write(document);<BR>&nbsp;&nbsp;&nbsp;writer.close();<BR>&nbsp;&nbsp;&nbsp;return 1;<BR>&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;return 0;<BR>&nbsp;}</FONT></P></TD></TR></TBODY></TABLE><BR><BR><BR><STRONG><FONT color=#ff0000 size=2>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A href="http://www.blogjava.net/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></P><img src ="http://www.blogjava.net/rosen/aggbug/9952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:42 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四种 XML 解析技术之不完全测试</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9950.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9950.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9950.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9950.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9950.html</trackback:ping><description><![CDATA[<P>&nbsp;&nbsp;&nbsp; 在平时工作中，难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案，哪个最适合我们呢？在这篇文章中，我对这四种主流方案做一个不完全评测，仅仅针对遍历 XML 这块来测试，因为遍历 XML 是工作中使用最多的（至少我认为）。<BR><BR><BR><STRONG><FONT size=4>预 备</FONT></STRONG><BR><BR>&nbsp;&nbsp;&nbsp; <STRONG>测试环境：</STRONG><BR>&nbsp;&nbsp;&nbsp; AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8，在 Debug 模式下测试。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>XML 文件格式如下：<BR></STRONG><FONT size=2>&nbsp;&nbsp;&nbsp; &lt;?xml version="1.0" encoding="GB2312"?&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RESULT&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;VALUE&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NO&gt;A1234&lt;/NO&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ADDR&gt;四川省XX县XX镇XX路X段XX号&lt;/ADDR&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/VALUE&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;VALUE&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;NO&gt;B1234&lt;/NO&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ADDR&gt;四川省XX市XX乡XX村XX组&lt;/ADDR&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/VALUE&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/RESULT&gt;</FONT></P>
<P>&nbsp;&nbsp;&nbsp; <STRONG>测试方法：<BR></STRONG>&nbsp;&nbsp;&nbsp; 采用 JSP 端调用Bean（至于为什么采用JSP来调用，请参考：<A href="http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspx"><FONT color=#000080>http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspx</FONT></A>），让每一种方案分别解析10K、100K、1000K、10000K的 XML 文件，计算其消耗时间（单位:毫秒）。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>JSP 文件：</STRONG><BR><FONT size=2>&nbsp;&nbsp;&nbsp; &lt;%@ page contentType="text/html; charset=gb2312" %&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;%@ page import="com.test.*"%&gt;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; &lt;html&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;body&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String args[]={""};<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyXMLReader.main(args);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/body&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/html&gt;</FONT></P>
<P><FONT size=4><STRONG><BR>测 试</STRONG><BR></FONT><BR>&nbsp;&nbsp;&nbsp; <STRONG>首先出场的是 DOM（JAXP Crimson 解析器）</STRONG>&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 另一方面，对于特别大的文档，解析和加载整个文档可能很慢且很耗资源，因此使用其他手段来处理这样的数据会更好。这些基于事件的模型，比如 SAX。</P>
<P>&nbsp;&nbsp;&nbsp; <STRONG>Bean文件：</STRONG><BR><FONT size=2>&nbsp;&nbsp;&nbsp; package com.test;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; import java.io.*;<BR>&nbsp;&nbsp;&nbsp; import java.util.*;<BR>&nbsp;&nbsp;&nbsp; import org.w3c.dom.*;<BR>&nbsp;&nbsp;&nbsp; import javax.xml.parsers.*;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public class MyXMLReader{</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String arge[]){<BR></FONT><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long lasting =System.currentTimeMillis();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File f=new File("data_10k.xml");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DocumentBuilder builder=factory.newDocumentBuilder();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc = builder.parse(f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeList nl = doc.getElementsByTagName("VALUE");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;nl.getLength();i++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("车牌号码:" +&nbsp; doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" 车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("运行时间："+(System.currentTimeMillis() - lasting)+" 毫秒");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P>&nbsp;&nbsp; &nbsp;&nbsp; 10k消耗时间：265 203 219 172<BR>&nbsp;&nbsp;&nbsp; 100k消耗时间：9172 9016 8891 9000<BR>&nbsp; 1000k消耗时间：691719 675407 708375 739656<BR>10000k消耗时间：OutOfMemoryError</P>
<P><BR>&nbsp;&nbsp;&nbsp; <STRONG>接着是 SAX</STRONG><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 这种处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX 还比它的替代者 DOM 快许多。</P>
<P>&nbsp;&nbsp;&nbsp; <STRONG>选择 DOM 还是选择 SAX ？</STRONG></P>
<P>&nbsp;&nbsp;&nbsp; 对于需要自己编写代码来处理 XML 文档的开发人员来说，选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。 <BR>&nbsp;&nbsp;&nbsp; DOM 采用建立树形结构的方式访问 XML 文档，而 SAX 采用的事件模型。 <BR>&nbsp;&nbsp;&nbsp; DOM 解析器把 XML 文档转化为一个包含其内容的树，并可以对树进行遍历。用 DOM 解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档，所以对性能和内存的要求比较高，尤其是遇到很大的 XML 文件的时候。由于它的遍历能力，DOM 解析器常用于 XML 文档需要频繁的改变的服务中。 <BR>&nbsp;&nbsp;&nbsp; SAX 解析器采用了基于事件的模型，它在解析 XML 文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。 <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <STRONG>Bean文件：</STRONG><BR><FONT size=2>&nbsp;&nbsp;&nbsp; package com.test;<BR>&nbsp;&nbsp;&nbsp; import org.xml.sax.*;<BR>&nbsp;&nbsp;&nbsp; import org.xml.sax.helpers.*;<BR>&nbsp;&nbsp;&nbsp; import javax.xml.parsers.*;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public class MyXMLReader extends DefaultHandler {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Stack tags = new java.util.Stack();</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MyXMLReader() {<BR>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long lasting = System.currentTimeMillis();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParserFactory sf = SAXParserFactory.newInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParser sp = sf.newSAXParser();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyXMLReader reader = new MyXMLReader();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp.parse(new InputSource("data_10k.xml"), reader);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + " 毫秒");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void characters(char ch[], int start, int length)&nbsp;throws SAXException {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String tag = (String) tags.peek();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tag.equals("NO")) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("车牌号码：" + new String(ch, start, length));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tag.equals("ADDR")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("&nbsp; 地址:" + new String(ch, start, length));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void startElement(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String uri,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String localName,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String qName,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Attributes attrs) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tags.push(qName);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;10k消耗时间：110 47 109 78<BR>&nbsp;&nbsp;&nbsp; 100k消耗时间：344 406 375 422<BR>&nbsp; 1000k消耗时间：3234 3281 3688 3312<BR>10000k消耗时间：32578 34313 31797 31890 30328</P>
<P><BR>&nbsp;&nbsp;&nbsp; <STRONG>然后是 JDOM </STRONG><A href="http://www.jdom.org/"><STRONG><FONT color=#000080>http://www.jdom.org/</FONT></STRONG></A></P>
<P>&nbsp;&nbsp;&nbsp; JDOM 的目的是成为 Java 特定文档模型，它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型，JDOM 一直得到大力推广和促进。正在考虑通过“Java 规范请求 JSR-102”将它最终用作“Java 标准扩展”。从 2000 年初就已经开始了 JDOM 开发。</P>
<P>&nbsp;&nbsp;&nbsp; JDOM 与 DOM 主要有两方面不同。首先，JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API，但是也限制了灵活性。第二，API 大量使用了 Collections 类，简化了那些已经熟悉这些类的 Java 开发者的使用。</P>
<P>&nbsp;&nbsp;&nbsp; JDOM 文档声明其目的是“使用 20%（或更少）的精力解决 80%（或更多）Java/XML 问题”（根据学习曲线假定为 20%）。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的，并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而，它仍需要您充分理解 XML 以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。</P>
<P>&nbsp;&nbsp;&nbsp; JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档（尽管它还可以将以前构造的 DOM 表示作为输入）。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。</P>
<P>&nbsp;&nbsp;&nbsp; <STRONG>Bean文件：</STRONG><BR><FONT size=2>&nbsp;&nbsp;&nbsp; package com.test;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; import java.io.*;<BR>&nbsp;&nbsp;&nbsp; import java.util.*;<BR>&nbsp;&nbsp;&nbsp; import org.jdom.*;<BR>&nbsp;&nbsp;&nbsp; import org.jdom.input.*;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public class MyXMLReader {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String arge[]) {<BR></FONT><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long lasting = System.currentTimeMillis();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXBuilder builder = new SAXBuilder();&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document doc = builder.build(new File("data_10k.xml")); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element foo = doc.getRootElement(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List allChildren = foo.getChildren(); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;allChildren.size();i++) { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" 车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + " 毫秒");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10k消耗时间：125 62 187 94<BR>&nbsp;&nbsp;&nbsp; 100k消耗时间：704 625 640 766<BR>&nbsp;&nbsp;1000k消耗时间：27984 30750 27859 30656<BR>10000k消耗时间：OutOfMemoryError</P>
<P><BR>&nbsp;&nbsp;&nbsp; <STRONG>最后是 DOM4J </STRONG><A href="http://dom4j.sourceforge.net/"><STRONG><FONT color=#000080>http://dom4j.sourceforge.net/</FONT></STRONG></A><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 虽然 DOM4J 代表了完全独立的开发结果，但最初，它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能，包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始，它就一直处于开发之中。</P>
<P>&nbsp;&nbsp;&nbsp; 为支持所有这些功能，DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然 DOM4J 付出了更复杂的 API 的代价，但是它提供了比 JDOM 大得多的灵活性。</P>
<P>&nbsp;&nbsp;&nbsp; 在添加灵活性、XPath 集成和对大文档处理的目标时，DOM4J 的目标与 JDOM 是一样的：针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案，实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时，它比 JDOM 更少强调防止不正确的应用程序行为。</P>
<P>&nbsp;&nbsp;&nbsp; DOM4J 是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML，特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。</P>
<P>&nbsp;&nbsp;&nbsp; <STRONG>Bean文件：</STRONG><BR><FONT size=2>&nbsp;&nbsp;&nbsp; package com.test;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; import java.io.*;<BR>&nbsp;&nbsp;&nbsp; import java.util.*;<BR>&nbsp;&nbsp;&nbsp; import org.dom4j.*;<BR>&nbsp;&nbsp;&nbsp; import org.dom4j.io.*;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; public class MyXMLReader {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String arge[]) {<BR></FONT><FONT size=2>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long lasting = System.currentTimeMillis();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File f = new File("data_10k.xml");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXReader reader = new SAXReader();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc = reader.read(f);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element root = doc.getRootElement();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element foo;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foo = (Element) i.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("车牌号码:" + foo.elementText("NO"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(" 车主地址:" + foo.elementText("ADDR"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("运行时间：" + (System.currentTimeMillis() - lasting) + " 毫秒");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</FONT></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10k消耗时间：109 78 109 31<BR>&nbsp;&nbsp;&nbsp; 100k消耗时间：297 359 172 312<BR>&nbsp;&nbsp;1000k消耗时间：2281 2359 2344 2469<BR>10000k消耗时间：20938 19922 20031 21078</P>
<P><BR><STRONG><FONT size=4>THE END</FONT></STRONG></P>
<P>&nbsp;&nbsp; JDOM 和 DOM 在性能测试时表现不佳，在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础，因为它正式获得 W3C 推荐（与基于非标准的 Java 模型相对），所以在某些类型的项目中可能也需要它（如在 JavaScript 中使用 DOM）。<BR>&nbsp;&nbsp; SAX表现较好，这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。<BR>&nbsp;&nbsp; 无疑，DOM4J是这场测试的获胜者，目前许多开源项目中大量采用 DOM4J，例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性，那就采用DOM4J吧！</P>
<P><BR><STRONG>参考文献：</STRONG><BR><A href="http://www-900.ibm.com/developerWorks/cn/xml/x-injava/index.shtml"><FONT color=#000080>http://www-900.ibm.com/developerWorks/cn/xml/x-injava/index.shtml</FONT></A><BR><A href="http://www-900.ibm.com/developerWorks/cn/xml/x-injava2/index.shtml"><FONT color=#000080>http://www-900.ibm.com/developerWorks/cn/xml/x-injava2/index.shtml</FONT></A><BR>&nbsp; <BR><BR><STRONG><FONT color=#ff0000 size=2>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A href="http://www.blogjava.net/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></P><img src ="http://www.blogjava.net/rosen/aggbug/9950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:40 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精确截取字符串（转载）</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9949.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9949.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9949.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9949.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9949.html</trackback:ping><description><![CDATA[开发中经常遇到，字符串过长，无法完全显示的问题<BR><BR>这时候就需要截取我们所需要的长度，后面显示省略号或其他字符。<BR><BR>由于中文字符占两个字节，而英文字符占用一个字节，所以，单纯地判断字符数，效果往往不尽如人意<BR><BR>下面的方法通过判断字符的类型来进行截取，效果还算可以：）<BR><BR><BR>如果大家有其他的解决方法欢迎贴出来，共同学习：）<BR>**********************************************************************<BR>private String str;<BR>private int counterOfDoubleByte;<BR>private byte b[];<BR>/**<BR>* 设置需要被限制长度的字符串<BR>* @param str 需要被限制长度的字符串<BR>*/<BR>public void setLimitLengthString(String str){<BR>&nbsp; this.str = str;<BR>}<BR>/**<BR>* @param len 需要显示的长度(&lt;font color="red"&gt;注意：长度是以byte为单位的，一个汉字是2个byte&lt;/font&gt;)<BR>* @param symbol 用于表示省略的信息的字符，如“...”,“&gt;&gt;&gt;”等。<BR>* @return 返回处理后的字符串<BR>*/<BR>public String getLimitLengthString(int len, String symbol) throws UnsupportedEncodingException {<BR>&nbsp; counterOfDoubleByte = 0;<BR>&nbsp; b = str.getBytes("GBK");<BR>&nbsp; if(b.length &lt;= len)<BR>&nbsp;&nbsp;&nbsp; return str;<BR>&nbsp; for(int i = 0; i &lt; len; i++){<BR>&nbsp;&nbsp;&nbsp; if(b[i] &lt; 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; counterOfDoubleByte++;<BR>&nbsp; }<BR><BR>&nbsp; if(counterOfDoubleByte % 2 == 0)<BR>&nbsp;&nbsp;&nbsp; return new String(b, 0, len, "GBK") + symbol;<BR>&nbsp; else<BR>&nbsp;&nbsp;&nbsp; return new String(b, 0, len - 1, "GBK") + symbol;<BR>}<BR><BR><BR><FONT color=#ff0000 size=2><STRONG>本文转贴自网友：focus2004 的文章</STRONG></FONT><img src ="http://www.blogjava.net/rosen/aggbug/9949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:39 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序运行时间之我见</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9948.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9948.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9948.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9948.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9948.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 最近很关注XML，关心各种流行解析技术的效率，在测试程序运行时间的时候，遇到一些困难，下面先看看我提出的问题吧。<BR>&nbsp;&nbsp;&nbsp; <BR>----------------------------------------------------------------------------- 
<P>&nbsp;&nbsp;&nbsp; 在一个类中，有一个叫做test()的方法需要被JSP端调用（test()主要任务是System.out.print()），于是在test()方法开始的地方加上"long lasting =System.currentTimeMillis()，"在结束的地方加上"System.out.println("运行时间："+(System.currentTimeMillis() - lasting)+" 毫秒")"。</P>
<P>&nbsp;&nbsp;&nbsp; 然后把test()方法改成main()方法，以便单独测试类，JSP端代码作出相应调整以便访问main()方法。奇怪的事情发生了，经过反复测试，使用JSP访问main()方法消耗的时间为 451 毫秒，而单独运行这个类消耗的时间为 2864 毫秒。</P>
<P>&nbsp;&nbsp;&nbsp; 为什么会这样？是不是WEB容器的原因呢？<BR>&nbsp;&nbsp;&nbsp; <BR>-----------------------------------------------------------------------------</P>
<P>&nbsp;&nbsp;在一个人气很高的论坛上，我得到些解答，自己也总结了一些，请各位看官来发表意见：<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 第一次请求JSP时，WEB容器将JSP发送到编译器，编译成Servlet。然后把Servlet和其他类（比如自己写的类）缓存在WEB容器中，再放入内存常驻，最后将响应结果返回给客户端；而JSP的所有后继请求，WEB容器将自动载入缓存，除非JSP或者类经过修改，否则WEB容器将不会重新执行编译并构造缓存。而单独运行类就不一样了，由于没有WEB容器缓存支持，每次运行都需要重新编译再读入内存才行，所以要慢些了。<BR>&nbsp;&nbsp;&nbsp; 另外，根据测试，在JSP端第一次被调用的时候，时间和单独运行类差不多，这也印证了上面的解释吧。</P>
<P>&nbsp;&nbsp;&nbsp; <BR>附上源程序<BR>类：<BR><FONT size=2>package com.test;<BR>import org.xml.sax.*;<BR>import org.xml.sax.helpers.*; <BR>import javax.xml.parsers.*;</FONT></P>
<P><FONT size=2>public class MyXMLReader extends DefaultHandler{&nbsp; </FONT></P>
<P><FONT size=2>&nbsp;java.util.Stack tags=new java.util.Stack();</FONT></P>
<P><FONT size=2>&nbsp;public MyXMLReader(){<BR>&nbsp; super();<BR>&nbsp;}</FONT></P>
<P><FONT size=2>&nbsp;public static void main(String args[]){<BR>&nbsp;long lasting =System.currentTimeMillis();<BR>&nbsp; try{&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParserFactory sf&nbsp; = SAXParserFactory.newInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAXParser sp = sf.newSAXParser();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyXMLReader reader = new MyXMLReader();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp.parse(new InputSource("data.xml"),reader);<BR>&nbsp; }<BR>&nbsp; catch(Exception e){<BR>&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp; }<BR>&nbsp; System.out.println("运行时间："+(System.currentTimeMillis() - lasting)+" 毫秒");<BR>&nbsp;} </FONT></P>
<P><FONT size=2>&nbsp;public void characters (char ch[], int start, int length)<BR>&nbsp;&nbsp;&nbsp; throws SAXException<BR>&nbsp;&nbsp; {</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;//从栈中得到当前节点的信息<BR>&nbsp;&nbsp; String tag=(String) tags.peek();<BR>&nbsp;&nbsp;&nbsp; if(tag.equals("NO") ){<BR>&nbsp;&nbsp;&nbsp;System.out.print("车牌号码：" +&nbsp; new String(ch,start,length));<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; if(tag.equals("ADDR")){<BR>&nbsp;&nbsp;&nbsp;System.out.println("&nbsp; 地址:" + new String(ch,start,length)); <BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp; }</FONT></P>
<P><FONT size=2>&nbsp;public void startElement(String uri, String localName, String qName, Attributes attrs){&nbsp; <BR>&nbsp;tags.push(qName);<BR>&nbsp;}<BR>}</FONT></P>
<P>JSP：<BR><FONT size=2>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<BR>&lt;%@ page import="com.test.*"%&gt;</FONT></P>
<P><FONT size=2>&lt;%<BR>&nbsp;&nbsp;&nbsp; long lasting =System.currentTimeMillis();<BR>%&gt;<BR>&lt;html&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;body&gt;<BR>&lt;%<BR>&nbsp;&nbsp;&nbsp; String args[]={""};<BR>&nbsp;&nbsp;&nbsp; MyXMLReader.main(args);<BR>%&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/body&gt;<BR>&lt;/html&gt;&nbsp; <BR><BR><BR><BR><STRONG><FONT color=#ff0000>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A href="http://www.blogjava.net/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></FONT></P><img src ="http://www.blogjava.net/rosen/aggbug/9948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:38 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取24位 BMP 图像并生成 JPG 缩略图</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9943.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9943.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9943.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9943.html</trackback:ping><description><![CDATA[
		<p>
				<font size="4">
						<strong>前言<br /></strong>
				</font>    <br />       在任何一个综合性网站，我们往往需要上传一些图片资料。但随着高分辨率DC的普及，上传的图片容量会很大，比如300万象素DC出来的文件基本不下600K。为了管理方便，大家可能不愿意每次都用ACDsee修改它，而直接上传到服务器。但是这种做法在客户端看来就没有那么轻松了，对于拨号上网的用户简直是一场恶梦，虽然你可以在图片区域设置wide和high！<br />    <br />       上一篇文章中（<a href="/rosen/archive/2007/06/12/9940.html">http://www.blogjava.net/rosen/archive/2007/06/12/9940.html</a>）我主要介绍了JPG(JEPG)、GIF、PNG图像的读取及压缩方法，遗憾的是不支持BMP图像。本文一鼓作气、再接再厉，一举解决了这个问题！<br />    <br /><font size="4"><strong>程序代码</strong></font></p>
		<p>
				<font size="2">package BMP;</font>
		</p>
		<p>
				<font size="2">import java.awt.Image;<br />import java.awt.Toolkit;<br />import java.awt.image.BufferedImage;<br />import java.awt.image.MemoryImageSource;</font>
		</p>
		<p>
				<font size="2">import java.io.FileInputStream;<br />import java.io.FileOutputStream;</font>
		</p>
		<p>
				<font size="2">import com.sun.image.codec.jpeg.JPEGCodec;<br />import com.sun.image.codec.jpeg.JPEGImageEncoder;</font>
		</p>
		<p>
				<font size="2">public class BMPReader{</font>
		</p>
		<p>
				<font size="2">    public String Reader(){  <br />        Image image;                                    //构造一个目标图<br />        String result="";                               //返回结果<br /> try{<br />     FileInputStream fs=new FileInputStream("/test.BMP");<br />     int bflen=14;                            <br />     byte bf[]=new byte[bflen];             <br />     fs.read(bf,0,bflen);                       //读取14字节BMP文件头<br />     int bilen=40;                  <br />     byte bi[]=new byte[bilen];<br />     fs.read(bi,0,bilen);                       //读取40字节BMP信息头</font>
		</p>
		<p>
				<font size="2">     // 获取一些重要数据<br />     int nwidth=(((int)bi[7]&amp;0xff)&lt;&lt;24)         //源图宽度<br />     | (((int)bi[6]&amp;0xff)&lt;&lt;16)<br />     | (((int)bi[5]&amp;0xff)&lt;&lt;8)<br />     | (int)bi[4]&amp;0xff;<br />     System.out.println("宽:"+nwidth);<br />            int nheight=(((int)bi[11]&amp;0xff)&lt;&lt;24)       //源图高度<br />     | (((int)bi[10]&amp;0xff)&lt;&lt;16)<br />     | (((int)bi[9]&amp;0xff)&lt;&lt;8)<br />     | (int)bi[8]&amp;0xff;<br />     System.out.println("高:"+nheight);<br />            //位数<br />     int nbitcount=(((int)bi[15]&amp;0xff)&lt;&lt;8) | (int)bi[14]&amp;0xff;<br />     System.out.println("位数:"+nbitcount);<br />            //源图大小<br />     int nsizeimage=(((int)bi[23]&amp;0xff)&lt;&lt;24)<br />     | (((int)bi[22]&amp;0xff)&lt;&lt;16)<br />     | (((int)bi[21]&amp;0xff)&lt;&lt;8)<br />     | (int)bi[20]&amp;0xff;<br />     System.out.println("源图大小:"+nsizeimage);</font>
		</p>
		<p>
				<font size="2">            //对24位BMP进行解析<br />     if(nbitcount==24){<br />         int npad=(nsizeimage/nheight)-nwidth*3;<br />         int ndata[]=new int[nheight*nwidth];<br />         byte brgb[]=new byte[(nwidth+npad)*3*nheight];<br />         fs.read (brgb,0,(nwidth+npad)*3*nheight);<br />         int nindex=0;<br />         for(int j=0;j&lt;nheight;j++){<br />      for(int i=0;i&lt;nwidth;i++){<br />                 ndata [nwidth*(nheight-j-1)+i]=<br />          (255&amp;0xff)&lt;&lt;24<br />          | (((int)brgb[nindex+2]&amp;0xff)&lt;&lt;16)<br />          | (((int)brgb[nindex+1]&amp;0xff)&lt;&lt;8)<br />          | (int)brgb[nindex]&amp;0xff;<br />                 nindex+=3;<br />            }<br />     nindex+=npad;<br />                }<br />  Toolkit kit=Toolkit.getDefaultToolkit();<br />  image=kit.createImage(new MemoryImageSource(nwidth,nheight,<br />      ndata,0,nwidth));<br />                result="从BMP得到图像image";<br />                System.out.println("从BMP得到图像image");<br />     }else{<br />         result="不是24位BMP，失败！";<br />                System.out.println("不是24位BMP，失败！");<br />         image=(Image)null;<br />     }<br />            fs.close();        //关闭输入流<br />            <br />            //开始进行图像压缩（对image对象进行操作）<br />     int wideth=image.getWidth(null);                                   //得到源图宽<br />     int height=image.getHeight(null);                                  //得到源图长<br />     BufferedImage tag=new BufferedImage(wideth/2,height/2,BufferedImage.TYPE_INT_RGB);<br />     tag.getGraphics().drawImage(image,0,0,wideth/2,height/2,null);     //绘制缩小后的图<br />     FileOutputStream out=new FileOutputStream("/newfile.jpg");         //输出到文件流<br />     JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);      <br />     encoder.encode(tag);                                               //进行JPEG编码<br />     out.close();       //关闭输出流                      <br /> }catch (Exception e){<br />     System.out.println(e);<br />        }<br />        return result;<br />    }<br />}<br /><br /></font>
		</p>
		<p>    相信代码部分应该没有什么问题吧？通过以下方法，你可以得到更多的信息：</p>
		<p>
				<br />       //得到压缩值<br />        int ncompression = (((int)bi[19])&lt;&lt;24)<br />        | (((int)bi[18])&lt;&lt;16)<br />        | (((int)bi[17])&lt;&lt;8)<br />        | (int)bi[16];<br />        System.out.println("压缩:"+ncompression);</p>
		<p>
				<br />       //象素情况<br />        int nxpm = (((int)bi[27]&amp;0xff)&lt;&lt;24)<br />        | (((int)bi[26]&amp;0xff)&lt;&lt;16)<br />        | (((int)bi[25]&amp;0xff)&lt;&lt;8)<br />        | (int)bi[24]&amp;0xff;<br />        System.out.println("X-象素/米:"+nxpm);<br />        int nypm = (((int)bi[31]&amp;0xff)&lt;&lt;24)<br />        | (((int)bi[30]&amp;0xff)&lt;&lt;16)<br />        | (((int)bi[29]&amp;0xff)&lt;&lt;8)<br />        | (int)bi[28]&amp;0xff;<br />        System.out.println("Y-象素/米:"+nypm);</p>
		<p>
				<br />       //颜色使用情况<br />        int nclrused = (((int)bi[35]&amp;0xff)&lt;&lt;24)<br />        | (((int)bi[34]&amp;0xff)&lt;&lt;16)<br />        | (((int)bi[33]&amp;0xff)&lt;&lt;8)<br />        | (int)bi[32]&amp;0xff;<br />        System.out.println("颜色使用数:"+nclrused);<br />        int nclrimp = (((int)bi[39]&amp;0xff)&lt;&lt;24)<br />        | (((int)bi[38]&amp;0xff)&lt;&lt;16)<br />        | (((int)bi[37]&amp;0xff)&lt;&lt;8)<br />        | (int)bi[36]&amp;0xff;<br />        System.out.println("颜色显要:"+nclrimp);<br />        int nplanes = (((int)bi[13]&amp;0xff)&lt;&lt;8) | (int)bi[12]&amp;0xff;<br />        System.out.println("位面:"+nplanes);</p>
		<p>
				<br />       //信息头中的图像大小<br />        int nbisize = (((int)bi[3]&amp;0xff)&lt;&lt;24)  <br />        | (((int)bi[2]&amp;0xff)&lt;&lt;16)<br />        | (((int)bi[1]&amp;0xff)&lt;&lt;8)<br />        | (int)bi[0]&amp;0xff;<br />        System.out.println("BMP信息头大小:"+nbisize);</p>
		<p>
				<br />       //文件大小及种类<br />        int nsize=(((int)bf[5]&amp;0xff)&lt;&lt;24)       <br />               | (((int)bf[4]&amp;0xff)&lt;&lt;16)<br />        | (((int)bf[3]&amp;0xff)&lt;&lt;8)<br />        | (int)bf[2]&amp;0xff;<br />        System.out.println("文件种类:"+(char)bf[0]+(char)bf[1]);<br />        System.out.println("文件大小:"+nsize);<br />        <br /><font size="4"><strong>后记</strong></font></p>
		<p>       可以通过变量nbitcount来判断是否是8位位图并作出相应处理。限于目前24位位图应用较为广泛，所以没有写出相应代码，如有需要可查阅Jeff West与John D.Mitchell之著作《How to read 8- and 24-bit Microsoft Windows bitmaps in Java applications》。</p>
		<p>       在此，我谨慎的表示：因为位图（BMP）没有经过压缩，所以对于源图的容量几乎没有限制，不会出现内存不足的情况。<br />    <br />       在写这篇文章时我只进行了9M左右BMP的读取，其实大家有兴趣的话可以利用50M左右的TIF图转换为BMP（几乎还是50M）来做试验。并欢迎上来指正。<br /><br /><br /><br /><strong><font color="#ff0000">请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</font></strong><a href="/rosen"><font face="宋体" color="#ff0000" size="2"><strong>http://www.blogjava.net/rosen</strong></font></a></p>
<img src ="http://www.blogjava.net/rosen/aggbug/9943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:27 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google 搜索之 WebService 篇</title><link>http://www.blogjava.net/rosen/archive/2005/08/12/9941.html</link><dc:creator>Rosen</dc:creator><author>Rosen</author><pubDate>Fri, 12 Aug 2005 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/rosen/archive/2005/08/12/9941.html</guid><wfw:comment>http://www.blogjava.net/rosen/comments/9941.html</wfw:comment><comments>http://www.blogjava.net/rosen/archive/2005/08/12/9941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rosen/comments/commentRss/9941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rosen/services/trackbacks/9941.html</trackback:ping><description><![CDATA[<P><FONT size=4><STRONG>前 言</STRONG></FONT></P>
<P>&nbsp;&nbsp;&nbsp; 通过本文，你将能了解到如何配置服务以及Google WebService的语法结构；怎样个性化你的搜索，例如:国家、语言；怎样提炼搜索结果。<BR>&nbsp;&nbsp;&nbsp; Google目前已经成了Web上最流行的搜索引擎，为了让诸如new content watchdog、GUI搜索工具和模式分析之类的应用程序成为可能，现在它们为20亿个页面建立了索引，开发者们可以通过基于SOAP的API进行调用。<BR>&nbsp;&nbsp;&nbsp; <BR><FONT size=4><STRONG>WebService 简介</STRONG></FONT></P>
<P>&nbsp;&nbsp;&nbsp; Web应用的巨大成功和不断发展，使其渗透到商业领域和个人生活的各个方面。人们只要使用浏览器，就可以享受到各种各样的Web服务，例如网上购物，网上交易，网络游戏，预定车票，网上聊天和交友等等。与此同时，由于Web技术所带来的优势（统一的客户端和较好的维护性），使一些传统的应用纷纷转型到基于B/S架构的瘦客户端应用程序，这是因为它能够避免花在桌面应用程序发布上的高成本，也能够很好的解决客户和服务器之间的通信问题。在客户端和服务器之间的通信，一个完美的解决方案是使用HTTP协议来通信。这是因为任何运行Web浏览器的机器都使用HTTP协议，可以很好地透过防火墙进行通信。许多商业程序还面临另一个问题，那就是与其他程序的互操作性。目前有很多商业数据仍然在大型主机上以非关系文件（VSAM）的形式存放，并由COBOL语言编写的大型机程序访问。而且，还有很多商业程序使用C++、JAVA、VB和其他各种各样的语言编写。现在初了最简单的程序之外，所有的程序都需要与运行在其他异构平台上的应用程序集成并进行数据交换。在以前，没有一个应用程序通信标准是独立于平台、组建模型和编程语言的。只有通过Web Service、客户端和服务器才能够自由的用HTTP进行通信，不论两个程序的平台和编程语言是什么。Web Service技术完全基于标准的技术，只有基于标准，所有的开放厂商才能有相同的标准，才能够在各自的平台上开发出具有跨平台互操作能力的软件产品和解决方案。标准时达成跨平台互操作能力的灵魂。 </P>
<P>&nbsp;&nbsp;&nbsp; Web是为了程序到用户的交互，而Web Service是为程序到程序的交互做准备。Web Service使公司可以降低进行电子商务的成本、更快的部署解决方案以及开拓新机遇。达到这个目标的关键在于通用的程序到程序通信模型，该模型应建立在现有的和新兴的标准之上。其中包括：HTTP，SOAP, WSDL, UDDI<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>SOAP：</STRONG>是“Simple Object Access Protocol”的缩写，SOAP是消息传递的协议,它规定了Web Services之间是怎样传递信息的。<BR>简单的说，SOAP规定了：<BR>1. 传递信息的格式为XML。这就使Web Services能够在任何平台上，用任何语言进行实现。<BR>2. 远程对象方法调用的格式。规定了怎样表示被调用对象以及调用的方法名称和参数类型等。<BR>3. 参数类型和XML格式之间的映射。这是因为，被调用的方法有时候需要传递一个复杂的参数，例如，一个Person对象。怎样用XML来表示一个对象参数，也是SOAP所定义的范围。</P>
<P>&nbsp;&nbsp;&nbsp; <STRONG>WSDL：</STRONG>是“Web Services Description Language”的缩写。WSDL是Web Services的定义语言。当实现了某种服务的时候(如：股票查询服务)，为了让别的程序调用，必须告诉大家服务接口。例如：服务名称，服务所在的机器名称，监听端口号，传递参数的类型，个数和顺序，返回结果的类型等等。这样别的应用程序才能调用该服务。WSDL协议就是规定了有关Web Services描述的标准。</P>
<P>&nbsp;&nbsp;&nbsp; <STRONG>UDDI：</STRONG>是“Universal Description, Discovery,and Integration”的缩写。简单说，UDDI用于集中存放和查找WSDL描述文件，起着目录服务器的作用。</P>
<P><FONT size=4><STRONG><BR>快速安装</STRONG></FONT></P>
<P>&nbsp;&nbsp;&nbsp; 本文的运行环境是JDK1.3+Tomcat4.0+JSP。要使用Google的服务，必须要有“license key”，可以在<A href="https://www.google.com/accounts/NewAccount?continue=http://api.google.com/createkey&amp;followup=http://api.google.com/createkey">https://www.google.com/accounts/NewAccount?continue=http://api.google.com/createkey&amp;followup=http://api.google.com/createkey</A>中取得，输入相应的信息，然后到你的邮箱收取“license key”。接着还需要“Java API for XML Messaging”亦即“JAXM”。它是Java XML Pack的一部分，在<A href="http://java.sun.com/xml/downloads/javaxmlpack.html">http://java.sun.com/xml/downloads/javaxmlpack.html</A>提供。<BR>&nbsp;&nbsp;&nbsp; 为了更简单的表达，我直接用JSP模式，并使用手工编码，没有用IDE环境。<BR>&nbsp;&nbsp;&nbsp; 解开刚才下载的java_xml_pack-summer02_01.zip，找到java_xml_pack-summer-02_01\jaxp-1.2_01\xalan.jar文件，用WinRAR解开把org文件夹拷贝到你的应用程序的WEB-INF\classes下。找到java_xml_pack-summer-02_01\jaxm-1.1_01\lib\saaj-api.jar文件，解开它并拷贝javax文件夹到同上的目录。找到java_xml_pack-summer-02_01\jaxm-1.1_01\lib\jaxm-api.jar文件，解开它并拷贝javax文件夹到相同目录。找到java_xml_pack-summer-02_01\jaxp-1.2_01\jaxp-api.jar文件，解开它并拷贝javax文件夹到相同目录。找到java_xml_pack-summer-02_01\jaxm-1.1_01\jaxm\saaj-ri.jar文件，解开并拷贝com文件夹到相同目录。<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; </P>
<P><FONT size=4><STRONG>程序源代码</STRONG></FONT></P>
<P><FONT size=1>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<BR>&lt;%@ page import="org.apache.xalan.processor.TransformerFactoryImpl"%&gt;<BR>&lt;%@ page import="javax.xml.soap.SOAPConnectionFactory"%&gt;<BR>&lt;%@ page import="javax.xml.soap.SOAPConnection"%&gt;<BR>&lt;%@ page import="javax.xml.soap.MessageFactory"%&gt;<BR>&lt;%@ page import="javax.xml.soap.SOAPMessage"%&gt;<BR>&lt;%@ page import="javax.xml.soap.SOAPPart"%&gt;<BR>&lt;%@ page import="javax.xml.soap.SOAPEnvelope"%&gt; <BR>&lt;%@ page import="javax.xml.soap.SOAPBody"%&gt;<BR>&lt;%@ page import="javax.xml.soap.SOAPElement"%&gt; <BR>&lt;%@ page import="java.io.FileInputStream"%&gt;<BR>&lt;%@ page import="javax.xml.transform.stream.StreamSource"%&gt;<BR>&lt;%@ page import="javax.xml.messaging.URLEndpoint"%&gt;<BR>&lt;%@ page import="javax.xml.transform.TransformerFactory"%&gt; <BR>&lt;%@ page import="javax.xml.transform.Transformer"%&gt;<BR>&lt;%@ page import="javax.xml.transform.Source"%&gt;<BR>&lt;%@ page import="javax.xml.transform.stream.StreamResult"%&gt;</FONT></P>
<P><FONT size=1>&lt;html&gt;<BR>&lt;head&gt;<BR>&lt;title&gt;google WebService&lt;/title&gt;<BR>&lt;/head&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&lt;%<BR>try {&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; //</FONT><FONT size=1>首</FONT><FONT size=1>先建立一个连接<BR>&nbsp;&nbsp;&nbsp; SOAPConnectionFactory soapConnFactory = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAPConnectionFactory.newInstance();<BR>&nbsp;&nbsp;&nbsp; SOAPConnection connection = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; soapConnFactory.createConnection();</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp; //</FONT><FONT size=1>接</FONT><FONT size=1>着，创建消息<BR>&nbsp;&nbsp;&nbsp; MessageFactory messageFactory=MessageFactory.newInstance();<BR>&nbsp;&nbsp;&nbsp; SOAPMessage message=messageFactory.createMessage();<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; //</FONT><FONT size=1>为</FONT><FONT size=1>消息部份创建SOAP对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; SOAPPart soapPart=message.getSOAPPart();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; //</FONT><FONT size=1>组</FONT><FONT size=1>装信息，根据C盘根目录下search.msg文件进行搜索<BR>&nbsp;&nbsp;&nbsp; StreamSource preppedMsgSrc=new StreamSource(new FileInputStream("/search.msg"));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; soapPart.setContent(preppedMsgSrc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; //</FONT><FONT size=1>保</FONT><FONT size=1>存消息<BR>&nbsp;&nbsp;&nbsp; message.saveChanges();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; </FONT><FONT size=1>//发</FONT><FONT size=1>送到目标地址<BR>&nbsp;&nbsp;&nbsp; URLEndpoint destination= <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new URLEndpoint("http://api.google.com/search/beta2");<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; </FONT><FONT size=1>//发</FONT><FONT size=1>送消息<BR>&nbsp;&nbsp;&nbsp; SOAPMessage reply=connection.call(message, destination);</FONT></P>
<P><FONT size=1>&nbsp;&nbsp;&nbsp; </FONT><FONT size=1>//保</FONT><FONT size=1>存输出，建立传出信息<BR>&nbsp;&nbsp; TransformerFactory transformerFactory = <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransformerFactory.newInstance();</FONT></P>
<P><FONT size=1>&nbsp;&nbsp; </FONT><FONT size=1>//根</FONT><FONT size=1>据样式文件translate.xsl进行解析<BR>&nbsp;&nbsp; Source styleSheet=new StreamSource("/translate.xsl");&nbsp;&nbsp; <BR>&nbsp;&nbsp; Transformer transformer= <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transformerFactory.newTransformer(styleSheet);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; </FONT><FONT size=1>//提</FONT><FONT size=1>取收到的内容<BR>&nbsp;&nbsp; Source sourceContent=reply.getSOAPPart().getContent();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; </FONT><FONT size=1>//建</FONT><FONT size=1>立输出文件results.out<BR>&nbsp;&nbsp; StreamResult result=new StreamResult("/results.out");&nbsp; <BR>&nbsp;&nbsp; transformer.transform(sourceContent, result);<BR>&nbsp;&nbsp; out.println("文件已生成C:\results.out");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp; </FONT><FONT size=1>//关</FONT><FONT size=1>闭连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; connection.close();<BR>}catch(Exception e){<BR>&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());<BR>} <BR>%&gt;</FONT></P>
<P><FONT size=1>&lt;/body&gt;<BR>&lt;/html&gt;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 源代码部分完全按照Google的规定进行编写，程序注解部分也在其中，这里就不罗嗦了。</FONT></P>
<P><FONT size=4><STRONG><BR>搜索格式</STRONG></FONT></P>
<P><FONT size=1>&lt;?xml version='1.0' encoding='UTF-8'?&gt; <BR>&lt;SOAP-ENV:Envelope&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsd="http://www.w3.org/1999/XMLSchema"&gt;<BR>&nbsp;&nbsp; &lt;SOAP-ENV:Body&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;ns1:doGoogleSearch&nbsp; xmlns:ns1="urn:GoogleSearch" <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key xsi:type="xsd:string"&gt;00000000000000000000000000000000&lt;/key&gt;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;q xsi:type="xsd:string"&gt;CSDN论坛&lt;/q&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;start xsi:type="xsd:int"&gt;0&lt;/start&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;maxResults xsi:type="xsd:int"&gt;10&lt;/maxResults&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter xsi:type="xsd:boolean"&gt;false&lt;/filter&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;restrict xsi:type="xsd:string"&gt;&lt;/restrict&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;safeSearch xsi:type="xsd:boolean"&gt;false&lt;/safeSearch&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;lr xsi:type="xsd:string"&gt;&lt;/lr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ie xsi:type="xsd:string"&gt;latin1&lt;/ie&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;oe xsi:type="xsd:string"&gt;latin1&lt;/oe&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/ns1:doGoogleSearch&gt; <BR>&nbsp; &lt;/SOAP-ENV:Body&gt;<BR>&lt;/SOAP-ENV:Envelope&gt;</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; search.msg文件标签&lt;&lt;key&gt;&lt;/key&gt;之前的为固定格式，无需费心。标签&lt;key&gt;就是本文第一部分所提到的“license key”，直接复制过来。标签&lt;q&gt;是指具体要搜索的内容。标签&lt;start&gt;是指从第几个开始搜索。标签&lt;maxResults&gt;是指每次返回搜索结果的最大值，Google WebService规定，最大值只能是“10”。标签&lt;filter&gt;是指过滤掉结果中相似和域名相同的结果。标签&lt;restrict&gt;是指国家和主题的约束，例如要限制只在国内搜索，就需要输入countryCN；要限制只在Linux主题内搜索，就输入linux。标签&lt;safeSearch&gt;过滤掉成人信息。标签&lt;lr&gt;搜索的语言，例如只搜索简体中文，就要输入lang_zh-CN。标签&lt;ie&gt;和&lt;oe&gt;分别指输入和输出的编码格式默认为latin1(UTF-8)。</FONT></P>
<P><STRONG><FONT size=2><FONT size=4><BR>解析格式</FONT></FONT></STRONG></P>
<P><FONT size=1>&lt;?xml version="1.0"?&gt; <BR>&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &lt;xsl:output method="text"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;xsl:template match="/"&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:apply-templates select="//item"/&gt; <BR>&nbsp;&nbsp;&nbsp; &lt;/xsl:template&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;xsl:template match="item"&gt; <BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="title" disable-output-escaping="yes"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:text&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="URL"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;/xsl:text&gt;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="summary"/&gt; <BR>&nbsp; &lt;/xsl:template&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&lt;/xsl:stylesheet&gt; </FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; translate.xsl文件。我们从&lt;xsl:value-of select="title" disable-output-escaping="yes"/&gt;这一句开始，select="title"确定了返回结果的第一部分为标题。接下来，select="URL"解析出URL地址。&lt;xsl:text&gt;&lt;/xsl:text&gt;暂且理解为换行标签吧。select="summary"解析出摘要。还有一些标签，详情请参考“Google Web APIs Reference”。</FONT></P>
<P><STRONG><FONT size=2><FONT size=4><BR>后 记</FONT></FONT></STRONG></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp; 程序运行以后所产生的结果results.out请大家自己去查看，在这里就不一一列举了。<BR>&nbsp;&nbsp;&nbsp; 创作这篇文章的目的纯属个人爱好，完全是对Google引擎的一种喜爱。文章不是很有深度，希望能给各位起到抛砖引玉的作用我就满足了，更加丰富的功能还有待我们去探索！<BR><BR><BR><BR><STRONG><FONT color=#ff0000>请注意！引用、转贴本文应注明原作者：Rosen Jiang 以及出处：</FONT></STRONG><A href="http://www.blogjava.net/rosen"><FONT face=宋体 color=#ff0000 size=2><STRONG>http://www.blogjava.net/rosen</STRONG></FONT></A></FONT></P><img src ="http://www.blogjava.net/rosen/aggbug/9941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rosen/" target="_blank">Rosen</a> 2005-08-12 15:25 <a href="http://www.blogjava.net/rosen/archive/2005/08/12/9941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>