﻿<?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-HIMMEL</title><link>http://www.blogjava.net/lazing/</link><description>Future network: Share and Create...</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:01:59 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:01:59 GMT</pubDate><ttl>60</ttl><item><title>使用XFire与Spring开发Web Service</title><link>http://www.blogjava.net/lazing/archive/2007/08/16/xfire_spring_web_service.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Thu, 16 Aug 2007 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/08/16/xfire_spring_web_service.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/137198.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/08/16/xfire_spring_web_service.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/137198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/137198.html</trackback:ping><description><![CDATA[<p><span>使用XFire与Spring开发Web Service </span></p>
<p>源代码下载（三个样例工程Maven版本） <a href="http://blog.ave7.org/lazing/files/2007/08/xfire-src.zip" title="xfire-src.zip">xfire-src.zip </a></p>
<p>相关lib文件请到XFire官方网站（见参考） 下载发布版本。</p>
<p><a href="http://blog.ave7.org/lazing/files/2007/08/xfire-spring.pdf" title="%e4%bd%bf%e7%94%a8xfire%e4%b8%8espring.pdf">PDF版本下载</a></p>
<p><span><strong>目录<br>
</strong></span><a href="http://blog.ave7.org/lazing/#_Toc175025960">实现功能与特点    2<br>
</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025961">运行环境    2</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025962">开发平台    2</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025963">实施步骤    2</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025964">概述    2</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025965">新建Java Project    3</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025966">新建WTP动态WEB工程    4</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025967">实现服务    6</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025968">利用Spring、XFire装配与暴露服务    7</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025969">测试并访问服务    7</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025970">利用XFire实现客户端    10</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025971">扩展主题    11</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025972">利用MTOM传输二进制对象（文件）    11</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025973">附录    12</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025974">XFire在WebLogic 8.1中的配置    12</a></p>
<p><a href="http://blog.ave7.org/lazing/#_Toc175025975">参考    12</a></p>
<h1>实现功能与特点</h1>
<ul>
    <li>基于J2EE平台的Web Service服务</li>
    <li>开发方便，配置简单
    <ul>
        <li>设计接口</li>
        <li>实现服务</li>
        <li>配置暴露接口</li>
        <li>XFire将自动生成对应的wsdl</li>
        <li>支持高级详细配置</li>
    </ul>
    </li>
    <li>与Spring无缝集成</li>
</ul>
<h1>运行环境</h1>
<ul>
    <li>JDK 1.4+</li>
    <li>Tomcat 4.0+ / WebLogic 8.1 （需要特殊配置，见附录）未测试其他环境</li>
    <li>其他包依赖参看 <a href="http://xfire.codehaus.org/Dependency+Guide">http://xfire.codehaus.org/Dependency+Guide</a></li>
</ul>
<h1>开发平台</h1>
<ul>
    <li>Eclipse WTP 1.5 平台IDE：<a href="http://www.eclipse.org/webtools/"><span>www.<strong>eclipse</strong>.org/webtools/</span></a><span><br>
    </span></li>
    <li>XFire 1.2.6 <a href="http://xfire.codehaus.org/Home">http://xfire.codehaus.org/Home</a></li>
    <li>可以选择安装XFire for Eclipse插件，可以添加XFire相关类库，根据WSDL生成代码。<a href="http://xfire.codehaus.org/Eclipse+Plugin">http://xfire.codehaus.org/Eclipse+Plugin</a></li>
    <li>JDK 1.4.2 <a href="http://java.sun.com/products/archive/">http://java.sun.com/products/archive/</a></li>
    <li>Tomcat 5.0.28 <a href="http://tomcat.apache.org/download-55.cgi">http://tomcat.apache.org/download-55.cgi#5.0.28</a></li>
</ul>
<h1>实施步骤</h1>
<h2>概述</h2>
<ol>
    <li>建立一个Java Project用于Domain实体和Web Service接口，这个工程的输出是一个jar包，为Web Service工程和Web Service Client共享。</li>
    <li>建立WTP动态WEB工程部署Web Service</li>
    <li>建立Java Project使用Web Service (Web Service Client)</li>
</ol>
<h2>新建Java Project</h2>
<ol>
    <li>建立普通Java Project 以下称为common工程</li>
    <li>如果使用Maven，项目依赖</li>
</ol>
<p><span>        <span>&lt;</span><span>dependency</span><span>&gt;</span><br>
</span></p>
<p><span>            <span>&lt;</span><span>groupId</span><span>&gt;</span>javax.mail<span>&lt;/</span><span>groupId</span><span>&gt;</span><br>
</span></p>
<p><span>            <span>&lt;</span><span>artifactId</span><span>&gt;</span>mail<span>&lt;/</span><span>artifactId</span><span>&gt;</span><br>
</span></p>
<p><span>            <span>&lt;</span><span>version</span><span>&gt;</span>1.4<span>&lt;/</span><span>version</span><span>&gt;</span><br>
</span></p>
<p><span>        <span>&lt;/</span><span>dependency</span><span>&gt;<br>
</span></span></p>
<ol>
    <li>普通情况需要加入如下lib</li>
</ol>
<p><span>activation-1.1.jar<br>
</span></p>
<p><span>mail-1.4.jar<br>
</span></p>
<ol>
    <li>编写类 org.ave7.xfire.domain.User</li>
</ol>
<p>org.ave7.xfire.domain.User.java</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.ave7.xfire.domain;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.Serializable;<br><br></span><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;User&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br><br></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;">6517808321041980976L</span><span style="color: #000000;">;<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Long&nbsp;userId;<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;accountId;<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;userName;<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Date&nbsp;lastLogin;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getAccountId()&nbsp;{<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;accountId;<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setAccountId(String&nbsp;accountId)&nbsp;{<br><br></span><span style="color: #0000ff;">this</span><span style="color: #000000;">.accountId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;accountId;<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Date&nbsp;getLastLogin()&nbsp;{<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;lastLogin;<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setLastLogin(Date&nbsp;lastLogin)&nbsp;{<br><br></span><span style="color: #0000ff;">this</span><span style="color: #000000;">.lastLogin&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;lastLogin;<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Long&nbsp;getUserId()&nbsp;{<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;userId;<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUserId(Long&nbsp;userId)&nbsp;{<br><br></span><span style="color: #0000ff;">this</span><span style="color: #000000;">.userId&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;userId;<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getUserName()&nbsp;{<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;userName;<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setUserName(String&nbsp;userName)&nbsp;{<br><br></span><span style="color: #0000ff;">this</span><span style="color: #000000;">.userName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;userName;<br><br>}<br><br>}</span></div>
<br>
<ol>
    <li>编写接口 org.ave7.xfire.ws.UserService</li>
</ol>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">org.ave7.xfire.ws.UserService.java<br><br></span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.ave7.xfire.ws;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.ave7.xfire.domain.User;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;UserService&nbsp;{<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;User&nbsp;queryUserByAccoutId(String&nbsp;accountId);<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createUser(User&nbsp;user);<br><br>}</span></div>
<br>
<h2>新建WTP动态WEB工程</h2>
<ol>
    <li>配置WTP加入Tomcat Server Runtime
    <ol>
        <li>选择Windows -&gt; Preference</li>
        <li>在左侧选择Server-&gt;Installed Runtime 添加Tomcat<br>
        <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring1.png"></li>
    </ol>
    </li>
    <li>新建工程，选择Dynamic Web Project 输入Project Name: XFireService<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring2.png"></li>
    <li>设置运行环境为Dynamic Web Module 2.3 ,  JDK 1.4<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring3.png"></li>
    <li>如果需要结合Maven，请如下配置，否则使用默认即可<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring4.png"></li>
    <li>如果使用Maven请注入如下依赖以及之前的Common工程，否则根据后面的列表复制lib文件到对应目录</li>
