<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shoopman</title>
	<atom:link href="http://blog.shoopman.org/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.shoopman.org</link>
	<description>Shoopman&#039;s Blog</description>
	<lastBuildDate>Thu, 15 Jul 2010 08:32:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>解决Office 2007每次启动都要运行配置的问题</title>
		<link>http://blog.shoopman.org/2010/07/15/%e8%a7%a3%e5%86%b3office-2007%e6%af%8f%e6%ac%a1%e5%90%af%e5%8a%a8%e9%83%bd%e8%a6%81%e8%bf%90%e8%a1%8c%e9%85%8d%e7%bd%ae%e7%9a%84%e9%97%ae%e9%a2%98.html</link>
		<comments>http://blog.shoopman.org/2010/07/15/%e8%a7%a3%e5%86%b3office-2007%e6%af%8f%e6%ac%a1%e5%90%af%e5%8a%a8%e9%83%bd%e8%a6%81%e8%bf%90%e8%a1%8c%e9%85%8d%e7%bd%ae%e7%9a%84%e9%97%ae%e9%a2%98.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 08:32:42 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Office]]></category>

		<guid isPermaLink="false">http://blog.shoopman.org/2010/07/15/%e8%a7%a3%e5%86%b3office-2007%e6%af%8f%e6%ac%a1%e5%90%af%e5%8a%a8%e9%83%bd%e8%a6%81%e8%bf%90%e8%a1%8c%e9%85%8d%e7%bd%ae%e7%9a%84%e9%97%ae%e9%a2%98.html</guid>
		<description><![CDATA[像以往一样，用着之前的OFFICE_2007_SP2.isz来安装Office 2007 SP2，可这次安装后却不正常了：每次启动Word或Excel，都要运行Office的配置程序，一配置就是好几分钟，之后还要提示重新启动系统。虽然取消配置也可以正常使用，但每次都弹出那个配置窗口令我相当不爽。Google之，有如下答案，照做，成功了，不过依然不解原因。
打开“我的电脑” -&#62; “C盘” -&#62; “Program Files\Common Files\Microsoft Shared\OFFICE12\Office Setup Controller”——找到一个“SETUP.EXE”的文件，对此文件重命名，改成别的什么都行。

]]></description>
			<content:encoded><![CDATA[<p>像以往一样，用着之前的OFFICE_2007_SP2.isz来安装Office 2007 SP2，可这次安装后却不正常了：每次启动Word或Excel，都要运行Office的配置程序，一配置就是好几分钟，之后还要提示重新启动系统。虽然取消配置也可以正常使用，但每次都弹出那个配置窗口令我相当不爽。Google之，有<a href="http://help.360.cn/5030809/24791420.html" target="_blank">如下答案</a>，照做，成功了，不过依然不解原因。</p>
<blockquote><p>打开“我的电脑” -&gt; “C盘” -&gt; “Program Files\Common Files\Microsoft Shared\OFFICE12\Office Setup Controller”——找到一个“SETUP.EXE”的文件，对此文件重命名，改成别的什么都行。</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2010/07/15/%e8%a7%a3%e5%86%b3office-2007%e6%af%8f%e6%ac%a1%e5%90%af%e5%8a%a8%e9%83%bd%e8%a6%81%e8%bf%90%e8%a1%8c%e9%85%8d%e7%bd%ae%e7%9a%84%e9%97%ae%e9%a2%98.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>删除Windows7桌面淘宝导航taobao.3608.com的图标</title>
		<link>http://blog.shoopman.org/2010/07/15/delete-taobao_3608_com_icon_on_windows7_desktop.html</link>
		<comments>http://blog.shoopman.org/2010/07/15/delete-taobao_3608_com_icon_on_windows7_desktop.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 08:20:50 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows7]]></category>

		<guid isPermaLink="false">http://blog.shoopman.org/2010/07/15/delete-taobao_3608_com_icon_on_windows7_desktop.html</guid>
		<description><![CDATA[安装了一个盗版的Windows7旗舰版，但桌面有一个淘宝导航的图标，指向taobao.3608.com，居然无法直接删除，Google之也未果，于是运行regedit在注册表里搜索“taobao.3608.com”，还真有结果：

于是把这个键“HKEY_CLASSES_ROOT\CLSID\{00000100-1234-0010-8000-00AA006D2EA4}”删除，重启后，桌面的淘宝图标变成了一个白图标，可以直接删除了。
]]></description>
			<content:encoded><![CDATA[<p>安装了一个盗版的Windows7旗舰版，但桌面有一个淘宝导航的图标，指向taobao.3608.com，居然无法直接删除，Google之也未果，于是运行regedit在注册表里搜索“taobao.3608.com”，还真有结果：</p>
<p><a href="http://blog.shoopman.org/wp-content/uploads/2010/07/tb.png"><img style="border-bottom: 0px; border-left: 0px; width: 620px; display: inline; border-top: 0px; border-right: 0px; scale: 620px" title="tb" border="0" alt="tb" src="http://blog.shoopman.org/wp-content/uploads/2010/07/tb_thumb.png" width="783" height="194" /></a></p>
<p>于是把这个键“HKEY_CLASSES_ROOT\CLSID\{00000100-1234-0010-8000-00AA006D2EA4}”删除，重启后，桌面的淘宝图标变成了一个白图标，可以直接删除了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2010/07/15/delete-taobao_3608_com_icon_on_windows7_desktop.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eWebEditor不支持IE8/IE7的解决方法</title>
		<link>http://blog.shoopman.org/2009/10/12/make-ewebeditor-support-ie7-8.html</link>
		<comments>http://blog.shoopman.org/2009/10/12/make-ewebeditor-support-ie7-8.html#comments</comments>
		<pubDate>Mon, 12 Oct 2009 10:48:31 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[eWebEditor]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">/2009/10/12/make-ewebeditor-support-ie7-8.html</guid>
		<description><![CDATA[在修改一个项目的老缺陷，使用了eWebEditor，没看出是哪个版本，但是在点击编辑器按钮时就报错：缺少对象，editor.js，行171。
editor.js中171行的代码是
 if (element.YUSERONCLICK) {  eval(element.YUSERONCLICK + &#8220;anonymous()&#8221;); } 

在网上搜索了一下，最简单的办法是将上面的代码替换为下面的，暂时没发现不良影响。
 if(navigator.appVersion.match(/MSIE (7&#124;8)\./i)!=null){     if (element.YUSERONCLICK) eval(element.YUSERONCLICK + &#8220;onclick(event)&#8221;);   }else{     if (element.YUSERONCLICK) eval(element.YUSERONCLICK + &#8220;anonymous()&#8221;); }

]]></description>
			<content:encoded><![CDATA[<p>在修改一个项目的老缺陷，使用了eWebEditor，没看出是哪个版本，但是在点击编辑器按钮时就报错：缺少对象，editor.js，行171。</p>
<p>editor.js中171行的代码是</p>
<blockquote><p> if (element.YUSERONCLICK) {<br />  eval(element.YUSERONCLICK + &#8220;anonymous()&#8221;);<br /> }<br /> </p>
</blockquote>
<p>在网上搜索了一下，最简单的办法是将上面的代码替换为下面的，暂时没发现不良影响。</p>
<blockquote><p> if(navigator.appVersion.match(/MSIE (7|8)\./i)!=null){<br />     if (element.YUSERONCLICK) eval(element.YUSERONCLICK + &#8220;onclick(event)&#8221;);  <br /> }else{<br />     if (element.YUSERONCLICK) eval(element.YUSERONCLICK + &#8220;anonymous()&#8221;);<br /> }</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/10/12/make-ewebeditor-support-ie7-8.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>为XFire生成的WebService客户端设置连接超时参数</title>
		<link>http://blog.shoopman.org/2009/09/09/set-the-connection-timeout-parameters-for-webservice-client-generated-by-xfire.html</link>
		<comments>http://blog.shoopman.org/2009/09/09/set-the-connection-timeout-parameters-for-webservice-client-generated-by-xfire.html#comments</comments>
		<pubDate>Wed, 09 Sep 2009 09:37:29 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[WebService]]></category>
		<category><![CDATA[XFire]]></category>

		<guid isPermaLink="false">/2009/09/9/set-the-connection-timeout-parameters-for-webservice-client-generated-by-xfire.html</guid>
		<description><![CDATA[由于要从另一个系统的WebService读取大量的数据，因此要修改连接WebService的超时参数。WebService的客户端代码是通过XFire的Ant任务生成的。Google一下，没找到答案，但最后还是在XFire官方找到了答案。
假设生成的客户端代码中的服务接口和Client的类分别为TestService和TestServiceClient，修改连接超时参数代码如下：
//创建Service对象  TestServiceClient testClient = new TestServiceClient();
TestService testService = testClient.getTestServicePort();
//设置连接参数  HttpClientParams params = new HttpClientParams();
params.setParameter(HttpClientParams.USE_EXPECT_CONTINUE, Boolean.FALSE);
params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, setting.getTimeout() * 1000);//单位是毫秒
Client client = Client.getInstance(testService);
client.setProperty(CommonsHttpMessageSender.HTTP_CLIENT_PARAMS, params);

XFire是基于Apache的HttpClient，所以实际上连接超时的参数是就是设置在HttpClient上的。
]]></description>
			<content:encoded><![CDATA[<p>由于要从另一个系统的WebService读取大量的数据，因此要修改连接WebService的超时参数。WebService的客户端代码是通过XFire的Ant任务生成的。Google一下，没找到答案，但最后还是在XFire官方找到了答案。</p>
<p>假设生成的客户端代码中的服务接口和Client的类分别为TestService和TestServiceClient，修改连接超时参数代码如下：</p>
<blockquote><p>//创建Service对象<br />  <br />TestServiceClient testClient = new TestServiceClient();</p>
<p>TestService testService = testClient.getTestServicePort();</p>
<p>//设置连接参数<br />  <br />HttpClientParams params = new HttpClientParams();</p>
<p>params.setParameter(HttpClientParams.USE_EXPECT_CONTINUE, Boolean.FALSE);</p>
<p>params.setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, setting.getTimeout() * 1000);//单位是毫秒</p>
<p>Client client = Client.getInstance(testService);</p>
<p>client.setProperty(CommonsHttpMessageSender.HTTP_CLIENT_PARAMS, params);</p>
</blockquote>
<p>XFire是基于<a href="http://www.apache.org/" target="_blank">Apache</a>的<a href="http://hc.apache.org/" target="_blank">HttpClient</a>，所以实际上连接超时的参数是就是设置在HttpClient上的。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/09/09/set-the-connection-timeout-parameters-for-webservice-client-generated-by-xfire.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>通过ODBC连接MySql</title>
		<link>http://blog.shoopman.org/2009/08/27/connect-mysql-through-odbc.html</link>
		<comments>http://blog.shoopman.org/2009/08/27/connect-mysql-through-odbc.html#comments</comments>
		<pubDate>Thu, 27 Aug 2009 10:58:26 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[ODBC]]></category>

		<guid isPermaLink="false">/2009/08/27/connect-mysql-through-odbc.html</guid>
		<description><![CDATA[由于需要共享EA项目，而暂时发现EA仅支持ODBC连接数据库，所以要解决通过ODBC连接MySql的问题了。
Windows默认是没有MySql的ODBC驱动的，首先要下载ODBC驱动。Google到MySql官网上有，但是需要注册，继续Google到一个下载镜像：http://mirror.cogentco.com/pub/mysql/Connector-ODBC/5.1/，选择了Windows x64的MSI版本下载，因为我的系统是Windows7 x64。下载下来才发现，x64的版本里还包含了x32的。
安装驱动后，在ODBC数据源管理里的“用户DNS”或“系统DNS”点击“Add”按钮，就可以看到了：  
选中“MySql DOBC 5.1 Driver”，点击“Finish”，就可以添加一个MySql数据源了：  
填完各输入框点“OK”，在列表里就可以看到刚才添加的数据源了：  
 
]]></description>
			<content:encoded><![CDATA[<p>由于需要共享EA项目，而暂时发现EA仅支持ODBC连接数据库，所以要解决通过ODBC连接MySql的问题了。</p>
<p>Windows默认是没有MySql的ODBC驱动的，首先要下载ODBC驱动。Google到<a href="http://dev.mysql.com/downloads/connector/odbc/5.1.html" target="_blank">MySql官网</a>上有，但是需要注册，继续Google到一个下载镜像：<a title="http://mirror.cogentco.com/pub/mysql/Connector-ODBC/5.1/" href="http://mirror.cogentco.com/pub/mysql/Connector-ODBC/5.1/" target="_blank">http://mirror.cogentco.com/pub/mysql/Connector-ODBC/5.1/</a>，选择了Windows x64的MSI版本下载，因为我的系统是Windows7 x64。下载下来才发现，x64的版本里还包含了x32的。</p>
<p>安装驱动后，在ODBC数据源管理里的“用户DNS”或“系统DNS”点击“Add”按钮，就可以看到了：<br />  <br /><img src="http://rp8w6a.blu.livefilestore.com/y1p_8U4RieqFKHaZxNr2Vgo8utUpEUisTch9n1l6Y1tLLWfK0f_MX4v9Cdbl_IHZo6ZWyvjHg4z7qLYoKcndm2iM1L2N_MjuSf2/dns.jpg" alt="" /></p>
<p>选中“MySql DOBC 5.1 Driver”，点击“Finish”，就可以添加一个MySql数据源了：<br />  <br /><img src="http://rp8w6a.blu.livefilestore.com/y1pPyyIEJueJzIuwkPIWkiOEAZxhcOZxegT1SvfaQlXGOT0i4lshz1A_YNMvGVVH5fmS1gNVq6X5hmok3TbGtLCnw/connection.jpg" alt="" /></p>
<p>填完各输入框点“OK”，在列表里就可以看到刚才添加的数据源了：<br />  <br /><img src="http://rp8w6a.blu.livefilestore.com/y1p9Klu7e0tRFhBgHYHsdR1f63Cxs4k_xEbyhI5TzQOvPgYibxwmcRHQfx_MiYwi_rJOKgh13rFZHT6m3uc9ymEng/list.jpg" alt="" /></p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/08/27/connect-mysql-through-odbc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>只谈技术，莫谈国是?</title>
		<link>http://blog.shoopman.org/2009/08/24/%e5%8f%aa%e8%b0%88%e6%8a%80%e6%9c%af%ef%bc%8c%e8%8e%ab%e8%b0%88%e5%9b%bd%e6%98%af.html</link>
		<comments>http://blog.shoopman.org/2009/08/24/%e5%8f%aa%e8%b0%88%e6%8a%80%e6%9c%af%ef%bc%8c%e8%8e%ab%e8%b0%88%e5%9b%bd%e6%98%af.html#comments</comments>
		<pubDate>Mon, 24 Aug 2009 18:56:08 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[JavaEye]]></category>

		<guid isPermaLink="false">/?p=27003</guid>
		<description><![CDATA[JavaEye发布的信息：http://www.javaeye.com/news/9991-protect-javaeye
今天下午JavaEye网站被和谐了，原因是多次出现“有害”信息！如果再次出现“有害”信息，我们可能会被和谐很长时间。      在这个特殊的时期，为了保护JavaEye网站还能够继续“存在”下去，为了大家还能有一个高质量的交流场所，我们呼吁每个JavaEye会员：       1、只谈技术，莫谈国是！       2、凡是发现涉及社会敏感事件的热点话题，政治话题，军事话题，请立刻在JavaEye站务论坛向我们举报！       3、请自律自己的行为，只要我们发现任何人发布任何政治话题和敏感事件的文章，帖子，博客，评论，甚至闲聊，统统直接删除用户ID和用户所有JavaEye资料，不给任何通知和解释。 

能怪JavaEye不？
不能！
该怪JavaEye不？
该！
无语……
]]></description>
			<content:encoded><![CDATA[<p>JavaEye发布的信息：<a title="http://www.javaeye.com/news/9991-protect-javaeye" href="http://www.javaeye.com/news/9991-protect-javaeye" target="_blank">http://www.javaeye.com/news/9991-protect-javaeye</a></p>
<blockquote><p>今天下午JavaEye网站被和谐了，原因是多次出现“有害”信息！如果再次出现“有害”信息，我们可能会被和谐很长时间。      <br />在这个特殊的时期，为了保护JavaEye网站还能够继续“存在”下去，为了大家还能有一个高质量的交流场所，我们呼吁每个JavaEye会员：       <br />1、只谈技术，莫谈国是！       <br />2、凡是发现涉及社会敏感事件的热点话题，政治话题，军事话题，请立刻在<a href="http://javaeye-admin.group.javaeye.com/">JavaEye站务论坛</a>向我们举报！       <br />3、请自律自己的行为，只要我们发现任何人发布任何政治话题和敏感事件的文章，帖子，博客，评论，甚至闲聊，统统直接删除用户ID和用户所有JavaEye资料，不给任何通知和解释。 </p>
</blockquote>
<p>能怪JavaEye不？</p>
<p>不能！</p>
<p>该怪JavaEye不？</p>
<p>该！</p>
<p>无语……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/08/24/%e5%8f%aa%e8%b0%88%e6%8a%80%e6%9c%af%ef%bc%8c%e8%8e%ab%e8%b0%88%e5%9b%bd%e6%98%af.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>把MyEclipse项目转为WTP项目</title>
		<link>http://blog.shoopman.org/2009/08/20/convert-myeclipse-project-to-wtp-project.html</link>
		<comments>http://blog.shoopman.org/2009/08/20/convert-myeclipse-project-to-wtp-project.html#comments</comments>
		<pubDate>Thu, 20 Aug 2009 13:22:41 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[MyEclipse]]></category>
		<category><![CDATA[WTP]]></category>

		<guid isPermaLink="false">/2009/08/20/convert-myeclipse-project-to-wtp-project.html</guid>
		<description><![CDATA[马上要进入另一个项目组了，新项目所用的IDE是MyEclipse。我已不习惯了庞大的MyEclipse，而习惯了WTP并且想试验一下新的Eclipse3.5，因此需要把MyEclipse项目转换为WTP项目。（PS：不遵守团队开发规范是不正确的行为！）
1.在Eclipse里导入MyEclipse项目到工作空间。
2.编辑.project文件，在&#60;natures&#62;&#60;/natures&#62;中加入
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;nature&#62;org.eclipse.wst.common.project.facet.core.nature&#60;/nature&#62;      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;nature&#62;org.eclipse.wst.common.modulecore.ModuleCoreNature&#60;/nature&#62;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;nature&#62;org.eclipse.jem.workbench.JavaEMFNature&#60;/nature&#62; 

在&#60;buildSpec&#62;&#60;/buildSpec&#62;节点加入
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;buildCommand&#62;      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;name&#62;org.eclipse.wst.common.project.facet.core.builder&#60;/name&#62;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;arguments&#62;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;/arguments&#62;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;/buildCommand&#62;      [...]]]></description>
			<content:encoded><![CDATA[<p>马上要进入另一个项目组了，新项目所用的IDE是MyEclipse。我已不习惯了庞大的MyEclipse，而习惯了WTP并且想试验一下新的Eclipse3.5，因此需要把MyEclipse项目转换为WTP项目。（PS：不遵守团队开发规范是不正确的行为！）</p>
<p>1.在Eclipse里导入MyEclipse项目到工作空间。</p>
<p>2.编辑.project文件，在&lt;natures&gt;&lt;/natures&gt;中加入</p>
<blockquote><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;nature&gt;org.eclipse.wst.common.project.facet.core.nature&lt;/nature&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;nature&gt;org.eclipse.wst.common.modulecore.ModuleCoreNature&lt;/nature&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;nature&gt;org.eclipse.jem.workbench.JavaEMFNature&lt;/nature&gt; </p>
</blockquote>
<p>在&lt;buildSpec&gt;&lt;/buildSpec&gt;节点加入</p>
<blockquote><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;buildCommand&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;org.eclipse.wst.common.project.facet.core.builder&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;arguments&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/arguments&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/buildCommand&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;buildCommand&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;org.eclipse.wst.validation.validationbuilder&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;arguments&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/arguments&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/buildCommand&gt;</p>
</blockquote>
<p>3.在Eclipse中刷新项目。</p>
<p>4.右击项目&#8211;&gt;Properties—&gt;Project Facets，在右边勾选Java与Dynamic Web Module，应用。</p>
<p>5.如果你的项目源代码文件夹不是WTP默认的src，则需要到Java Build Path中去添加相应源代码文件夹。</p>
<p>6.如果你的项目Web文件夹不是WTP默认的WebContent，则需要文件文件 &lt;项目目录&gt;/.settings/org.eclipse.wst.common.component，找到</p>
<blockquote><p>&lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/WebContent&quot;/&gt;</p>
</blockquote>
<p>并修改，如</p>
<blockquote><p>&lt;wb-resource deploy-path=&quot;/&quot; source-path=&quot;/webapp&quot;/&gt;</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/08/20/convert-myeclipse-project-to-wtp-project.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>当BeanUtils的拷贝遇上java.util.Date</title>
		<link>http://blog.shoopman.org/2009/08/16/when-beanutils-copyer-meets-java-util-date.html</link>
		<comments>http://blog.shoopman.org/2009/08/16/when-beanutils-copyer-meets-java-util-date.html#comments</comments>
		<pubDate>Sun, 16 Aug 2009 21:33:26 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[BeanUtils]]></category>

		<guid isPermaLink="false">/2009/08/16/when-beanutils-copyer-meets-java-util-date.html</guid>
		<description><![CDATA[BeanUtils是apache基金会下的一个开源项目，主要用于对Java Bean的操作。在一个项目中，经常要用到Bean属性拷贝，使用了org.apache.commons.beanutils.BeanUtils.copyProperties(dest, orgi)。由于此方法声明了抛出异常，在项目中为了方便，便对此作了简单封装，把异常处理了：
public static void copy(Object dest, Object orgi) {     &#160;&#160;&#160; try {      &#160;&#160;&#160;&#160;&#160;&#160;&#160; BeanUtils.copyProperties(dest, orgi);      &#160;&#160;&#160; } catch (Exception e) {      &#160;&#160;&#160;&#160;&#160;&#160;&#160; log.error(&#34;Bean属性拷贝出错。&#34;, e);      &#160;&#160;&#160; }     [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://commons.apache.org/beanutils/" target="_blank">BeanUtils</a>是<a href="http://www.apache.org" target="_blank">apache</a>基金会下的一个开源项目，主要用于对Java Bean的操作。在一个项目中，经常要用到Bean属性拷贝，使用了org.apache.commons.beanutils.BeanUtils.copyProperties(dest, orgi)。由于此方法声明了抛出异常，在项目中为了方便，便对此作了简单封装，把异常处理了：</p>
<blockquote><p>public static void copy(Object dest, Object orgi) {     <br />&#160;&#160;&#160; try {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; BeanUtils.copyProperties(dest, orgi);      <br />&#160;&#160;&#160; } catch (Exception e) {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; log.error(&quot;Bean属性拷贝出错。&quot;, e);      <br />&#160;&#160;&#160; }      <br />} </p>
</blockquote>
<p>后来却发现，当源对象orgi中某个java.util.Date类型的属性为null时，copy会失败（虽然异常被处理了），目标对象dest中部分非Date类型的属性也为空，虽然源对象中这些属性是有值。原因就是上BeanUtils在处理属性值为null的Date类型时出错了，便抛出了异常，后面的属性便不会再复制。</p>
<p>后来在JavaEye搜到了答案：为BeanUtils注册一个日期类型转换器：使用org.apache.commons.beanutils.ConvertUtils，注册org.apache.commons.beanutils.converters.DateConverter。下面的代码是放在copy方法所在的类：</p>
<blockquote><p>static{     <br />&#160;&#160;&#160; ConvertUtils.register(new DateConverter(), Date.class);      <br />} </p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/08/16/when-beanutils-copyer-meets-java-util-date.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于注解与自动扫描的某些实体没被映射的原因之一</title>
		<link>http://blog.shoopman.org/2009/07/16/a-reason-about-the-problem-that-an-entity-is-not-mapped.html</link>
		<comments>http://blog.shoopman.org/2009/07/16/a-reason-about-the-problem-that-an-entity-is-not-mapped.html#comments</comments>
		<pubDate>Thu, 16 Jul 2009 21:28:20 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[注解]]></category>

		<guid isPermaLink="false">/2009/07/16/a-reason-about-the-problem-that-an-entity-is-not-mapped.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 在尝试修改基于SpringSide 3.1.3的mini-web过程中，又遇到了一个奇怪的问题。一个hql如下：
StringBuilder hql = new StringBuilder();      hql.append(&#34;SELECT new &#34;);       hql.append(CommentBean.class.getName());       hql.append(&#34; (o,u.name,u.image) &#34;);       hql.append(&#34; FROM &#34;);       hql.append(Comment.class.getSimpleName()).append(&#34; o, &#34;);       [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在尝试修改基于SpringSide 3.1.3的mini-web过程中，又遇到了一个奇怪的问题。一个hql如下：</p>
<blockquote><p>StringBuilder hql = new StringBuilder();      <br />hql.append(&quot;SELECT new &quot;);       <br />hql.append(CommentBean.class.getName());       <br />hql.append(&quot; (o,u.name,u.image) &quot;);       <br />hql.append(&quot; FROM &quot;);       <br />hql.append(Comment.class.getSimpleName()).append(&quot; o, &quot;);       <br />hql.append(User.class.getSimpleName()).append(&quot; u &quot;);       <br />hql.append(&quot; WHERE o.userId=u.id AND o.infoId=? &quot;);       <br />hql.append(&quot; ORDER BY o.commentTime DESC&quot;); </p>
</blockquote>
<p>Comment这个实体类的全限定名是：org.shoopman.entity.Comment</p>
<p>但在运行时却报错：</p>
<blockquote><p>Comment is not mapped [SELECT new org.shoopman.service.dto.CommentBean (o,u.name,u.image)&#160; FROM Comment o, org.shoopman.entity.user.User u&#160; WHERE o.userId=u.id AND o.infoId=?&#160; ORDER BY o.commentTime DESC]      <br />org.hibernate.hql.ast.QuerySyntaxException: Comment is not mapped [SELECT new org.shoopman.service.dto.CommentBean (o,u.name,u.image)&#160; FROM Comment o, org.shoopman.entity.user.User u&#160; WHERE o.userId=u.id AND o.infoId=?&#160; ORDER BY o.commentTime DESC]       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:277)</p>
<p>&#160;</p>
</blockquote>
<p>而其他实体的查询却没有问题。先看一下spring的applicationContext.xml关于Hibernate的配置：</p>
<blockquote><p>&lt;bean id=&quot;sessionFactory&quot; class=&quot;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&quot;&gt;      <br />&#160;&#160;&#160; &lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /&gt;       <br />&#160;&#160;&#160; &lt;property name=&quot;namingStrategy&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;bean class=&quot;org.hibernate.cfg.ImprovedNamingStrategy&quot; /&gt;       <br />&#160;&#160;&#160; &lt;/property&gt;       <br />&#160;&#160;&#160; &lt;property name=&quot;hibernateProperties&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;props&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;prop key=&quot;hibernate.dialect&quot;&gt;${hibernate.dialect}&lt;/prop&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;prop key=&quot;hibernate.show_sql&quot;&gt;${hibernate.show_sql}&lt;/prop&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;prop key=&quot;hibernate.format_sql&quot;&gt;${hibernate.format_sql}&lt;/prop&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;prop key=&quot;hibernate.cache.provider_class&quot;&gt;org.hibernate.cache.EhCacheProvider       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/prop&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;prop key=&quot;hibernate.cache.provider_configuration_file_resource_path&quot;&gt;${hibernate.ehcache_config_file}&lt;/prop&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/props&gt;       <br />&#160;&#160;&#160; &lt;/property&gt;       <br />&#160;&#160;&#160; &lt;property name=&quot;packagesToScan&quot; value=&quot;<font color="#ff0000">org.shoopman.entity.*</font>&quot; /&gt;       <br />&lt;/bean&gt; </p>
</blockquote>
<p>&#160;&#160;&#160; 问题就在这个自动描述packagesToScan的配置上。如上的配置，Spring只会扫描到org.shoopman.entity这个包下的子包里的实体类，而直接放在这个包下的实体却没有描述。</p>
<p>&#160;&#160;&#160; 无奈，只好在新建一个org.shoopman.entity.common包，把Comment移到此包下。到此，问题解决。</p>
<p>&#160;</p>
<p>&#160;&#160;&#160; 题外话：看上面的hql生成过程，在使用User这个实体类时，我用的是User.class.getSimpleName()，为什么Hibernate在生成hql却是全限定名。当把Comment移到common包下，控制台里打印出来的hql又是SimpleName。这是Hibernate的一个容错处理吗？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/16/a-reason-about-the-problem-that-an-entity-is-not-mapped.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GFW又K了一个ghs的IP？</title>
		<link>http://blog.shoopman.org/2009/07/16/gfw-kill-another-ghs-ip.html</link>
		<comments>http://blog.shoopman.org/2009/07/16/gfw-kill-another-ghs-ip.html#comments</comments>
		<pubDate>Thu, 16 Jul 2009 19:28:02 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[ghs]]></category>

		<guid isPermaLink="false">/2009/07/16/gfw-kill-another-ghs-ip.html</guid>
		<description><![CDATA[    下午还能通过blog.shoopman.org来访问我的博客，刚才通过Windows Live Write来发表文章，却不成功。现在只能通过shoopmanlog.appspot.com来访问了。看一下友情连接里的GAE伙伴们，徐明的挂了，Keengle的也挂了，Qing的还没有。这样还好，不用费那么多事去找新的ghs IP了。
    5月26日左右，ghs挂了一个IP；6月15日左右，又挂了一个；今天，7月16日，再一个。看来，在GFW的驱动下，广大中国的GAE Blogger们都要习惯每月一次的修改域名A记录或者类似的事情了。
    已在GoDaddy修改了域名的A记录，看多久后才能生效吧。现在，只有等待并且忍受，等哪天实在忍受不了了，就去给美国增加一点儿GDP吧。
]]></description>
			<content:encoded><![CDATA[<p>    下午还能通过blog.shoopman.org来访问我的博客，刚才通过Windows Live Write来发表文章，却不成功。现在只能通过<a href="http://shoopmanlog.appspot.com" target="_blank">shoopmanlog.appspot.com</a>来访问了。看一下友情连接里的GAE伙伴们，<a href="http://xuming.net" target="_blank">徐明</a>的挂了，<a href="http://www.kgblog.net" target="_blank">Keengle</a>的也挂了，<a href="http://www.ddig.info" target="_blank">Qing</a>的还没有。这样还好，不用费那么多事去找新的ghs IP了。</p>
<p>    5月26日左右，<a href="http://shoopmanlog.appspot.com/2009/05/27/another-ghs-ip-been-blocked.html" target="_blank">ghs挂了一个IP</a>；6月15日左右，又挂了一个；今天，7月16日，再一个。看来，在GFW的驱动下，广大中国的GAE Blogger们都要习惯每月一次的修改域名A记录或者类似的事情了。</p>
<p>    已在<a href="http://shoopmanlog.appspot.com/2009/04/21/the-experience-of-purchasing-a-domain-abroad.html" target="_blank">GoDaddy</a>修改了域名的A记录，看多久后才能生效吧。现在，只有等待并且忍受，等哪天实在忍受不了了，就去给美国增加一点儿GDP吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/16/gfw-kill-another-ghs-ip.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为Micolog添加了Google翻译功能</title>
		<link>http://blog.shoopman.org/2009/07/15/add-google-translate-gadget-for-micolog.html</link>
		<comments>http://blog.shoopman.org/2009/07/15/add-google-translate-gadget-for-micolog.html#comments</comments>
		<pubDate>Wed, 15 Jul 2009 13:13:26 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Micolog]]></category>

		<guid isPermaLink="false">/2009/07/15/add-google-translate-gadget-for-micolog.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 今天在Google Analytics里看到，大概30%的IP流量是来自国外，而语言是en-us的流量更多（我的操作系统也是英文版的）。所以，如果能提供一个翻译按钮给那些老外，他们会更明白我在说什么。Google Translate已经提供了这样一个小工具，只需要简单的几个步骤，就可以往自己网站添加上这个翻译功能。下面就为我这个基于Micolog的博客加上这个小功能吧。
&#160;&#160;&#160; 1. 获取代码   到http://translate.google.cn/translate_tools?hl=zh-CN去，代码马上就生成了，如下：
&#60;script src=&#34;http://www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/translatemypage.xml&#38;up_source_language=zh-CN&#38;w=160&#38;h=60&#38;title=&#38;border=&#38;output=js&#34;&#62;&#60;/script&#62;

其中，w和h这两个参数是控制Google翻译小工具的宽度和高度，可以自行修改。
&#160;&#160;&#160; 2. 修改主题文件   找到你要添加小工具的网页，把上面的代码粘贴进去。比如我是在themes\default\templates\sidebar.html里添加了小工具。
&#160;&#160;&#160; 3. 上传文件
&#160;&#160;&#160; 至此，Google翻译小工具就添加进去了，你可以看一下页面右上方。样子是有点丑，将就一下了。
&#160;&#160;&#160; Google还提供了更多可以往自己网页里放的小工具，可以到http://www.google.com/webmasters/gadgets/找一下。
]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 今天在<a href="https://www.google.com/analytics" target="_blank">Google Analytics</a>里看到，大概30%的IP流量是来自国外，而语言是en-us的流量更多（我的操作系统也是英文版的）。所以，如果能提供一个翻译按钮给那些老外，他们会更明白我在说什么。Google Translate已经提供了这样一个小工具，只需要简单的几个步骤，就可以往自己网站添加上这个翻译功能。下面就为我这个基于Micolog的博客加上这个小功能吧。</p>
<p>&#160;&#160;&#160; 1. 获取代码   <br />到<a title="http://translate.google.cn/translate_tools?hl=zh-CN" href="http://translate.google.cn/translate_tools?hl=zh-CN" target="_blank">http://translate.google.cn/translate_tools?hl=zh-CN</a>去，代码马上就生成了，如下：</p>
<blockquote><p>&lt;script src=&quot;http://www.gmodules.com/ig/ifr?url=http://www.google.com/ig/modules/translatemypage.xml&amp;up_source_language=zh-CN&amp;w=160&amp;h=60&amp;title=&amp;border=&amp;output=js&quot;&gt;&lt;/script&gt;</p>
</blockquote>
<p>其中，w和h这两个参数是控制Google翻译小工具的宽度和高度，可以自行修改。</p>
<p>&#160;&#160;&#160; 2. 修改主题文件   <br />找到你要添加小工具的网页，把上面的代码粘贴进去。比如我是在themes\default\templates\sidebar.html里添加了小工具。</p>
<p>&#160;&#160;&#160; 3. 上传文件</p>
<p>&#160;&#160;&#160; 至此，Google翻译小工具就添加进去了，你可以看一下页面右上方。样子是有点丑，将就一下了。</p>
<p>&#160;&#160;&#160; Google还提供了更多可以往自己网页里放的小工具，可以到<a title="http://www.google.com/webmasters/gadgets/" href="http://www.google.com/webmasters/gadgets/" target="_blank">http://www.google.com/webmasters/gadgets/</a>找一下。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/15/add-google-translate-gadget-for-micolog.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为Micolog添加Google自定义搜索</title>
		<link>http://blog.shoopman.org/2009/07/14/add-google-custom-search-to-micolog.html</link>
		<comments>http://blog.shoopman.org/2009/07/14/add-google-custom-search-to-micolog.html#comments</comments>
		<pubDate>Tue, 14 Jul 2009 14:35:59 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Micolog]]></category>

		<guid isPermaLink="false">/2009/07/14/add-google-custom-search-to-micolog.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 由于Google App Engine数据存储与关系数据库不一样，Micolog也无法像传统应用那样提供基于数据库某些字段的搜索。作为搜索引擎老大，Google对自家的App Engine里的内容收录还是相当及时的，比如我这博客发布的文章，一般两天内就收录了。因此我们可以利用Google搜索引擎收录索引来解决Blog站内搜索这个问题。Micolog默认主题里就提供的站内搜索，即加上site:blog.shoopman.org，比如这个搜索。有个不爽的地方，就是搜索结果页完全跳出了自己的博客。于是，我利用了Google自定义搜索来为Micolog博客加入站内搜索。
&#160;&#160;&#160; 先看一下最后的效果：    http://blog.shoopman.org/google-search?q=java&#38;cx=004316150475193113567%3Ah9vz95zkor4&#38;cof=FORID%3A11&#38;ie=UTF-8     还不错吧，页面的顶部、底部以及右边都是Micolog原本的风格和内容，只有页面主体是搜索结果。下面开始动手了。
1. 创建Google自定义搜索引擎     用你的Google帐号登陆到 http://www.google.com/coop/cse/，按照提示创建一个自定义搜索（图）。 
2. 获取代码     转到自定义搜索的控制面板&#8211;获取代码，选择”使用 iframe 使搜索结果位于我的网站上”，并指定搜索结果页地址，如/google-search（图），这时可得到搜索框和搜索结果页的代码，先保存一下。 
3. 修改Micolog主题      转到你正使用的主题，如我是用默认主题，即到themes\default\templates下，编辑base.html，把搜索框处理的代码修改如下： 
&#60;form method=&#34;get&#34; id=&#34;cse-search-box&#34; action=&#34;/google-search&#34;&#62;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;input type=&#34;text&#34; value=&#34;Search&#8230;&#34; onfocus=&#34;if (this.value [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 由于Google App Engine数据存储与关系数据库不一样，Micolog也无法像传统应用那样提供基于数据库某些字段的搜索。作为搜索引擎老大，Google对自家的App Engine里的内容收录还是相当及时的，比如我这博客发布的文章，一般两天内就收录了。因此我们可以利用Google搜索引擎收录索引来解决Blog站内搜索这个问题。Micolog默认主题里就提供的站内搜索，即加上site:blog.shoopman.org，比如这个<a href="http://www.google.cn/search?as_q=java&amp;as_sitesearch=blog.shoopman.org" target="_blank">搜索</a>。有个不爽的地方，就是搜索结果页完全跳出了自己的博客。于是，我利用了Google自定义搜索来为Micolog博客加入站内搜索。</p>
<p>&#160;&#160;&#160; 先看一下最后的效果：    <br /><a title="http://blog.shoopman.org/google-search?q=java&amp;cx=004316150475193113567%3Ah9vz95zkor4&amp;cof=FORID%3A11&amp;ie=UTF-8" href="http://blog.shoopman.org/google-search?q=java&amp;cx=004316150475193113567%3Ah9vz95zkor4&amp;cof=FORID%3A11&amp;ie=UTF-8" target="_blank">http://blog.shoopman.org/google-search?q=java&amp;cx=004316150475193113567%3Ah9vz95zkor4&amp;cof=FORID%3A11&amp;ie=UTF-8</a>     <br />还不错吧，页面的顶部、底部以及右边都是Micolog原本的风格和内容，只有页面主体是搜索结果。下面开始动手了。</p>
<p><strong>1. 创建Google自定义搜索引擎</strong>     <br />用你的Google帐号登陆到 <a title="http://www.google.com/coop/cse/" href="http://www.google.com/coop/cse/" target="_blank">http://www.google.com/coop/cse/</a>，按照提示创建一个自定义搜索（<a title="申请Google自定义搜索" href="http://hfijeq.blu.livefilestore.com/y1pXXCaBuXlnQadjCDWIGGfaiW0Lxw9er0J5MJSjoRwMrbvWl4GS9Cigs5CoAoDiHHNj6d2tnoWiOU7LDOqjR8xlWp6GPbHOzHB/create.jpg" target="_blank">图</a>）。 </p>
<p><strong>2. 获取代码</strong>     <br />转到自定义搜索的控制面板&#8211;获取代码，选择”使用 iframe 使搜索结果位于我的网站上”，并指定搜索结果页地址，如<font color="#ff0000">/google-search</font>（<a title="获取代码" href="http://hfijeq.blu.livefilestore.com/y1pGrgFBz6X4axf8sW4e82171JC_aSJ2UhVepB1tCs3DgZg7jC-fTDUT3sHf8fBoTZt3aVjGZKSwoumNDllcDIwRTBWr4jDuS0q/getcode.jpg" target="_blank">图</a>），这时可得到搜索框和搜索结果页的代码，先保存一下。 </p>
<p><strong>3. 修改Micolog主题      <br /></strong>转到你正使用的主题，如我是用默认主题，即到themes\default\templates下，编辑base.html，把搜索框处理的代码修改如下： </p>
<blockquote><p>&lt;form method=&quot;get&quot; id=&quot;cse-search-box&quot; action=&quot;/<font color="#ff0000">google-search</font>&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;text&quot; value=&quot;Search&#8230;&quot; onfocus=&quot;if (this.value == &#8216;Search&#8230;&#8217;) {this.value = &#8221;;}&quot; onblur=&quot;if (this.value == &#8221;) {this.value = &#8216;Search&#8230;&#8217;;}&quot; name=&quot;<font color="#ff0000">q</font>&quot; id=&quot;s&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;image&quot; src=&quot;/themes/{{ blog.theme_name }}/images/transparent.gif&quot; id=&quot;go&quot; alt=&quot;Search&quot; title=&quot;Search&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;hidden&quot; name=&quot;<font color="#ff0000">cx</font>&quot; value=&quot;004316150475193113567:h9vz95zkor4&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;hidden&quot; name=&quot;cof&quot; value=&quot;FORID:11&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;hidden&quot; name=&quot;ie&quot; value=&quot;UTF-8&quot; /&gt;       <br />&lt;/form&gt;</p>
</blockquote>
<p>注意，form中action处的google-search后面再说，名为cx的隐藏域应该是自己自定义搜索的标识。在第二步里的搜索框代码里，还有一行&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=zh-Hans&quot;&gt;&lt;/script&gt;，不要加进去，这会改变原来搜索框的样式。</p>
<p><strong>4. 创建搜索结果Javascript</strong>     <br />由于无法在Micolog的编辑器添加有效的Javascript代码，我们将Google自定义搜索结果页的Javascript代码放到一个独立的js文件里，内容如下：</p>
<blockquote><p>var googleSearchIframeName = &quot;cse-search-results&quot;;      <br />var googleSearchFormName = &quot;cse-search-box&quot;;       <br />var googleSearchFrameWidth = 600;       <br />var googleSearchDomain = &quot;www.google.com&quot;;       <br />var googleSearchPath = &quot;/cse&quot;;</p>
</blockquote>
<p>把此文件命名为google_search.js，并放在/static/js目录下。（你可以修改js文件名及路径，但建议放在static目录下）</p>
<p><strong>5. 创建搜索结果显示页</strong>     <br />登陆到Micolog后台管理，创建页面，内容如下：</p>
<blockquote><p>&lt;div id=&quot;cse-search-results&quot;&gt; &lt;/div&gt;      <br />&lt;script src=&quot;<font color="#ff0000">http://blog.shoopman.org/static/js/google_search.js</font>&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;script src=&quot;http://www.google.com/afsonline/show_afs_search.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</p>
</blockquote>
<p>其中前面的js就是上一步创建的那个js文件。    <br />在此页面里，还要指定名称(slug)为google-search，即第2步、第3步中搜索框Form中的action；把页面级别设置为1，那么在博客顶部的菜单就不会出现此页面的连接（<a title="创建页面" href="http://hfijeq.blu.livefilestore.com/y1pBsUAUR2UFftdJsBBk9Ud-ubysXQf8pAx_mgiOqtw0eMQgL4-KUe9SePoj-0hVq7vB5ngrVAt7nThuBMQmOEOFQe7MmHeSJIU/micolog_page.jpg" target="_blank">图</a>）。</p>
<p><strong>6. 上传文件      <br /></strong>把修改过的base.html和新建的google_search.js上传到Google App Engine中，就大功告成了！</p>
<p>&#160;</p>
<p>Update1：这文章在发布后几分钟就被Google收录了，很快！</p>
<p>Update2：这里有个更方便的办法：<a title="http://www.houkai.com/2009/07/7/google-search.html" href="http://www.houkai.com/2009/07/7/google-search.html" target="_blank">http://www.houkai.com/2009/07/7/google-search.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/14/add-google-custom-search-to-micolog.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SessionListener与Spring</title>
		<link>http://blog.shoopman.org/2009/07/10/session-listener-and-spring-context.html</link>
		<comments>http://blog.shoopman.org/2009/07/10/session-listener-and-spring-context.html#comments</comments>
		<pubDate>Fri, 10 Jul 2009 17:07:44 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[SessionLisener]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">/2009/07/10/session-listener-and-spring-context.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 在SessionListener里，需要使用被Spring管理起来的其他Bean，如某些DAO或者Manager、Service。在实现这个过程是这样的：
&#160;&#160;&#160; 1.把SessionListener也交给Spring来管理。
&#160;&#160;&#160; 由于使用了Spring Annotation，所以在SessionListener上加了@Service标记，并且把需要用到的其他Bean在SessionListener中定义为成员变量并加上@Autowried。但结果是失败的，SessionListener里的其他Bean没有被注入。
&#160;&#160;&#160; 2.直接通过Spring的Context来获得相应的DAO等的实例。
&#160;&#160;&#160; Spring Annotation默认是ByType的方式来注入Bean，因此写了一个静态方法来获取相关的Bean，不知道有没有其他更好的办法，请告诉我吧：
/**      * 根据类型从Spring中取得Bean       *       * @param &#60;T&#62;&#160;&#160;&#160; Bean的类型       * @param beanClass&#160;&#160;&#160; Bean的Class对象       * @param servletContext&#160;&#160;&#160; * @return   [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在SessionListener里，需要使用被Spring管理起来的其他Bean，如某些DAO或者Manager、Service。在实现这个过程是这样的：</p>
<p>&#160;&#160;&#160; 1.把SessionListener也交给Spring来管理。</p>
<p>&#160;&#160;&#160; 由于使用了Spring Annotation，所以在SessionListener上加了@Service标记，并且把需要用到的其他Bean在SessionListener中定义为成员变量并加上@Autowried。但结果是失败的，SessionListener里的其他Bean没有被注入。</p>
<p>&#160;&#160;&#160; 2.直接通过Spring的Context来获得相应的DAO等的实例。</p>
<p>&#160;&#160;&#160; Spring Annotation默认是ByType的方式来注入Bean，因此写了一个静态方法来获取相关的Bean，不知道有没有其他更好的办法，请告诉我吧：</p>
<blockquote><p>/**      <br />* 根据类型从Spring中取得Bean       <br />*       <br />* @param &lt;T&gt;&#160;&#160;&#160; Bean的类型       <br />* @param beanClass&#160;&#160;&#160; Bean的Class对象       <br />* @param servletContext&#160;&#160;&#160; <br />* @return       <br />*/       <br />@SuppressWarnings(&quot;unchecked&quot;)       <br />public static &lt;T&gt; T getSpringBean(Class&lt;T&gt; beanClass,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ServletContext servletContext) {       <br />&#160;&#160;&#160; WebApplicationContext appContext = (WebApplicationContext) servletContext       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);       <br />&#160;&#160;&#160; Map beans = appContext.getBeansOfType(beanClass);       <br />&#160;&#160;&#160; if (beans == null || beans.isEmpty()) {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return null;       <br />&#160;&#160;&#160; }       <br />&#160;&#160;&#160; return (T) beans.values().toArray()[0];       <br />} </p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/10/session-listener-and-spring-context.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一次WebService调试的遗留问题</title>
		<link>http://blog.shoopman.org/2009/07/10/webservice-debug-with-xfire-replenish.html</link>
		<comments>http://blog.shoopman.org/2009/07/10/webservice-debug-with-xfire-replenish.html#comments</comments>
		<pubDate>Fri, 10 Jul 2009 16:39:45 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[WebService]]></category>
		<category><![CDATA[XFire]]></category>

		<guid isPermaLink="false">/2009/07/10/webservice-debug-with-xfire-replenish.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 在上一篇《一次WebService调试》里，简单的完成了WebService的开发与调用，但还存在着两个问题：
1.客户端生成的代码里，RemoteUser这个对象，每个属性并不是预想中的String，而是javax.xml.bind.JAXBElement&#60;String&#62;。
&#160;&#160;&#160; 这个问题可以使用aegis来处理，在RemoteUser所在的包下添加一个RemoteUser.aegis.xml文件，如下：
&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;     &#60;mappings xmlns:tns=&#34;http://www.xxx.com/services/nopService”&#62;      &#160;&#160;&#160; &#60;mapping name=&#34;tns:RemoteUser&#34;&#62;      &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property minOccurs=&#34;1&#34; maxOccurs=&#34;1&#34; nillable=&#34;true&#34; name=&#34;fax&#34; /&#62;      &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property minOccurs=&#34;1&#34; maxOccurs=&#34;1&#34; nillable=&#34;true&#34; name=&#34;mail&#34; /&#62;      &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;property minOccurs=&#34;1&#34; maxOccurs=&#34;1&#34; nillable=&#34;true&#34; name=&#34;mobile&#34; /&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在上一篇《<a href="http://blog.shoopman.org/2009/07/6/webservice-debug-with-xfire.html" target="_blank">一次WebService调试</a>》里，简单的完成了WebService的开发与调用，但还存在着两个问题：</p>
<p>1.客户端生成的代码里，RemoteUser这个对象，每个属性并不是预想中的String，而是javax.xml.bind.JAXBElement&lt;String&gt;。</p>
<p>&#160;&#160;&#160; 这个问题可以使用aegis来处理，在RemoteUser所在的包下添加一个RemoteUser.aegis.xml文件，如下：</p>
<blockquote><p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;     <br />&lt;mappings xmlns:<font color="#0000ff">tns</font>=&quot;<font color="#0000ff">http://www.xxx.com/services/nopService</font>”&gt;      <br />&#160;&#160;&#160; &lt;mapping name=&quot;tns:RemoteUser&quot;&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;fax&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;mail&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;mobile&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;name&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;post&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;pwd&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;sex&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;telephone&quot; /&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; nillable=&quot;true&quot; name=&quot;uid&quot; /&gt;      <br />&#160;&#160;&#160; &lt;/mapping&gt;      <br />&lt;/mappings&gt;</p>
</blockquote>
<p>2.客户端生成的代码里，getAccount()的返回值GetAccountResponse里的并不是预想中的List&lt;RemoteUser&gt;，而是一个ArrayOfRemoteUser对象中再包了一个类型为List&lt;RemoteUser&gt;的属性。</p>
<p>&#160;&#160;&#160;&#160; 现在这个问题还没有解决。。。。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/10/webservice-debug-with-xfire-replenish.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一次WebService调试</title>
		<link>http://blog.shoopman.org/2009/07/06/webservice-debug-with-xfire.html</link>
		<comments>http://blog.shoopman.org/2009/07/06/webservice-debug-with-xfire.html#comments</comments>
		<pubDate>Mon, 06 Jul 2009 14:48:54 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[WebService]]></category>
		<category><![CDATA[XFire]]></category>

		<guid isPermaLink="false">/2009/07/6/webservice-debug-with-xfire.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 项目背景：中移动某省的一个管理系统A，而本公司另一产品线则负责此移动公司的门户P，现在需要进行用户数据的同步及实现单点登陆。门户P有一套简单的关于用户数据同步的WebService接口规范，定义了方法名、返回值及参数。
&#160;&#160;&#160; 系统A技术框架：JDK1.4 + Struts1.2.x + Spring + XFire。
&#160;&#160;&#160; 我对XFire不太熟悉，幸好系统A原先就已经使用了XFire向其他系统提供了WebService，我只需要依葫芦画瓢就行。还是简单的说一下XFire及与Spring集成的配置吧。
&#160;&#160;&#160; 1. web.xml的配置，配置xfire的servlet及URI映射
&#60;servlet&#62;      &#60;servlet-name&#62;xfire&#60;/servlet-name&#62;       &#60;servlet-class&#62;org.codehaus.xfire.spring.XFireSpringServlet&#60;/servlet-class&#62;       &#60;/servlet&#62; 
&#60;servlet-mapping&#62;      &#60;servlet-name&#62;xfire&#60;/servlet-name&#62;       &#60;url-pattern&#62;/services/*&#60;/url-pattern&#62;       &#60;/servlet-mapping&#62; 

&#160;&#160;&#160; 2. [...]]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 项目背景：中移动某省的一个管理系统A，而本公司另一产品线则负责此移动公司的门户P，现在需要进行用户数据的同步及实现单点登陆。门户P有一套简单的关于用户数据同步的WebService接口规范，定义了方法名、返回值及参数。</p>
<p>&#160;&#160;&#160; 系统A技术框架：JDK1.4 + Struts1.2.x + Spring + XFire。</p>
<p>&#160;&#160;&#160; 我对XFire不太熟悉，幸好系统A原先就已经使用了XFire向其他系统提供了WebService，我只需要依葫芦画瓢就行。还是简单的说一下XFire及与Spring集成的配置吧。</p>
<p>&#160;&#160;&#160; 1. web.xml的配置，配置xfire的servlet及URI映射</p>
<blockquote><p>&lt;servlet&gt;      <br />&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;       <br />&lt;servlet-class&gt;org.codehaus.xfire.spring.XFireSpringServlet&lt;/servlet-class&gt;       <br />&lt;/servlet&gt; </p>
<p>&lt;servlet-mapping&gt;      <br />&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;       <br />&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;       <br />&lt;/servlet-mapping&gt; </p>
</blockquote>
<p>&#160;&#160;&#160; 2. services.xml的配置，位于WEB-INF/META-INF/xfire下，指定WebService的名称、路径及类接口及实现类</p>
<blockquote><p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      <br />&lt;beans xmlns=&quot;http://xfire.codehaus.org/config/1.0&quot;&gt;       <br />&#160;&#160;&#160;&#160; &lt;service&gt;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;NopService&lt;/name&gt;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;namespace&gt;/services/NopService&lt;/namespace&gt;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;serviceClass&gt;com.xxx.project.service.NopService&lt;/serviceClass&gt;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;implementationClass&gt;com.xxx.project.service.NopServiceImpl&lt;/implementationClass&gt;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160; &lt;/service&gt;       <br />&lt;/beans&gt;</p>
</blockquote>
<p>服务接口类如下：</p>
<blockquote><p>package com.xxx.project.service</p>
<p>public interface NopService {      <br />&#160;&#160;&#160; /**       <br />&#160;&#160;&#160;&#160; * 获得用户信息       <br />&#160;&#160;&#160;&#160; * @param flag       <br />&#160;&#160;&#160;&#160; * @return       <br />&#160;&#160;&#160;&#160; */       <br />&#160;&#160;&#160; public List getAccount(String flag);</p>
<p>}</p>
</blockquote>
<p>getAccount返回的List包含的是对象是RemoteUser，一个纯粹的JavaBean，如下：</p>
<blockquote><p>package com.xxx.project.service</p>
<p>public class RemoteUser {      <br />&#160;&#160;&#160; private String uid;&#160; <br />&#160;&#160;&#160; private String name;&#160; <br />&#160;&#160;&#160; private String pwd;&#160; <br />&#160;&#160;&#160; private String sex;&#160; <br />&#160;&#160;&#160; private String mobile;&#160; <br />&#160;&#160;&#160; private String telephone;&#160; <br />&#160;&#160;&#160; private String mail;&#160; <br />&#160;&#160;&#160; private String post;&#160; <br />&#160;&#160;&#160; private String fax; </p>
<p>&#160;&#160;&#160; /** 省略掉的getter与setter */</p>
<p>}</p>
</blockquote>
<p>&#160;&#160;&#160; 3. spring beans 的配置</p>
<blockquote><p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      <br />&lt;!DOCTYPE beans PUBLIC       <br />&#160;&#160;&#160; &quot;-//SPRING//DTD BEAN//EN&quot;       <br />&#160;&#160;&#160; &quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;&gt;       <br />&lt;beans&gt;       <br />&#160;&#160;&#160; &lt;import resource=&quot;classpath:org/codehaus/xfire/spring/xfire.xml&quot; /&gt;       <br />&#160;&#160;&#160; &lt;bean       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; class=&quot;org.springframework.web.servlet.handler.SimpleUrlHandlerMapping&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;urlMap&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;map&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;entry key=&quot;/nopService&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ref bean=&quot;xfire.nopService&quot;/&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/entry&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/map&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/property&gt;       <br />&#160;&#160;&#160; &lt;/bean&gt;       <br />&#160;&#160;&#160; &lt;!&#8211; common xfire exporter,set the parent to this bean &#8211;&gt;       <br />&#160;&#160;&#160; &lt;bean id=&quot;commonXFireExporter&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; class=&quot;org.codehaus.xfire.spring.remoting.XFireExporter&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; lazy-init=&quot;false&quot; abstract=&quot;true&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;serviceFactory&quot; ref=&quot;xfire.serviceFactory&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;xfire&quot; ref=&quot;xfire&quot; /&gt;       <br />&#160;&#160;&#160; &lt;/bean&gt;       <br />&#160;&#160;&#160; &lt;!&#8211; Declare a parent bean with all properties common to both services &#8211;&gt;       <br />&#160;&#160;&#160; &lt;bean id=&quot;xfire.nopService&quot; parent=&quot;commonXFireExporter&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;name&quot; value=&quot;nopService&quot;/&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;namespace&quot; value=&quot;<font color="#ff0000">http://<font color="#ff0000">www</font>.xxx.com/services/nopService</font>&quot;/&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;serviceBean&quot; ref=&quot;nopService&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;serviceInterface&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; value=&quot;com.xxx.project.service.NopService&quot; /&gt;       <br />&#160;&#160;&#160; &lt;/bean&gt;       <br />&lt;/beans&gt;</p>
</blockquote>
<p>&#160;&#160;&#160; 4.aegis的配置，由于接口上的返回类型是集合类，需要配置一个NopService.aegis.xml的文件来告诉xfire包含在集合中的是什么类型，注意到文件名是接口名+.aegis.xml，位置跟接口的一样。</p>
<blockquote><p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      <br />&lt;mappings&gt;       <br />&#160;&#160;&#160; &lt;mapping&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;method name=&quot;getAccount&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;return-type       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; componentType=&quot;com.xxx.project.service.RemoteUser&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; minOccurs=&quot;1&quot; maxOccurs=&quot;1&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/method&gt;       <br />&#160;&#160;&#160; &lt;/mapping&gt;       <br />&lt;/mappings&gt;</p>
</blockquote>
<p>&#160;</p>
<p>部署到Tomcat中，通过浏览器访问<a title="http://localhost:8080/services/nopService?wsdl" href="http://localhost:8080/services/nopService?wsdl">http://localhost:8080/services/nopService?wsdl</a>，得到了类似如下的WSDL：</p>
<blockquote><p>&lt;?xml version=&quot;1.0<br />
&quot; encoding=&quot;UTF-8&quot;?&gt;      <br />&lt;wsdl:definitions targetNamespace=&quot;<font color="#ff0000">http://www.xxx.com/services/nopService</font>&quot;       <br />&#160;&#160; <font color="#ff0000">xmlns:tns=&quot;http://www.xxx.com/services/nopService&quot;</font> xmlns:wsdlsoap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot;       <br />&#160;&#160;&#160; xmlns:soap12=&quot;http://www.w3.org/2003/05/soap-envelope&quot; <font color="#ff0000">xmlns:ns1=&quot;http://project.xxx.com&quot;</font>       <br />&#160;&#160;&#160; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:soapenc11=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot;       <br />&#160;&#160;&#160; xmlns:soapenc12=&quot;http://www.w3.org/2003/05/soap-encoding&quot; xmlns:soap11=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;       <br />&#160;&#160;&#160; xmlns:wsdl=&quot;http://schemas.xmlsoap.org/wsdl/&quot;&gt;       <br />&#160;&#160;&#160; &lt;wsdl:types&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">&lt;xsd:schema</font> xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; attributeFormDefault=&quot;qualified&quot; elementFormDefault=&quot;qualified&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; targetNamespace=&quot;http://www.xxx.com/services/nopService&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element name=&quot;getAccount&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element maxOccurs=&quot;1&quot; minOccurs=&quot;1&quot; name=&quot;in0&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:element&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element name=&quot;getAccountResponse&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element maxOccurs=&quot;1&quot; minOccurs=&quot;1&quot; name=&quot;out&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; nillable=&quot;true&quot; type=&quot;<font color="#ff0000">ns1:ArrayOfRemoteUser</font>&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:element&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">&lt;/xsd:schema&gt;        <br /></font>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">&lt;xsd:schema</font> xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; attributeFormDefault=&quot;qualified&quot; elementFormDefault=&quot;qualified&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; targetNamespace=&quot;http://project.xxx.com&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:complexType name=&quot;ArrayOfRemoteUser&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element maxOccurs=&quot;unbounded&quot; minOccurs=&quot;0&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; name=&quot;RemoteUser&quot; nillable=&quot;true&quot; type=&quot;ns1:RemoteUser&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:complexType name=&quot;RemoteUser&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element <font color="#0000ff">minOccurs=&quot;0&quot;</font> name=&quot;fax&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element <font color="#0000ff">minOccurs=&quot;0&quot;</font> name=&quot;mail&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element <font color="#0000ff">minOccurs=&quot;0&quot;</font> name=&quot;mobile&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element minOccurs=&quot;0&quot; name=&quot;name&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element minOccurs=&quot;0&quot; name=&quot;post&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element minOccurs=&quot;0&quot; name=&quot;pwd&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />
 type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element minOccurs=&quot;0&quot; name=&quot;sex&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element minOccurs=&quot;0&quot; name=&quot;telephone&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;xsd:element minOccurs=&quot;0&quot; name=&quot;uid&quot; nillable=&quot;true&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/xsd:complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="#ff0000">&lt;/xsd:schema&gt;</font>       <br />&#160;&#160;&#160; &lt;/wsdl:types&gt;</p>
<p>&#160;&#160;&#160; &lt;!&#8211; 省略了部分 &#8211;&gt;      <br />&#160;&#160;&#160; &lt;/wsdl:definitions&gt;</p>
</blockquote>
<p>wsdl文件都出来，算是成功一半了，接着就是生成客户端来测试了。像Axis和cfx一样，XFire也带有代码生成工具，也有ant任务，如下：</p>
<blockquote><p>&lt;project name=&quot;xfire-client&quot; default=&quot;wsgen&quot; basedir=&quot;.&quot;&gt;      <br />&#160;&#160;&#160; &lt;path id=&quot;classpath&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;fileset dir=&quot;lib&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;include name=&quot;**/*.jar&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/fileset&gt;       <br />&#160;&#160;&#160; &lt;/path&gt;       <br />&#160;&#160;&#160; &lt;target name=&quot;wsgen&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;taskdef name=&quot;wsgen&quot; classname=&quot;org.codehaus.xfire.gen.WsGenTask&quot; classpathref=&quot;classpath&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;wsgen outputDirectory=&quot;appClientModule&quot; wsdl=&quot;http://localhost:8080/services/nopService?wsdl&quot; package=&quot;com.xxx.project.client&quot; overwrite=&quot;true&quot; /&gt;       <br />&#160;&#160;&#160; &lt;/target&gt;       <br />&lt;/project&gt;</p>
<p>&#160;</p>
</blockquote>
<p>客户代码生成后，再写一个测试类来调用WebService：</p>
<blockquote><p>public class NopServiceTest { </p>
<p>&#160;&#160;&#160; public static void main(String[] args) {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; nopServiceClient client = new nopServiceClient();       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; nopServicePortType service = client.getnopServiceHttpPort(&quot;<a href="http://localhost:8080/services/nopService&quot;);">http://localhost:8080/services/nopService&quot;);</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ArrayOfRemoteUser rets = service.getAccount(&quot;&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; List&lt;RemoteUser&gt; list = rets.getRemoteUser();       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(list.size());       <br />&#160;&#160;&#160; } </p>
<p>}</p>
</blockquote>
<p>&#160;&#160;&#160; OK！测试成功。赶紧打包部署到测试服务器上，让门户P的开发人员来测试。对方很快来了反应：wsdl不符合他们的规范，在将wsdl导入门户P时报错&#8212;-无法识别类型“<font color="#ff0000">ns1:ArrayOfRemoteUser</font>”。我能得到的错误信息就这么多，以及一份符合所谓规范的wsdl样例，貌似是由Axis生成的：</p>
<blockquote><p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;      <br />&lt;wsdl:definitions targetNamespace=&quot;<a href="http://security.interfaces.eoms.yyy.com&quot;">http://security.interfaces.eoms.yyy.com&quot;</a>       <br />&#160;&#160;&#160; xmlns:apachesoap=&quot;http://xml.apache.org/xml-soap&quot; xmlns:impl=&quot;<a href="http://security.interfaces.eoms.yyy.com&quot;">http://security.interfaces.eoms.yyy.com&quot;</a>       <br />&#160;&#160;&#160; xmlns:intf=&quot;http://security.interfaces.eoms.yyy.com&quot; xmlns:wsdl=&quot;http://schemas.xmlsoap.org/wsdl/&quot;       <br />&#160;&#160;&#160; xmlns:wsdlsoap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;       <br />&#160;&#160;&#160; &lt;!&#8211;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; WSDL created by Apache Axis version: 1.3 Built on Oct 05, 2005       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; (05:23:37 EDT)       <br />&#160;&#160;&#160; &#8211;&gt;       <br />&#160;&#160;&#160; &lt;wsdl:types&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;schema elementFormDefault=&quot;qualified&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; targetNamespace=&quot;http://security.interfaces.eoms.yyy.com&quot; xmlns=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;getAccount&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;flag&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/element&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;getAccountResponse&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element maxOccurs=&quot;unbounded&quot; name=&quot;getAccountReturn&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; type=&quot;impl:RemoteUser&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/element&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;complexType name=&quot;RemoteUser&quot;&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;seque<br />
nce&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;fax&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;mail&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;mobile&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;name&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;post&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;pwd&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;sex&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;telephone&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;element name=&quot;uid&quot; nillable=&quot;true&quot; type=&quot;xsd:string&quot; /&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/sequence&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/complexType&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/schema&gt;       <br />&#160;&#160;&#160; &lt;/wsdl:types&gt;</p>
</blockquote>
<p>&#160;&#160;&#160; 由于非技术原因，此问题得由我来处理。通过对比两个wsdl文件、长时间及多次的测试，最终锁定了门户P无法识别”ns1:ArrayOfRemoteUser”的原因：系统A的wsdl有两个<font color="#ff0000">&lt;xsd:schema&gt;</font>节点。又经过多次尝试，才终于把xfire生成的wsdl的schema节点合并为一个，方法是，把前面第3步的spring beans配置中的标红处修改如下，跟接口类颠倒的包名保持一致：</p>
<blockquote><p>&lt;bean id=&quot;xfire.nopService&quot; parent=&quot;commonXFireExporter&quot;&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;name&quot; value=&quot;nopService&quot;/&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;namespace&quot; value=&quot;<font color="#ff0000">http://service.project.</font><font color="#ff0000">xxx.com</font>&quot;/&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;serviceBean&quot; ref=&quot;nopService&quot; /&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;serviceInterface&quot;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; value=&quot;<font color="#ff0000">com.xxx.project.service</font>.NopService&quot; /&gt;&#160; <br />&lt;/bean&gt;</p></blockquote>
<p>后来在网上找到可能的原因：<a title="https://issues.apache.org/jira/browse/CXF-1117" href="https://issues.apache.org/jira/browse/CXF-1117" target="_blank">https://issues.apache.org/jira/browse/CXF-1117</a>，门户P的cxf包可能较旧，不支持多个xmlns。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/06/webservice-debug-with-xfire.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Struts2中OGNL设置泛型属性值的问题</title>
		<link>http://blog.shoopman.org/2009/07/01/solve-ognl-set-value-to-generic-type-property-in-struts2.html</link>
		<comments>http://blog.shoopman.org/2009/07/01/solve-ognl-set-value-to-generic-type-property-in-struts2.html#comments</comments>
		<pubDate>Wed, 01 Jul 2009 16:08:40 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[OGNL]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[泛型]]></category>

		<guid isPermaLink="false">/2009/07/1/solve-ognl-set-value-to-generic-type-property-in-struts2.html</guid>
		<description><![CDATA[    有这么一个封装了CRUD操作的Action基类：
public abstract class CrudAction extends ActionSupport{
    protected T entity;
    protected PK id;
 
    public void setId(PK id) {         this.id = id;     }
    /** 显示新建或编辑页前的数据准备 */
    public String input() throws Exception {
    }
    /** other code */
}

    然后是一个继承此CrudAction的用户CRUD操作类：
public class UserAction extends CrudAction {
    @Autowired     private UserManager userManager;
 
    @Override     public String input() throws [...]]]></description>
			<content:encoded><![CDATA[<p>    有这么一个封装了CRUD操作的Action基类：</p>
<blockquote><p><span style="background-color: #ffffff;">public abstract class CrudAction extends ActionSupport{</span></p>
<p><span style="background-color: #ffffff;">    protected T entity;</span></p>
<p><span style="background-color: #ffffff;">    protected PK id;</span></p>
<p> </p>
<p>    public void setId(PK id) { <br />        this.id = id; <br />    }</p>
<p>    /** 显示新建或编辑页前的数据准备 */</p>
<p>    public String input() throws Exception {</p>
<p>    }</p>
<p>    /** other code */</p>
<p><span style="background-color: #ffffff;">}</span></p>
</blockquote>
<p>    然后是一个继承此CrudAction的用户CRUD操作类：</p>
<blockquote><p><span style="background-color: #ffffff;">public class UserAction extends CrudAction {</span></p>
<p>    @Autowired <br />    private UserManager userManager;</p>
<p> </p>
<p>    @Override <br />    public String input() throws Exception {</p>
<p>        <span style="color: #ff0000;">entity = userManager.get(id);</span></p>
<p>    }</p>
<p><span style="background-color: #ffffff;">}</span></p>
</blockquote>
<p>    但是通过类似这样的连接<a href="http://localhost:8080/test/user!input.action?id=uid">http://localhost:8080/test/user!input.action?id=uid</a>来访问时，在UserAction中得到的id值是一个长度为1的String数组，导致后面Hibernate查询报错了。不知道为什么获得的值是数组，一开始只好以最直接的办法来获取正确的id值：判断id是否为数组，如果是即取索引为0的值。</p>
<p>    后来，尝试在子类用实际的类型覆盖id的setter方法：</p>
<blockquote><p>    @Override <br />    public void setId(String id) { <br />        this.id = id; <br />    }</p>
</blockquote>
<p>结果是可以正确的获得值，而不需要经过上面那丑陋的转换。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/07/01/solve-ognl-set-value-to-generic-type-property-in-struts2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows7从待机恢复又没响应了</title>
		<link>http://blog.shoopman.org/2009/06/09/windows7-not-responded-when-woke-up.html</link>
		<comments>http://blog.shoopman.org/2009/06/09/windows7-not-responded-when-woke-up.html#comments</comments>
		<pubDate>Tue, 09 Jun 2009 13:15:35 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows7]]></category>

		<guid isPermaLink="false">/2009/06/9/windows7-not-responded-when-woke-up.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 中午休息，把Dell 1400合上了，让它待机状态也休息一下吧，毕竟天气实在太热了，而公司空调又又再再的坏了。刚才醒了过来，马上打开Dell，而它却没有反应了&#8212;-屏幕是黑的，指标灯中除了电源灯是亮的外其他的都黑着；按Ctrl+Alt+Del，1400也没有反应；轻按Power键也一样。
&#160;&#160;&#160; 自从安装起Windows7 x64 RC 7100以来，已经出现了三四次这种情况了；而在给Dell 1400升级到4G内存后，还有两次从待机恢复时出现了蓝屏！
&#160;&#160;&#160; 不过总体上，Windows7还是进步不少了，暂时还没有删除Windows7的计划。
]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 中午休息，把Dell 1400合上了，让它待机状态也休息一下吧，毕竟天气实在太热了，而公司空调又又再再的坏了。刚才醒了过来，马上打开Dell，而它却没有反应了&#8212;-屏幕是黑的，指标灯中除了电源灯是亮的外其他的都黑着；按Ctrl+Alt+Del，1400也没有反应；轻按Power键也一样。</p>
<p>&#160;&#160;&#160; 自从安装起Windows7 x64 RC 7100以来，已经出现了三四次这种情况了；而在给Dell 1400升级到4G内存后，还有两次从待机恢复时出现了蓝屏！</p>
<p>&#160;&#160;&#160; 不过总体上，Windows7还是进步不少了，暂时还没有删除Windows7的计划。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/06/09/windows7-not-responded-when-woke-up.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>删除 NetBeans 自动生成的Swing 事件处理方法代码</title>
		<link>http://blog.shoopman.org/2009/06/02/the-way-how-to-delete-the-swing-event-handler-generated-by-netbeans.html</link>
		<comments>http://blog.shoopman.org/2009/06/02/the-way-how-to-delete-the-swing-event-handler-generated-by-netbeans.html#comments</comments>
		<pubDate>Tue, 02 Jun 2009 18:53:05 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Swing]]></category>
		<category><![CDATA[事件处理]]></category>

		<guid isPermaLink="false">/2009/06/2/the-way-how-to-delete-the-swing-event-handler-generated-by-netbeans.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 初用NetBeans6.5开发Swing界面，发现通过NetBeans生成的事件处理方法的代码，在源代码视图里无法删除。Google一下，在http://space.itpub.net/9844649/viewspace-580172找到了正确办法：
选中相关的组件
右键&#8211;&#62;“属性”，打开属性对话框，或者直接找到属性视图
点击“事件”页
找到相应的事件，点后面的按钮
在弹出的处理程序对话框中找到相应的事件处理方法，选中删除
&#160;&#160;&#160; Eclipse使用久了，感觉NetBeans相当之不习惯。
]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 初用NetBeans6.5开发Swing界面，发现通过NetBeans生成的事件处理方法的代码，在源代码视图里无法删除。Google一下，在<a title="http://space.itpub.net/9844649/viewspace-580172" href="http://space.itpub.net/9844649/viewspace-580172">http://space.itpub.net/9844649/viewspace-580172</a>找到了正确办法：</p>
<p>选中相关的组件</p>
<p>右键&#8211;&gt;“属性”，打开属性对话框，或者直接找到属性视图</p>
<p>点击“事件”页</p>
<p>找到相应的事件，点后面的按钮</p>
<p>在弹出的处理程序对话框中找到相应的事件处理方法，选中删除</p>
<p>&#160;&#160;&#160; Eclipse使用久了，感觉NetBeans相当之不习惯。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/06/02/the-way-how-to-delete-the-swing-event-handler-generated-by-netbeans.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ghs的又一个IP被封了</title>
		<link>http://blog.shoopman.org/2009/05/27/another-ghs-ip-been-blocked.html</link>
		<comments>http://blog.shoopman.org/2009/05/27/another-ghs-ip-been-blocked.html#comments</comments>
		<pubDate>Wed, 27 May 2009 09:38:23 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[ghs]]></category>

		<guid isPermaLink="false">/2009/05/27/another-ghs-ip-been-blocked.html</guid>
		<description><![CDATA[    上周，Google的Blogger被封了，至今未解禁。今天，我的博客无法通过绑定的域名访问，当然，估计一大片绑定域名的GAE应用访问不了，比如xuming.net。看来GFW在搞大动作啊，唉，可怜的中国网民。
    昨天我的这个博客还是可以通过域名blog.shoopman.org来访问的，今天一早却访问不了。一开始以为是公司网络太差了，但还是尝试了Google App Engine送的域名shoopmanlog.appspot.com来访问，没有问题，由此确定，又一个ghs的IP被GFW干掉了。
    GFW是强大的，但中国网民的智慧更是强大，我在xiao3meng这里找到了一个ghs的IP，马上到GoDaddy的域名管理里去重新设置了A记录，现在就是在等待域名解析生效了。如果你是通过blog.shoopman.org看到了这篇文章，那说明域名解析已经生效了。如果以后再出现访问不了的问题，那就先试试用shoopmanlog.appspot.com这个域名来访问吧。
]]></description>
			<content:encoded><![CDATA[<p>    上周，Google的<a href="http://www.blogger.com/" target="_blank">Blogger</a>被封了，至今未解禁。今天，我的博客无法通过绑定的域名访问，当然，估计一大片绑定域名的GAE应用访问不了，比如<a href="http://xuming.net/" target="_blank">xuming.net</a>。看来GFW在搞大动作啊，唉，可怜的中国网民。</p>
<p>    昨天我的这个博客还是可以通过域名<a href="http://blog.shoopman.org">blog.shoopman.org</a>来访问的，今天一早却访问不了。一开始以为是公司网络太差了，但还是尝试了Google App Engine送的域名<a title="http://shoopmanlog.appspot.com" href="http://shoopmanlog.appspot.com" target="_blank">shoopmanlog.appspot.com</a>来访问，没有问题，由此确定，又一个ghs的IP被GFW干掉了。</p>
<p>    GFW是强大的，但中国网民的智慧更是强大，我在<a href="http://xiao3meng.org/web/update-ghs-google-com-available-ip-list" target="_blank">xiao3meng这里</a>找到了一个ghs的IP，马上到GoDaddy的域名管理里去重新设置了A记录，现在就是在等待域名解析生效了。如果你是通过blog.shoopman.org看到了这篇文章，那说明域名解析已经生效了。如果以后再出现访问不了的问题，那就先试试用<a title="http://shoopmanlog.appspot.com" href="http://shoopmanlog.appspot.com" target="_blank">shoopmanlog.appspot.com</a>这个域名来访问吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/05/27/another-ghs-ip-been-blocked.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>该评论已关闭&#8212;-已成最新网络流行语</title>
		<link>http://blog.shoopman.org/2009/05/26/a-new-popular-phrase-comments-been-closed.html</link>
		<comments>http://blog.shoopman.org/2009/05/26/a-new-popular-phrase-comments-been-closed.html#comments</comments>
		<pubDate>Tue, 26 May 2009 12:59:15 +0000</pubDate>
		<dc:creator>Shoopman</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[乱谈]]></category>
		<category><![CDATA[网易]]></category>

		<guid isPermaLink="false">/2009/05/26/a-new-popular-phrase--comments-been-closed.html</guid>
		<description><![CDATA[    在盗盗的Twitter上看到一个“如何迅速了解近期国内发生的敏感事件？——请用Google&#8221;该评论已关闭”。点那连接一看，果然Google的搜索结果里基本上都是很敏感的事情，不信？点这试试！ 不得不佩服中国网民的智慧。至于为什么，还是继续问一下Google吧，http://www.google.cn/search?hl=zh-CN&#38;newwindow=1&#38;q=%E8%AF%A5%E8%AF%84%E8%AE%BA%E5%B7%B2%E5%85%B3%E9%97%AD&#38;meta=&#38;aq=f&#38;oq。
]]></description>
			<content:encoded><![CDATA[<p>    在<a href="http://twitter.com/daodao" target="_blank">盗盗的Twitter</a>上看到一个“如何迅速了解近期国内发生的敏感事件？——请用Google&#8221;该评论已关闭”。点那连接一看，果然Google的搜索结果里基本上都是很敏感的事情，不信？<a href="http://www.google.cn/search?q=%22%E8%AF%A5%E8%AF%84%E8%AE%BA%E5%B7%B2%E5%85%B3%E9%97%AD%22+site%3Anews.163.com+-%22bbs.news.163.com" target="_blank">点这试试</a>！ 不得不佩服中国网民的智慧。至于为什么，还是继续问一下Google吧，<a title="http://www.google.cn/search?hl=zh-CN&amp;newwindow=1&amp;q=%E8%AF%A5%E8%AF%84%E8%AE%BA%E5%B7%B2%E5%85%B3%E9%97%AD&amp;meta=&amp;aq=f&amp;oq=" href="http://www.google.cn/search?hl=zh-CN&amp;newwindow=1&amp;q=%E8%AF%A5%E8%AF%84%E8%AE%BA%E5%B7%B2%E5%85%B3%E9%97%AD&amp;meta=&amp;aq=f&amp;oq" target="_blank">http://www.google.cn/search?hl=zh-CN&amp;newwindow=1&amp;q=%E8%AF%A5%E8%AF%84%E8%AE%BA%E5%B7%B2%E5%85%B3%E9%97%AD&amp;meta=&amp;aq=f&amp;oq</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.shoopman.org/2009/05/26/a-new-popular-phrase-comments-been-closed.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
