﻿<?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-有时，退一步，能一口气进几步，只是这先退一步需要勇气和自信。-随笔分类-java 技术区</title><link>http://www.blogjava.net/ducklyl/category/26693.html</link><description>用心爱你，努力工作。</description><language>zh-cn</language><lastBuildDate>Wed, 21 Nov 2007 12:00:18 GMT</lastBuildDate><pubDate>Wed, 21 Nov 2007 12:00:18 GMT</pubDate><ttl>60</ttl><item><title>基于spring+ibatis的架构   2007-11-20</title><link>http://www.blogjava.net/ducklyl/archive/2007/11/20/161938.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Tue, 20 Nov 2007 13:30:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/11/20/161938.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/161938.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/11/20/161938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/161938.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/161938.html</trackback:ping><description><![CDATA[&nbsp;
<p align="center"><span style="font-family: 宋体">基于</span>spring+ibatis<span style="font-family: 宋体">的架构</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">有一段时间没有来更新文章了</span>,<span style="font-family: 宋体">呵呵</span>,<span style="font-family: 宋体">最近在研究系统的架构</span>,<span style="font-family: 宋体">为下一期系统做前期准备</span>.<span style="font-family: 宋体">准备采用</span>spring+ibatis+JSF<span style="font-family: 宋体">的架构</span>.<span style="font-family: 宋体">我个人目前只了解</span>spring+ibatis<span style="font-family: 宋体">这两层</span>,<span style="font-family: 宋体">因此这里也只讨论关于这两层的结合</span>.<br />
<span style="font-family: 宋体">下图为工程目录</span>:<br />
</p>
<p style="text-indent: 21pt"><img height="206" alt="" src="http://www.blogjava.net/images/blogjava_net/ducklyl/ddddd.jpg" width="233" border="0" /><br />
<br />
(1)<span style="font-family: 宋体">首先是</span>spring<span style="font-family: 宋体">的配置文件</span>: applicationContext.xml</p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;?xml</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">version=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"1.0"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">encoding=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"UTF-8"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">?&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;!DOCTYPE</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">beans</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">PUBLIC</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//SPRING//DTD BEAN 2.0//EN"</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"http://www.springframework.org/dtd/spring-beans-2.0.dtd"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;beans&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;bean</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">id=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"propertyConfigurer"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">class=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;property</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">name=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"locations"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;list&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;value&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">com/conf/jdbc.properties</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/value&gt;</span><span style="font-size: 10pt; color: #228820; font-family: 'Courier New'">&lt;!—</span><span style="font-size: 10pt; font-family: 宋体">数据库配置</span><span style="font-size: 10pt; color: #228820; font-family: 'Courier New'">--&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/list&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/property&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/bean&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;bean</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">id=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"dataSource"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">class=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"org.springframework.jndi.JndiObjectFactoryBean"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;property</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">name=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"jndiName"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">value=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"${dataSource}"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">/&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/bean&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;bean</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">id=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"sqlMapClient"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">class=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"org.springframework.orm.ibatis.SqlMapClientFactoryBean"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;property</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">name=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"configLocation"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">value=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"com/ibatis/sql-map-config.xml"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">/&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/bean&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;bean</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">id=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"sqlMapDAO"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">class=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"com.doone.database.SqlMapClientDAO"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;property</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">name=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"dataSource"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">ref=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"dataSource"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">/&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;property</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">name=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"sqlMapClient"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">ref=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"sqlMapClient"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">/&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/bean&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;bean</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">id=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"transactionManager"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">class=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;property</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">name=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"dataSource"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">ref=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"dataSource"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">/&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/bean&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/beans&gt;</span></p>
<p style="text-indent: 21pt">(2)<span style="font-size: 10pt; color: black; font-family: 'Courier New'"> jdbc.properties</span><span style="font-size: 10pt; color: black; font-family: 宋体">配置文件</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: black; font-family: 宋体">配置数据源</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">dataSource</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span></p>
<p style="text-indent: 20pt"><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">dataSource</span><span style="font-size: 10pt; color: green; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: maroon; font-family: 'Courier New'">test</span></p>
<p style="text-indent: 21pt">(3<span style="font-size: 10pt; color: black; font-family: 'Courier New'">) IbatisDAO</span><span style="font-size: 10pt; color: black; font-family: 宋体">接口</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> com.doone.database;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> java.util.HashMap;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> java.util.List;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">interface</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> <span style="background: yellow">IbatisDAO</span> {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">/**</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">查询数据库转换成</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">List</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@param</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">sqlMapId</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">String</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*</span><strong><span style="font-size: 10pt; color: #7f9fbf; font-family: 'Courier New'">@return</span></strong><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">List</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">*/</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> List ibatisQueryForList(String sqlMapId, Object parameter);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> List ibatisQueryForList(String sqlMapId);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="font-size: 10pt; font-family: 宋体">类似在这里实现删除</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">更新的方法</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt">(4<span style="font-size: 10pt; color: black; font-family: 'Courier New'">) <span style="background: yellow">SqlMapClientDAO</span></span><span style="font-size: 10pt; color: black; font-family: 宋体">类</span></p>
<p style="text-indent: 21pt">package com.doone.database;</p>
<p style="text-indent: 21pt">import java.util.ArrayList;</p>
<p style="text-indent: 21pt">import java.util.HashMap;</p>
<p style="text-indent: 21pt">import java.util.List;</p>
<p style="text-indent: 21pt">import java.util.Vector;</p>
<p style="text-indent: 21pt">import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;</p>
<p style="text-indent: 21pt">public class SqlMapClientDAO extends SqlMapClientDaoSupport implements IbatisDAO{</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/**</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * <span style="font-family: 宋体">查询数据库转换成</span>List</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * @param sqlMapId String</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * @param parameter Object</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * @return List</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; */</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public List ibatisQueryForList(String sqlMapId, Object parameter) {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; List list = null;</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list = (List) getSqlMapClientTemplate().queryForList(sqlMapId, parameter);</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; catch (Exception er) {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //log4j.log4jInfo("Ibatis<span style="font-family: 宋体">操作出错</span>,<span style="font-family: 宋体">原因</span>:", er.getMessage());</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (list == null)</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list = new ArrayList();</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return list;</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/**</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * <span style="font-family: 宋体">查询数据库转换成</span>List</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * @param sqlMapId String</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * @return List</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; */</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;public List ibatisQueryForList(String sqlMapId) {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return ibatisQueryForList(sqlMapId, null);</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</p>
<p style="text-indent: 21pt">}</p>
<p style="text-indent: 21pt">(5<span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span>sql-map-config.xml<span style="font-family: 宋体">配置文件</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;?xml</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">version=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"1.0"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">encoding=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"UTF-8"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">?&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;!DOCTYPE</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">sqlMapConfig</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">PUBLIC</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//iBATIS.com//DTD SQL Map Config 2.0//EN"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"http://www.ibatis.com/dtd/sql-map-config-2.dtd"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;sqlMapConfig&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;sqlMap</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">resource=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"com/ibatis/Account.xml"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">/&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/sqlMapConfig&gt;</span></p>
<p style="text-indent: 21pt">(5<span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'"> Account</span>.xml<span style="font-family: 宋体">配置文件</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;?xml</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">version=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"1.0"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">encoding=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"UTF-8"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">?&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;!DOCTYPE</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">sqlMap</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">PUBLIC</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//iBATIS.com//DTD SQL Map 2.0//EN"</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"http://www.ibatis.com/dtd/sql-map-2.dtd"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;sqlMap</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">namespace=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"Account"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;select</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">id=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"getList"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">parameterClass=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"java.util.HashMap"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">resultClass=</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"java.util.HashMap"</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; select username as value from signon</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/select&gt;</span></p>
<p style="text-indent: 20pt"><span style="font-size: 10pt; color: #0000e1; font-family: 'Courier New'">&lt;/sqlMap&gt;</span></p>
<p style="text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Signon</span><span style="font-size: 10pt; color: black; font-family: 宋体">为数据库的一张表</span></p>
<p style="text-indent: 21pt">(6<span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 10pt; color: navy; font-family: 宋体">测试类</span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">Main.java</span></p>
<p style="text-indent: 21pt">package com.main;</p>
<p style="text-indent: 21pt">import org.springframework.context.ApplicationContext;</p>
<p style="text-indent: 21pt">import org.springframework.context.support.ClassPathXmlApplicationContext;</p>
<p style="text-indent: 21pt">import com.doone.database.IbatisDAO;</p>
<p style="text-indent: 21pt">import java.util.*;</p>
<p style="text-indent: 21pt">public class Main {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ApplicationContext context;</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run()</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("<span style="font-family: 宋体">初始化环境</span>.....");</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context=new ClassPathXmlApplicationContext("com/conf/applicationContext.xml");</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("<span style="font-family: 宋体">获取</span> sqlMapDAO.....");</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IbatisDAO sqlMapDAO=(IbatisDAO)context.getBean("sqlMapDAO");</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list=sqlMapDAO.ibatisQueryForList("getList");</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("查询结果为:"+list);</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args)</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Main().run();</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 21pt">}</p>
<img src ="http://www.blogjava.net/ducklyl/aggbug/161938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-11-20 21:30 <a href="http://www.blogjava.net/ducklyl/archive/2007/11/20/161938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习笔记 2007-10-31</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/31/157279.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Wed, 31 Oct 2007 11:14:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/31/157279.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/157279.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/31/157279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/157279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/157279.html</trackback:ping><description><![CDATA[<p>呵呵，这两天项目比较急，事情也比较多，所以没有及时更新。<br />
上一回简单介绍了代理机制，通过创建LogBeforeAdvice来实现。通过实现MethodBeforeAdvice接口，会在目标对象的方法执行之前被呼叫。当然也可以通过实现AfterReturningAdvice，使得目标对象的方法在执行之后被调用。<br />
同样创建LogAfterAdvice类，实现AfterReturningAdvice接口。<br />
<br />
(1)LogAfterAdvice.java</p>
<p>package com.proxy;</p>
<p>import java.lang.reflect.*;<br />
import java.util.logging.Logger;<br />
import java.util.logging.Level;<br />
import org.springframework.aop.AfterReturningAdvice;</p>
<p>public class LogAfterAdvice&nbsp; implements AfterReturningAdvice{</p>
<p>&nbsp;private Logger logger=Logger.getLogger(this.getClass().getName());<br />
&nbsp;public void afterReturning(Object object,Method method,Object[] args,Object target) throws Throwable<br />
&nbsp;{<br />
&nbsp;&nbsp;logger.log(Level.INFO,"LogAfterAdvice mehtod ends "+method);<br />
&nbsp;}</p>
<p>}<br />
(2)advice-config.xml修改如下：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</p>
<p>&lt;beans&gt;<br />
&nbsp;&lt;bean id="logBeforeAdvice" class="com.proxy.LogBeforeAdvice" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="logAfterAdvice" class="com.proxy.LogAfterAdvice" /&gt;<br />
&nbsp;&lt;bean id="helloSpeaker" class="com.proxy.HelloSpeaker" /&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="helloProxy"<br />
&nbsp;&nbsp;class="org.springframework.aop.framework.ProxyFactoryBean"&gt;&lt;!--建立代理对象--&gt;<br />
&nbsp;&nbsp;&lt;property name="proxyInterfaces"&gt;&lt;!--代理接口--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;com.proxy.IHello&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="target"&gt;&lt;!--代理目标--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="helloSpeaker"/&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="interceptorNames"&gt;&lt;!--代理实现类--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;logBeforeAdvice&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;logAfterAdvice&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;<br />
<br />
这样就实现了目标对象的方法在执行之后被调用。<br />
<br />
<br />
同样，在方法执行前后调用目标对象的方法也可以不通过上面的这种方式(毕竟实现两个接口比较麻烦)，可以直接通过实现MethodInterceptor接口，达到目的。<br />
如LogInterceptor类便实现了这样的接口，如下<br />
(3)LogInterceptor.java<br />
</p>
<p>package com.proxy;</p>
<p>import java.util.logging.Logger;<br />
import java.util.logging.Level;<br />
import org.aopalliance.intercept.*;</p>
<p>public class LogInterceptor&nbsp; implements MethodInterceptor{</p>
<p>&nbsp;private Logger logger=Logger.getLogger(this.getClass().getName());</p>
<p>&nbsp;public Object invoke(MethodInvocation Invocation) throws Throwable {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;logger.log(Level.INFO,"LogInterceptor method starts..."+Invocation.getMethod());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Object result=null;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;result=Invocation.proceed();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;finally<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;logger.log(Level.INFO,"LogInterceptor method ends..."+Invocation.getMethod());<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}</p>
<p>}<br />
</p>
<p>(4)advice-config.xml 配置文件修改如下：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</p>
<p>&lt;beans&gt;<br />
&nbsp;&lt;bean id="logInterceptor" class="com.proxy.LogInterceptor" /&gt;<br />
&nbsp;&lt;bean id="helloSpeaker" class="com.proxy.HelloSpeaker" /&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="helloProxy"<br />
&nbsp;&nbsp;class="org.springframework.aop.framework.ProxyFactoryBean"&gt;&lt;!--建立代理对象--&gt;<br />
&nbsp;&nbsp;&lt;property name="proxyInterfaces"&gt;&lt;!--代理接口--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;com.proxy.IHello&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="target"&gt;&lt;!--代理目标--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="helloSpeaker"/&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="interceptorNames"&gt;&lt;!--代理实现类--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;logInterceptor&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;<br />
<br />
通过实现MethodInterceptor接口，同样实现了这样的功能。</p>
<p><br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/ducklyl/aggbug/157279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-31 19:14 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/31/157279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习笔记 2007-10-28 Spring实现代理机制</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/28/156500.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Sun, 28 Oct 2007 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/28/156500.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/156500.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/28/156500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/156500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/156500.html</trackback:ping><description><![CDATA[上一笔记，介绍了代理机制，这一节介绍Spring是如何实现代理。<br />
通过一个例子来说明。<br />
包下载地址(两个都要下)：<br />
http://www.blogjava.net/Files/ducklyl/springaop.rar<br />
http://www.blogjava.net/Files/ducklyl/Spring.rar<br />
<br />
(1)创建LogBeforeAdvice类(实现MethodBeforeAdvice接口，会在目标对象的方法执行之前被呼叫)<br />
<p>package com.proxy;</p>
<p>import java.lang.reflect.*;<br />
import java.util.logging.Logger;<br />
import java.util.logging.Level;<br />
import org.springframework.aop.MethodBeforeAdvice;;</p>
<p>public class LogBeforeAdvice&nbsp; implements MethodBeforeAdvice{</p>
<p>&nbsp;private Logger logger=Logger.getLogger(this.getClass().getName());<br />
&nbsp;public void before(Method method,Object[] args,Object target) throws Throwable<br />
&nbsp;{<br />
&nbsp;&nbsp;logger.log(Level.INFO,"mehtod starts "+method);<br />
&nbsp;}<br />
}<br />
</p>
<br />
(2)创建配置文件advice-config.xml<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</p>
<p>&lt;beans&gt;<br />
&nbsp;&lt;bean id="logBeforeAdvice" class="com.proxy.LogBeforeAdvice" /&gt;<br />
&nbsp;&lt;bean id="helloSpeaker" class="com.proxy.HelloSpeaker" /&gt;<br />
&nbsp;<br />
&nbsp;&lt;bean id="helloProxy"<br />
&nbsp;&nbsp;class="org.springframework.aop.framework.ProxyFactoryBean"&gt;&lt;!--建立代理对象--&gt;<br />
&nbsp;&nbsp;&lt;property name="proxyInterfaces"&gt;&lt;!--代理接口--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;com.proxy.IHello&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="target"&gt;&lt;!--代理目标--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="helloSpeaker" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="interceptorNames"&gt;&lt;!--代理实现类--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;logBeforeAdvice&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&lt;/beans&gt;<br />
(3)测试类SpringAOPDemo </p>
<p>package com.proxy;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.FileSystemXmlApplicationContext;</p>
<p>public class SpringAOPDemo {<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;//读取配置文件<br />
&nbsp;&nbsp;ApplicationContext context=new FileSystemXmlApplicationContext("advice-config.xml");<br />
&nbsp;&nbsp;IHello helloProxy=(IHello)context.getBean("helloProxy");<br />
&nbsp;&nbsp;helloProxy.hello("ducklyl");<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
}<br />
<br />
运行测试类，结果如下：<br />
Hello,ducklyl<br />
</p>
<img src ="http://www.blogjava.net/ducklyl/aggbug/156500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-28 17:47 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/28/156500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习笔记 2007-10-28 代理机制</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/28/156452.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Sun, 28 Oct 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/28/156452.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/156452.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/28/156452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/156452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/156452.html</trackback:ping><description><![CDATA[接下来学习有关AOP,首先了解有关代理机制(Spring实现AOP的一种方式)。代理分为两种：静态代理与动态代理。<br />
通过一个例子来了解静态代理。<br />
(1)一个简单的接口IHello<br />
<p>package com.proxy;<br />
/**<br />
&nbsp;* 接口<br />
&nbsp;* <br />
&nbsp;* **/<br />
public interface IHello {<br />
&nbsp;public void hello(String name);</p>
<p>}<br />
(2)实现类HelloSpeaker </p>
<p>package com.proxy;</p>
<p>public class HelloSpeaker implements IHello{</p>
<p>&nbsp;public void hello(String name) {<br />
&nbsp;&nbsp;System.out.println("Hello,"+name);<br />
&nbsp;&nbsp;<br />
&nbsp;}</p>
<p>}<br />
(3)代理类HelloProxy </p>
<p>package com.proxy;<br />
import java.util.logging.*;<br />
/**<br />
&nbsp;* 静态代理类,代理真正的实现类HelloSpeaker来执行<br />
&nbsp;* <br />
&nbsp;* */<br />
public class HelloProxy implements IHello{</p>
<p>&nbsp;private Logger logger=Logger.getLogger(this.getClass().getName());<br />
&nbsp;<br />
&nbsp;private IHello helloObject;//接口声明</p>
<p>&nbsp;//构造函数<br />
&nbsp;public HelloProxy(IHello helloObject)<br />
&nbsp;{<br />
&nbsp;&nbsp;this.helloObject=helloObject;<br />
&nbsp;}<br />
&nbsp;//接口实现方法<br />
&nbsp;public void hello(String name)<br />
&nbsp;{<br />
&nbsp;&nbsp;log("hello methods starts...");<br />
&nbsp;&nbsp;helloObject.hello(name);<br />
&nbsp;&nbsp;log("hello methods ends...");<br />
&nbsp;}<br />
&nbsp;private void log(String msg)<br />
&nbsp;{<br />
&nbsp;&nbsp;logger.log(Level.INFO,msg);<br />
&nbsp;}</p>
<p>}<br />
</p>
<p>(4)测试类ProxyDemo </p>
<p>package com.proxy;</p>
<p>public class ProxyDemo {<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;//静态代理模式<br />
&nbsp;&nbsp;HelloProxy proxy=new HelloProxy(new HelloSpeaker());<br />
&nbsp;&nbsp;proxy.hello("ducklyl");<br />
&nbsp;}</p>
<p>}<br />
运行测试类，结果为：<br />
Hello,ducklyl<br />
2007-10-28 10:52:26 com.proxy.HelloProxy log<br />
信息: hello methods starts...<br />
2007-10-28 10:52:27 com.proxy.HelloProxy log<br />
信息: hello methods ends...<br />
<br />
<br />
<br />
接下来介绍动态代理<br />
(1)创建动态代理类LogHandler </p>
<p>package com.proxy;</p>
<p>import java.lang.reflect.InvocationHandler;<br />
import java.lang.reflect.Method;<br />
import java.lang.reflect.Proxy;<br />
import java.util.logging.*;<br />
/**<br />
&nbsp;* <br />
&nbsp;* 动态代理类<br />
&nbsp;* **/</p>
<p>public class LogHandler implements InvocationHandler {</p>
<p>&nbsp;private Logger logger = Logger.getLogger(this.getClass().getName());</p>
<p>&nbsp;private Object delegate;</p>
<p>&nbsp;public LogHandler()<br />
&nbsp;{<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public Object bind(Object delegate) {<br />
&nbsp;&nbsp;this.delegate = delegate;<br />
&nbsp;&nbsp;log("bind starts...");<br />
&nbsp;&nbsp;return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;delegate.getClass().getInterfaces(), this);<br />
&nbsp;}</p>
<p>&nbsp;public Object invoke(Object proxy, Method method, Object[] args)<br />
&nbsp;&nbsp;&nbsp;throws Throwable {<br />
&nbsp;&nbsp;Object result = null;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;log("method starts..." + method);<br />
&nbsp;&nbsp;&nbsp;result = method.invoke(delegate, args);<br />
&nbsp;&nbsp;&nbsp;log("method ends..." + method);<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;log(e.toString());<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return null;<br />
&nbsp;}</p>
<p>&nbsp;private void log(String msg) {<br />
&nbsp;&nbsp;logger.log(Level.INFO, msg);<br />
&nbsp;}</p>
<p>}<br />
(2)创建测试类ProxyTest <br />
</p>
<p>package com.proxy;</p>
<p>public class ProxyTest {<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;LogHandler logHandler=new LogHandler();<br />
&nbsp;&nbsp;//logHandler代理HelloSpeaker实例，调用hello<br />
&nbsp;&nbsp;IHello helloProxy=(IHello)logHandler.bind(new HelloSpeaker());<br />
&nbsp;&nbsp;helloProxy.hello("ducklyl");<br />
&nbsp;}</p>
<p>}<br />
<br />
运行测试类，结果为：<br />
Hello,ducklyl<br />
2007-10-28 11:24:59 com.proxy.LogHandler log<br />
信息: bind starts...<br />
2007-10-28 11:24:59 com.proxy.LogHandler log<br />
信息: method starts...public abstract void com.proxy.IHello.hello(java.lang.String)<br />
2007-10-28 11:24:59 com.proxy.LogHandler log<br />
信息: method ends...public abstract void com.proxy.IHello.hello(java.lang.String)<br />
<br />
</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/ducklyl/aggbug/156452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-28 11:00 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/28/156452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习笔记 2007-10-25</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/25/155937.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Thu, 25 Oct 2007 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/25/155937.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/155937.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/25/155937.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/155937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/155937.html</trackback:ping><description><![CDATA[这次介绍有关资源相关的接口:org.springframework.context.MessageResource.而类org.springframework.context.ApplicationContext实现了该接口.，您可以通过getMessage()的方法来取得资源文件，从而实现国际化消息。<br />
通过一个例子来说明。<br />
导入Spring所需的包：commons-logging.jar，spring.jar 。(日志包和Spring包)<br />
包下载地址：<br />
http://www.blogjava.net/Files/ducklyl/Spring.rar<br />
<br />
(1)创建resource-config.xml<br />
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</p>
<p>&lt;beans&gt;<br />
&lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&gt;<br />
&nbsp;&lt;property name="basename"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;duck&lt;/value&gt; &lt;!-- 资源文件名前缀 --&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;/beans&gt;<br />
(2)创建资源文件duck_en_US.properties,duck_zh_CN.properties两个文件<br />
duck_en_US.properties内容为：<br />
ducklyl=User {0} login at {1}<br />
<br />
duck_zh_CN.properties内容(经过JDK工具native2ascii)编码转换为:<br />
ducklyl=\u7528\u6237 {0} \u4e8e {1} \u767b\u9646<br />
<br />
(3)创建测试类</p>
<p>package com.resource;</p>
<p>import java.util.*;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.FileSystemXmlApplicationContext;</p>
<p><br />
public class SpringTest {<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;//读取配置文件<br />
&nbsp;ApplicationContext context=new FileSystemXmlApplicationContext("src/com/resource/resource-config.xml");<br />
&nbsp;<br />
&nbsp;//传入两个参数,替换资源文件{0},{1}<br />
&nbsp;String[] para=new String[]{"王生生",Calendar.getInstance().getTime().toString()};<br />
&nbsp;<br />
&nbsp;System.out.println(context.getMessage("ducklyl", para,Locale.US));<br />
&nbsp;System.out.println(context.getMessage("ducklyl", para,Locale.CHINA));<br />
&nbsp;<br />
}<br />
}<br />
<br />
如果以上配置正确，运行结果为：<br />
<br />
User 王生生 login at Thu Oct 25 19:15:59 CST 2007<br />
用户 王生生 于 Thu Oct 25 19:15:59 CST 2007 登陆</p>
<img src ="http://www.blogjava.net/ducklyl/aggbug/155937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-25 19:28 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/25/155937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习笔记 2007-10-24</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/24/155660.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Wed, 24 Oct 2007 11:32:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/24/155660.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/155660.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/24/155660.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/155660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/155660.html</trackback:ping><description><![CDATA[Spring提供了一个BeanFactoryPostProcessor接口的实现类：CustomEditorConfigurer。这个类可以实现java.beans.PropertyEditor接口的类，并将字符串值转换为指定类型的对象。<br />
通过一个简单的例子来说明。<br />
导入Spring所需的包：commons-logging.jar，spring.jar 。(日志包和Spring包)<br />
包下载地址：<br />
http://www.blogjava.net/Files/ducklyl/Spring.rar<br />
<br />
(1)创建User 类<br />
<p>package com.editor;</p>
<p>public class User {<br />
&nbsp;private String name;<br />
&nbsp;private int number;<br />
&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}<br />
&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}<br />
&nbsp;public int getNumber() {<br />
&nbsp;&nbsp;return number;<br />
&nbsp;}<br />
&nbsp;public void setNumber(int number) {<br />
&nbsp;&nbsp;this.number = number;<br />
&nbsp;}</p>
<p>}</p>
(2)创建HelloBean 类<br />
<p>package com.editor;</p>
<p>public class HelloBean {<br />
&nbsp;private String helloWord;<br />
&nbsp;private User user;<br />
&nbsp;public String getHelloWord() {<br />
&nbsp;&nbsp;return helloWord;<br />
&nbsp;}<br />
&nbsp;public void setHelloWord(String helloWord) {<br />
&nbsp;&nbsp;this.helloWord = helloWord;<br />
&nbsp;}<br />
&nbsp;public User getUser() {<br />
&nbsp;&nbsp;return user;<br />
&nbsp;}<br />
&nbsp;public void setUser(User user) {<br />
&nbsp;&nbsp;this.user = user;<br />
&nbsp;}</p>
<p><br />
}<br />
(3)创建UserEditor 类</p>
<p>package com.editor;<br />
import java.beans.PropertyEditorSupport;</p>
<p>public class UserEditor extends PropertyEditorSupport{<br />
&nbsp;public void setAsText(String text)<br />
&nbsp;{<br />
&nbsp;&nbsp;String[] strs=text.split(",");<br />
&nbsp;&nbsp;int number=Integer.parseInt(strs[1]);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;User user=new User();<br />
&nbsp;&nbsp;user.setName(strs[0]);<br />
&nbsp;&nbsp;user.setNumber(number);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;setValue(user);<br />
&nbsp;}</p>
<p>}<br />
</p>
<p><br />
(4)在类路径下创建property-config.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</p>
<p>&lt;beans&gt;<br />
&nbsp;&lt;bean id="EditorConfigBean"<br />
&nbsp;&nbsp;class="org.springframework.beans.factory.config.CustomEditorConfigurer"&gt;<br />
&nbsp;&nbsp;&lt;property name="customEditors"&gt;&lt;!--CustomEditorConfigurer类会加载"customEditors"属性设定的map--&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;entry key="com.editor.User"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean id="userEditor" class="com.editor.UserEditor" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/map&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;bean id="helloBean" class="com.editor.HelloBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="helloWord"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;Hello!&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="user"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;ducklyl,123456&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</p>
<p>&lt;/beans&gt;<br />
(5)创建测试类<br />
</p>
<p>package com.editor;</p>
<p>import org.springframework.context.*;<br />
import org.springframework.context.support.*;</p>
<p><br />
public class SpirngTest {<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;//读取配置文件<br />
&nbsp;&nbsp;ApplicationContext context=new FileSystemXmlApplicationContext("property-config.xml");<br />
&nbsp;&nbsp;//获取id="helloBean"对象<br />
&nbsp;&nbsp;HelloBean hello=(HelloBean)context.getBean("helloBean");<br />
&nbsp;&nbsp;//调用helloBean对象getHelloWord()方法<br />
&nbsp;&nbsp;System.out.println(hello.getHelloWord());<br />
&nbsp;&nbsp;System.out.println("Name:"+hello.getUser().getName());<br />
&nbsp;&nbsp;System.out.println("Number:"+hello.getUser().getNumber());<br />
&nbsp;}</p>
<p>}<br />
如果以上正确设置，运行结果为：<br />
Hello!<br />
Name:ducklyl<br />
Number:123456</p>
 <img src ="http://www.blogjava.net/ducklyl/aggbug/155660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-24 19:32 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/24/155660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习笔记 2007-10-22</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/22/155030.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Mon, 22 Oct 2007 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/22/155030.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/155030.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/22/155030.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/155030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/155030.html</trackback:ping><description><![CDATA[<p>之前的例子比较简单，打算了解一下Spring的基本用法。Spring的依赖注入有三种实现方式，常用是setter和construct方式。对于像数组和集合对象注入，注入前必须填充一些对象到集合中，然后再把集合注入到Bean，采用setter方式来完成。<br />
通过一个例子来说明。<br />
导入Spring所需的包：commons-logging.jar，spring.jar 。(日志包和Spring包)<br />
包下载地址：<br />
http://www.blogjava.net/Files/ducklyl/Spring.rar<br />
<br />
(1)创建ObjectSet类<br />
package com.set;</p>
<p>public class ObjectSet {<br />
&nbsp;private String name;</p>
<p>&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}<br />
&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}<br />
&nbsp;public String toString()<br />
&nbsp;{<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}<br />
}<br />
(2)创建SomeBean类<br />
package com.set;</p>
<p>import java.util.List;<br />
import java.util.Map;</p>
<p>public class SomeBean {<br />
&nbsp;private String[] someStrArray;<br />
&nbsp;private ObjectSet[] someObjArray;<br />
&nbsp;private List someList;<br />
&nbsp;private Map someMap;<br />
&nbsp;public SomeBean()<br />
&nbsp;{}<br />
&nbsp;public List getSomeList() {<br />
&nbsp;&nbsp;return someList;<br />
&nbsp;}<br />
&nbsp;public void setSomeList(List someList) {<br />
&nbsp;&nbsp;this.someList = someList;<br />
&nbsp;}<br />
&nbsp;public Map getSomeMap() {<br />
&nbsp;&nbsp;return someMap;<br />
&nbsp;}<br />
&nbsp;public void setSomeMap(Map someMap) {<br />
&nbsp;&nbsp;this.someMap = someMap;<br />
&nbsp;}<br />
&nbsp;public ObjectSet[] getSomeObjArray() {<br />
&nbsp;&nbsp;return someObjArray;<br />
&nbsp;}<br />
&nbsp;public void setSomeObjArray(ObjectSet[] someObjArray) {<br />
&nbsp;&nbsp;this.someObjArray = someObjArray;<br />
&nbsp;}<br />
&nbsp;public String[] getSomeStrArray() {<br />
&nbsp;&nbsp;return someStrArray;<br />
&nbsp;}<br />
&nbsp;public void setSomeStrArray(String[] someStrArray) {<br />
&nbsp;&nbsp;this.someStrArray = someStrArray;<br />
&nbsp;}<br />
}<br />
(3)在类路径下，创建set-config.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
&lt;beans&gt;<br />
&lt;bean id="first_object" class="com.set.ObjectSet" &gt;<br />
&nbsp;&lt;property name="name"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;ducklyl&lt;/value&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;bean id="second_object" class="com.set.ObjectSet" &gt;<br />
&nbsp;&lt;property name="name"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;wangsp&lt;/value&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;bean id="someBean" class="com.set.SomeBean" &gt;<br />
&nbsp;&lt;property name="someStrArray"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;Hello&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;Welcome&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;property name="someObjArray"&gt;<br />
&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="first_object"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="second_object"/&gt;<br />
&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;property name="someList"&gt;<br />
&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;ListTest&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="first_object"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="second_object"/&gt;<br />
&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;property name="someMap"&gt;<br />
&nbsp;&nbsp;&lt;map&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;entry key="first"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;Hello,ducklyl!&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/entry&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;entry key="second"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref bean="first_object"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/entry&gt;<br />
&nbsp;&nbsp;&lt;/map&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;/beans&gt;<br />
(4)创建测试类SpringTest<br />
</p>
<p>package com.set;</p>
<p>import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.FileSystemXmlApplicationContext;<br />
import java.util.*;</p>
<p>public class SpringTest {<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;//读取配置文件<br />
&nbsp;ApplicationContext context=new FileSystemXmlApplicationContext("set-config.xml");<br />
&nbsp;//获取id="setBean"对象<br />
&nbsp;SomeBean someBean=(SomeBean)context.getBean("someBean");<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; //获取someStrArray,someObjArray<br />
&nbsp;String[] strs=someBean.getSomeStrArray();<br />
&nbsp;ObjectSet[] some=someBean.getSomeObjArray();<br />
&nbsp;<br />
&nbsp;for(int i=0;i&lt;strs.length;i++)<br />
&nbsp;System.out.println(strs[i]+","+some[i]);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; //获取someList<br />
&nbsp;List someList=(List)someBean.getSomeList();<br />
&nbsp;for(int i=0;i&lt;someList.size();i++)<br />
&nbsp;&nbsp;System.out.println(someList.get(i));<br />
&nbsp;<br />
&nbsp;//获取someMap<br />
&nbsp;Map someMap=someBean.getSomeMap();<br />
&nbsp;System.out.println(someMap);<br />
&nbsp;<br />
}<br />
}<br />
</p>
<p>如果以上配置正确，运行测试程序，结果如下：<br />
Hello,ducklyl<br />
Welcome,wangsp<br />
ListTest<br />
ducklyl<br />
wangsp<br />
{first=Hello,ducklyl!, second=ducklyl}</p>
<img src ="http://www.blogjava.net/ducklyl/aggbug/155030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-22 16:40 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/22/155030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hessian 一个简单二进制协议实现webservice</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/21/154757.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Sun, 21 Oct 2007 12:20:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/21/154757.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/154757.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/21/154757.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/154757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/154757.html</trackback:ping><description><![CDATA[最近项目中涉及到外网平台调远程接口数据的问题，本来是用soap方式实现的，今天听人介绍了Hessian，想不到它的实现更加简单，代码写起来也比较少。<br />
下面这个例子我是从Hessian官方上，稍微改了点。<br />
创建一个名为Hessian的web工程，测试服务器为tomcat5.0，lib目录下必须包含hessian-3.0.20.jar包，下载地址：http://www.blogjava.net/Files/ducklyl/hessian-3.0.20.jar.rar<br />
(1)接口Basic <br />
<p>package example;</p>
<p>public interface Basic {<br />
&nbsp;&nbsp; public String hello(); //与服务端的hello方法对应<br />
}<br />
(2)服务端实现类</p>
<p>package example;</p>
<p>public class BasicService implements Basic {<br />
&nbsp; private String _greeting = "Hello,ducklyl!";</p>
<p>&nbsp; public void setGreeting(String greeting)<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; _greeting = greeting;<br />
&nbsp; }</p>
<p>&nbsp; public String hello()<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; return _greeting;<br />
&nbsp; }<br />
}</p>
(3)客户端实现类<br />
<p>package example;</p>
<p>import com.caucho.hessian.client.HessianProxyFactory;<br />
/**&nbsp;&nbsp; <br />
&nbsp;* &lt;p&gt;Title: hessian实现远程调用&lt;/p&gt;&nbsp;&nbsp;<br />
&nbsp;* &lt;p&gt;Copyright: Copyright (c) 2007&lt;/p&gt;&nbsp;&nbsp;<br />
&nbsp;* @author ducklyl&nbsp;&nbsp; <br />
&nbsp;* @version 1.0&nbsp;&nbsp; <br />
&nbsp;*/&nbsp;&nbsp; <br />
public class BasicClient {<br />
&nbsp; public static void main(String []args)<br />
&nbsp;&nbsp;&nbsp; throws Exception<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; String url = "http://127.0.0.1:8080/Hessian/ducklyl";<br />
&nbsp;&nbsp;&nbsp; //创建factory实例<br />
&nbsp;&nbsp;&nbsp; HessianProxyFactory factory = new HessianProxyFactory();<br />
&nbsp;&nbsp;&nbsp; //客户端需实现Basic接口<br />
&nbsp;&nbsp;&nbsp; Basic basic = (Basic) factory.create(Basic.class, url);</p>
<p>&nbsp;&nbsp;&nbsp; System.out.println("Hessian: " + basic.hello());<br />
&nbsp; }<br />
}<br />
</p>
<p>(4)&nbsp;web.xml<br />
</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE web-app<br />
&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />
&nbsp;&nbsp;&nbsp; "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br />
&nbsp;&lt;web-app&gt;<br />
&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp; &lt;servlet-name&gt;ducklyl&lt;/servlet-name&gt;<br />
&nbsp;&nbsp; &lt;servlet-class&gt;com.caucho.hessian.server.HessianServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;home-class&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;example.BasicService&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;home-api&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;example.Basic&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&lt;servlet-name&gt;ducklyl&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/ducklyl&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;<br />
&lt;/web-app&gt;</p>
<p>&nbsp;运行客户端程序BasicClient ，如果以下配置没问题，输出结果为：</p>
Hessian: Hello,ducklyl! 
 <img src ="http://www.blogjava.net/ducklyl/aggbug/154757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-21 20:20 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/21/154757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring学习笔记 2007-10-21</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/21/154686.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Sun, 21 Oct 2007 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/21/154686.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/154686.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/21/154686.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/154686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/154686.html</trackback:ping><description><![CDATA[<p>计划用一个月时间来学习Spring，在这里把自己的学习过程记录下来，方便想学习Spring的人，也为自己日后复习有个参考。以下通过一个简单的例子来先了解下Spring的用法。<br />