</ol>
<p><span>&lt;dependency&gt;<br>
</span></p>
<p><span>      &lt;groupId&gt;org.codehaus.xfire&lt;/groupId&gt;<br>
</span></p>
<p><span>      &lt;artifactId&gt;xfire-aegis&lt;/artifactId&gt;<br>
</span></p>
<p><span>      &lt;version&gt;1.2.4&lt;/version&gt;<br>
</span></p>
<p><span>    &lt;/dependency&gt;<br>
</span></p>
<p><span>    &lt;dependency&gt;<br>
</span></p>
<p><span>      &lt;groupId&gt;org.codehaus.xfire&lt;/groupId&gt;<br>
</span></p>
<p><span>      &lt;artifactId&gt;xfire-spring&lt;/artifactId&gt;<br>
</span></p>
<p><span>      &lt;version&gt;1.2.4&lt;/version&gt;<br>
</span></p>
<p><span>    &lt;dependency&gt;<br>
</span></p>
<p><span>      &lt;groupId&gt;xalan&lt;/groupId&gt;<br>
</span></p>
<p><span>      &lt;artifactId&gt;xalan&lt;/artifactId&gt;<br>
</span></p>
<p><span>      &lt;version&gt;2.7.0&lt;/version&gt;<br>
</span></p>
<p><span>    &lt;/dependency&gt;</span></p>
<br>
<p>Lib文件列表</p>
<p><span>xbean-2.2.0.jar<br>
</span></p>
<p><span>qdox-1.5.jar<br>
</span></p>
<p><span>commons-attributes-api-2.1.jar<br>
</span></p>
<p><span>ant-1.5.jar<br>
</span></p>
<p><span>wstx-asl-3.2.0.jar<br>
</span></p>
<p><span>stax-utils-20040917.jar<br>
</span></p>
<p><span>commons-httpclient-3.0.jar<br>
</span></p>
<p><span>spring-1.2.6.jar<br>
</span></p>
<p><span>XmlSchema-1.1.jar<br>
</span></p>
<p><span>stax-api-1.0.1.jar<br>
</span></p>
<p><span>jaxen-1.1-beta-9.jar<br>
</span></p>
<p><span>xfire-annotations-1.2.4.jar<br>
</span></p>
<p><span>xfire-aegis-1.2.4.jar<br>
</span></p>
<p><span>xfire-core-1.2.4.jar<br>
</span></p>
<p><span>xfire-spring-1.2.4.jar<br>
</span></p>
<p><span>xfire-xmlbeans-1.2.4.jar<br>
</span></p>
<p><span>jdom-1.0.jar<br>
</span></p>
<p><span>xbean-spring-2.7.jar<br>
</span></p>
<p><span>wsdl4j-1.6.1.jar<br>
</span></p>
<p><span>commons-beanutils-1.7.0.jar<br>
</span></p>
<p><span>activation-1.1.jar<br>
</span></p>
<p><span>mail-1.4.jar<br>
</span></p>
<p><span>commons-codec-1.3.jar<br>
</span></p>
<p><span>xmlParserAPIs-2.6.2.jar<br>
</span></p>
<p><span>xercesImpl-2.6.2.jar<br>
</span></p>
<p><span>junit-3.8.1.jar<br>
</span></p>
<p><span>commons-logging-1.0.4.jar<br>
xalan-2.7.0.jar<br>
</span></p>
<h2>实现服务</h2>
<p>org.ave7.xfire.ws.UserServiceImpl.java</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.ave7.xfire.ws;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.rmi.RemoteException;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Date;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.commons.logging.Log;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.commons.logging.LogFactory;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.ave7.xfire.domain.User;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;UserServiceImpl&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;UserService&nbsp;{<br><br></span><span style="color: #0000ff;">private</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">static</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;Log&nbsp;log&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LogFactory.getLog(UserServiceImpl.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;createUser(User&nbsp;user)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;RemoteException&nbsp;{<br><br>log.debug(&#8220;createUser&nbsp;user</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user);<br><br>}<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;User&nbsp;queryUserByAccoutId(String&nbsp;accountId)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;"><br>RemoteException&nbsp;{<br><br>log.debug(&#8220;accountId</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;accountId);<br><br>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><br>user.setAccountId(&#8220;testAccount&#8221;);<br><br>user.setLastLogin(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date());<br><br>user.setUserName(&#8220;测试用户&#8220;);<br><br>user.setUserId(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Long(</span><span style="color: #000000;">123L</span><span style="color: #000000;">));<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;user;<br><br>}<br><br>}</span></div>
<br>
<h2>利用Spring、XFire装配与暴露服务</h2>
<ol>
    <li>在web.xml配置相关组件</li>
</ol>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version=&#8220;1.0&#8243;&nbsp;encoding=&#8220;UTF-8&#8243;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;web-app&nbsp;PUBLIC&nbsp;&#8220;-//Sun&nbsp;Microsystems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;2.3//EN&#8221; <br>&#8220;http://java.sun.com/dtd/web-app_2_3.dtd&#8221;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">web-app&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">=&#8220;WebApp_ID&#8221;&gt;<br><br></span><span style="color: #ff0000;">&lt;display-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">XFireService</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">display-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">context-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">contextConfigLocation</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">classpath:applicationContext*.xml</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param-value</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">context-param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>org.springframework.web.context.ContextLoaderListener<br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">listener</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">xfire</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>org.codehaus.xfire.spring.XFireSpringServlet<br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">xfire</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/service/*</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">web-app</span><span style="color: #0000ff;">&gt;</span></div>
<br>
<ol>
    <li>在applicationContext.xml配置相关服务</li>
</ol>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version=&#8220;1.0&#8243;&nbsp;encoding=&#8220;UTF-8&#8243;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;&#8220;-//SPRING//DTD&nbsp;BEAN//EN&#8221;<br><br>&#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">import&nbsp;</span><span style="color: #ff0000;">resource</span><span style="color: #0000ff;">=&#8220;classpath:org/codehaus/xfire/spring/xfire.xml&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">=&#8220;baseWebService&#8221;<br><br></span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">=&#8220;org.codehaus.xfire.spring.remoting.XFireExporter&#8221;<br><br></span><span style="color: #ff0000;">lazy-init</span><span style="color: #0000ff;">=&#8220;false&#8221;&nbsp;</span><span style="color: #ff0000;">abstract</span><span style="color: #0000ff;">=&#8220;true&#8221;&gt;<br><br></span><span style="color: #ff0000;">&lt;property&nbsp;name</span><span style="color: #0000ff;">=&#8220;serviceFactory&#8221;&nbsp;</span><span style="color: #ff0000;">ref</span><span style="color: #0000ff;">=&#8220;xfire.serviceFactory&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=&#8220;xfire&#8221;&nbsp;</span><span style="color: #ff0000;">ref</span><span style="color: #0000ff;">=&#8220;xfire&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">=&#8220;userWS&#8221;&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">=&#8220;org.ave7.xfire.ws.UserServiceImpl&#8221;&gt;&lt;/bean&gt;<br><br></span><span style="color: #ff0000;">&lt;bean&nbsp;id</span><span style="color: #0000ff;">=&#8220;userService&#8221;&nbsp;</span><span style="color: #ff0000;">parent</span><span style="color: #0000ff;">=&#8220;baseWebService&#8221;&gt;<br><br></span><span style="color: #ff0000;">&lt;property&nbsp;name</span><span style="color: #0000ff;">=&#8220;serviceBean&#8221;&nbsp;</span><span style="color: #ff0000;">ref</span><span style="color: #0000ff;">=&#8220;userWS&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=&#8220;serviceClass&#8221;<br><br></span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">=&#8220;org.ave7.xfire.ws.UserService&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span></div>
<br>
<h2>测试并访问服务</h2>
<ol>
    <li>检查lib文件夹，Maven用户注意添加对common工程的依赖，其他情况请把common工程导出的jar包复制到web-inf/lib目录</li>
    <li>在WTP中添加服务器，部署应用<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring5.png"></li>
    <li>在浏览器中输入类似 <a href="http://localhost:8080/XFireService/service">http://localhost:8080/XFireService/service</a> 应看到<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring6.png"></li>
    <li>点击wsdl <a href="http://localhost:8080/XFireService/service/UserService?wsdl">http://localhost:8080/XFireService/service/UserService?wsdl</a> 看到<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring7.png"><br>
    如果这一步出现500错误，请检查是否有xalan.jar包</li>
    <li>在WTP中利用Web Service Explore测试SOAP方式，在WTP工具栏选择<img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring8.png"> 最右侧按钮</li>
    <li>点击右上角进入WSDL page<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring9.png"></li>
    <li>点击WSDL Main节点输入服务wsdl地址，点击<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring10.png"></li>
    <li>列出所有的可用服务，选择服务测试<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring11.png"></li>
    <li>测试queryUserByAccountId<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring12.png"></li>
    <li>点击结果中的Source可以看到SOAP报文<br>
    <img src="http://blog.ave7.org/lazing/files/2007/08/081607-0426-xfirespring13.png"></li>
</ol>
<h2>利用XFire实现客户端</h2>
<ol>
    <li>新建一个普通Java工程，lib中引用XFire相关包</li>
</ol>
<p>如果使用Maven添加如下依赖以及对common工程的引用</p>
<p><span>        <span>&lt;</span><span>dependency</span><span>&gt;</span><br>
</span></p>
<p><span>            <span>&lt;</span><span>groupId</span><span>&gt;</span>org.codehaus.xfire<span>&lt;/</span><span>groupId</span><span>&gt;</span><br>
</span></p>
<p><span>            <span>&lt;</span><span>artifactId</span><span>&gt;</span>xfire-aegis<span>&lt;/</span><span>artifactId</span><span>&gt;</span><br>
</span></p>
<p><span>            <span>&lt;</span><span>version</span><span>&gt;</span>1.2.4<span>&lt;/</span><span>version</span><span>&gt;</span><br>
</span></p>
<p><span>        <span>&lt;/</span><span>dependency</span><span>&gt;</span><br>
</span></p>
<p>普通Java工程添加如下lib以及对common工程的引用</p>
<p><span>activation-1.1.jar<br>
</span></p>
<p><span>commons-codec-1.3.jar<br>
</span></p>
<p><span>commons-httpclient-3.0.jar<br>
</span></p>
<p><span>commons-logging-1.0.4.jar<br>
</span></p>
<p><span>jaxen-1.1-beta-9.jar<br>
</span></p>
<p><span>jdom-1.0.jar<br>
</span></p>
<p><span>junit-3.8.1.jar<br>
</span></p>
<p><span>mail-1.4.jar<br>
</span></p>
<p><span>stax-api-1.0.1.jar<br>
</span></p>
<p><span>stax-utils-20040917.jar<br>
</span></p>
<p><span>wsdl4j-1.6.1.jar<br>
</span></p>
<p><span>wstx-asl-3.2.0.jar<br>
</span></p>
<p><span>xercesImpl-2.6.2.jar<br>
</span></p>
<p><span>xfire-aegis-1.2.4.jar<br>
</span></p>
<p><span>xfire-core-1.2.4.jar<br>
</span></p>
<p><span>xmlParserAPIs-2.6.2.jar<br>
</span></p>
<p><span>XmlSchema-1.1.jar<br>
</span></p>
<ol>
    <li>编写客户端程序</li>
</ol>
<p>org.ave7.xfire.client.MyClient.java</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org.ave7.xfire.client;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.net.MalformedURLException;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.rmi.RemoteException;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.ave7.xfire.domain.User;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.ave7.xfire.ws.UserService;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.codehaus.xfire.client.XFireProxyFactory;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.codehaus.xfire.service.Service;<br><br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.codehaus.xfire.service.binding.ObjectServiceFactory;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyClient&nbsp;{<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">static</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br><br></span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br><br>Service&nbsp;serviceModel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectServiceFactory()<br><br>.create(UserService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br><br>UserService&nbsp;service&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(UserService)&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XFireProxyFactory().create(<br><br>serviceModel,<br><br>&#8220;http:</span><span style="color: #008000;">//</span><span style="color: #008000;">localhost:8080/XFireService/service/UserService&#8221;);</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>User&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;service.queryUserByAccoutId(&#8220;</span><span style="color: #000000;">123</span><span style="color: #000000;">&#8243;);<br><br>System.out<br><br>.println(&#8220;userId</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user.getUserId()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;&#8220;,&nbsp;userName</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;<br><br></span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user.getUserName()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;&#8220;,&nbsp;lastLogin</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;<br><br></span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user.getLastLogin());<br><br>}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(MalformedURLException&nbsp;e)&nbsp;{<br><br>e.printStackTrace();<br><br>}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(RemoteException&nbsp;e)&nbsp;{<br><br>e.printStackTrace();<br><br>}<br><br>}<br><br>}</span></div>
<br>
<ol>
    <li>运行。控制台打印输出</li>
</ol>
<p style="margin-left: 40px;"><span></span></p>
<div style="border: 1px solid #666666;">
<p style="margin-left: 40px;"><span>2007-8-16 10:25:52 org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry crea<br>
</span></p>
<p style="margin-left: 40px;"><span>teTypeCreator<br>
</span></p>
<p style="margin-left: 40px;"><span><span>信息</span><span>: Couldn&#8217;t find Java 5 module on classpath. Annotation mappings will not be su<br>
</span></span></p>
<p style="margin-left: 40px;"><span>pported.<br>
</span></p>
<p style="margin-left: 40px;"><span><span><span>userId=123, userName=</span><span>测试用户</span><span>, lastLogin=Thu Aug 16 10:25:53 CST 2007</span></span></span></p>
</div>
<p style="margin-left: 40px;"><span><span><span></span></span><span><br>
</span></span></p>
<h1>扩展主题</h1>
<h2>利用MTOM传输二进制对象（文件）</h2>
<p>MTOM是XFire的一个组件，可以协助利用压缩等手段更快的在网络上传输base64的SOAP对象</p>
<p>MTOM以及aegis默认支持如下几种java对象的数据</p>
<ul>
    <li>byte[]</li>
    <li>javax.activation.DataHandler</li>
    <li>javax.activation.DataSource</li>
</ul>
<ol>
    <li>配置启用MTOM</li>
</ol>
<p>在Spring配置文件中需要MTOM的服务中加入如下配置</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">=&#8220;userService&#8221;&nbsp;</span><span style="color: #ff0000;">parent</span><span style="color: #0000ff;">=&#8220;baseWebService&#8221;&gt;<br><br></span><span style="color: #ff0000;">&lt;property&nbsp;name</span><span style="color: #0000ff;">=&#8220;serviceBean&#8221;&nbsp;</span><span style="color: #ff0000;">ref</span><span style="color: #0000ff;">=&#8220;userWS&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=&#8220;serviceClass&#8221;<br><br></span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">=&#8220;org.ave7.xfire.ws.UserService&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">=&#8221;properties&#8221;&gt;<br><br></span><span style="color: #ff0000;">&lt;map</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entry&nbsp;</span><span style="color: #ff0000;">key</span><span style="color: #0000ff;">=&#8221;mtom-enabled&#8221;&nbsp;</span><span style="color: #ff0000;">value</span><span style="color: #0000ff;">=&#8221;true&#8221;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">map</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<br>
<ol>
    <li>在客户端编写传输程序</li>
</ol>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;Service&nbsp;serviceModel&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectServiceFactory()<br><br>.create(UserService.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br><br>UserService&nbsp;service&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(UserService)&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XFireProxyFactory().create(<br><br>serviceModel,<br><br>&#8220;http:</span><span style="color: #008000;">//</span><span style="color: #008000;">localhost:8080/XFireService/service/UserService&#8221;);</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>Client&nbsp;client&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Client.getInstance(service);<br><br>client.setProperty(&#8220;mtom</span><span style="color: #000000;">-</span><span style="color: #000000;">enabled&#8221;,&nbsp;&#8220;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&#8221;);<br><br>client.setProperty(HttpTransport.CHUNKING_ENABLED,&nbsp;&#8220;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&#8221;);<br><br>User&nbsp;user&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;service.queryUserByAccoutId(&#8220;</span><span style="color: #000000;">123</span><span style="color: #000000;">&#8243;);<br><br>System.out<br><br>.println(&#8220;userId</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user.getUserId()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;&#8220;,&nbsp;userName</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;<br><br></span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user.getUserName()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;&#8220;,&nbsp;lastLogin</span><span style="color: #000000;">=</span><span style="color: #000000;">&#8221;<br><br></span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user.getLastLogin());<br><br>ByteArrayDataSource&nbsp;byteData&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ByteArrayDataSource(<br><br>&#8220;Test&nbsp;Sending&nbsp;Byte&#8221;.getBytes(),&nbsp;&#8220;text</span><span style="color: #000000;">/</span><span style="color: #000000;">plain;&nbsp;charset</span><span style="color: #000000;">=</span><span style="color: #000000;">UTF</span><span style="color: #000000;">-</span><span style="color: #000000;">8</span><span style="color: #000000;">&#8243;);<br><br>service.transferDataSource(byteData);<br></span></div>
<br>
<h1>附录</h1>
<h2>XFire在WebLogic 8.1中的配置</h2>
<ol>
    <li>Add the QName JAR file (qname.jar) into the WEB-INF/lib folder in your WAR file</li>
    <li>Add a file weblogic.xml into the WEB-INF folder in your WAR file</li>
</ol>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;weblogic-web-app&nbsp;PUBLIC<br><br>&#8220;-//BEA&nbsp;Systems,&nbsp;Inc.//DTD&nbsp;Web&nbsp;Application&nbsp;8.1//EN&#8221;<br><br>&#8220;http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd&#8221;</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">weblogic-web-app</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">container-descriptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">prefer-web-inf-classes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">true</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">prefer-web-inf-classes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">container-descriptor</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">weblogic-web-app</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<br>
<p>QName JAR file (qname.jar) <a href="http://docs.codehaus.org/download/attachments/27836/qname.jar?version=1">http://docs.codehaus.org/download/attachments/27836/qname.jar?version=1</a></p>
<h1>参考</h1>
<ul>
    <li>File Transfers using SOAP XFire <a href="http://blogs.opensymphony.com/plightbo/2006/04/file_transfers_using_soap_xfir.html">http://blogs.opensymphony.com/plightbo/2006/04/file_transfers_using_soap_xfir.html</a></li>
    <li>XFire生火指南<br>
    <a href="http://wiki.springside.org.cn/display/springside/XFire">http://wiki.springside.org.cn/display/springside/XFire</a></li>
    <li>XFire官方网站<br>
    <a href="http://xfire.codehaus.org/Home">http://xfire.codehaus.org/Home</a></li>
</ul>
<p>XFire On WebLogic 8.1<br>
<a href="http://docs.codehaus.org/display/XFIRE/XFire+on+WebLogic+8.1">http://docs.codehaus.org/display/XFIRE/XFire+on+WebLogic+8.1</a></p><img src ="http://www.blogjava.net/lazing/aggbug/137198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-08-16 13:15 <a href="http://www.blogjava.net/lazing/archive/2007/08/16/xfire_spring_web_service.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF Sucks</title><link>http://www.blogjava.net/lazing/archive/2007/07/31/133594.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Tue, 31 Jul 2007 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/07/31/133594.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/133594.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/07/31/133594.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/133594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/133594.html</trackback:ping><description><![CDATA[呃，我从来没有这么讨厌过某项技术，即使是面对错综复杂的MFC，即使是传说是不超过一百个人明白的DCOM。<br><br>我不明白，服务器端的程序就老大么？<br>为什么都跑来对JavaScript动一堆手脚。<br><br>有人说的好，JSF就是ASP.net in JAVA。<br>难道把前台后台混为一谈，提供些预定义的控件就是良好的框架么？<br><br><br><br><br><img src ="http://www.blogjava.net/lazing/aggbug/133594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-07-31 16:10 <a href="http://www.blogjava.net/lazing/archive/2007/07/31/133594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE BLOG 公布免费的Develop Tool bar</title><link>http://www.blogjava.net/lazing/archive/2007/05/18/118382.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Fri, 18 May 2007 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/05/18/118382.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/118382.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/05/18/118382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/118382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/118382.html</trackback:ping><description><![CDATA[<a target="_blank"  href="http://blogs.msdn.com/ie/archive/2005/09/16/469686.aspx">http://blogs.msdn.com/ie/archive/2005/09/16/469686.aspx</a><br><br>一些功能列表：<br>
<ul>
    <li>explore the DOM tree and find elements on the page</li>
    <li>disable IE settings, view information</li>
    <li>outline elements,</li>
    <li>control images</li>
    <li>resize pages to common screen resolutions</li>
    <li>validate against existing standards and provides pointers to <span id="id2100" style="display: none;">World Wide Web Consortium
    <div class="TopicTipStats">12/6/2004 10:45:25 PM - dmarsh</div>
    </span><a href="http://channel9.msdn.com/wiki/default.aspx/Channel9.W3C" onmouseover="'TopicTipOn(this," id2100="" );="" onmouseout="TopicTipOff();">W3C</a> specs</li>
</ul>
下载地址<br><a target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;displaylang=en </a><br><br><img src ="http://www.blogjava.net/lazing/aggbug/118382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-05-18 15:29 <a href="http://www.blogjava.net/lazing/archive/2007/05/18/118382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ageci Notes: Authentication</title><link>http://www.blogjava.net/lazing/archive/2007/05/17/118190.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Thu, 17 May 2007 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/05/17/118190.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/118190.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/05/17/118190.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/118190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/118190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Most of this article and degist from Ageci User Guide.CORE    SecurityContextHolder, to provide any type access to the SecurityContext.        SecurityContext, to hold the Authentication and...&nbsp;&nbsp;<a href='http://www.blogjava.net/lazing/archive/2007/05/17/118190.html'>阅读全文</a><img src ="http://www.blogjava.net/lazing/aggbug/118190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-05-17 22:52 <a href="http://www.blogjava.net/lazing/archive/2007/05/17/118190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Notes: Data types and Operators</title><link>http://www.blogjava.net/lazing/archive/2007/05/17/118189.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Thu, 17 May 2007 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/05/17/118189.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/118189.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/05/17/118189.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/118189.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/118189.html</trackback:ping><description><![CDATA[<h3>Comprehend</h3>
<ul>
    <li>A variable holds a value, while an object reference variable points to the memory that holds the object.</li>
    <li>The short-circuit logical operators &amp;&amp; and || operate only on boolean operands. For example, the expression<br>9&amp;&amp;7 will not compile. Understand the difference between short-circuit logical operators and bitwise<br>operators.</li>
    <li>If the first expression of a &amp;&amp; operator is false, the second expression is not evaluated, and if the first<br>expression of a || operator is true, the second expression is not evaluated.</li>
</ul>
<h3>Look Out</h3>
<ul>
    <li>Be on guard for words that are only slightly different from the
    Java keywords, such as synchronize instead of synchronized, implement
    instead of implements, and protect instead of protected.</li>
    <li>Whether an array stores primitive variables or object references, the array itself is always an object.</li>
    <li>It is illegal to include the array size in the array declaration.</li>
    <li>Division by zero generates a runtime ArithmeticException only if
    the operands are integers. In case of float and double, the result of
    division by zero is infinity.</li>
    <li>The result of the modulo operator always carries the sign of the first operand (i.e. the one before the operator);<br>you can ignore the sign of the second operand.</li>
    <li>You cannot instantiate an enum by using the new operator.</li>
</ul>
<h3>Memorize</h3>
<ul>
    <li>Know the Java language keywords.</li>
    <li>Know the range of values for all primitive data types.</li>
    <li>All primitive data types except boolean and char are signed.</li>
    <li>The first character of an identifier must be a letter, a dollar
    sign ($), or an underscore (_). Characters other than the first
    character in an identifier may be a letter, a dollar sign, an
    underscore, or a digit.</li>
</ul><img src ="http://www.blogjava.net/lazing/aggbug/118189.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-05-17 22:48 <a href="http://www.blogjava.net/lazing/archive/2007/05/17/118189.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Notes: Classes, Methods, and Interface</title><link>http://www.blogjava.net/lazing/archive/2007/05/17/118188.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Thu, 17 May 2007 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/05/17/118188.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/118188.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/05/17/118188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/118188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/118188.html</trackback:ping><description><![CDATA[<h3>Comprehend</h3>
<ul>
    <li>The method name and return type are mandatory in a method
    declaration. Even though you are not required to specify a modifier in
    a method declaration, the default modifier is assigned to the method,
    if you don&#8217;t declare one.
    </li>
    <li>A static variable belongs to the class and not to a
    particular instance of the class, and therefore is initialized when the
    class is loaded, and before the class is instantiated.
    </li>
    <li>Because a static method belongs to a class and not to a
    particular instance of the class, it cannot access the nonstatic
    methods and variables of the class in which it is defined.
    </li>
    <li>An instance of an inner class can only exist in an instance
    of the outer class, and has direct access to all the instance variables
    and methods of the outer instance.
    </li>
    <li>If you make a super call or a this call, it must be in the
    beginning of a constructor. That means you can make either a super call
    or a this call, but not both.</li>
</ul>
<h3>Look Out</h3>
<ul>
    <li>The variable-length parameters list must appear last in the
    parentheses of a method and it consists of a data type, three dots, and
    a name, in that order.
    </li>
    <li>A Java class cannot inherit from more than one class, but it can inherit from one class and one or more interfaces.
    </li>
    <li>The class that inherits from an interface must provide
    implementation for all the methods that are declared in the interface
    if the class is not abstract.
    </li>
    <li>An interface can extend another interface but it cannot implement another interface or a class.</li>
</ul>
<h3>Memorize</h3>
<ul>
    <li>If you do not provide any constructor for a class you write, the
    compiler provides the default constructor for that class. If you write
    at least one constructor for the class, the compiler provides no
    constructor.
    </li>
    <li>If you don not make a this or a super call in the beginning of a constructor, the compiler places a super() call there.
    </li>
    <li>You use the keyword extends to write a derived class that
    inherits from a parent class, and use the keyword implements to write a
    class that inherits from an interface.
    </li>
    <li>The methods in an interface are inherently public and
    abstract, and the variables in the interface are inherently public,
    final, and static.</li>
</ul><img src ="http://www.blogjava.net/lazing/aggbug/118188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-05-17 22:47 <a href="http://www.blogjava.net/lazing/archive/2007/05/17/118188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Microsoft Software Basic Process</title><link>http://www.blogjava.net/lazing/archive/2007/05/17/118187.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Thu, 17 May 2007 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/05/17/118187.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/118187.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/05/17/118187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/118187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/118187.html</trackback:ping><description><![CDATA[<div class="postentry">
<ol>
    <li>Plan an agenda.
    </li>
    <li>Define key business drivers.
    </li>
    <li>Define key success facts.
    </li>
    <li>Work out persona.
    </li>
    <li>Work out Scenario.
    </li>
    <li>High level architecture
    </li>
    <li>High level design
    </li>
    <li>Development
    </li>
    <li>QA
    </li>
    <li>Deployment</li>
</ol>
</div><img src ="http://www.blogjava.net/lazing/aggbug/118187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-05-17 22:37 <a href="http://www.blogjava.net/lazing/archive/2007/05/17/118187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数值方法笔记1</title><link>http://www.blogjava.net/lazing/archive/2007/05/17/118185.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Thu, 17 May 2007 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/05/17/118185.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/118185.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/05/17/118185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/118185.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/118185.html</trackback:ping><description><![CDATA[<h3>关于这个笔记<br>
</h3>
<p>也许你已经学会了一门计算机语言，也许你会写一段不错的程序。
</p>
<p>也许你在嘈杂的环境用不费力的就可以用熟悉的IDE完成一个项目。
</p>
<p>不过，你还在用+ - * /和%做所有的计算么？
</p>
<p>这个笔记就是为了写出更加正确的程序，小小的一个学习过程。
</p>
<p>我不总结复杂的道理，只记录用得上的方案。
</p>
<p>出现的一切代码都使用Java语言。
</p>
<h3>正确的计算过程导致错误的计算结果<br>
</h3>
<p>关于基本数值计算中的一些陷阱
</p>
<h4>浮点数和实数<br>
</h4>
<p>当早期的Fortran和algol创造出real这个关键字时，你还真以为那么是实数，不过说真的，你被骗了。
</p>
<p>所以到了C，我们拥有了float。
</p>
<p>那么他们到底有什么不同呢？
</p>
<p>简单地说
</p>
<blockquote>
<p>System.out.println(&#8221;Value of 1/3: &#8221; + (1/3f))
</p>
</blockquote>
<p>将输出
</p>
<blockquote>
<p>Value of 1/3: 0.33333334
</p>
</blockquote>
<p>很简单，这是很早之前您就知道的四舍五入。当时我们只是那无法写完的循环在纸上划下一个&#8221;≈&#8221;，然后非常开心可以少写几个字符。如果你有一个负责任的数学老师，他（她）就会反复的叮咛你，要小心，计算时候要保留结果精度往后一位的数值。
</p>
<p>当这一切轮到了计算机，我们叫它：
</p>
<p><strong>舍入误差<br>
</strong></p>
<p>舍入误差有时相当惊人。对1/3连加840次，你会得到279.9915（本应当为280），如何惊人，我们会在下面看到。
</p>
<p>不过有意思的事情，和小时候的情形不一样，舍入误差并不是由于不能除尽或者是无理数造成的，类似于1/5的数字连加之后也有误差。这是因为绝大多数
计算机是基于2进制体系的，所以IBM有用于商业计算的10进制计算机。简单的事实是利用float表达的2的幂次，在精度范围是没有舍入误差的。
</p>
<p>给出常用定义：
</p>
<p><img  src="http://blog.ave7.org/lazing/files/2007/05/050407-1319-11.png">
</p>
<p>作如下计算，你会期待怎样的结果呢？
</p>
<p><img  src="http://blog.ave7.org/lazing/files/2007/05/050407-1319-12.png">
</p>
<p>别偷懒，用你久远的口算能力，很容易就可以得出，它本来应该是0。而事实上，我们伟大的计算机的答案是3222784.0
</p>
<p>为什么？
</p>
<p>因为，10000001/20000000的时候，答案本应该是0.50000005，由于舍入误差，我们得到了0.5000006。
</p>
<p>接下来我们减去0.5的时候，得到的应当是0.00000006，这样，我们就丢失了所有的正确的数。
</p>
<p>更糟糕的是，计算机中实际得到的值是5.9604645e-8。
</p>
<p>因此，您的存款户头上可能会平白无故减少3222784元。只因为银行决定向你支付利息之后，调整了汇率。
</p>
<p>呃，这一次，我们叫它：
</p>
<blockquote>
<p><strong>相消误差</strong>——两个非常相近的值相减时，如果消去了绝大多数有效数值，那么就会发生相消误差。<br><strong>舍入误差</strong>——是精确值和其可表达值之间的差值。
</p>
</blockquote>
<p><span>如果还有什么要说的，那就是：<br>
</span></p>
<blockquote>
<p>Double比float 更接近实数，貌似不需要我说。<br>浮点运算不遵守代数定理
</p>
</blockquote>
<p>比如：a = 1.0, b = 3.0e-8, c  = 4.0e-8
</p>
<p>那么：&nbsp;&nbsp;&nbsp;&nbsp;(a+b)+c = 1.0
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;a+(b+c) = 1.0000001
</p>
<p>不过加法和乘法还是满足交换律的。
</p>
<p>下一次：轮到了整数。
</p><img src ="http://www.blogjava.net/lazing/aggbug/118185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-05-17 22:34 <a href="http://www.blogjava.net/lazing/archive/2007/05/17/118185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail API 实例汇总</title><link>http://www.blogjava.net/lazing/archive/2007/05/17/118184.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Thu, 17 May 2007 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/05/17/118184.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/118184.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/05/17/118184.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/118184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/118184.html</trackback:ping><description><![CDATA[<div class="postentry">
<p>呃，好吧，我只写过三个JavaMail的程序。</p>
<p>都是批量邮件守护程序。决定总结一下，希望非常幸运找到这篇文章的人不会再对这个困惑。</p>
<h3>必须明白的基础知识</h3>
<ol>
    <li>STMP协议是如何工作的<br>
    协议的标准在这里 <a href="http://www.ietf.org/rfc/rfc2821.txt?number=2821">http://www.ietf.org/rfc/rfc2821.txt?number=2821</a><br>
    下面是扼要说明（<a href="http://www.freesoft.org/CIE/Topics/94.htm">http://www.freesoft.org/CIE/Topics/94.htm</a> ）：
    <blockquote>
    <p>Simple Mail Transfer Protocol (SMTP), documented in RFC
    821, is Internet&#8217;s standard host-to-host mail transport protocol and
    traditionally operates over TCP, port 25. In other words, a UNIX user
    can type telnet hostname 25 and connect with an SMTP server, if one is
    present.</p>
    <p>SMTP uses a style of asymmetric request-response protocol popular in
    the early 1980s, and still seen occasionally, most often in mail
    protocols. The protocol is designed to be equally useful to either a
    computer or a human, though not too forgiving of the human. From the
    server&#8217;s viewpoint, a clear set of commands is provided and
    well-documented in the RFC. For the human, all the commands are clearly
    terminated by newlines and a HELP command lists all of them. From the
    sender&#8217;s viewpoint, the command replies always take the form of text
    lines, each starting with a three-digit code identifying the result of
    the operation, a continuation character to indicate another lines
    following, and then arbitrary text information designed to be
    informative to a human.</p>
    </blockquote>
    <p>事实上，你可以像使用DOS命令一样发送电子邮件。<a href="http://bbs.stcore.com/archiver/tid-8024.html">http://bbs.stcore.com/archiver/tid-8024.htm </a>当然因为各种原因，你的尝试不可能成功。事实上SMTP工作的时候就是简单的发送命令。取得认证，发送数据。得到反馈。确认退出这么简单。
    </p>
    </li>
    <li>SMTP中用于发送的数据<br>
    SMTP中发送的数据，遵从<font size="-1"><strong>Multipurpose Internet Mail</strong> <strong>Extensions</strong> (<strong>MIME</strong>)标准，呃，我不得不说，这是这个星球上最重要的标准之一。所有的互联网通信基本都是基于这个标准的演化。除了电子邮件，常见的应用还包括HTTP报文等（也就是所有网页了），另外即使在20年后发展的XML，其2进制数据发送仍然实用的MIME中的编码方式。<br>
    恩，这里就涉及到邮件附件如何处理的问题。恩，简单地说就是BASE64编码</font></li>
</ol>
<blockquote>
<pre>Table 1: The Base64 Alphabet<br><br>Value Encoding  Value Encoding  Value Encoding  Value Encoding</pre>
<pre>0 A            17 R            34 i            51 z<br><br>1 B            18 S            35 j            52 0<br><br>2 C            19 T            36 k            53 1<br><br>3 D            20 U            37 l            54 2<br><br>4 E            21 V            38 m            55 3<br><br>5 F            22 W            39 n            56 4<br><br>6 G            23 X            40 o            57 5<br><br>7 H            24 Y            41 p            58 6<br><br>8 I            25 Z            42 q            59 7<br><br>9 J            26 a            43 r            60 8<br><br>10 K            27 b            44 s            61 9<br><br>11 L            28 c            45 t            62 +<br><br>12 M            29 d            46 u            63 /<br><br>13 N            30 e            47 v<br><br>14 O            31 f            48 w         (pad) =<br><br>15 P            32 g            49 x<br><br>16 Q            33 h            50 y</pre>
</blockquote>
<p>在这种编码中，我们将字符或者二进制编码以6个比特位为一组，替换成相应的字符形式。比如</p>
<pre>100110111010001011101001</pre>
<p>转换结果就是</p>
<pre>100110 -&gt; 38</pre>
<pre>111010 -&gt; 58<br><br>001011 -&gt; 11<br><br>101001 -&gt; 41</pre>
<pre>38 -&gt; m<br><br>58 -&gt; 6<br><br>11 -&gt; L<br><br>41 -&gt; p</pre>
<pre>m6Lp</pre>
<p>于是，我们就可以以文本的方式编码二进制流以及扩展ASCII字符，比如中文字符。</p>
<p>基础知识完毕，下面是FAQ</p>
<h3>Java发送电子邮件需要哪些软件包</h3>
<p>mail.jar 通常还会需要 activation.jar</p>
<blockquote>
<p>下载地址<br>
http://java.sun.com/products/javabeans/jaf/downloads/index.html<br>
https://maven-repository.dev.java.net/nonav/repository/javax.mail/</p>
</blockquote>
<h3>如何发送邮件</h3>
<p>关于：</p>
<ul>
    <li>如何发送邮件</li>
    <li>如何发送带有附件的邮件</li>
    <li>如何发送中文邮件</li>
    <li>邮件中文标题乱码怎么办</li>
    <li>邮件附件乱码怎么办等等问题</li>
</ul>
<p>请查看以下代码</p>
<pre class="java">	<span style="color: blue; font-weight: bold;">public</span> <span style="color: blue; font-weight: bold;">static</span> <span style="color: blue; font-weight: bold;">synchronized</span> <span style="color: #993333;">void</span> sendMail<span style="color: #66cc66;">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AProperties+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">Properties</span></a> settings<span style="color: #66cc66;">)</span><br>&nbsp;<br> 		<span style="color: blue; font-weight: bold;">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">Exception</span></a> <span style="color: #66cc66;">{</span><br>&nbsp;<br> 	<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AProperties+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">Properties</span></a> props = <span style="color: blue; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AProperties+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">Properties</span></a><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	props.<span style="color: #006600;">put</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"mail.smtp.host"</span>, settings.<span style="color: #006600;">get</span><span style="color: #66cc66;">(</span>StartCore.<span style="color: #006600;">MAIL_SERVER</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	props.<span style="color: #006600;">put</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"mail.smtp.user"</span>, settings.<span style="color: #006600;">get</span><span style="color: #66cc66;">(</span>StartCore.<span style="color: #006600;">USER_NAME</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	props.<span style="color: #006600;">put</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"mail.smtp.auth"</span>, <span style="color: #ff0000;">"true"</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #808080; font-style: italic;">//SMTP服务器用户验证</span><br>&nbsp;<br> 	<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AAuthenticator+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">Authenticator</span></a> auth = <span style="color: blue; font-weight: bold;">new</span> SMTPAuthenticator<span style="color: #66cc66;">(</span><span style="color: #66cc66;">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a><span style="color: #66cc66;">)</span> settings<br>&nbsp;<br> 		.<span style="color: #006600;">get</span><span style="color: #66cc66;">(</span>StartCore.<span style="color: #006600;">USER_NAME</span><span style="color: #66cc66;">)</span>, <span style="color: #66cc66;">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a><span style="color: #66cc66;">)</span> settings<br>&nbsp;<br> 		.<span style="color: #006600;">get</span><span style="color: #66cc66;">(</span>StartCore.<span style="color: #006600;">PASSWORD</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	Session session = Session.<span style="color: #006600;">getDefaultInstance</span><span style="color: #66cc66;">(</span>props, auth<span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">(</span><span style="color: #ff0000;">"true"</span>.<span style="color: #006600;">compareToIgnoreCase</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a><span style="color: #66cc66;">)</span> settings.<span style="color: #006600;">get</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"DEBUG"</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span> == <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span><br>&nbsp;<br> 		session.<span style="color: #006600;">setDebug</span><span style="color: #66cc66;">(</span><span style="color: blue; font-weight: bold;">true</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	<span style="color: #66cc66;">}</span><br>&nbsp;<br><span style="color: #808080; font-style: italic;">//创建消息体</span><br>&nbsp;<br> 	MimeMessage msg = <span style="color: blue; font-weight: bold;">new</span> MimeMessage<span style="color: #66cc66;">(</span>session<span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #808080; font-style: italic;">//设置发送人邮件</span><br>&nbsp;<br> 	msg.<span style="color: #006600;">setFrom</span><span style="color: #66cc66;">(</span><span style="color: blue; font-weight: bold;">new</span> InternetAddress<span style="color: #66cc66;">(</span><span style="color: #66cc66;">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a><span style="color: #66cc66;">)</span> settings<br>&nbsp;<br> 		.<span style="color: #006600;">get</span><span style="color: #66cc66;">(</span>StartCore.<span style="color: #006600;">USER_MAIL</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #808080; font-style: italic;">//设置接收人邮件</span><br>&nbsp;<br> 	address = <span style="color: blue; font-weight: bold;">new</span> InternetAddress<span style="color: #66cc66;">[</span><span style="color: #66cc66;">]</span> <span style="color: #66cc66;">{</span> <span style="color: blue; font-weight: bold;">new</span> InternetAddress<span style="color: #66cc66;">(</span>rs<br>&nbsp;<br> 		.<span style="color: #006600;">getString</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"GRE_mail"</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">}</span>;<br>&nbsp;<br> 	msg.<span style="color: #006600;">setRecipients</span><span style="color: #66cc66;">(</span>Message.<span style="color: #006600;">RecipientType</span>.<span style="color: #006600;">TO</span>, address<span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #808080; font-style: italic;">//设置主题，中文编码</span><br>&nbsp;<br> 	msg.<span style="color: #006600;">setSubject</span><span style="color: #66cc66;">(</span>subject, <span style="color: #ff0000;">"gbk"</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	msg.<span style="color: #006600;">setSentDate</span><span style="color: #66cc66;">(</span><span style="color: blue; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ADate+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">Date</span></a><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a> content = <span style="color: #ff0000;">"邮件正文"</span>;<br>&nbsp;<br> 	MimeBodyPart mbp1 = <span style="color: blue; font-weight: bold;">new</span> MimeBodyPart<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	mbp1.<span style="color: #006600;">setText</span><span style="color: #66cc66;">(</span>content, <span style="color: #ff0000;">"gbk"</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #808080; font-style: italic;">//邮件附件</span><br>&nbsp;<br>MimeBodyPart attachFilePart = <span style="color: blue; font-weight: bold;">new</span> MimeBodyPart<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">File</span></a> file = <span style="color: blue; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AFile+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">File</span></a><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"中文附件.txt"</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br>FileDataSource fds = <span style="color: blue; font-weight: bold;">new</span> FileDataSource<span style="color: #66cc66;">(</span>file.<span style="color: #006600;">getName</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br>attachFilePart.<span style="color: #006600;">setDataHandler</span><span style="color: #66cc66;">(</span><span style="color: blue; font-weight: bold;">new</span> DataHandler<span style="color: #66cc66;">(</span>fds<span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	sun.<span style="color: #006600;">misc</span>.<span style="color: #006600;">BASE64Encoder</span> enc = <span style="color: blue; font-weight: bold;">new</span> sun.<span style="color: #006600;">misc</span>.<span style="color: #006600;">BASE64Encoder</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	<span style="color: #808080; font-style: italic;">//解决中文附件名称</span><br>&nbsp;<br> 	attachFilePart.<span style="color: #006600;">setFileName</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"=?gbk?B?"</span><br>&nbsp;<br> 		+ enc.<span style="color: #006600;">encode</span><span style="color: #66cc66;">(</span>file.<span style="color: #006600;">getName</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>.<span style="color: #006600;">getBytes</span><span style="color: #66cc66;">(</span><span style="color: #ff0000;">"gbk"</span><span style="color: #66cc66;">)</span><span style="color: #66cc66;">)</span> + <span style="color: #ff0000;">"?="</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br>Multipart mp = <span style="color: blue; font-weight: bold;">new</span> MimeMultipart<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	mp.<span style="color: #006600;">addBodyPart</span><span style="color: #66cc66;">(</span>mbp1<span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	mp.<span style="color: #006600;">addBodyPart</span><span style="color: #66cc66;">(</span>attachFilePart<span style="color: #66cc66;">)</span>;<br>&nbsp;<br>msg.<span style="color: #006600;">setContent</span><span style="color: #66cc66;">(</span>mp<span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #808080; font-style: italic;">// send the message</span><br>&nbsp;<br> 	msg.<span style="color: #006600;">saveChanges</span><span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	Transport.<span style="color: #006600;">send</span><span style="color: #66cc66;">(</span>msg<span style="color: #66cc66;">)</span>;<br>&nbsp;<br><span style="color: #66cc66;">}</span></pre>
<p>这是上面用户验证用到的类</p>
<pre class="java"><span style="color: blue; font-weight: bold;">class</span> SMTPAuthenticator <span style="color: blue; font-weight: bold;">extends</span> javax.<span style="color: #006600;">mail</span>.<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AAuthenticator+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">Authenticator</span></a> <span style="color: #66cc66;">{</span></pre>
<pre class="java">	<span style="color: blue; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a> username;<br>&nbsp;<br>	<span style="color: blue; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a> password;<br>&nbsp;<br>	<span style="color: #808080; font-style: italic;">/**<br>&nbsp;<br>  	* @param username<br>&nbsp;<br> 	* @param password<br>&nbsp;<br>  	*/</span><br>&nbsp;<br> 	<span style="color: blue; font-weight: bold;">public</span> SMTPAuthenticator<span style="color: #66cc66;">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a> username, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">String</span></a> password<span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span><br>&nbsp;<br> 		<span style="color: blue; font-weight: bold;">this</span>.<span style="color: #006600;">username</span> = username;<br>&nbsp;<br> 		<span style="color: blue; font-weight: bold;">this</span>.<span style="color: #006600;">password</span> = password;<br>&nbsp;<br>	<span style="color: #66cc66;">}</span><br>&nbsp;<br>	<span style="color: blue; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3APasswordAuthentication+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">PasswordAuthentication</span></a> getPasswordAuthentication<span style="color: #66cc66;">(</span><span style="color: #66cc66;">)</span> <span style="color: #66cc66;">{</span><br>&nbsp;<br> 		<span style="color: blue; font-weight: bold;">return</span> <span style="color: blue; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3APasswordAuthentication+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: red; font-weight: bold;">PasswordAuthentication</span></a><span style="color: #66cc66;">(</span>username, password<span style="color: #66cc66;">)</span>;<br>&nbsp;<br> 	<span style="color: #66cc66;">}</span><br>&nbsp;<br><span style="color: #66cc66;">}</span></pre>
<h3>邮件发送出错</h3>
<blockquote>
<p>What causes an
&#8220;javax.activation.UnsupportedDataTypeException: no object DCH for MIME
type xxx/xxxx javax.mail.MessagingException: IOException while sending
message;&#8221; to be sent and how do I fix this? [This happens for known
MIME types like text/htm</p>
</blockquote>
<p>事实上这个是邮件发送时验证组件设置不当引起的，这个组件配置方法如下</p>
<blockquote>
<p>(http://java.sun.com/j2ee/1.4/docs/api/javax/activation/MailcapCommandMap.html)</p>
<p>The MailcapCommandMap looks in various places in the user&#8217;s system
for mailcap file entries. When requests are made to search for commands
in the MailcapCommandMap, it searches mailcap files in the following
order:</p>
<p>1) Programatically added entries to the MailcapCommandMap instance.<br>
2) The file .mailcap in the user&#8217;s home directory.<br>
3) The file /lib/mailcap.<br>
4) The file or resources named META-INF/mailcap.<br>
5) The file or resource named META-INF/mailcap.default (usually found only in the activation.jar file).</p>
</blockquote>
<p>我选用了第四种方法，在生成的Jar文件中加入了 META-INF/mailcap.</p>
<pre class="apache"><span style="color: #adadad; font-style: italic;">#</span><br><span style="color: #adadad; font-style: italic;"># This is a very simple 'mailcap' file</span><br><span style="color: #adadad; font-style: italic;">#</span><br>image/gif;;		x-java-view=com.sun.activation.viewers.ImageViewer<br>image/jpeg;;		x-java-view=com.sun.activation.viewers.ImageViewer<br>text/*;;		x-java-view=com.sun.activation.viewers.TextViewer<br>text/*;;		x-java-edit=com.sun.activation.viewers.TextEditor<br>text/html;; 	x-java-content-handler=com.sun.mail.handlers.text_html<br>text/xml;; 		x-java-content-handler=com.sun.mail.handlers.text_xml<br>text/plain;; 	x-java-content-handler=com.sun.mail.handlers.text_plain<br>multipart/*;; 	x-java-content-handler=com.sun.mail.handlers.multipart_mixed<br>message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822</pre>
</div><img src ="http://www.blogjava.net/lazing/aggbug/118184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-05-17 22:30 <a href="http://www.blogjava.net/lazing/archive/2007/05/17/118184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ave7.net BLSNS框架研究报告</title><link>http://www.blogjava.net/lazing/archive/2007/01/19/94993.html</link><dc:creator>HIMMEL</dc:creator><author>HIMMEL</author><pubDate>Fri, 19 Jan 2007 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/lazing/archive/2007/01/19/94993.html</guid><wfw:comment>http://www.blogjava.net/lazing/comments/94993.html</wfw:comment><comments>http://www.blogjava.net/lazing/archive/2007/01/19/94993.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/lazing/comments/commentRss/94993.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lazing/services/trackbacks/94993.html</trackback:ping><description><![CDATA[<p>呼呼，写这个别人看不懂的题目很不着调。其实核心内容就是对Java AJAX框架做个小笔记，记录一下我的实践心得。
</p><p>因为要还换空间了，终于可以为自己的网站写Java程序了，刚好老师要我总结一下，提供一个即插即用的Ajax JAVA环境。
</p><p>汗~~不过简单美，我就开心的说一下吧。
</p><h1>框架选择汇总
</h1><ul><li>Ajax toolkit: Dojo <a href="http://dojotoolkit.org/">http://dojotoolkit.org/</a>
		</li><li>Communication: DWR <a href="http://getahead.ltd.uk/dwr/">http://getahead.ltd.uk/dwr/</a>
		</li><li>Presentation: Struts 2 <a href="http://struts.apache.org/2.x/">http://struts.apache.org/2.x/</a>  / WebWork <a href="http://www.opensymphony.com/webwork/">http://www.opensymphony.com/webwork/</a>
		</li><li>IoC: Spring <a href="http://www.springframework.org/">http://www.springframework.org/</a>
		</li><li>Persistence: Hibernate <a href="http://www.hibernate.org/">http://www.hibernate.org/</a>  or iBatis <a href="http://ibatis.apache.org/">http://ibatis.apache.org/</a>
		</li></ul><h1>选择理由
</h1><h2>Dojo 
</h2><p>我最爱的就是Dojo。Dojo提供了丰富的Widget和不断增加的教程文档。拥有了IBM和SUN的官方支持。更重要的是，Dojo不止为Java设计，Dojo是一个通用的平台，这意味着，所有最新的技术都可以移植到Dojo上面来，而你并不需要重新学习。
</p><p>Dojo最大的弱点是，启动缓慢，官方网站在网络质量不好的时候会有死机的感觉。不过依然记得0.3到0.4的巨大惊喜。我相信随着Dojo的成熟，对其的学习是一种保值的投资。
</p><h2>DWR
</h2><p>这是目前几个框架中，我唯一没有在实际项目中使用过的。之前用Dojo和WW写程序的时候，使用JSON作为数据 媒介（没有用RPC）。写了很多代码来负责同步JSON与JAVA对象。目前看来DWR可以很好的解决这个问题。而且，随着Annotation的流行，连配置都不用了。
</p><h2>Struts2 / WW
</h2><p>目前没有用过Struts 2不过从前身WW的表现来看，绝对是开发速度之选。丰富的扩展支持，良好的接口设计，为易变的Web环境提供了舒适的开发体验。再加上Apache的大名，那就素质量的保证啊。虽然有Ajax支持的鸡肋（T_T原谅我，我是真的不会用那个）。Struts2同样开始支持Annotation配置，真是为我省心啊。
</p><h2>Spring
</h2><p>Spring is coming…..
</p><p>没有理由，只要不用EJB，那么只有Spring才是J2EE的选择，良好的扩展性，无所不在的简洁。总书记怎么说来着？和谐美啊。Spring就是和谐，让那一片一片菱角分明的框架结合的天衣无缝。总而言之一句话，Spring就是端午节的糯米啊。（那谁是粽子叶呢？）
</p><h2>Hibernate 与 iBatis
</h2><p>其实持久层的选择就要省重一点了。
</p><p>Hibernate很方便，方便到太容易犯错误。所以我把iBatis列进去，这是性能和健壮性的考虑。
</p><p>我明白Hibernate有多么方便，如果两三个月就要交付一个项目，Hibernate能够让你忘掉SQL的存在。但是要做一个逻辑复杂的SNS站点，iBatis无疑更轻巧更考验才智。
</p><p>以上，再加上Acegi和axis2（暂时没打算用），开心的玩Java AJAX吧</p><img src ="http://www.blogjava.net/lazing/aggbug/94993.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lazing/" target="_blank">HIMMEL</a> 2007-01-19 22:34 <a href="http://www.blogjava.net/lazing/archive/2007/01/19/94993.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>