(1)创建一个java工程，建立如下类：HelloBean</p>
<p>package com.ducklyl;</p>
<p>public class HelloBean {<br />
&nbsp;private String helloWord;</p>
<p>&nbsp;public String getHelloWord() {<br />
&nbsp;&nbsp;return helloWord;<br />
&nbsp;}</p>
<p>&nbsp;public void setHelloWord(String helloWord) {<br />
&nbsp;&nbsp;this.helloWord = helloWord;<br />
&nbsp;}</p>
<p><br />
}<br />
</p>
<p><br />
(2)创建Spring配置文件：beans-config.xml<br />
</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;</p>
<p>&lt;beans&gt;<br />
&lt;bean id="helloBean" class="com.ducklyl.HelloBean"&gt;<br />
&nbsp;&lt;property name="helloWord"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;Hello,ducklyl!&lt;/value&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;/beans&gt;<br />
<br />
(3)导入Spring所需的包：commons-logging.jar，spring.jar 。(日志包和Spring包)<br />
包下载地址：<br />
http://www.blogjava.net/Files/ducklyl/Spring.rar<br />
(4)创建测试类：SpringDemo.java<br />
</p>
<p>package com.ducklyl;</p>
<p>import org.springframework.core.io.FileSystemResource;<br />
import org.springframework.core.io.Resource;<br />
import org.springframework.beans.factory.BeanFactory;<br />
import org.springframework.beans.factory.xml.*;</p>
<p><br />
public class SpringDemo{<br />
&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;//读取配置文件<br />
&nbsp;&nbsp;Resource rs=new FileSystemResource("beans-config.xml");<br />
&nbsp;&nbsp;//实例化Bean工厂<br />
&nbsp;&nbsp;BeanFactory factory=new XmlBeanFactory(rs);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//获取id="helloBean"对象<br />
&nbsp;&nbsp;HelloBean hello=(HelloBean)factory.getBean("helloBean");<br />
&nbsp;&nbsp;//调用helloBean对象getHelloWord()方法<br />
&nbsp;&nbsp;System.out.println(hello.getHelloWord());<br />
&nbsp;}</p>
<p>}<br />
<br />
如果以上配置正确的话，运行SpringDemo.java，可以看到输出结果：Hello,ducklyl！<br />
<br />
</p>
<p><br />
<br />
　　　　</p>
<img src ="http://www.blogjava.net/ducklyl/aggbug/154686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-21 13:26 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/21/154686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的SOAP技术</title><link>http://www.blogjava.net/ducklyl/archive/2007/10/20/154497.html</link><dc:creator>ducklyl</dc:creator><author>ducklyl</author><pubDate>Sat, 20 Oct 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/ducklyl/archive/2007/10/20/154497.html</guid><wfw:comment>http://www.blogjava.net/ducklyl/comments/154497.html</wfw:comment><comments>http://www.blogjava.net/ducklyl/archive/2007/10/20/154497.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ducklyl/comments/commentRss/154497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ducklyl/services/trackbacks/154497.html</trackback:ping><description><![CDATA[开始之前，我想就本文即将讨论的主题和读者需要具备的起点知识做一些必需的描叙。本文的主题是讨论SOAP技术，我们将尽可能的讲得通俗易懂一些，所以，我们引入了一个普通的&#8220;Hello World&#8221;范例来给读者说明它们是怎么运作的，让读者知道它们的运作方式。我认为，如果光看官方文档是很难开始学习这门新技术的，官方文档中包含大量的范例，并解释了所有的特性和优点，但是没解释它们的运作方式。
<p>　在这篇文章中，我不打算只肤浅的解释SOAP技术的定义，我们假设读者熟悉JAVA语言，Web技术，具有XML语言，XML Namespaces，XML Schema的基础。在这种情况下，理解本文将不存在任何困难。然而，即使没有这些知识，你也不必担心，我们将尽可能的解释得简单，但是当你开始做自己的SOAP应用程序时会遇到一些问题和麻烦。因此，花费一定时间来学习上面的知识是很有必要的。</p>
<p>　　从技术的角度来说，有必要提一下我们的调试环境。我们使用的是Windows XP操作系统，安装有JAVA 2 SDK 1.4.1，Apache SOAP 2.3.1，JAF 1.0.2，JAVAMAIL 1.3.1和Xerces 2.6.0。上面所提及的都能在Tcomcat 4.1.29 JSP/Servlet容器中正常运行。所有的软件都是免费自由软件，因此你能够很容易的下载它们并自己在任何你喜欢的平台如Windows或UNIX上安装它们。Java SDK，JAF和JAVAMAIL位于SUN的官方网站(http://java.sun.com)，其他的软件在Jakarta项目组的官方网站(http://jakarta.apache.org)上有down的。</p>
<p>　　可能你在看到我们需要这么多不同的包(package)时已经有点担心和不安了，但是实际上你不应该担心这些的。一旦你懂了基础，那么对你将相当容易。安装不是一件很难的事情，你只需要在设置环境变量的时候仔细些，比如CATALINA_HOME, CLASSPATH, JAVA_HOME 等等，所有这些步骤都是手工的。由于我仅仅是想将你的注意力再次集中到它们身上，所以你能很快的就完成以上配置过程。我只是添加下面的一些字符串到Tomcat的bin/setclasspath.bat文件中:<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"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />set&nbsp;CATALINA_HOME</span><span style="color: #000000">=</span><span style="color: #000000">C:\Tomcat4</span><span style="color: #000000">.1.29</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%JAVA_HOME%\lib\tools.jar<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%JAVA_HOME%\soap-</span><span style="color: #000000">2.3.1</span><span style="color: #000000">\lib\soap.jar<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%JAVA_HOME%\javamail-1.3.1\mail.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%JAVA_HOME%\jaf-1.0.2\activation.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%JAVA_HOME%\xerces-2_6_0\xercesSamples.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%JAVA_HOME%\xerces-2_6_0\xml-apis.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%JAVA_HOME%\xerces-2_6_0\xmlParserAPIs.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%CATALINA_HOME%\common\lib\servlet.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">set&nbsp;CLASSPATH</span><span style="color: #000000">=</span><span style="color: #000000">%CLASSPATH%</span><span style="color: #008000">;</span><span style="color: #008000">%CATALINA_HOME%\common\lib\tools.jar</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;</span></div>
<p>&nbsp;</p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果你的安装路径(installation paths)和上面使用的不同，你需要更正它们，然后关闭和重启Tomcat以使它们生效。这样，你就有为运行SOAP作好了准备。但是现在，我要忘记有关的技术部分，来学一点理论知识。
<p>　　SOAP意思是简单对象访问协议(Simple Object Access Protocol)。的确如它的名字一样，SOAP是很简单的。它是一个基于XML的协议，允许程序组件和应用程序彼此使用一种标准的Internet协议--HTTP来通讯。SOAP是一种独立的平台，它不依赖程序语言，它是简单的，弹性的，很容易扩展的。目前，应用程序能够彼此使用一种基于DCOM和CORBA技术的远程过程调用(RPC)来进行相互通讯，但HTTP不被设计为这个目的。RPC在Internet上应用是非常困难的，它们会出现许多兼容性和安全性的问题，因为防火墙和代理服务器通常都会阻断(block)这些类型的流量。应用程序之间最好的通讯方式是通过HTTP协议，因为HTTP是支持所有Internet浏览器和服务器的。基于这个目的，SOAP协议被创建出来。<br />
那么，它们是如何运作的呢?比如，一个应用程序(A)需要和另一个应用程序(B)在SOAP的帮助下进行彼此通讯。它们将使用下面的框架图来完成这个过程:</p>
<p><img style="border-left-color: #000000; border-bottom-color: #000000; width: 500px; border-top-color: #000000; border-right-color: #000000" alt="" src="http://searchwebservices.techtarget.com.cn/imagelist/06/38/6ali8sib0zrt.gif" border="0" /></p>
<p>　　这个SOAP信封(SOAP envelope)是一个包含以下内容的XML文档:</p>
<p>　　<img height="263" alt="" src="http://searchwebservices.techtarget.com.cn/imagelist/06/38/wd23k20qxnm8.gif" width="229" /></p>
<p>　　正如你看到的，它是非常简单的。它看起来确实就象一个普通的信封或者你的email。你想看看它们是如何动作的吗?下面跟我们一起来吧。其实我们有很多方法是不用SOAP来在创建和运行我们自己的&#8220;Hello World&#8221;应用程序的，但是因为我们要保持它的简单性，我会给你一个它运作方式的框架图(scheme)。</p>
<p>　　我们的&#8220;Hello World&#8221;范例会包含一个SOAP Service。我们的SOAP Client将发送它们的名字到该SOAP Service，并试图得到一些答复或响应。这个SOAP Service需要部署到一个SOAP Admin的工具，以至重定位所有请求的SOAP(Proxy) RPC Router能够知道它们应该使用哪种服务来运作。总而言之，这个是以下面的方式来运作的:</p>
<p><a href="http://searchwebservices.techtarget.com.cn/TLimages/picview/?/imagelist/06/38/612k2813eo29.gif" target="_blank"><img style="border-left-color: #000000; border-bottom-color: #000000; border-top-color: #000000; border-right-color: #000000" alt="点击放大此图片" src="http://searchwebservices.techtarget.com.cn/imagelist/06/38/612k2813eo29s.gif" border="0" /></a><br />
现在，我们来一步步的看看到底发生了什么。在Step 1里，HelloWorldClient将连接一个SOAP RPC Router，请求我们的SOAP Service并将包含我们名字的一个字符串传递给它。该SOAP RPC Router会检查是否它已经部署了这个SOAP Service。如果它被发现是被部署的，那么它将传递数据到这个SOAP Service并调用特定的方法，这个是Step 2。然后SOAP Service方法会被执行，将返回某个字符串值(该值就是SOAP Client的答复或者响应)(Step 3)。在Step4中，SOAP RPC Router将仅仅只是重定向这个数据到SOAP Client。所有在Step1和Step4里传输的数据是通过SOAP Envelope来完成的。正如你所看到的，算法是相当简单的，因此我们只准备关心实际的代码。</p>
<p>　　首先，我们要创建一个SOAP Service。下面是它的代码，请不要忘记将它放入HelloWorld/ 目录中(必须被包含在你的CLASSPATH中):<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"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;SOAPService.java&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">　　</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;HelloWorld;&nbsp;<br />
<img id="Codehighlighter1_71_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_183_Open_Text.style.display='none'; Codehighlighter1_71_183_Closed_Image.style.display='inline'; Codehighlighter1_71_183_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_71_183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_71_183_Closed_Text.style.display='none'; Codehighlighter1_71_183_Open_Image.style.display='inline'; Codehighlighter1_71_183_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" />　　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SOAPService&nbsp;</span><span id="Codehighlighter1_71_183_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_71_183_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_110_178_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_178_Open_Text.style.display='none'; Codehighlighter1_110_178_Closed_Image.style.display='inline'; Codehighlighter1_110_178_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_110_178_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_110_178_Closed_Text.style.display='none'; Codehighlighter1_110_178_Open_Image.style.display='inline'; Codehighlighter1_110_178_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;sayHi(String&nbsp;x)&nbsp;</span><span id="Codehighlighter1_110_178_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_110_178_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;my&nbsp;friend,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">!&nbsp;Glad&nbsp;to&nbsp;see&nbsp;you!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />　　}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;添加任何注释也是很容易的。要编译它，只需要用下列命令:javac SOAPService.java<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二步，一旦我们准备好了SOAP Service，我们需要用SOAP Service Manager来部署它。这个可以通过很多方式来实现，但是为了能让初学SOAP的读者更容易理解SOAP，我提供了一个最容易的方式。我们假设你的Web Server(Tomcat或其他)已经正常运行，并且你已经正确安装了SOAP。那么当浏览器访问http://localhost:8080/soap/，你会看见Apache SOAP的欢迎页面。点击Run the admin client ，然后 Deploy。你会得到一个屏幕显示，在那里你需要填入ID，Scope，Method，Provider Type和JAVA Provider的信息到表单域中。你能忽略其他所有的表单域，除非你真的需要它们的信息。我们的&#8220;HelloWorld&#8221;例子不需要它们，所以，我们填的下面的值:<br />
<li>　　ID: urn:HelloWorld_SOAPService
<li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scope: Application
<li>　　Methods: sayHi
<li>　　Provider Type: java
<li>　　Java Provider - Provider Class: HelloWorld.SOAPService
<li>　　Java Provider - Static? No
<p>一些注释:ID是我们要从SOAP Client标识我们的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java类的名字。</p>
<p>　　现在，点击Deploy 按钮，那么你的服务会被部署。再次强调，请注意正确设置CLASSPATH环境变量。然后，你的HelloWorld.SOAPService类能够被找到，并且所有必需的jar包也能被找到。这是个几乎每个人都会犯的普通错误。现在，你能够点击 List ，将会看见你的服务已经被部署进来。恭喜!</p>
<p>　　最后，让我们来创建一个SOAP Client。代码看起来有点复杂，但是在现实中不会只有这么点长。<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"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">1</span><span style="color: #000000">:&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;HelloWorldClient.java&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">　　</span><span style="color: #000000">2</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />　　</span><span style="color: #000000">3</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.net.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />　　</span><span style="color: #000000">4</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />　　</span><span style="color: #000000">5</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.soap.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />　　</span><span style="color: #000000">6</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.soap.rpc.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img id="Codehighlighter1_207_1443_Open_Image" onclick="this.style.display='none'; Codehighlighter1_207_1443_Open_Text.style.display='none'; Codehighlighter1_207_1443_Closed_Image.style.display='inline'; Codehighlighter1_207_1443_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_207_1443_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_207_1443_Closed_Text.style.display='none'; Codehighlighter1_207_1443_Open_Image.style.display='inline'; Codehighlighter1_207_1443_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" />　　</span><span style="color: #000000">7</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloWorldClient&nbsp;</span><span id="Codehighlighter1_207_1443_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_207_1443_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img id="Codehighlighter1_270_1435_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_1435_Open_Text.style.display='none'; Codehighlighter1_270_1435_Closed_Image.style.display='inline'; Codehighlighter1_270_1435_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_270_1435_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_270_1435_Closed_Text.style.display='none'; Codehighlighter1_270_1435_Open_Image.style.display='inline'; Codehighlighter1_270_1435_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span><span style="color: #000000">8</span><span style="color: #000000">:&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;arg)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_270_1435_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_270_1435_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">9</span><span style="color: #000000">:&nbsp;Call&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">10</span><span style="color: #000000">:&nbsp;URL&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">11</span><span style="color: #000000">:&nbsp;Vector&nbsp;params&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">12</span><span style="color: #000000">:&nbsp;Response&nbsp;rep&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">13</span><span style="color: #000000">:&nbsp;String&nbsp;ourName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Superman</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">14</span><span style="color: #000000">:&nbsp;String&nbsp;ourUrn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">urn:HelloWorld_SOAPService</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">15</span><span style="color: #000000">:&nbsp;String&nbsp;ourMethod&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">sayHi</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">16</span><span style="color: #000000">:&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;URL(</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/soap/servlet/&nbsp;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">　　rpcrouter</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">　　</span><span style="color: #000000">17</span><span style="color: #000000">:&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Passing&nbsp;to&nbsp;our&nbsp;deployed&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ourUrn</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">　　our&nbsp;name&nbsp;(</span><span style="color: #000000">"</span><span style="color: #000000">+ourName+</span><span style="color: #000000">"</span><span style="color: #000000">):&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">　　</span><span style="color: #000000">18</span><span style="color: #000000">:&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Call();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">19</span><span style="color: #000000">:&nbsp;c.setTargetObjectURI(ourUrn);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">20</span><span style="color: #000000">:&nbsp;c.setMethodName(ourMethod);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">21</span><span style="color: #000000">:&nbsp;c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">22</span><span style="color: #000000">:&nbsp;params&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Vector();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">23</span><span style="color: #000000">:&nbsp;params.addElement(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Parameter(</span><span style="color: #000000">"</span><span style="color: #000000">ourName</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;String.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　ourName,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">));&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">24</span><span style="color: #000000">:&nbsp;c.setParams(params);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">25</span><span style="color: #000000">:&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">and&nbsp;its&nbsp;answer&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">26</span><span style="color: #000000">:&nbsp;rep&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c.invoke(url,&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">);&nbsp;<br />
<img id="Codehighlighter1_1071_1289_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1071_1289_Open_Text.style.display='none'; Codehighlighter1_1071_1289_Closed_Image.style.display='inline'; Codehighlighter1_1071_1289_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1071_1289_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1071_1289_Closed_Text.style.display='none'; Codehighlighter1_1071_1289_Open_Image.style.display='inline'; Codehighlighter1_1071_1289_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span><span style="color: #000000">27</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rep.generatedFault())&nbsp;</span><span id="Codehighlighter1_1071_1289_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1071_1289_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">28</span><span style="color: #000000">:&nbsp;Fault&nbsp;fault&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rep.getFault();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">29</span><span style="color: #000000">:&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">\nCall&nbsp;failed!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">30</span><span style="color: #000000">:&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Code&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fault.getFaultCode());&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">31</span><span style="color: #000000">:&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">String&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fault.getFaultString());&nbsp;<br />
<img id="Codehighlighter1_1296_1426_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1296_1426_Open_Text.style.display='none'; Codehighlighter1_1296_1426_Closed_Image.style.display='inline'; Codehighlighter1_1296_1426_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1296_1426_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1296_1426_Closed_Text.style.display='none'; Codehighlighter1_1296_1426_Open_Image.style.display='inline'; Codehighlighter1_1296_1426_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />　　</span><span style="color: #000000">32</span><span style="color: #000000">:&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_1296_1426_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1296_1426_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">33</span><span style="color: #000000">:&nbsp;Parameter&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rep.getReturnValue();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">34</span><span style="color: #000000">:&nbsp;System.out.print(result.getValue());&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />　　</span><span style="color: #000000">35</span><span style="color: #000000">:&nbsp;System.out.println();&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　</span><span style="color: #000000">36</span><span style="color: #000000">:&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />　　</span><span style="color: #000000">37</span><span style="color: #000000">:&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />　　</span><span style="color: #000000">38</span><span style="color: #000000">:}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
下面我要做一些解释。在第13行，我们设置了我们的名字，这个名字将会传递给SOAP Service。在第14行，我们设置了我们将要调用的服务的ID(service ID)，和第15行里设置的服务方法(service method)。有了这个ID，服务能够被部署到SOAP服务管理器(SOAP Service Manager)中。我们没有设置任何其他值，仅仅只用刚才那些基础值就可以正常运作了。你能从SOAP的官方文档上得到相关信息，该文档来自SOAP包中，它们的解释超出了本文的范围。
<p>　　用以下方式编译这个SOAP Client:</p>
<p>　　javac HelloWorldClient.java</p>
<p>　　为了圆满完成它，让我们检查一下针对我们的测试，是否所有事情都准备就绪。Tomcat正在运行，所有的环境变量都正确，SOAP Service被编译和部署，SOAP Client被成功编译。OK，让我们运行它，你将看到这个屏幕:<br />
<a href="http://searchwebservices.techtarget.com.cn/TLimages/picview/?/imagelist/06/38/500w6w006b97.gif" target="_blank"><img style="border-left-color: #000000; border-bottom-color: #000000; border-top-color: #000000; border-right-color: #000000" alt="点击放大此图片" src="http://searchwebservices.techtarget.com.cn/imagelist/06/38/500w6w006b97s.gif" border="0" /></a></p>
<p>　　正如你所看到的，我们的SOAP Client使用SOAP协议成功发送它的名字和接收了一个答复。正如前面所说的，SOAP Service发送和接收的是SOAP envelope。这个是SOAP envelope的源代码。</p>
<p>　　被发送到SOAP Service的SOAP Envelope<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"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">＜?xml&nbsp;version=1.0&nbsp;encoding=UTF-8?＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜SOAP-ENV:Envelope&nbsp;xmlns:SOAP-ENV="http://schemas.xmlsoap.org/<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />soap/envelope/"<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />xmlns:xsi="http://www.w3.org/2001/<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />XMLSchema-instance"<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />xmlns:xsd="http://www.w3.org/2001/XMLSchema"＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜SOAP-ENV:Body＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜ns1:sayHi&nbsp;xmlns:ns1="urn:HelloWorld_SOAPService"<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />soap/encoding/"＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜ourName&nbsp;xsi:type="xsd:string"＞Superman＜/ourName＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜/ns1:sayHi＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜/SOAP-ENV:Body＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜/SOAP-ENV:Envelope＞:&nbsp;</span></div>
<br />
从SOAP Service接收的SOAP Envelope<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"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">＜?xml&nbsp;version=1.0&nbsp;encoding=UTF-8?＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜SOAP-ENV:Envelope&nbsp;xmlns:SOAP-ENV="http://schemas.xmlsoap.org/<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />soap/envelope/"<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />xmlns:xsi="http://www.w3.org/2001/<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />XMLSchema-instance"<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />xmlns:xsd="http://www.w3.org/2001/XMLSchema"＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜SOAP-ENV:Body＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜ns1:sayHiResponse&nbsp;xmlns:ns1="urn:HelloWorld_SOAPService"<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />SOAP-ENV:encodingStyle="http://schemas.xmlsoap.<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />org/soap/encoding/"＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜return&nbsp;xsi:type="xsd:string"＞Hello&nbsp;my&nbsp;friend,&nbsp;Superman!<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Glad&nbsp;to&nbsp;see&nbsp;you!＜/return＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜/ns1:sayHiResponse＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜/SOAP-ENV:Body＞<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />＜/SOAP-ENV:Envelope＞&nbsp;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要理解SOAP Envelope中的所有标签的含义，我建议你花一点时间阅读 http://www.w3.org/2001/06/soap-envelope 命名空间规范。
<p>　　我希望本文能够在你理解SOAP技术上有一定帮助。这个技术是简单的，有趣的，强大的，弹性的。它被用在许多Web应用中，这些应用的数量也在不断增加。学习SOAP是值得的，至少你要知道它是什么和它是怎么运作的。</p>
</li>
 <img src ="http://www.blogjava.net/ducklyl/aggbug/154497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ducklyl/" target="_blank">ducklyl</a> 2007-10-20 14:59 <a href="http://www.blogjava.net/ducklyl/archive/2007/10/20/154497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>