<?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>Java豆技术站点</title>
	<atom:link href="http://javadou.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://javadou.com</link>
	<description>Java</description>
	<lastBuildDate>Fri, 12 Mar 2010 02:06:49 +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>Ajax快速入门-以XML作为数据载体发送和接收图书信息</title>
		<link>http://javadou.com/ajax-xml-request-response-book-info-538/</link>
		<comments>http://javadou.com/ajax-xml-request-response-book-info-538/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 02:06:49 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[ajax]]></category>

		<guid isPermaLink="false">http://javadou.com/ajax%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8-%e4%bb%a5xml%e4%bd%9c%e4%b8%ba%e6%95%b0%e6%8d%ae%e8%bd%bd%e4%bd%93%e5%8f%91%e9%80%81%e5%92%8c%e6%8e%a5%e6%94%b6%e5%9b%be%e4%b9%a6%e4%bf%a1%e6%81%af-2-538/</guid>
		<description><![CDATA[是从一本书上抄下来的 感觉实用记录下来
Ajax快速入门，以XML作为数据载体发送和接收图书信息。
1、创建XMLHttpRequest对象：xmlHttp；
2、以XML数据存储用户选择的图书（ID）；
3、发送异步请求（调用XMLHttpRequest对象的... ]]></description>
			<content:encoded><![CDATA[<p>是从一本书上抄下来的 感觉实用记录下来</p>
<p>Ajax快速入门，以XML作为数据载体发送和接收图书信息。</p>
<p>1、创建XMLHttpRequest对象：xmlHttp；<br />
2、以XML数据存储用户选择的图书（ID）；<br />
3、发送异步请求（调用XMLHttpRequest对象的相关方法和设置属性）：<br />
3.1、调用open()方法，设置请求方式（POST/GET/HEAD）和URL;<br />
3.2、调用setRequestHeader()方法，设置请求的报头信息；<br />
3.2、调用send()方法，向服务器发送请求；<br />
3.4、设置onreadystatechange属性，设置回调函数名。<br />
4、XmlBookServlet处理XML字符串并返回XML字符串<br />
4.1、读取请求（request）中的XML字符窜；<br />
BufferedReader reader = request.getReader();<br />
while ((len = reader.read(buf)) != -1) {<br />
xml.append(new String(buf, 0, len));<br />
}<br />
4.2、利用dom4j提供的基于事件的处理模型对XML文档进行解析<br />
saxReader.addHandler()；<br />
4.3、在解析的同时读取数据库中相应的信息（详细信息），并注入对象中；<br />
eltBooks.add(eltBook);<br />
4.4、将对象写入返回响应(response)中：<br />
response.getWriter()<br />
xmlWriter.write(eltBooks);<br />
5、回调函数处理服务器返回结果：<br />
5.1、检查“请求的状态”，4为响应已完成；<br />
5.2、检查“服务器的HTTP状态码”，200为OK；<br />
5.3、清除先前请求的结果，包括表头和内容；<br />
5.4、解析服务器响应的XML数据，构建表头和内容。</p>
<p>孙鑫《Struts2 深入详解》笔记，第18章。</p>
<p><span><a name="download">下载</a></span></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<th scope="col">描述</th>
<th scope="col">名字</th>
<th scope="col">大小</th>
<th scope="col">下载方法</th>
</tr>
<tr>
<th scope="row">本文完整的源代码</th>
<td>sx_ch18001.rar</td>
<td>35 KB</td>
<td><a onkeypress="sa_onclick(this.href)" href="http://ttdemo.googlecode.com/files/sx_ch18001.rar"><strong>HTTP</strong></a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ajax-xml-request-response-book-info-538/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Struts2遍历List时输出Index</title>
		<link>http://javadou.com/struts2-list-index-535/</link>
		<comments>http://javadou.com/struts2-list-index-535/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 02:04:28 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://javadou.com/struts2%e9%81%8d%e5%8e%86list%e6%97%b6%e8%be%93%e5%87%baindex-535/</guid>
		<description><![CDATA[在循环中我们常常需要索引值 很多朋友不知道如何在struts2中得到，在Struts2架构中，输出列表时如果我们相同时输出该记录的index，只需在迭代器中定义status=”idx”，然后就可以使用idx.index取值了。
&60;!– 遍历结果... ]]></description>
			<content:encoded><![CDATA[<p>在循环中我们常常需要索引值 很多朋友不知道如何在struts2中得到，在Struts2架构中，输出列表时如果我们相同时输出该记录的index，只需在迭代器中定义status=”idx”，然后就可以使用idx.index取值了。<br />
&lt;!– 遍历结果集 begin –&gt; &lt;s:iterator value=”rentRefList” status=”idx”&gt; &lt;tr height=”25″ align=”center” bgcolor=”white”&gt; &lt;td bgcolor=”#f7f9ff”&gt; &lt;s:property value=”#idx.index+1″ /&gt; &lt;/td&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-list-index-535/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>让Struts2+ExtJS支持多语言</title>
		<link>http://javadou.com/struts2-extjs-more-language-536/</link>
		<comments>http://javadou.com/struts2-extjs-more-language-536/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 02:04:28 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[Web开发]]></category>
		<category><![CDATA[extjs]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://javadou.com/%e8%ae%a9struts2extjs%e6%94%af%e6%8c%81%e5%a4%9a%e8%af%ad%e8%a8%80-536/</guid>
		<description><![CDATA[其实很简单就是几行代码就可以了
secondform = new Ext.Panel({
id : &8216;tab2&8242;,
title : &8216;&60;s:text name=&8221;XXX&8221;/&62;&8217;,
)
说明：Struts2支持多语言非常方便，只要写好对应的资源文件就可以了。ExtJS的多语言很麻... ]]></description>
			<content:encoded><![CDATA[<p>其实很简单就是几行代码就可以了<br />
secondform = new Ext.Panel({<br />
id : &#8216;tab2&#8242;,<br />
title : &#8216;&lt;s:text name=&#8221;XXX&#8221;/&gt;&#8217;,<br />
)</p>
<p>说明：Struts2支持多语言非常方便，只要写好对应的资源文件就可以了。ExtJS的多语言很麻烦，和Struts2配合起来就非常好了。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-extjs-more-language-536/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Eclipse/MyEclipse中通过代理使用SVN</title>
		<link>http://javadou.com/eclipse-and-myeclipse-svn-537/</link>
		<comments>http://javadou.com/eclipse-and-myeclipse-svn-537/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 02:04:28 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[CVS/SVN]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[MyEclipse]]></category>
		<category><![CDATA[myeclipse]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://javadou.com/%e5%9c%a8eclipsemyeclipse%e4%b8%ad%e9%80%9a%e8%bf%87%e4%bb%a3%e7%90%86%e4%bd%bf%e7%94%a8svn-537/</guid>
		<description><![CDATA[有时候我们会碰到需要设置代理，然后通过svn获取源代码，下面我们来看一下如何设置；
1、
找到 C:\Documents and Settings\your userName\Application Data\Subversion 这个目录下的servers文件，用任意一个文本编辑器打开，找到
类似... ]]></description>
			<content:encoded><![CDATA[<p>有时候我们会碰到需要设置代理，然后通过svn获取源代码，下面我们来看一下如何设置；<br />
1、</p>
<p>找到 C:\Documents and Settings\your userName\Application Data\Subversion 这个目录下的servers文件，用任意一个文本编辑器打开，找到<br />
类似于如下的文字：</p>
<p>[global]<br />
# http-proxy-exceptions = *.exception.com, www.internal-site.org<br />
#http-proxy-host = proxy2.some-domain-name.com<br />
#http-proxy-port = 9000<br />
# http-proxy-username = defaultusername</p>
<p>将</p>
<p>#http-proxy-host<br />
#http-proxy-port</p>
<p>这两行前面的#号去掉，并将＝号右边的值分别改为你的代理服务器地址和端口号即可。</p>
<p>2、设置Eclipse/MyEclipse，确认SVN的客户端是SVNKit：</p>
<p>这样，就可以在Eclipse/MyEclipse中通过代理使用SVN了。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/eclipse-and-myeclipse-svn-537/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装SQL Server2005遇到的几个问题</title>
		<link>http://javadou.com/sql-server2005-523/</link>
		<comments>http://javadou.com/sql-server2005-523/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 00:50:47 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/%e5%ae%89%e8%a3%85sql-server2005%e9%81%87%e5%88%b0%e7%9a%84%e5%87%a0%e4%b8%aa%e9%97%ae%e9%a2%98-523/</guid>
		<description><![CDATA[原来有个项目是SQL Server2000，想移植到最新的2005中。手头得到的是一个2005企业版，安装的时候遇到了几个问题，现在一一列出来希望对大家有所帮助。
1. “系统兼容性”警告
在执行到系统检测那一步的时候有一个... ]]></description>
			<content:encoded><![CDATA[<p>原来有个项目是SQL Server2000，想移植到最新的2005中。手头得到的是一个2005企业版，安装的时候遇到了几个问题，现在一一列出来希望对大家有所帮助。</p>
<p><strong>1. “系统兼容性”警告</strong></p>
<p>在执行到系统检测那一步的时候有一个警告，提示是“系统兼容性错误”，因为是一个警告，当时也没有在意就继续安装了。但是安装的时候只有一个客户端可以选择，不能安装sql server服务。后来没办法，又重新回到刚才的警告，自己看了下“安装帮助”，原来企业版只能运行在win2k server和2003等系统上，不能运行在XP上。这一点跟之前的2000是类似的。所以本机只能安装标准版的了。</p>
<p><strong>2. 性能计数器要求安装错误</strong></p>
<p>提示的对话框如下：<img src="http://www.javatang.com/upload/snap016.gif" alt="" /></p>
<p>查看了联机帮助，提示下面的解决办法（这个方法我试了之后不是很好，另外一个方法见下面）：</p>
<blockquote><p>1 在 Microsoft Windows 2003 或 Windows XP 桌面上，依次单击“开始”、“运行”，然后在“打开”中键入 regedit.exe，再单击“确定”。在 Windows 2000 中，使用 regedt32.exe 启动注册表编辑器。</p>
<p>2 定位到以下注册表项：</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib]</p>
<p>“Last Counter”=dword:00000ed4 (5276)</p>
<p>“LastHelp”=dword:00000ed5 (5277)</p>
<p>3 上一步的“Last Counter”值 (5276) 必须与以下注册表项中“Perflib\009”的“Counter”项的最大值匹配，并且上一步的“Last Help”值 (5277) 必须与以下注册表项中“Perflib\009”的“Help”项的最大值匹配。</p>
<p>[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009]</p>
<p>注意 009 是英文中的一个示例。“Last Counter”和“Last Help”值是由 Windows 动态分配的；这两个值会因计算机的不同而不同。</p>
<p>4 如有必要，可修改“\Perflib”项中的“Last Counter”和“Last Help”值的值：在右侧窗格中，右键单击“Last Counter”或“Last Help”，单击“修改”，再单击“Base = “Decimal””，在“值数据”中设置值，再单击“确定”。如有必要，对另一个项重复以上过程，然后关闭注册表编辑器。</p>
<p>5 再次运行 SQL Server 安装程序。</p></blockquote>
<p>可是按照上面的方法还是无法解决问题，后来网上查了下，找到一个解决的办法（见下面的参考资料）。不过其实没有作者介绍的那么复杂，只要在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib] 找到04项下Count和Help中最大的项值（一般是最后一项）修改到Perflib目录下对应的“Laster Counter”项和“Laster Help”项就可以了。</p>
<p><strong>3. SQL Server2005与SQL Server2000或SQL Server7.0共存的方法</strong></p>
<p>因为都是在本机，安装2005的时候原来的SQL Server2000也不想删除，查了下资料这样是可以的，需要注意以下两点：</p>
<p>1) 在安装SQL2005的时候不要使用默认实例名称(SQL Server2000的实例名称是MSSQLSERVER)，手工输入一个自定义的不同于MSSQLSERVER的实例名称；</p>
<p>2) 如果和SQL Server2000安装到同一目录(例如C:\Program Files\Microsoft SQL Server)，那么在安装时不要选择安装SQL Server Management Studio，而是在安装之后到光盘的Tools\Setup目录下，运行SqlRun_Tools.msi安装。如果不小心已经安装上的话，在“添加/删除”里面删除掉SQL Server Management Studio然后在到光盘的Tools\Setup目录下，运行SqlRun_Tools.msi重新安装就可以了。</p>
<p>参考资料：</p>
<p>安装Ms SQL Server 2005 开发版时出现性能计数器要求安装错误的解决办法</p>
<p><a href="http://submaie.cnblogs.com/archive/2006/02/07/326538.html" target="_blank">http://submaie.cnblogs.com/archive/2006/02/07/326538.html</a></p>
<p>SQL Server2005与2000能否装在同一个系统？求确切答案</p>
<p><a href="http://www.readbook8.com/dev/5701/4402802.htm" target="_blank">http://www.readbook8.com/dev/5701/4402802.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/sql-server2005-523/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>乱码造成本站之前数据破坏，借此谈谈MySQL的乱码问题</title>
		<link>http://javadou.com/mysql-luan-ma-532/</link>
		<comments>http://javadou.com/mysql-luan-ma-532/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/%e4%b9%b1%e7%a0%81%e9%80%a0%e6%88%90%e6%9c%ac%e7%ab%99%e4%b9%8b%e5%89%8d%e6%95%b0%e6%8d%ae%e7%a0%b4%e5%9d%8f%ef%bc%8c%e5%80%9f%e6%ad%a4%e8%b0%88%e8%b0%88mysql%e7%9a%84%e4%b9%b1%e7%a0%81%e9%97%ae-532/</guid>
		<description><![CDATA[为了防止升级失败我特意用sqlYog将数据备份了一下，然后升级的过程中没有任何问题，因为我发现原来的栏目排列有些改变，于是就直接清空数据然后再导入备份过的数据重新安装一下系统。当前清空数据库的时候... ]]></description>
			<content:encoded><![CDATA[<p>为了防止升级失败我特意用<a href="http://www.javatang.com/archives/2007/07/25/2757191.html">sqlYog</a>将数据备份了一下，然后升级的过程中没有任何问题，因为我发现原来的栏目排列有些改变，于是就直接清空数据然后再导入备份过的数据重新安装一下系统。当前清空数据库的时候没有多想，反正之前有备份。这个时候问题出现了：导入备份后的数据全部变成了乱码！确切的应该说是错码才对，因为出现的不是问号而是一些错误的中文字。</p>
<p><img style="border: black 1px solid;" src="http://www.javatang.com/wp-content/messy-code.png" alt="乱码" /></p>
<p>反复试了很多种方法依然是无效，后来从sqlYog官方网站上查到sqlYog从6.0开始每次生成的sql文件编码都是utf-8格式的，另外在操作数据之前都使用</p>
<div>
<ol title="Double click to hide line number." ondblclick="linenumber(this)">
<li><span>set</span><span> </span><span>names</span><span> </span><span>&#8220;</span><span>utf8</span><span>&#8220;</span><span>;</span></li>
</ol>
</div>
<p>将所有的环境都设置为utf8编码，你可以在sqlYog的查询窗口中使用</p>
<div>
<ol title="Double click to hide line number." ondblclick="linenumber(this)">
<li><span>SHOW</span><span> </span><span>VARIABLES</span><span> </span><span>LIKE</span><span> </span><span>&#8216;</span><span>character_set_%</span><span>&#8216;</span><span>;</span></li>
</ol>
</div>
<p>查看一下语言环境。sqlYog在查看数据的时候首先查看原来数据库设置的编码格式，然后将其转换为utf8格式的数据，最后输出出来；如果修改数据则相反。上次我在博文中提到<a href="http://www.javatang.com/archives/2007/07/25/2757191.html">使用sqlYog6.03可以直接查看gbk编码的数据，但是查看utf8格式的编码是乱码</a>，我觉得这应该是sqlYog6.03版本中转换编码算法的一个bug，果然在最新发布的6.10rc版本中就修复了这个错误；另外一个就是根数据库默认设置的编码也有很大的关系，因为MySQL使用的默认编码是latin1，正是这样一个非常具有历史原因的设置成为了造成乱码的最直接的原因。这里可能有人会说不是sqlYog操作之前都已经将环境设置为utf8格式了吗？这个时候应该跟MySQL本身的编码没有任何关系了呀。sqlYog操作的时候是不会有关系，但是其他进程(比如php、java等)操作的时候呢？数据写入的时候已经出现乱码了，问题就出在这里。所以为了完全杜绝MySQL的乱码问题，建议将MySQL的默认编码设置为utf8格式。</p>
<p>因为wordpress数据库中的编码都是utf8格式的，我又使用的sqlYog6.03版本，所以无论查看还是备份utf8的数据都是乱码。最后只能是逐一从百度快照中将数据找出来添加到数据库中，因为我在wordpress中设置的remark规则跟时间和最后的数据id号有关系，为了不至于造成在百度中搜索出来的结果失效，所以首先先将原来数据库中的这些数据导入到新的数据中。当然这个时候wordpress已经升级成2.3了，呵呵(苦笑中…)</p>
<p>目前在2006年8月份之前的数据还没有恢复，将近有80条。我会在最近这段时间将他升级完成的。</p>
<p>参考资料：<a href="http://webyog.com/faq/34_102_en.html" target="_blank">Which MySQL Character Sets are supported by SQLyog?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/mysql-luan-ma-532/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpMyAdmin初次安装拒绝登录的问题及解决方法</title>
		<link>http://javadou.com/phpmyadmin-refuse-resolvent-531/</link>
		<comments>http://javadou.com/phpmyadmin-refuse-resolvent-531/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/phpmyadmin%e5%88%9d%e6%ac%a1%e5%ae%89%e8%a3%85%e6%8b%92%e7%bb%9d%e7%99%bb%e5%bd%95%e7%9a%84%e9%97%ae%e9%a2%98%e5%8f%8a%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95-531/</guid>
		<description><![CDATA[今天安装phpMyAdmin  2.10的时候修改认证方式为cookie之后进入程序首页登录的时候一直提示访问被拒绝，真的是奇怪了。后来从网上查了一下原来是需要清空一下浏览器缓存。
参考资料：hpMyAdmin 2.10.2 配置
... ]]></description>
			<content:encoded><![CDATA[<p>今天安装phpMyAdmin  2.10的时候修改认证方式为cookie之后进入程序首页登录的时候一直提示访问被拒绝，真的是奇怪了。后来从网上查了一下原来是需要清空一下浏览器缓存。</p>
<p>参考资料：<a href="http://blog.csdn.net/gggxin/archive/2007/06/28/1669936.aspx" target="_blank">hpMyAdmin 2.10.2 配置</a></p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/phpmyadmin-refuse-resolvent-531/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQLyog 6.x 开始支持Unicode编码了！！</title>
		<link>http://javadou.com/sqlyog-6-x-unicode-530/</link>
		<comments>http://javadou.com/sqlyog-6-x-unicode-530/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/sqlyog-6-x-%e5%bc%80%e5%a7%8b%e6%94%af%e6%8c%81unicode%e7%bc%96%e7%a0%81%e4%ba%86%ef%bc%81%ef%bc%81-530/</guid>
		<description><![CDATA[
一直是使用SQLyog来管理MySQL的，感觉他功能非常的强大，而且使用操作的时候非常的方便。但是一直以来SQLyog有个特别不爽的地方就是不支持Unicode，在查看数据库中的中文时会显示乱码，so如果直接用软件编辑保存... ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.javatang.com/wp-content/sqlyog_box.jpg" target="_blank"><img src="http://www.javatang.com/wp-content/sqlyog_box.thumbnail.jpg" border="0" alt="sqlyog_box.jpg" /></a></p>
<p>一直是使用<a href="http://www.webyog.com/" target="_blank">SQLyog</a>来管理MySQL的，感觉他功能非常的强大，而且使用操作的时候非常的方便。但是一直以来SQLyog有个特别不爽的地方就是不支持Unicode，在查看数据库中的中文时会显示乱码，so如果直接用软件编辑保存的话显示到网页上面就是乱码了，完全没有使用SQL  Server管理器那样的方便。</p>
<p>不过现在好了，今天无意间到SQLyog官方网站上面的时候，发现软件已经升级到6.x版本了，我所期待的<a href="http://www.webyog.com/en/screenshots_sqlyog.php" target="_blank">支持中文的功能也实现了</a>，爽啊~~~</p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/sqlyog-6-x-unicode-530/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows下安装zip包版本的MySQL</title>
		<link>http://javadou.com/windows-zip-mysql-529/</link>
		<comments>http://javadou.com/windows-zip-mysql-529/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/windows%e4%b8%8b%e5%ae%89%e8%a3%85zip%e5%8c%85%e7%89%88%e6%9c%ac%e7%9a%84mysql-529/</guid>
		<description><![CDATA[虽然官方提供了非常好的安装文件，但是有的时候不想每次再重装系统之后都要安装一遍MySQL，需要使用zip包版本的MySQL。在配置的时候有以下几个问题需要了解的，总结一下：
1. 设置MySQL为Windows服务
在Windows下用mysq... ]]></description>
			<content:encoded><![CDATA[<p>虽然官方提供了非常好的安装文件，但是有的时候不想每次再重装系统之后都要安装一遍MySQL，需要使用zip包版本的MySQL。在配置的时候有以下几个问题需要了解的，总结一下：</p>
<p><strong>1. 设置MySQL为Windows服务</strong></p>
<p>在Windows下用mysqld-nt.exe可以注册为服务，即用mysqld-nt –install mysql<br />
这会设置为mysqld-nt.exe为mysql服务，相关信息在命令行模式下查询mysqld-nt –verbose –help</p>
<p><strong>2. 启动服务时出现“错误1067”的解决方法</strong></p>
<p>参考手册中明确说明了这个问题：</p>
<blockquote><p>These messages often occur when the MySQL base or data directories are installed in different locations than the default locations (C:\Program Files\MySQL\MySQL Server 5.0 and C:\Program Files\MySQL\MySQL Server 5.0\data, respectively).</p></blockquote>
<p>上面的意思是在没有将MySQL安装到默认的目录下面的情况下启动Windows服务的时候就会出现上述提示，解决的办法就是指定MySQL跟目录以及数据库目录。在my.ini文件最后增加以下内容，然后将my.ini拷贝到windows目录下。</p>
<div>
<ol title="Double click to hide line number." ondblclick="linenumber(this)">
<li>[mysqld]</li>
<li># set basedir to your installation path</li>
<li>basedir=E:/mysql</li>
<li># set datadir to the location of your data directory</li>
<li>datadir=D:/MySQLdata</li>
</ol>
</div>
<p><strong>3. 初始帐号</strong></p>
<p>用户名root，密码为空，所以说默认情况下的MySQL5是不安全的。进入之后立即修改root帐号密码，命令如下：</p>
<div>
<ol title="Double click to hide line number." ondblclick="linenumber(this)">
<li><span>set</span><span> </span><span>password</span><span> </span><span>for</span><span> </span><span>root</span><span>@</span><span>localhost</span><span> =</span><span>password</span><span>(</span><span>&#8216;</span><span>yourPassword</span><span>&#8216;</span><span>)</span><span>; </span></li>
<li><span>flush</span><span> </span><span>privileges</span><span>;</span></li>
</ol>
</div>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/windows-zip-mysql-529/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>迟到的报道－ SQLServer2005 JDBC v1.1正式版发布</title>
		<link>http://javadou.com/sqlserver2005-jdbc-v1-1-528/</link>
		<comments>http://javadou.com/sqlserver2005-jdbc-v1-1-528/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[sql-server]]></category>

		<guid isPermaLink="false">http://javadou.com/%e8%bf%9f%e5%88%b0%e7%9a%84%e6%8a%a5%e9%81%93%ef%bc%8d-sqlserver2005-jdbc-v1-1%e6%ad%a3%e5%bc%8f%e7%89%88%e5%8f%91%e5%b8%83-528/</guid>
		<description><![CDATA[好久没有上SQL Server JDBC网站，原来早在8月29日就更新驱动了，现在是1.1的正式版。从其中一个开发者的博客上看到了更新的内容：
1. Integrated security 增强了安全连接，不过这个功能只支持 Windows 系统。我记得是需要... ]]></description>
			<content:encoded><![CDATA[<p>好久没有上SQL Server JDBC网站，原来早在8月29日就更新驱动了，现在是1.1的正式版。从其中一个开发者的博客上看到了更新的内容：</p>
<p>1. Integrated security 增强了安全连接，不过这个功能只支持 Windows 系统。我记得是需要拷贝一个dll文件</p>
<p>2. Client Failover, Database Mirroring support 支持 客户端失效倍援和数据库镜像功能<br />
数据镜像功能其实是SQL Server2005的一个新功能，现在的JDBC驱动也支持了。关于这个功能更多可参考：<a href="http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx" target="_blank">http://www.microsoft.com/technet/prodtechnol/sql/2005/dbmirror.mspx</a><br />
客户端失效倍援（不知道这个翻译是否准确）的描述是这样的：When connecting to a Sql Server 2005 Database that has a failover partner the JDBC v1.1 driver will cache failover information and retry to the failover partner on primary failure. Additionally you can use the new “failoverPartner” connection string keyword to handle initial connection failure scenarios.</p>
<p>3. 修复了以下上个版本里面的比较严重的bug（前面的数字是提交bug时候产生的序号，没有具体的含义）<br />
&lt;blockquote&gt; &lt;li&gt;426389 Calling Statement.execute no longer causes an SQLException with the</p>
<p>message “sp_cursoropen/sp_cursorprepare: The statement parameter can</p>
<p>only be a single select or a single stored procedure‿ for UPDATE</p>
<p>WHERE queries when the selectMethod=cursor connection property is set.&lt;/li&gt;</p>
<p>&lt;li&gt;436718 Calling PreparedStatement.execute no longer causes an SQLException</p>
<p>with the message “sp_cursoropen/sp_cursorprepare: The statement</p>
<p>parameter can only be a batch or a stored procedure with a single</p>
<p>select, without FOR BROWSE, COMPUTE BY, or variable assignments‿ for</p>
<p>INSERT INTO queries when the selectMethod=cursor connection property is set.&lt;/li&gt;<br />
&lt;li&gt;450639 The driver no longer throws an SQLException with the message “Server</p>
<p>failed to resume the transaction, desc: 4600000001.‿ when configuring</p>
<p>SQL Server 2005 as the JBoss JMS message store.&lt;/li&gt;<br />
&lt;li&gt;435796 Executing SQL WRITETEXT statements no longer throws an SQLException</p>
<p>with the message “No TDS_RET_STATUS was found for the stored procedure</p>
<p>output parameters.‿&lt;/li&gt;<br />
&lt;li&gt;424295 DatabaseMetaData.getMaxConnections no longer throws an SQLException with</p>
<p>the message “The configuration option ‘user connections’ does not exist,</p>
<p>or it may be an advanced option‿ for SQL Server 2005 servers.&lt;/li&gt;<br />
&lt;li&gt;433394 Calling Statement.executeBatch after setting a BLOB value no longer throws</p>
<p>an SQLException with the message “The conversion from BLOB to BINARY is unsupported.‿&lt;/li&gt;<br />
&lt;li&gt;435448 The driver no longer throws an SQLException with the message</p>
<p>“com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ‘-’‿</p>
<p>when sending a BigDecimal prepared statement parameter value to the server</p>
<p>with the 5.0 JRE.&lt;/li&gt;&lt;/blockquote&gt;<br />
参考资料：<br />
JDBC 2005 v1.1 is now available.</p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/sqlserver2005-jdbc-v1-1-528/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>怎样在SQL Server2005中删除数据库用户</title>
		<link>http://javadou.com/sql-server2005-delete-user-527/</link>
		<comments>http://javadou.com/sql-server2005-delete-user-527/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/%e6%80%8e%e6%a0%b7%e5%9c%a8sql-server2005%e4%b8%ad%e5%88%a0%e9%99%a4%e6%95%b0%e6%8d%ae%e5%ba%93%e7%94%a8%e6%88%b7-527/</guid>
		<description><![CDATA[以前在SQL Server2000中删除数据库用户很简单，只要直接删除或者使用Drop User命令就可以了，但是SQL Server2005中直接操作是不行的，这是因为在SQL Server 2005中架构是做为实体对待的。所以要删除该用户，需要先删除该用... ]]></description>
			<content:encoded><![CDATA[<p>以前在SQL Server2000中删除数据库用户很简单，只要直接删除或者使用Drop User命令就可以了，但是SQL Server2005中直接操作是不行的，这是因为在SQL Server 2005中架构是做为实体对待的。所以要删除该用户，需要先删除该用户所拥有的架构或更改此架构的所有者。否则会提示”数据库主体在该数据库中拥有架构，无法删除。</p>
<p>另外，每一个数据库用户对应于一个系统登陆帐号，并且每一个架构只能赋予一个用户。所以直接删除用户的架构是不可以的，可以这样：首先创建一个新的登陆名，然后将需要删除的架构赋予这个新用户。这样就可以删除之前的用户了。</p>
<p>参考资料：<br />
SQL 2005 应用手记<br />
<a href="http://silverfox.mynew.ws/blog/index.php?/archives/111-SQL-2005.html" target="_blank">http://silverfox.mynew.ws/blog/index.php?/archives/111-SQL-2005.html</a></p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/sql-server2005-delete-user-527/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MS SQL Server 中事务日志变大的处理</title>
		<link>http://javadou.com/ms-sql-server-log-deal-526/</link>
		<comments>http://javadou.com/ms-sql-server-log-deal-526/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/ms-sql-server-%e4%b8%ad%e4%ba%8b%e5%8a%a1%e6%97%a5%e5%bf%97%e5%8f%98%e5%a4%a7%e7%9a%84%e5%a4%84%e7%90%86-526/</guid>
		<description><![CDATA[在SQL Server中经常遇到事务日志变大的情况，除了将数据库设置为“自动收缩”外，还可以使用下面的SQL命令进行快速清除数据库中的事务日志，命令如下：


&8211; 第一步：清空日志 
DUMP TRANSACTION databasename WITH NO_LOG ... ]]></description>
			<content:encoded><![CDATA[<p>在SQL Server中经常遇到事务日志变大的情况，除了将数据库设置为“自动收缩”外，还可以使用下面的SQL命令进行快速清除数据库中的事务日志，命令如下：</p>
<div>
<ol title="Double click to hide line number." ondblclick="linenumber(this)">
<li><span>&#8211; 第一步：清空日志 </span></li>
<li><span>DUMP</span><span> </span><span>TRANSACTION</span><span> </span><span>databasename</span><span> </span><span>WITH</span><span> </span><span>NO_LOG</span><span> </span></li>
<li><span>&#8211; 第二步：截断事务日志 </span></li>
<li><span>BACKUP</span><span> </span><span>LOG</span><span> </span><span>databasename</span><span> </span><span>WITH</span><span> </span><span>NO_LOG</span><span> </span></li>
<li><span>&#8211; 第三步：收缩数据库 </span></li>
<li><span>DBCC</span><span> </span><span>SHRINKDATABASE</span><span>(</span><span>databasename</span><span>)</span></li>
</ol>
</div>
<p>需要说明几点：<br />
1. 上面的SQL命令需要按照顺序执行；<br />
2. 执行上面的命令通常比直接使用右键菜单中的“收缩”命令要快很多</p>
<p>参考资料：<br />
SQL SERVER 数据库日志已满，如何收缩数据库日志<br />
<a href="http://blog.csdn.net/faintbear/archive/2005/02/06/283316.aspx" target="_blank">http://blog.csdn.net/faintbear/archive/2005/02/06/283316.aspx</a><br />
如何收缩数据库日志<br />
<a href="http://www.cndiy8.com/data/web5701/20050228/20050228__3794589.html" target="_blank">http://www.cndiy8.com/data/web5701/20050228/20050228__3794589.html</a></p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/ms-sql-server-log-deal-526/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>微软官方发布SQLServer JDBC 1.1 CTP版本</title>
		<link>http://javadou.com/sqlserver-jdbc-1-1-ctp-524/</link>
		<comments>http://javadou.com/sqlserver-jdbc-1-1-ctp-524/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 00:50:48 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://javadou.com/%e5%be%ae%e8%bd%af%e5%ae%98%e6%96%b9%e5%8f%91%e5%b8%83sqlserver-jdbc-1-1-ctp%e7%89%88%e6%9c%ac-524/</guid>
		<description><![CDATA[经过漫长的6个月的等待，微软官方终于发布了SQL Server JDBC 1.1版本的驱动，不过该版本为CTP(Community Technology Preview) 社区预览版，主要修改了所有已知的bug。
这里引用SQL Server JDBC项目一名开发人员 Angel 的一段说明：
An... ]]></description>
			<content:encoded><![CDATA[<p>经过漫长的6个月的等待，微软官方终于发布了SQL Server JDBC 1.1版本的驱动，不过该版本为CTP(Community Technology Preview) 社区预览版，主要修改了所有已知的bug。<br />
这里引用SQL Server JDBC项目一名开发人员 Angel 的一段说明：</p>
<blockquote><p>Announcing the June 2006 Community Tech Preview of the JDBC 2005 driver:<br />
<a href="http://www.microsoft.com/downloads/details.aspx?familyid=f914793a-6fb4-475f-9537-b8fcb776befd&amp;displaylang=en" target="_blank">http://www.microsoft.com/downloads/details.aspx?familyid=f914793a-6fb… </a></p>
<p>This preview contains all the changes of CTP 1 including Integrated<br />
Security, it includes rollup fixes for all the QFEs we have shipped to date<br />
and we have addressed most customer issues filed through the product<br />
feedback center.</p>
<p>To round it off we have also added a brand new feature: Client Failover. As<br />
far as I know this is the first JDBC driver to take advantage of Sql Server<br />
2005 Database Mirroring. This feature has been fully documented for this<br />
CTP, we could really use feedback on both the functionality and the docs.</p>
<p>For a complete change list take a look at the release.txt file that ships<br />
with the package, for the first time we are providing comprehensive<br />
information on the work we have done since v1.0, let us know if this is<br />
helpful information.</p></blockquote>
<p>下载地址：<a href="http://msdn.microsoft.com/data/ref/jdbc/" target="_blank">http://msdn.microsoft.com/data/ref/jdbc/</a></p>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/sqlserver-jdbc-1-1-ctp-524/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery使用文档 jQuery 1.4.1 中文文档 CHM 版发布</title>
		<link>http://javadou.com/jquery-1-4-1-chm-512/</link>
		<comments>http://javadou.com/jquery-1-4-1-chm-512/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 08:45:06 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=512</guid>
		<description><![CDATA[新鲜出炉，更新了大量内容，应该还有一些BUG，欢迎纠错：
http://code.google.com/p/jquery-api-zh-cn/downloads/list
本来更早出来的，结果半路又杀出1.4.1，而且发现bind、live还有ajax等方法有大量更新，所以重新翻译这三个方法... ]]></description>
			<content:encoded><![CDATA[<p>新鲜出炉，更新了大量内容，应该还有一些BUG，欢迎纠错：</p>
<p><a href="http://code.google.com/p/jquery-api-zh-cn/downloads/list">http://code.google.com/p/jquery-api-zh-cn/downloads/list</a></p>
<p>本来更早出来的，结果半路又杀出1.4.1，而且发现bind、live还有ajax等方法有大量更新，所以重新翻译这三个方法，消耗了大把时间。所以今天才发出来。</p>
<p>还有个html版的<a rel="nofollow" href="http://jquery-api-zh-cn.googlecode.com/svn/trunk/index.html">http://jquery-api-zh-cn.googlecode.com/svn/trunk/index.html</a></p>
<p>似乎这个不怎么更新了 大家还是用chm的吧 也比较方便</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/jquery-1-4-1-chm-512/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>xfire学习webservice&#8211;基于xfire的web service搭建</title>
		<link>http://javadou.com/xfire-webservice-xfireweb-service-511/</link>
		<comments>http://javadou.com/xfire-webservice-xfireweb-service-511/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 07:11:53 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[webservice]]></category>
		<category><![CDATA[xfire]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=511</guid>
		<description><![CDATA[标题：基于xfire的web service搭建
出处：小强的家
时间：Sun, 12 Apr 2009 12:30:29 +0000
作者：xiaojiit
地址：www.sharejava.cn/blog/read.php/12.htm
内容：
这里，用的xfire1.2.6和Spring 2.0，开发工具用的MyEclispe，虽然MyEclipse自带了开发xfir... ]]></description>
			<content:encoded><![CDATA[<p>标题：基于xfire的web service搭建<br />
出处：小强的家<br />
时间：Sun, 12 Apr 2009 12:30:29 +0000<br />
作者：xiaojiit<br />
地址：www.sharejava.cn/blog/read.php/12.htm</p>
<p>内容：<br />
这里，用的xfire1.2.6和Spring 2.0，开发工具用的MyEclispe，虽然MyEclipse自带了开发xfire的插件，但为了不依赖开发工具，所以以下为手动创建。<br />
Xfire 可以很好的和Spring 集成，下面分两部分介绍<br />
纯Xfire 的web service<br />
1.1、先建一个web 项目，打开下载到的xfire包，将lib下的所有 Jar包和modules目录下的所有Jar包拷到web 项目的WEB-INF/lib目录下。<br />
1.2、修改web.xml文件，添加如下内容，以支持xfire：</p>
<p>&lt;servlet&gt;<br />
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;org.codehaus.xfire.transport.http.XFireConfigurableServlet<br />
&lt;/servlet-class&gt;<br />
&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</p>
<p>这样，便可以通过http://localhost:8080/projectName/services/ 路径来访问所有发布的web services了。<br />
1.3、在项目下的WEB-INF目录下建立META-INF/xfire/这个目录，在此目录下建立services.xml文件，这个文件用来添写我的要发布的web services。文件内容如下所示：</p>
<p>&lt;beans&gt;<br />
&lt;service  xmlns=&#8221;http://xfire.codehaus.org/config/1.0&#8243;&gt;<br />
&lt;name&gt;HelloService&lt;/name&gt;<br />
&lt;serviceClass&gt;com.services.HelloService&lt;/serviceClass&gt;  &lt;implementationClass&gt;com.services.HelloServiceImpl&lt;/implementationClass&gt;<br />
&lt;/service&gt;<br />
&lt;/beans&gt;<br />
文件的内容如下：<br />
：发布一个web service；<br />
：发布web service的名称；<br />
：提供服务的接口类；<br />
：实现服务接口类的具体类。</p>
<p>注：这里用的Spring 2.0，如果是用xfire 自带的Spring1.2.6，应该将  xmlns=&#8221;http://xfire.codehaus.org/config/1.0&#8243; 放到里去定义。<br />
1.4、下面，将这个web 项目，发布到tomcat下，便可以使用</p>
<p>http://localhost:8080/xfire/services/HelloService?wsdl</p>
<p>来调用这个web service了。<br />
于Spring 集成的Xfire 开发web services，这里用的是spring 2.0，如果是spring2.5，需要将spring-webmvc.jar添加进来。</p>
<p>下面说与Spring 集成的Xfire开发步骤<br />
Spring 与xfire 有三种结合方式，下面以直接与spring集成的方法说明。<br />
（通过Spring的org.springframework.web.servlet.DispatcherServlet）。<br />
2.1、将xfire与spring的JAR包放到web 项目的classPath<br />
2.2、修改web.xml，使其支持Spring 与xfire，添加如下内容：</p>
<p>&lt;context-param&gt;<br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&lt;param-value&gt;<br />
/WEB-INF/conf/applicationContext.xml<br />
classpath:org/codehaus/xfire/spring/xfire.xml<br />
&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;listener&gt;<br />
&lt;listener-class&gt;<br />
org.springframework.web.context.ContextLoaderListener<br />
&lt;/listener-class&gt;<br />
&lt;/listener&gt;<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;<br />
org.springframework.web.servlet.DispatcherServlet<br />
&lt;/servlet-class&gt;<br />
&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;xfire&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/service/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</p>
<p>2.3、根据web.xml的内容，创建Spring的配置文件：applicationContext.xml<br />
在本例中，将此文件放在WEB-INF/conf目录下。内容如下：</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221; &#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221;&gt;<br />
&lt;beans&gt;<br />
&lt;bean id=&#8221;helloBean&#8221; /&gt;<br />
&lt;/beans&gt;</p>
<p>这里，定义了一个bean,这里用的是web services接口的实现类。<br />
2.4、在WEB-INF下创建xfire-servlet.xml文件，这里的xfire是org.springframework.web.servlet.DispatcherServlet这个servlet的名称，应该根据自己的进行修改<br />
内容如下：</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221; &#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221;&gt;<br />
&lt;beans&gt;<br />
&lt;!&#8211; 在这写上这名，这样就可以用applicationContext.xml里定义的Bean &#8211;&gt;<br />
&lt;import resource=&#8221;classpath:org/codehaus/xfire/spring/xfire.xml&#8221; /&gt;</p>
<p>&lt;!&#8211; 这是定义URL映射 &#8211;&gt;<br />
&lt;bean&gt;<br />
&lt;property name=&#8221;urlMap&#8221;&gt;<br />
&lt;map&gt;<br />
&lt;!&#8211; 在这写每一个Web Service的URL映射 &#8211;&gt;<br />
&lt;entry key=&#8221;/HelloService&#8221;&gt; //URL，访问地址<br />
&lt;ref bean=&#8221;hello&#8221; /&gt;<br />
&lt;/entry&gt;<br />
&lt;/map&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;!&#8211; 定义一个基础Service,以下的Service引用它 &#8211;&gt;<br />
&lt;bean id=&#8221;baseWebService&#8221;</p>
<p>lazy-init=&#8221;false&#8221; abstract=&#8221;true&#8221;&gt;<br />
&lt;!&#8211; 引用xfire.xml中定义的工厂 &#8211;&gt;<br />
&lt;property name=&#8221;serviceFactory&#8221; ref=&#8221;xfire.serviceFactory&#8221; /&gt;<br />
&lt;!&#8211; 引用xfire.xml中的xfire实例 xfire是web.xml配置的DispatcherServlet的名称&#8211;&gt;<br />
&lt;property name=&#8221;xfire&#8221; ref=&#8221;xfire&#8221; /&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;!&#8211; 定义一个Hello　的WebService，这里的serviceClass是接口 &#8211;&gt;<br />
&lt;bean id=&#8221;hello&#8221; parent=&#8221;baseWebService&#8221;&gt;<br />
&lt;property name=&#8221;serviceBean&#8221;&gt;<br />
&lt;ref bean=&#8221;helloBean&#8221; /&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&#8221;serviceClass&#8221;&gt;<br />
&lt;value&gt;com.service.HelloService&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
&lt;/beans&gt;</p>
<p>这样便生成一个web Service，可以通过域名来访问，并编写客户端代码了。</p>
<p>另一种方式，使用xfire自带的org.codehaus.xfire.spring.XFireSpringServlet这个类进行设置。<br />
方法如下：<br />
修改web.xml，添加如下内容：</p>
<p>&lt;context-param&gt;<br />
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;<br />
&lt;listener&gt;<br />
&lt;listener-class&gt;<br />
org.springframework.web.context.ContextLoaderListener<br />
&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>&lt;!&#8211;XFire 配置  &#8211;&gt;<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;<br />
org.codehaus.xfire.spring.XFireSpringServlet<br />
&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/service/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</p>
<p>这样，便不必使用xfire-servlet.xml文件，直接在applicationContext.xml里添加Web Service的Bean就可以了。applicationContext.xml代码如下：</p>
<p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;<br />
&lt;!DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221; &#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221;&gt;<br />
&lt;beans&gt;</p>
<p>&lt;!&#8211; web service 配置 &#8211;&gt;<br />
&lt;import resource=&#8221;classpath:org/codehaus/xfire/spring/xfire.xml&#8221; /&gt;</p>
<p>&lt;bean id=&#8221;HelloServiceImpl&#8221;<br />
/&gt;</p>
<p>&lt;bean id=&#8221;HelloService&#8221;<br />
&gt;<br />
&lt;property name=&#8221;xfire&#8221; ref=&#8221;xfire&#8221; /&gt;<br />
&lt;property name=&#8221;serviceBean&#8221; ref=&#8221;HelloServiceImpl&#8221; /&gt;<br />
&lt;!&#8211; WebService的实现类bean &#8211;&gt;<br />
&lt;property name=&#8221;serviceClass&#8221;<br />
value=&#8221;com.service.service.HelloService&#8221; /&gt;<br />
&lt;/bean&gt;<br />
&lt;/beans&gt;</p>
<p>但个Web Service是没有任何安全性可言的，任何拿到WSDL的人都可以轻松地构造客户端程序访问我们的Web Service服务。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/xfire-webservice-xfireweb-service-511/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何使用xFire开发webService返回复杂对象List</title>
		<link>http://javadou.com/xfire-webservice-return-list-510/</link>
		<comments>http://javadou.com/xfire-webservice-return-list-510/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 07:10:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[webservice]]></category>
		<category><![CDATA[List]]></category>
		<category><![CDATA[xfire]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=510</guid>
		<description><![CDATA[XFire开发时，在返回数据类型时遇到了一些麻烦，查到这样一篇文单，非常不错，故收藏之。
翻译： zilong3927  原文地址： http://docs.codehaus.org/display/XFIRE/Mapping+collections
调用 Web Services 时，经常需要返回集合（ collectio... ]]></description>
			<content:encoded><![CDATA[<p>XFire开发时，在返回数据类型时遇到了一些麻烦，查到这样一篇文单，非常不错，故收藏之。</p>
<p>翻译： zilong3927  原文地址： http://docs.codehaus.org/display/XFIRE/Mapping+collections</p>
<p>调用 Web Services 时，经常需要返回集合（ collection ）作为结果，或者接受 collection 型的参数。 SOAP 本身就支持这一点。</p>
<p>但是这一机制的问题在于， java 语言的 collections 是无类型的（ untyped ） . 因此，如果要在 Java 1.4 当中支持 collections ， 就需要做一些额外的工作。</p>
<p>Java 5 &amp; 范型（ Generics ）</p>
<p>首先而且是推荐的做法是在 JDK5 当中使用范型（ generics ）。范型能够使你在代码当中为你的 collections 指定类型信息， 从而允许 xfire 自动地推导出 collection 类型，生成正确的 wsdl 等等。</p>
<p>下面示例了如何写这样的一个方法：</p>
<p>public    Collection &lt;   String   &gt;  getValuesForIds(Collection &lt;   Integer   &gt; );</p>
<p>Java 1.4 &amp; 集合（ Collections ）</p>
<p>有些情况下并不总能够使用范型（ generics ） . 例如，如果你的部署环境使用 JDK 1.4 ， 或者你想暴露一些遗留的服务，而同时又不打算修改任何代码也不打算进行移植。</p>
<p>对于这样的一些情况而言， 你需要生成一个 xml 映射文件，来指定方法和它们对应的集合类型（ collection types ） .</p>
<p>这个 xml 文件的名字必须是 &lt;className&gt;.aegis.xml ， 其中 className 是你的服务（ service ）的接口类（ unqualified class ）的名字。</p>
<p>下面最好通过一个例子来展示这个 xml 文件的格式。 我们想要展现的服务有这样的一个接口 :</p>
<p>public   interface  MyService1{<br />
String getFoo();<br />
Collection getCollection();<br />
void  setList(  int  id ， java.util.List);<br />
}</p>
<p>既然代码中的 collections 没有指定类型， 我们剧需要生成一个 xml 文件来指定所需要的类型。 这个文件的路径应该和 MyService1.class 在同一个包（ package ）当中， 并且它的名字应该是 MyService1.aegis.xml</p>
<p>对于这个接口来说，一个最简单的映射文件如下 :<br />
&lt; mappings &gt;<br />
&lt; mapping &gt;<br />
&lt; method  name = &#8220;getCollection&#8221;   &gt;<br />
&lt; return-type  componentType = &#8220;java.lang.String&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt; method  name = &#8220;setList&#8221;   &gt;<br />
&lt; parameter  index = &#8220;1&#8243;  componentType = &#8220;java.lang.String&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt;/ mapping &gt;<br />
&lt;/ mappings &gt;</p>
<p>注意这个映射文件确切地指定了所需要的信息，不包含任何冗余。 例如， getFoo 方法没有被指定，这是由于它没有包含任何 collections ，因此能够在没有任何映射信息的情况下暴露给使用者。</p>
<p>其次， setCollection 方法没有指定索引为 0 的参数。 这是由于该参数类型为 int ，因此不需要任何映射</p>
<p>如果我们有多个方法，都匹配指定的映射又该怎么办 ? 这种情况下， 映射就对所有匹配的方法均有效。</p>
<p>所以，如果在我们的接口中增加以下的方法：</p>
<p>void  setList( int id ，java.util.List， boolean persist);</p>
<p>那么现在我们的映射定义对于两个 setList 方法都有作用。这种情况下， 我们不必为额外的参数（译者注：此处指 boolean persist ）指定两次映射 . 映射文件就指定了所有那些第二个参数为 List 的方法，并假定 List 中包含的都是 strings 。</p>
<p>如果我们想让那个具有 3 个参数的方法，其中的 list 不包含 Strings ， 而是实际上包含 Dates? 这种情况下， 就需要一个更确切的映射来覆盖（ override ）原先那个更一般的， 所以我们的映射文件需要添加下面这个定义 :<br />
&lt; method  name =  &#8220;setList&#8221;    &gt;<br />
&lt; parameter  index = &#8220;1&#8243;  componentType = &#8220;java.lang.String&#8221;   /&gt;<br />
&lt; parameter  index = &#8220;2&#8243;  class = &#8220;boolean&#8221;   /&gt;<br />
&lt;/ method &gt;</p>
<p>注意一下类型属性。 现在这个映射将对所有那些第二个参数为 List ，第三个参数为 boolean 型的方法适用。 在我们的接口当中，这个映射唯一地确定了一个特定的方法，使用这个映射就能够解释方法当中的 List 参数。</p>
<p>在优先顺序方面， 更确切的映射总是优先于更一般的。</p>
<p>让我们考虑下面这个复杂一些的例子 :</p>
<p>public      interface    MyService2<br />
{<br />
Collection getCollection();  // method 1<br />
Collection getCollection(  int  id);  // method 2<br />
Collection getCollection( String id);  // method 3<br />
Collection getCollectionForValues(  int  value ， Collection c);  // method 4<br />
Collection getCollectionForValues( String id ， Collection c);  // method 5<br />
}</p>
<p>映射文件的内容为 :<br />
&lt; mappings &gt;<br />
&lt; mapping &gt;<br />
&lt;!&#8211;  mapping 1  &#8211;&gt;<br />
&lt; method  name = &#8220;getCollection&#8221;   &gt;<br />
&lt; return-type  componentType = &#8220;java.lang.Double&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt;!&#8211;  mapping 2  &#8211;&gt;<br />
&lt; method  name = &#8220;getCollection&#8221;   &gt;<br />
&lt; return-type  componentType = &#8220;java.lang.Float&#8221;   /&gt;<br />
&lt; parameter  index = &#8220;0&#8243;  class = &#8220;int&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt;!&#8211;  mapping 3  &#8211;&gt;<br />
&lt; method  name = &#8220;getCollectionForValues&#8221;   &gt;<br />
&lt; return-type  componentType = &#8220;java.math.BigDecimal&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt;!&#8211;  mapping 4  &#8211;&gt;<br />
&lt; method  name = &#8220;getCollectionForValues&#8221;   &gt;<br />
&lt; parameter  index = &#8220;0&#8243;  class = &#8220;java.lang.String&#8221;   /&gt;<br />
&lt; parameter  index = &#8220;1&#8243;  componentType = &#8220;java.util.Date&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt;!&#8211;  mapping 5  &#8211;&gt;<br />
&lt; method  name = &#8220;getCollectionForValues&#8221;   &gt;<br />
&lt; return-type  componentType = &#8220;java.util.Calendar&#8221;   /&gt;<br />
&lt; parameter  index = &#8220;0&#8243;  class = &#8220;int&#8221;   /&gt;<br />
&lt; parameter  index = &#8220;1&#8243;  componentType = &#8220;java.lang.Bit&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt;/ mapping &gt;<br />
&lt;/ mappings &gt;</p>
<p>这个文件的格式是不需要做过多解释的。但有几点还是需要加以说明。</p>
<p>先来看一下第一个映射 (mapping 1) 。 这个映射指定了所有 getCollection 方法所返回的 collections contain 均包含 java.lang.Doubles 。 如果没有指定其他的 getCollection 映射， 那么这个映射将对方法 1 ， 2 ， 3 都适用。</p>
<p>但是，第二个映射更加明确地指定了它所适用的方法。即如果 getCollection 方法的第一个参数是 int 型，那么该方法所返回的 collection 包含的是 Float 型。 由于这条规则更加明确，它将为方法 2 覆盖掉第一个映射，这是满足映射约束标准的。</p>
<p>使用以上的规则，不难推导出方法 4 和方法 5 返回的 collections 结果的组件类型（ component types ）。</p>
<p>Collections on Javabeans</p>
<p>对于使用 collections 的 java beans 来说，语法也是类似的。 例如，比方说我们有一个 Company bean ，包含了一个 List ， 其中的对象是 employees:</p>
<p>public   class  Company<br />
{<br />
private  Collection employees;<br />
Collection getEmployees() {  return  employees; }<br />
public   void  setEmployees(Collection employees) {  this  .employees  =  employees };<br />
}</p>
<p>除了可以使用 &lt;method&gt; &amp; &lt;parameter&gt; 元素外， 也可以使用 &lt;property&gt; 元素 :<br />
&lt; mappings &gt;<br />
&lt; mapping &gt;<br />
&lt; property  componentType = &#8220;org.codehaus.xfire.Employee&#8221;   /&gt;<br />
&lt;/ mapping &gt;<br />
&lt;/ mappings &gt;</p>
<p>Handling Maps</p>
<p>Java Maps 并不能很好地映射到 XML Schema (no pun intended) ，因为 XML Schema 中没有 Map 的概念，客户端也是这样， Maps 被转换成 {key ， value} 元组的集合。 除了要提供 value 的类型以外，你还必须为 Aegis 提供 key 的类型 :</p>
<p>public     class  GiftService {<br />
Map getGiftList() {  /*  returns a map of NiceChild =&gt; Present  */  }<br />
}</p>
<p>映射文件应该像下面这样 :<br />
&lt; mappings &gt;<br />
&lt; mapping &gt;<br />
&lt; method  name = &#8220;getGiftList&#8221;   &gt;<br />
&lt; return-type  keyType = &#8220;org.codehaus.xfire.NiceChild&#8221;  componentType = &#8220;org.codehaus.xfire.Present&#8221;   &gt;<br />
&lt;/ method &gt;<br />
&lt;/ mapping &gt;<br />
&lt;/ mappings &gt;</p>
<p>这将生成下面的类型 :<br />
&lt; xsd:complexType  name =  &#8220;NiceChild2PresentMap&#8221;    &gt;<br />
&lt; xsd:sequence &gt;<br />
&lt; xsd:element  name = &#8220;entry&#8221;  minOccurs = &#8220;0&#8243;  maxOccurs = &#8220;unbounded&#8221;   &gt;<br />
&lt; xsd:complexType &gt;<br />
&lt; xsd:sequence &gt;<br />
&lt; xsd:element  name = &#8220;key&#8221;  type = &#8220;ns1:NiceChild&#8221;  minOccurs = &#8220;0&#8243;  maxOccurs = &#8220;1&#8243;   /&gt;<br />
&lt; xsd:element  name = &#8220;value&#8221;  type = &#8220;ns1:Present&#8221;  minOccurs = &#8220;0&#8243;  maxOccurs = &#8220;1&#8243;   /&gt;<br />
&lt;/ xsd:sequence &gt;<br />
&lt;/ xsd:complexType &gt;<br />
&lt;/ xsd:element &gt;<br />
&lt;/ xsd:sequence &gt;<br />
&lt;/ xsd:complexType &gt;</p>
<p>Collections of Collections of Collections of&#8230;.</p>
<p>在某些情况下，你可能想要传递 Collections of Collections 。比方说你有一个返回 List of a List of Doubles 的服务 ( 不要问为什么你要做这样一件事情 &#8230;):</p>
<p>public   class  ListService<br />
{<br />
public  List getListOfListOfDoubles<br />
{<br />
List l  =   new  ArrayList();<br />
List doubles  =   new  ArrayList();<br />
doubles.add(  new  Double ( 1.0 ));<br />
l.add(doubles);<br />
return  l;<br />
}<br />
}</p>
<p>要处理这种情况，我们需要引进一个新的 &lt;component&gt; 元素。 下面是一个很好的例子 :<br />
&lt; mappings &gt;<br />
&lt; mapping &gt;<br />
&lt; method  name = &#8220;getListofListofDoubles&#8221;   &gt;<br />
&lt; return-type  componentType = &#8220;#someDoubles&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt; component  name = &#8220;someDoubles&#8221;  class = &#8220;java.util.List&#8221;  componentType = &#8220;java.lang.Double&#8221;   /&gt;<br />
&lt;/ mapping &gt;<br />
&lt;/ mappings &gt;</p>
<p>正像你在这里所看到的，返回类型的 componentType 是一个指向 &lt;component&gt; 的引用，而不是一个类。组件类型 &#8220;#someDoubles&#8221; 引用到名字为 &#8220;someDoubles&#8221; 的 &lt;component&gt; 。</p>
<p>Aegis 将会自动给这些 collections 命名为 ArrayOfDouble 和 ArrayOfArrayOfDouble 。 你也可以改变这些名字。 要设置你自己的名字， 提供一个 &#8220;typeName&#8221; 属性即可 :<br />
&lt; mappings &gt;<br />
&lt; mapping &gt;<br />
&lt; method  name = &#8220;getListofListofDoubles&#8221;   &gt;<br />
&lt; return-type  componentType = &#8220;#someDoubles&#8221;  typeName = &#8220;LotsOfDoubles&#8221;   /&gt;<br />
&lt;/ method &gt;<br />
&lt; component  name = &#8220;someDoubles&#8221;  class = &#8220;java.util.List&#8221;  typeName = &#8220;SomeDoubles&#8221;  componentType = &#8220;java.lang.Double&#8221;   /&gt;<br />
&lt;/ mapping &gt;<br />
&lt;/ mappings &gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/xfire-webservice-return-list-510/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>webservice-XFire开发一个简单的web服务</title>
		<link>http://javadou.com/webservice-xfire-develop-fires-demo-509/</link>
		<comments>http://javadou.com/webservice-xfire-develop-fires-demo-509/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 07:04:28 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[webservice]]></category>
		<category><![CDATA[xfire]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=509</guid>
		<description><![CDATA[ 在这一节，你将了解到如何将一个普通的 java 文件转换为一个 web 服务， services.xml 文件是如何定义的，如何发布这个 web 服务、如何获得这个服务的 WSDL 、如何创建 Client 代码、如何测试这个 web 服务。
首先打开 Ecl... ]]></description>
			<content:encoded><![CDATA[<p>在这一节，你将了解到如何将一个普通的 java 文件转换为一个 web 服务， services.xml 文件是如何定义的，如何发布这个 web 服务、如何获得这个服务的 WSDL 、如何创建 Client 代码、如何测试这个 web 服务。<br />
首先打开 Eclipse ，创建一个普通的 java 工程，将 xfire 所需的 jar 和 xfire 的 jar 加入到工程所需的类库引用中。创建一个简单的 java 文件，这个 java 文件简单到只提供一个 add 方法。</p>
<p>package com.kuaff.xfire.samples;<br />
public class MathService<br />
{<br />
public long add( int p1, int p2)<br />
{<br />
return p1 + p2;<br />
}<br />
}</p>
<p>在 src 目录下创建 META-INF/xfire 目录，然后在 META-INF/xfire 目录下创建 services.xml 文件，文件内容为：<br />
&lt;beans xmlns=&#8221;http://xfire.codehaus.org/config/1.0&#8243;&gt;<br />
&lt;service&gt;<br />
&lt;name&gt;MathService&lt;/name&gt;<br />
&lt;namespace&gt;http://www.kuaff.com/xfire/samples/MathService&lt;/namespace&gt;<br />
&lt;serviceClass&gt;com.kuaff.xfire.samples.MathService&lt;/serviceClass&gt;<br />
&lt;/service&gt;<br />
&lt;/beans&gt;<br />
这个文档定义了你要发布的 web 服务，这个定义了一个名为 MathService 的服务，服务类为 com.kuaff.xfire.samples.MathService 。<br />
这样我们的一个简单的 web 服务就开发完成了，下面就要把它发布出去。<br />
将工程 bin 目录下的所有的文件复制到第一节中配置的 tomcat/webapps/xfire/WEB-INF/classes 文件夹下，启动 tomcat ，你就可以检查这个 web 服务是否发布成功了。<br />
打开浏览器，在浏览器地址栏中输入 http://localhost:8080/xfire/services/ ，正常情况下应该浏览器应该显示类似下面的页面。</p>
<p>Available Services:</p>
<ul>
<li>MessageHistoryService <a href="http://msg.9666.cn//services/MessageHistoryService?wsdl">[wsdl]</a></li>
</ul>
<p>注意：请在浏览器中输入 <a href="http://localhost:8080/xfire/services/">http://localhost:8080/xfire/services/</a> 而不是 <a href="http://localhost:8080/xfire/services">http://localhost:8080/xfire/services</a> ，虽然两者显示的页面相同，但是点击页面上的链接，后者的链接会出错，因为后者后面少加了一个“ / ”。点击 [wsdl] 链接，可以查看这个 web 服务的 wsdl 文档。</p>
<p><a href="http://javadou.com/wordpress/wp-content/uploads/2010/02/r_xfire3.jpg"><img class="alignnone size-medium wp-image-508" title="r_xfire3" src="http://javadou.com/wordpress/wp-content/uploads/2010/02/r_xfire3-300x208.jpg" alt="" width="300" height="208" /></a></p>
<p>如果在你的机器上的显示如上面所示，则说明你的这个 web 服务发布成功，可以正常提供基于 http 的 web 服务。</p>
<p>下面一个问题就是如何开发一个 Client ，来消费（使用）这个 web 服务。</p>
<p>XFire 、 Axis 、 asp.net 以及其它的一些商业产品都提供了根据 wsdl 文档创建客户端代码的工具。这里采用 Xfire 提供的 wsgen 工具来创建客户端的访问代码。</p>
<p>Wsgen 是 xfire 提供的一个 ant task ， task 的申明如下：</p>
<p>&lt;taskdef name= &#8220;wsgen&#8221; classname= &#8220;org.codehaus.xfire.gen.WsGenTask&#8221; classpathref= &#8220;xfire 的 jar 路径 &#8221; /&gt;</p>
<p>这样，就可以在 build.xml 文件中使用这个 task ：</p>
<p>&lt;wsgen outputDirectory= &#8220;client&#8221; wsdl= &#8220;MathService.wsdl&#8221; package= &#8220;com.kuaff.xfire.samples&#8221; /&gt;</p>
<p>outputDirectory 属性定义创建的代码所在的文件夹， wsdl 是 web 服务的 wsdl 文件， package 代表创建的代码的 packege 。还可以通过 binding 属性制定 bind 类型： jaxb 或者是 xmlbeans ，</p>
<p>这样，就会在 client 文件夹下创建多个 java 文件，这些文件提供了访问 web 服务的方法。<br />
在这里声明一点，创建的代码大量的使用了 java 注释，这个 JSE5 中提供的新特性，所以你需要使用 JSE5 编译， Eclipse 也必须要 3.1 以上的版本。<br />
这段 ant 脚本将创建三个文件： MathServicePortType 、 MathServiceImpl 和 MathServiceClient 。 MathServicePortType 是这个 web 服务的客户端接口存根、 MathServiceImpl 实现了这个接口。 MathServiceClient 封装了访问这个 web 服务的方法。<br />
最后，你可以创建一个单元测试类，用来测试这个客户端类。这个类的内容如下：<br />
package com.kuaff.xfire.samples;<br />
import junit.framework.TestCase;<br />
public class MathServiceClientTest extends TestCase<br />
{<br />
public void testAdd()<br />
{<br />
MathServiceClient client = new MathServiceClient();<br />
MathServicePortType ms = client.getMathServiceHttpPort();<br />
long result = ms.add(10, 20);<br />
assertEquals (result, 30);<br />
}<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/webservice-xfire-develop-fires-demo-509/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XFire开发webservice服务和客户端全攻略</title>
		<link>http://javadou.com/xfire-webservice-service-client-507/</link>
		<comments>http://javadou.com/xfire-webservice-service-client-507/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 07:01:31 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[webservice]]></category>
		<category><![CDATA[xfire]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=507</guid>
		<description><![CDATA[XFire 是与Axis 2并列的新一代Web Service框架，通过提供简单的API支持Web Service各项标准协议，帮助你方便快速地开发Web Service应用。
相 对于Axis来说，目前XFire相对受欢迎，加上其提供了和Spring集成的支持，在目前的Web Se... ]]></description>
			<content:encoded><![CDATA[<p>XFire 是与Axis 2并列的新一代Web Service框架，通过提供简单的API支持Web Service各项标准协议，帮助你方便快速地开发Web Service应用。</p>
<p>相 对于Axis来说，目前XFire相对受欢迎，加上其提供了和Spring集成的支持，在目前的Web Service开源社区拥有众多的追随者。并且因为XFire为Spring提供的支持，使得我们可以很容易在Spring中使用XFire构建Web Service应用。</p>
<p>XFire 与Axis2相比具有如下特征：</p>
<p>l           支持一系列Web Service的新标准&#8211;JSR181、WSDL2.0 、JAXB2、WS-Security等；</p>
<p>l           使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现；</p>
<p>l           容易上手，可以方便快速地从pojo发布服务；</p>
<p>l           支持Spring、Pico、Plexus、Loom等容器；</p>
<p>l           灵活的Binding机制，包括默认的Aegis,xmlbeans,jaxb2,castor；</p>
<p>l           高性能的SOAP 栈设计；</p>
<p>l           支持Spring、Pico、Plexus、Loom等容器。</p>
<p>XFire 与Axis1性能的比较如下：</p>
<p>l           XFire 比Axis1.3快2-6倍；</p>
<p>l           XFire 的响应时间是Axis1.3的1/2到1/5。</p>
<p>XFire 在WebService框架中开始较晚，它从现有的框架中借鉴了许多优秀的理念，力争将Web Service的应用开发难度降到最低。此外，还提供了各种绑定技术、支持多种传输协议，对WebService体系中许多新的规范提供了支持。</p>
<p>下面让我们来看一个XFire于Spring集成的helloWorld的简单例子。</p>
<p><strong>一．实现的功能和特点 </strong></p>
<p>本例具有如下功能和特点：</p>
<p>1）  基于J2EE平台的Web Service服务；</p>
<p>2）  开发方便，配置简单；</p>
<p>3）  与spring无缝集成。</p>
<p>XFire 是完全基于流数据处理进行工作的系统，这意味着XFire不是将整个SOAP文档缓存在内存中，而是以管道的方式接收SOAP流数据。这种工作方式的转变带来了可观的性能回报，同时节省了内存的占用。</p>
<p>XFire 从 管道中接收一个SOAP请求到返回一个SOAP响应，会经历一系列的阶段。在管道调用的任何一个阶段，XFire都可以添加一些额外的Handler，在 对消息进行加工处理后再传入到下一个阶段中。在SOAP请求消息对Web Service发起真正调用之前，分别会经过传输、预转发、转发、策略实施、用户信息处理、预调用、服务调用等阶段。</p>
<p><strong>二．开发环境 </strong></p>
<p>笔者的开发环境描述如下：</p>
<p>1）  jdk: 1.5 版本；</p>
<p>2）  Tomcat ：5.5.20；</p>
<p>3）  MyEclipse: 5.1.1  GA 。</p>
<p><strong>三．开发步骤 </strong></p>
<p><strong>1. </strong> <strong>工程与环境的建立 </strong></p>
<p>在 MyEclipse中新建Web工程，名为webservice_helloworld。选择该工程后，点击右键选择MyEclipse-&gt;Add Web Service Capabilities，弹出Add Web Service Capabilities对话框，点击“Next”，弹出Project Library Configuration对话框，默认选择Core Libraries，点击“Finish”按钮，完成XFire核心包的添加。为了后续的客户端的测试，还需读者加入commons- httpclient.jar包到WEB-INF/lib下。</p>
<p>部署后可看到此时WEB-INF/lib的jar包列表如下：</p>
<p>activation-1.1.jar 、 commons-beanutils-1.7.0.jar、commons-codec-1.3.jar、commons- httpclient.jar、commons-logging-1.0.4.jar、jaxen-1.1-beta-9.jar、jaxws-api- 2.0.jar、jdom-1.0.jar、jsr173_api-1.0.jar、mail-1.4.jar、saaj-api-1.3.jar、 saaj-impl-1.3.jar、spring-1.2.6.jar、stax-api-1.0.1.jar、wsdl4j-1.5.2.jar、 wstx-asl-3.0.1.jar、xbean-2.1.0.jar、xbean-spring-2.5.jar、xfire-aegis- 1.2.2.jar、xfire-annotations-1.2.2.jar、xfire-core-1.2.2.jar、xfire- java5-1.2.2.jar、xfire-jaxws-1.2.2.jar、xfire-jsr181-api-1.0-M1.jar、xfire- spring-1.2.2.jar、XmlSchema-1.1.jar</p>
<p>为了后续的开发和测试，在src目录下分别建立test和webservice目录，分别用于存放测试文件和webservice的相关类。</p>
<p><strong>2 </strong> <strong>．Web Service实现的编写 </strong></p>
<p>在本例中，我们只是做一个helloWorld的简单例子。Web Service服务端提供一个根据输入的名字信息回复相应的helloWorld信息的。例如，当名字为“阿蜜果”时，恢复信息为“hello，阿蜜果”。下面让我们一步一步来开始进行编码。</p>
<p><strong>1） </strong> <strong>web.xml </strong> <strong>的配置 </strong></p>
<p>一 般情况下，我们通过HTTP作为Web Service的传输协议，这样我们只需启动一个Web服务器(如Tomcat，在本例中使用的是Tomcat5.5.20)，这样客户端就可以通过 HTTP访问到Web Service服务。为了集成Spring容器，XFire专门提供一个XFireSpringServlet，我们可以在web.xml中配置该 Servlet，将Spring容器中定义的Web Service在某个URI下发布。</p>
<p>为了能正确使用XFire，需在web.xml中进行相应配置，在该文件中配置XFire的 servlet 和 servlet-mapping 。同时因为本实例需要将 XFire 集成到 Spring 中，因而需要在 web.xml 文件中加载 Spring 的相应配置文件。在本实例中，我们首先在 WEB-INF 下建立两个配置 Spring 配置文件，一个为 applicationContext.xml ，该文件用来定义本工程的 bean ，一个为 xfire-servlet.xml ，用来配置 XFire 的相关 bean 。修改后的 web.xml 的内容如下所示：<br />
&lt;? xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br />
&lt; web-app  xmlns =&#8221;http://java.sun.com/xml/ns/j2ee&#8221;  xmlns:xsi =&#8221;http://www.w3.org/2001/XMLSchema-instance&#8221;  version =&#8221;2.4&#8243;  xsi:schemaLocation =&#8221;http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&#8221; &gt;<br />
&lt; display-name &gt; XFireService &lt;/ display-name &gt;<br />
&lt;!&#8211;  begin Spring配置  &#8211;&gt;<br />
&lt; context-param &gt;<br />
&lt; param-name &gt; contextConfigLocation &lt;/ param-name &gt;<br />
&lt; param-value &gt; /WEB-INF/applicationContext.xml,/WEB-INF/xfire-servlet.xml &lt;/ param-value &gt;<br />
&lt;/ context-param &gt;<br />
&lt; listener &gt;<br />
&lt; listener-class &gt;  org.springframework.web.context.ContextLoaderListener<br />
&lt;/ listener-class &gt;<br />
&lt;/ listener &gt;<br />
&lt; listener &gt;<br />
&lt; listener-class &gt;      org.springframework.web.util.IntrospectorCleanupListener<br />
&lt;/ listener-class &gt;<br />
&lt;/ listener &gt;<br />
&lt;!&#8211;  end Spring配置  &#8211;&gt;</p>
<p>&lt;!&#8211;  begin XFire 配置  &#8211;&gt;<br />
&lt; servlet &gt;<br />
&lt; servlet-name &gt; xfire &lt;/ servlet-name &gt;<br />
&lt; servlet-class &gt; org.springframework.web.servlet.DispatcherServlet &lt;/ servlet-class &gt;<br />
&lt;/ servlet &gt;<br />
&lt; servlet-mapping &gt;<br />
&lt; servlet-name &gt; xfire &lt;/ servlet-name &gt;<br />
&lt; url-pattern &gt; *.ws &lt;/ url-pattern &gt;<br />
&lt;/ servlet-mapping &gt;<br />
&lt; servlet &gt;<br />
&lt;!&#8211;  配合Spring容器中XFire一起工作的Servlet &#8211;&gt;<br />
&lt; servlet-name &gt; xfireServlet &lt;/ servlet-name &gt;<br />
&lt; servlet-class &gt; org.codehaus.xfire.spring.XFireSpringServlet &lt;/ servlet-class &gt;<br />
&lt;/ servlet &gt;<br />
&lt; servlet-mapping &gt;<br />
&lt; servlet-name &gt; xfireServlet &lt;/ servlet-name &gt;<br />
&lt;!&#8211;  在这个URI下开放Web Service服务  &#8211;&gt;<br />
&lt; url-pattern &gt; /service/* &lt;/ url-pattern &gt;<br />
&lt;/ servlet-mapping &gt;<br />
&lt;!&#8211;  end XFire 配置  &#8211;&gt;<br />
&lt;/ web-app &gt;</p>
<p><strong> 2） </strong> <strong>Web Service </strong> <strong>的接口类 </strong> <strong>HelloWorld.java </strong> <strong>和对应实现类 </strong> <strong>HelloWorldImpl.java </strong></p>
<p>为了用 Web Service 完成 HelloWorld 功能，我们首先在 src/webservice 目录下建立接口类 HelloWold.java 。它仅包含一个 sayHelloWorld(String name) 的方法，其详细内容如下：<br />
package  webservice;</p>
<p>/** */ /**<br />
*HelloWorld的接口类.<br />
*/<br />
public interface HelloWorld  {<br />
/** */ /**<br />
*对名字为name的人打招呼.<br />
*@paramname名字<br />
*@return返回打招呼的字符串<br />
*/<br />
String sayHelloWorld(String name);<br />
}<br />
我们还需要建立一个对应的实现类，来实现sayHelloWorld的功能，该实现类即为HelloWorldImpl.java。该类的详细内容如下：<br />
package  webservice;<br />
/** */ /**<br />
*HelloWorld的实现类.<br />
*/<br />
public class HelloWorldImpl  implements  HelloWorld  {<br />
public  String sayHelloWorld(String name)  {<br />
String helloWorld  =   &#8221; hello, &#8220;   +  name;<br />
return  helloWorld;<br />
}<br />
}</p>
<p>3） Spring 配置文件 applicationContext.xml 和 xfire-servlet.xml 的配置</p>
<p>首先我们在 applicationContext.xml 文件中配置对应的 bean —— HelloWorldBean ，该 xml 文件的内容如下：<br />
&lt;? xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br />
&lt;! DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221;<br />
&#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221; &gt;<br />
&lt; beans &gt;<br />
&lt; bean  id =&#8221;HelloWorldBean&#8221;  class =&#8221;webservice.HelloWorldImpl&#8221; /&gt;<br />
&lt;/ beans &gt;<br />
这个配置文件很简单，在此不详述。</p>
<p>XFire 为 Spring提供了方便易用的导出器XFireExporter，借助该导出器的支持，我们可以在Spring容器中将一个POJO导出为Web Service。HelloWorld是业务服务类，在此拥有一个sayHelloWorld的方法，我们希望将此方法开放为Web Service。在实际应用中，如果某个类具有众多的方法，而其中的某些方法不需要开放为Web Service的情况下，我们可以定义一个窄接口，该接口中只需定义那些开放为Web Service的业务方法。</p>
<p>将一个业务类所有需要开放为Web Service的方法通过一个窄接口来描述是值得推荐的作法，这让Web Service的接口显得很“干净”。其次，XFire的导出器也需要服务接口的支持，因为它采用基于接口的动态代理技术。</p>
<p>窄接口中的方法在真实的系统中可能需要引用其它的业务类或DAO获取数据库中的真实数据，为了简化实例，我们在此简化了实例。</p>
<p>下面让我们看看在xfire-servlet.xml文件中导出器的设置，该文件内容如下：<br />
&lt;? xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br />
&lt;! DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221;<br />
&#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221; &gt;<br />
&lt; beans &gt;<br />
&lt;!&#8211;  引入XFire预配置信息  &#8211;&gt;<br />
&lt; import  resource =&#8221;classpath:org/codehaus/xfire/spring/xfire.xml&#8221;   /&gt;<br />
&lt;! —定义访问的url&#8211; &gt;<br />
&lt; bean  class =&#8221;org.springframework.web.servlet.handler.SimpleUrlHandlerMapping&#8221; &gt;<br />
&lt; property  name =&#8221;urlMap&#8221; &gt;<br />
&lt; map &gt;<br />
&lt; entry  key =&#8221;/HelloWorldService.ws&#8221; &gt;<br />
&lt; ref  bean =&#8221;HelloWorldService&#8221;   /&gt;<br />
&lt;/ entry &gt;<br />
&lt;/ map &gt;<br />
&lt;/ property &gt;<br />
&lt;/ bean &gt;</p>
<p>&lt;!&#8211;  使用XFire导出器  &#8211;&gt;<br />
&lt; bean  id =&#8221;baseWebService&#8221;  class =&#8221;org.codehaus.xfire.spring.remoting.XFireExporter&#8221;  lazy-init =&#8221;false&#8221;  abstract =&#8221;true&#8221; &gt;<br />
&lt;!&#8211;  引用xfire.xml中定义的工厂  &#8211;&gt;<br />
&lt; property  name =&#8221;serviceFactory&#8221;  ref =&#8221;xfire.serviceFactory&#8221;   /&gt;<br />
&lt;!&#8211;  引用xfire.xml中的xfire实例  &#8211;&gt;<br />
&lt; property  name =&#8221;xfire&#8221;  ref =&#8221;xfire&#8221;   /&gt;<br />
&lt;/ bean &gt;<br />
&lt; bean  id =&#8221;HelloWorldService&#8221;  parent =&#8221;baseWebService&#8221; &gt;<br />
&lt;!&#8211;  业务服务bean  &#8211;&gt;<br />
&lt; property  name =&#8221;serviceBean&#8221;  ref =&#8221;HelloWorldBean&#8221;   /&gt;<br />
&lt;!&#8211;  业务服务bean的窄接口类  &#8211;&gt;<br />
&lt; property  name =&#8221;serviceClass&#8221;  value =&#8221;webservice.HelloWorld&#8221;   /&gt;<br />
&lt;/ bean &gt;<br />
&lt;/ beans &gt;</p>
<p>在上面的配置中，我们可以看到，在该配置文件中引入了xfire.xml这个Spring配置文件。它是在XFire核心JAR包中拥有一个预定义的 Spring配置文件，它定义了XFire在Spring中必须用到的一些Bean和资源，需要引入这个预定义的配置文件。从该配置文件中可以看出，我们通过XFireExporter将业务类导出为Web Service，对于任何导出器，我们都需要引入XFire环境，即serviceFactory 和 xfire ，这是标准的配置。 ServiceFactory 是XFire的核心类，它可以将一个POJO生成为一个Web Service。</p>
<p>在本实例中，我们通过定义一个baseWebService，其余的webService配置都将该bean作为父bean，这样可以简化Spring的配置，不需要多次引入serviceFactory和xfire。</p>
<p>3. Web Service 的测试</p>
<p>在上一步操作完成之后，我们的这个简单的 Web Service 已经编写完毕，下面让我们来看看自己的劳动成果吧。</p>
<p>在浏览器中输入地址： http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl ，我们可以看到 HelloWorldService 对应的 WSDL 信息， 阅读这个WSDL文档，我们可以知道HelloWorld的sayHelloWorld方法已经被成功地发布为Web Service了。只要拿到这个WSDL就可以开发相应的客户端调用程序了。</p>
<p>XFire 为访问服务端Web Service提供了各种方便的方式：我们一般根据服务地址和窄接口类创建客户调用程序。</p>
<p>在不能获得服务窄接口类的情况下，XFire允许我们通过WSDL文件生成客户端调用程序，通过指定服务接口的方式调用服务。</p>
<p>1） 通过WSDL文件生成客户端调用程序</p>
<p>首先我们通过 http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl 我们可以获得 WSDL 文件 HelloWorldService.wsdl ，并将其放在 src 目录下面，接着我们通过程序访问该 WSDL 文件，并调用需测试的方法。此时测试类 WebServiceClientTest.java 的内容如下所示：<br />
package  test;</p>
<p>import  org.codehaus.xfire.client.Client;<br />
import  org.springframework.core.io.ClassPathResource;<br />
import  org.springframework.core.io.Resource;<br />
import  webservice.HelloWorld;</p>
<p>/** */ /**<br />
*Copyright2007GuangZhouAmigo.<br />
*Allrightreserved.<br />
*HelloWorld的webservice的测试类.<br />
* @author &lt;a href=&#8221;mailto:xiexingxing1121@126.com&#8221;&gt;AmigoXie&lt;/a&gt;<br />
*@version1.0<br />
*Creationdate:2007-9-16-下午05:36:05<br />
*/<br />
public class WebServiceClientTest  {<br />
HelloWorld helloWorld  =   null ;</p>
<p>public static void main(String[] args)  throws  Exception  {<br />
WebServiceClientTest test  =   new  WebServiceClientTest();<br />
test.testClient();<br />
}</p>
<p>public void testClient()  throws  Exception  {<br />
String wsdl  =   &#8221; HelloWorldService.wsdl &#8221; ;  // 对应的WSDL文件<br />
Resource resource  =   new  ClassPathResource(wsdl);<br />
Client client  =   new  Client(resource.getInputStream(),  null );  // 根据WSDL创建客户实例</p>
<p>Object[] objArray  =   new  Object[ 1 ];<br />
objArray[ 0 ]  =   &#8221; 阿蜜果 &#8221; ;<br />
// 调用特定的Web Service方法<br />
Object[] results  =  client.invoke( &#8221; sayHelloWorld &#8221; , objArray);<br />
System.out.println( &#8221; result:  &#8220;   +  results[ 0 ]);<br />
}<br />
}</p>
<p>运行该类，可得到如下输出结果：</p>
<p>result: hello, 阿蜜果</p>
<p>可看出运行结果正确。</p>
<p>2 ）根据服务地址创建客户端调用程序</p>
<p>接着让我们来看一个根据服务地址创建客户端调用程序的例子。我们可以通过测试类来测试Web Service的正确性，下面让我们来看一个简单的测试类，首先我们在src/test目录建立 WebServiceClientTest.java 文件，并在 src 目录下建立客户端调用的 Spring 配置文件 client.xml 。在 client.xml 配置文件中我们定义了一个 testWebService 的 bean ，该 bean 访问 wsdlDocumentUrl 为 http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl 的 WSDL 。该 xml 文件的详细内容如下：<br />
&lt;? xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243; ?&gt;<br />
&lt;! DOCTYPE beans PUBLIC &#8220;-//SPRING//DTD BEAN//EN&#8221;<br />
&#8220;http://www.springframework.org/dtd/spring-beans.dtd&#8221; &gt;<br />
&lt; beans &gt;<br />
&lt; bean  id =&#8221;testWebService&#8221;  class =&#8221;org.codehaus.xfire.spring.remoting.XFireClientFactoryBean&#8221; &gt;<br />
&lt; property  name =&#8221;serviceClass&#8221; &gt;<br />
&lt; value &gt; webservice.HelloWorld &lt;/ value &gt;<br />
&lt;/ property &gt;<br />
&lt; property  name =&#8221;wsdlDocumentUrl&#8221; &gt;<br />
&lt; value &gt; http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl &lt;/ value &gt;<br />
&lt;/ property &gt;<br />
&lt;/ bean &gt;<br />
&lt;/ beans &gt;</p>
<p>在 WebServiceClientTest.java 文件中获得 HelloWorld ，并调用它的 sayHelloWorld 方法来完成测试，该类的详细内容如下所示：<br />
package  test;</p>
<p>import  org.springframework.context.ApplicationContext;<br />
import  org.springframework.context.support.ClassPathXmlApplicationContext;<br />
import  webservice.HelloWorld;</p>
<p>/** */ /**<br />
*HelloWorld的webservice的测试类.<br />
*/<br />
public class WebServiceClientTest  {<br />
HelloWorld helloWorld  =   null ;</p>
<p>public static void main(String[] args)  {<br />
WebServiceClientTest test  =   new  WebServiceClientTest();<br />
test.testClient();<br />
}</p>
<p>public void testClient()  {<br />
ApplicationContext ctx  =   new  ClassPathXmlApplicationContext(<br />
&#8221; client.xml &#8221; );<br />
helloWorld  =  (HelloWorld) ctx.getBean( &#8221; testWebService &#8221; );<br />
System.out.println(helloWorld.sayHelloWorld( &#8221; 阿蜜果 &#8221; ));<br />
}<br />
}</p>
<p>在启动 webservice_helloworld 工程的情况下，运行 WebServiceClientTest 类，可看到控制台包含如下信息：</p>
<p>hello, 阿蜜果</p>
<p>由此可看出调用 Web Service 成功。</p>
<p>四．总结</p>
<p>与 Axis相比，在实施Web Service时XFire更加简洁高效，并且XFire对Spring提供了强大的支持，可以非常方便地在Spring中使用XFire实施Web Service，因此XFire在短短的时间里成为了受Web Service开发者喜爱的框架。</p>
<p>XFire为客户端提供了多种访问Web Service的方式，如果可以获取客户端的窄接口类，则可以采用窄接口类调用Web Service。如果仅能获取WSDL，XFire也可以采用动态反射的机制调用Web Service。XFire为Eclipse提供了一个可以根据WSDL生成客户端存根代码的插件，相信XFire也将为其它非Java语言提供类似的插件。</p>
<p>技术可用性的一个很大的标准是它是否方便测试，XFire提供多种方式进行Web Service的测试，简单方便，给Web Service开发人员的测试工作带来了福音。</p>
<p>在本文中，笔者通过一个简单的helloWorld的Web Service例子，详细地说明了用XFire+Spring构建Web Service时配置文件的相关配置，以及测试的各种方法，也让读者见识了XFire与Spring的无缝集成，希望对读者学习XFire有点帮助。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/xfire-webservice-service-client-507/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebService完全实例详细解析</title>
		<link>http://javadou.com/webservice-xml-study-506/</link>
		<comments>http://javadou.com/webservice-xml-study-506/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 07:00:41 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=506</guid>
		<description><![CDATA[首先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面 有 函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们... ]]></description>
			<content:encoded><![CDATA[<p>首先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面 有 函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他 们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.</p>
<p>webservice传递的数据只能是序列化的数据,典型的就是xml数据,这里我们也只讨论xml数据的传输.</p>
<p>有了一些对xml webservice的初步了解后,我们将切入正题,即是用一个具体的webservice事例的形式来讲解具体的webservice用法,用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧.</p>
<p>这里,我们将以一个简单的分布式课件搜索系统为例来讲解.使用VS2003为编译环境,C#为语言,SqlServcer2000为数据库.(这个例子来 源于一位网上朋友的文章的启发,觉得很能代表webservice的特点,就按那个想法做了这么个系统来示例了)</p>
<p>首先,明确我们要做什么.我们需要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种形式都无所谓, 甚至它本身 并不需要数据库,它只是提供给用户一个查询的接口,真正的服务,普通用户是不接触到的.然后,这里我们还需要若干个提供服务的站点,我们可以称它们为资源 站,这里为简单起见,假设有两个资源站,分别叫WebSiteA,WebSiteB,它们可以是不对外公布的,只是为了丰富查询数据而存在.最后,是我们 最需要关注的东西&#8212;资源站提供给ServiceGatherSite的服务.两个资源站,就有两个服务,我们称为SiteAService和 SiteBService.两个服务间没有任何关系,内部提供的方法也完全没关联,只是需要把方法如何使用告诉ServiceGatherSite,意思 是,服务只提供查询接口,返回的数据如何处理,服务本身并不管,全由使用服务的站点分配.</p>
<p>写了这么多,算是简要的介绍了下有关xml webservice的概念和我们这个例子的结构,下篇文章,我们将开始真正进入代码的设计阶段.</p>
<p>上篇文章介绍了些webservice的基本特性和我们例子的结构,这篇文章我们将开始具体的代码编写工作.</p>
<p>这个专题主要讲述的是webservice,因此这里我们的代码以Webservice相关为主,而其他工程,例如:ServiceGatherSite,WebSiteA等,只将简略介绍.</p>
<p>在VS2003中,开发一个webservice并不是件困难的事,首先,我们新建一个webservice项目(文件-&gt;新建-&gt;项目-&gt;C#-&gt;Web服务应用程序)</p>
<p>建完这个工程,我们将看到一个叫Service1.asmx的文件,这就是webservice的标准文件,它也有UI的概念,不过我们一般不 关注,因 此,我们查看其cs代码文件.如果你什么都还没做的话,将看见一个被注释掉的helloworld的WebMethod,把注释去掉,在运行,你就可以得 到最简单的webservice运行实例了.点击&#8221;helloworld&#8221;将执行其方法.显然,这个函数对我们的意义只在于宏观的了解了下web服务的写 法.</p>
<p>下面,我们将开始具体介绍webservice的写法.在代码文件里,如果我们写了一个函数后,希望此函数成为外部可调用的接口函数,我们必须 在函数上面 添上一行代码[WebMethod(Description="函数的描述信息")],如果你的函数没有这个申明,它将不能被用户引用.如:</p>
<p>以下是引用片段：</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">[WebMethod(Description="最简单的方法")]public string HelloWorld()</p>
<p>{</p>
<p>return &#8220;Hello World&#8221;;</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>这个函数就是外部可调用的接口函数,对用户来说相当于一个API.如果某用户在引用了这个服务后,他调用HelloWorld()方法,他就将获得&#8221;HelloWorld&#8221;这个返回值.</p>
<p>看到这里,我们是不是发现,其实webservice并不是那么的神秘,它也不过只是个接口,对我们而言,侧重点依然是接口函数的编写.下面,我将给出我们的例子所需要的接口函数.</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">[WebMethod(Description="查询以获取需要的课件信息")]public XmlDataDocument GetSiteAData(string AssignName)</p>
<p>{</p>
<p>XmlDataDocument xd=new XmlDataDocument(); //</p>
<p>DataSet ds=new DataSet();</p>
<p>CStoreProc cp=new CStoreProc(&#8220;SearchAssign&#8221;);</p>
<p>cp.AddParIn(&#8220;@keywords&#8221;,SqlDbType.VarChar,30,AssignName);</p>
<p>cp.AddParOut(&#8220;@res&#8221;,SqlDbType.Int);</p>
<p>if(cp.SelectProc()) //如果执行成功,存储过程</p>
<p>{</p>
<p>cp.myData.EnforceConstraints=false; //不进行格式严格检查</p>
<p>if((int)cp.GetReturnValue(&#8220;@res&#8221;)==-1)</p>
<p>{</p>
<p>string xml=&#8221;";</p>
<p>xd.LoadXml(xml);</p>
<p>return xd;</p>
<p>}</p>
<p>xd=new XmlDataDocument(cp.myData);</p>
<p>XmlNode root1=xd.DocumentElement;</p>
<p>XmlNodeList roots=root1.SelectNodes(&#8220;list&#8221;);</p>
<p>foreach(XmlNode roota in roots) //为所有元素加上站点名称标记</p>
<p>{</p>
<p>XmlElement Link=xd.CreateElement(&#8220;SiteName&#8221;);</p>
<p>Link.InnerText=ConfigurationSettings.AppSettings["SiteName"].ToString();</p>
<p>roota.AppendChild(Link);</p>
<p>}</p>
<p>return xd;</p>
<p>}</p>
<p>else return null;</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>这是获取资源站点信息的一个接口函数.里面大部分的代码,我想对于有一定asp.net基础的朋友来说,都应该是一看就明白,这里只说明下CStoreProc,这是我封装的一个存储过程类,主要功能是执行各种类型的存储过程.</p>
<p>细心的朋友可能会发现这个函数的返回类型似乎比较特殊,是个xml的文档.我们在前面已经说过,webservice只能传输序列化数据,xml显 然满足 条件,但比如hash表之类的非序列化数据,是不能传输的,xml使用最为广泛,而且考虑到跨平台应用,所以这里我们只以xml数据的传输来示例.</p>
<p>接上篇文章,我们先简单解释下GetSiteAData(string AssignName)函数.</p>
<p>函数功能很简单,只是要返回查询结果,其数据格式是XmlDataDocument.当查询失败时(无匹配查询结果),我们构造一个xml,返 回一个空记 录.否则,我们把查询后的dataset生成一个XmlDataDocument,接下来,由于该项目的需要,我加入了一个循环,添加dataset里所 没有的节点,站点名称.在这之后,算是完成了一个符合我们期望格式的xml数据文档,我们把它返回.</p>
<p>好了,webservice的方法函数介绍完了(这里还有个web服务方法,稍后介绍),接下来我们的任务是怎么调用它了.首先把 webservice的 项目编译完成,假定我们这个服务是针对资源站点A的,我们不妨称其为ServiceA.先单独运行asmx文件,执行GetSiteAData (string AssignName)方法,将提示你输入参数,你输入要搜索的内容,点确认,将返回给你一个xml数据,并在ie上显示出来,这就是你搜索到的内容拉.</p>
<p>这里对ServiceA的工作再做点介绍,在我们这个项目里,它是资源站点A提供的服务,意思是,它查询的数据将全来源于站点A,而站点A资源添加在本项目也有专门的工程实现.</p>
<p>好了,回到正题.这里我介绍vs调用webservice的方法,其实其他平台的调用方法也是大同小异.首先我们介绍web引用方式,这种方式 我强烈建议 调试时使用,非常方便.右击引用,点添加web引用,输入你的webservice地址,如:http: //localhost/aspxproject/WebServiceSolution/SiteBService/service1.asmx,你必 须保证你输入的webservice存在.然后引用即可,注意:web引用名将作为你加入的webservice的名字空间.比如你输入了:SiteA, 那服务的实例化将是这样:SiteA.Service1 serviceA=new SiteA.Service1();(Service1是服务的类名).</p>
<p>完成了这一步,service的调用似乎变的那么简单,我们已经实现了远程实例化,接下来的远程调用也是一样的容易.下面给出资源采集站ServiceGatherSite的绑定代码(只采集A站点的信息)</p>
<p>以下是引用片段：</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">//绑定数据public void BindData()</p>
<p>{</p>
<p>serviceA=new SiteA.Service1();</p>
<p>DataSet ds=new DataSet();</p>
<p>XmlNode xmlNode1;</p>
<p>XmlDataDocument xd=new XmlDataDocument();</p>
<p>StringBuilder xmlString1;</p>
<p>xmlNode1=serviceA.GetSiteAData(strSearch);</p>
<p>if(xmlNode1==null) //&#8211;存储过程执行失败</p>
<p>return;</p>
<p>xmlString1=new StringBuilder(xmlNode1.OuterXml);</p>
<p>if(xmlString1.ToString().Equals(&#8220;&#8221;))</p>
<p>return ;</p>
<p>xd.LoadXml(xmlString1.ToString());</p>
<p>ds.ReadXml(new XmlNodeReader(xd));</p>
<p>DataGrid1.DataSource=ds.Tables["list"].DefaultView;</p>
<p>DataGrid1.DataBind();</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>此段代码给出了xml转化成dataset的解决方案,虽然这不是必须的,但毕竟在asp.net里,dataset占的作用之重,谁都知道的.其 他的请 朋友们先看(呵呵,个中高手就免了),在下篇文章中将会有对它的一些解释与及多服务分布调用的解决方案,写了三篇了,发现似乎还是有些朋友看的,那我就献 丑继续写下去好了,大家有什么意见也希望提出,在下的理解存在偏驳也再所难免,希望谅解:)</p>
<p>接上篇文章,我们先简单说明下绑定函数.首先实例化ServiceA,这个和一般类的实例化并没有不同..接下来用xmlNode1来接受函数的返回值,接下来是构造xml,并将其转化为dataset,这是通用的方法,如果是刚接触不久的朋友,最好能记下这种方法.</p>
<p>接下来给出异步调用两个服务的代码</p>
<p>以下是引用片段：</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#f3f3f3">//绑定数据public void BindData()</p>
<p>{</p>
<p>IAsyncResult ar1;</p>
<p>IAsyncResult ar2;</p>
<p>serviceA=new SiteA.Service1();</p>
<p>serviceB=new SiteB.Service1();</p>
<p>DataSet ds=new DataSet();</p>
<p>XmlNode xmlNode1,xmlNode2;</p>
<p>XmlDataDocument xd=new XmlDataDocument();</p>
<p>StringBuilder xmlString1,xmlString2;</p>
<p>//&#8211;简单的异步调用</p>
<p>ar1=serviceA.BeginGetSiteAData(strSearch,null,null);</p>
<p>ar2=serviceB.BeginGetSiteAData(strSearch,null,null);</p>
<p>xmlNode1=serviceA.EndGetSiteAData(ar1);</p>
<p>xmlNode2=serviceB.EndGetSiteAData(ar2);</p>
<p>//&#8212;&#8212;&#8212;-</p>
<p>if(xmlNode1==null&amp;&amp;xmlNode2==null) //&#8211;存储过程执行失败</p>
<p>return;</p>
<p>xmlString1=new StringBuilder(xmlNode1.OuterXml);</p>
<p>xmlString2=new StringBuilder(xmlNode2.OuterXml);</p>
<p>xmlString1=MakeNewXmlString(xmlString1,xmlString2); //生成新的xml</p>
<p>if(xmlString1.ToString().Equals(&#8220;&#8221;))</p>
<p>return ;</p>
<p>xd.LoadXml(xmlString1.ToString());</p>
<p>ds.ReadXml(new XmlNodeReader(xd));</p>
<p>DataGrid1.DataSource=ds.Tables["list"].DefaultView;</p>
<p>DataGrid1.DataBind();</p>
<p>}</p>
<p>//生成新XML</p>
<p>public StringBuilder MakeNewXmlString(StringBuilder str1,StringBuilder str2)</p>
<p>{</p>
<p>str1=str1.Replace(&#8220;&#8221;,&#8221;");</p>
<p>str2=str2.Replace(&#8220;&#8221;,&#8221;");</p>
<p>str1.Append(str2.ToString());</p>
<p>return str1;</p>
<p>}</td>
</tr>
</tbody>
</table>
<p>这有两个需要注意的地方,一个是xml构造,还有就是异步调用的实现,请读者,自己理解</p>
<p>下面讲下通过dll来引用webservice的方法,我只把流程介绍下.</p>
<p>首先,在ie输入服务的地址,如:http://www.xxx.com/service.asmx</p>
<p>然后写输入http://www.xxx.com/service.asmx?wsdl</p>
<p>打开后,另存为xxx.wsdl</p>
<p>然后用vs的命令提示符来编译:wsdl /namespace:SiteA ServiceA.wsdl</p>
<p>生成名字空间为sitea的代理类</p>
<p>最后csc /out:ServiceA.dll /t:library Service1.cs ,其中service1.cs为代理类文件</p>
<p>最后引用dll就可以了.</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/webservice-xml-study-506/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简单介绍webservice和soap小原理</title>
		<link>http://javadou.com/start-webservice-and-soap-505/</link>
		<comments>http://javadou.com/start-webservice-and-soap-505/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 06:58:20 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=505</guid>
		<description><![CDATA[从表面上看，Web service 就是一个应用程序，它向外界暴露出一个能够通过Web进行调用的API。也就是说，可以利用编程的方法通过Web来调用这个应用程序。
对Web service 更精确的解释: Web services是建立可互操作的分布式... ]]></description>
			<content:encoded><![CDATA[<p>从表面上看，Web service 就是一个应用程序，它向外界暴露出一个能够通过Web进行调用的API。也就是说，可以利用编程的方法通过Web来调用这个应用程序。</p>
<p>对Web service 更精确的解释: Web services是建立可互操作的分布式应用程序的新平台。Web service平台是一套标准，它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言，在任何你喜欢的平台上写Web service ，只要我们可以通过Web service标准对这些服务进行查询和访问。</p>
<p>不管你的Web service是用什么工具，什么语言写出来的，只要你用SOAP协议通过HTTP来调用它，总体结构都一致。通常，你用你自己喜欢的语言(如VB 6或者VB.NET)来构建你的Web service，然后用SOAP Toolkit或者.NET的内建支持来把它暴露给Web客户。于是，任何语言，任何平台上的客户都可以阅读其WSDL文档，以调用这个Web service。客户根据WSDL描述文档，会生成一个SOAP请求消息。Web service都是放在Web服务器 (如IIS) 后面的，客户生成的SOAP请求会被嵌入在一个HTTP POST请求中，发送到Web服务器来。Web服务器再把这些请求转发给Web service请求处理器。请求处理器的作用在于，解析收到的SOAP请求，调用Web service，然后再生成相应的SOAP应答。Web服务器得到SOAP应答后，会再通过HTTP应答的方式把它送回到客户端。 bbs.bitsCN.com中国网管论坛</p>
<p>基本概念</p>
<p>SOAP</p>
<p>XML和XSD</p>
<p>WSDL(Web Services Description Language)</p>
<p>WSML(Web Services Meta Language)</p>
<p>什么时候使用Web Services</p>
<p>Web service是创建可互操作的分布式应用程序的新平台。Web service 的主要目标是跨平台的可互操作性。为了达到这一目标，Web service 是完全基于XML、XSD等独立于平台、独立于软件供应商的标准的。</p>
<p>Web service在应用程序跨平台和跨网络进行通信的时候是非常有用的。Web service适用于应用程序集成、B2B集成、代码和数据重用，以及通过Web进行客户端和服务器的通信的场合。</p>
<p>当然，Web service也不是万能的，你不能到处滥用Web service。在有些情况下，Web service 会降低应用程序的性能，而不会带来任何好处。例如，一台机器或一个局域网里面运行的同构应用程序就不应该用Web service 进行通信。</p>
<p>如何调用Web Services</p>
<p>客户端:取得服务端的服务描述文件WSDL，解析该文件的内容，了解服务端的服务信息，以及调用方式。根据需要，生成恰当的SOAP请求消息(指定调用的方法，已经调用的参数)，发往服务端。等待服务端返回的SOAP回应消息，解析得到返回值。<br />
服务端:生成服务描述文件，以供客户端获取。接收客户端发来的SOAP请求消息，解析其中的方法调用和参数格式。根据WSDL和WSML的描述，调用相应的COM对象来完成指定功能，并把返回值放入SOAP回应消息返回给用户。</p>
<p>高层接口</p>
<p>使用高层接口，不需要知道SOAP和XML的任何信息，就可以生成和使用一个WebService。Soap Toolkit 2.0通过提供两个COM对象――SoapClient和SoapServer，来完成这些功能。</p>
<p>在客户端，只需要生成一个SoapClient实例，并用WSDL作为参数来调用其中的mssoapinit方法。SoapClient对象会自动解析 WSDL文件，并在内部生成所有Web Service的方法和参数信息。之后，你就可以像调用IDispatch接口里的方法一样，调用里面所有的方法。在VB或是脚本语言里，你甚至可以直接 在SoapClient对象名后面直接加上.方法(参数…)进行调用。</p>
<p>低层接口</p>
<p>要使用低层接口，你必须对SOAP和XML有所了解。你可以对SOAP的处理过程进行控制，特别是要做特殊处理的时候。</p>
<p>在客户端，首先要创建一个HttpConnector对象，负责HTTP连接。设定Connector的一些头部信息，比如EndPoinURL和 SoapAction等。如果网络连接需要使用代理服务器，那也要在这里设定相关的信息。接着创建SoapSerializer对象，用于生成Soap消 息。按照WSDL里定义，把所有参数按顺序序列化，得到一个完整的SOAP请求消息。该Soap消息，作为Payload通过HttpConnector 被发送到服务端。最后，生成一个SoapReader对象，负责读取服务端返回的SOAP消息，取得其中的返回值。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/start-webservice-and-soap-505/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>你所不知道的提高spring+hibernate性能的一个方法</title>
		<link>http://javadou.com/spring-hibernate-autocommit-xing-neng-504/</link>
		<comments>http://javadou.com/spring-hibernate-autocommit-xing-neng-504/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 09:13:56 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[autocommit]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=504</guid>
		<description><![CDATA[在spring + hibernate的应用中，你监控mysql日志，你会发现大量的log如下：
1. 158268 Query       SET autocommit=1
2. 158268 Query       SET autocommit=1
3. 158268 Query       SET autocommit=1
4. 158268 Query       SET autocommit=0
5. 158268 Q... ]]></description>
			<content:encoded><![CDATA[<p>在spring + hibernate的应用中，你监控mysql日志，你会发现大量的log如下：</p>
<p>1. 158268 Query       SET autocommit=1<br />
2. 158268 Query       SET autocommit=1<br />
3. 158268 Query       SET autocommit=1<br />
4. 158268 Query       SET autocommit=0<br />
5. 158268 Query       commit<br />
6. 158268 Query       SET autocommit=1<br />
7. 158268 Query       SET autocommit=1<br />
8. 158268 Query       SET autocommit=1<br />
9. 158268 Query       SET autocommit=0<br />
10. 158268 Query       commit</p>
<p>158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=0<br />
158268 Query       commit<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=1<br />
158268 Query       SET autocommit=0<br />
158268 Query       commit</p>
<p>另外，你如果看mysqlreport，你会发现set_option和commt几乎占了mysql query的一半！！</p>
<p>原因是？</p>
<p>我们先看第一个问题：</p>
<p>1. 158268 Query       SET autocommit=0<br />
2. 158268 Query       commit</p>
<p>158268 Query       SET autocommit=0<br />
158268 Query       commit</p>
<p>这种日志产生的原因是hibernate查询时，如果所请求的对象在cache中，那么hibernate仍然会向数据库发出这样的两个sql语句。</p>
<p>再来看第二个问题</p>
<p>1. 158268 Query       SET autocommit=1</p>
<p>158268 Query       SET autocommit=1</p>
<p>这是因为当connection 被放回conn pool时，conn pool会恢复此连接取出时的autocommit状态。一般连接池里面的autocommit状态为true，所以每个查询都会紧跟着一个set autocommit＝1。</p>
<p>对第一个问题我们的解决方案：</p>
<p>那就是利用LazyConnectionDataSourceProxy</p>
<p>这个conn 代理的作用就是，只有当确实有必要时，他它向DB发出查询。一切没有必要的set autocommit=0 commit语句都不会发向数据库。</p>
<p>此class的详细作用请参见spring 文档</p>
<p>example配置如下:</p>
<p>1. &lt;bean id=&#8221;dataSourceTarget&#8221; destroy-method=&#8221;close&#8221;&gt;<br />
2.   &lt;property name=&#8221;driverClass&#8221;&gt;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;&lt;/property&gt;<br />
3.   &lt;property name=&#8221;jdbcUrl&#8221;&gt;&lt;value&gt;jdbc:mysql<br />
4. ://localhost:3306/imagedb&lt;/value&gt;&lt;/property&gt;<br />
5.   &lt;property name=&#8221;user&#8221;&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/property&gt;<br />
6.   &lt;property name=&#8221;password&#8221;&gt;&lt;value&gt;&lt;/value&gt;&lt;/property&gt;<br />
7.<br />
8.  &lt;property name=&#8221;initialPoolSize&#8221; value=&#8221;60&#8243; /&gt;<br />
9.         &lt;property name=&#8221;minPoolSize&#8221; value=&#8221;50&#8243; /&gt;<br />
10.         &lt;property name=&#8221;maxPoolSize&#8221; value=&#8221;80&#8243; /&gt;<br />
11.         &lt;property name=&#8221;maxIdleTime&#8221; value=&#8221;7200&#8243; /&gt;<br />
12.<br />
13.         &lt;property name=&#8221;idleConnectionTestPeriod&#8221; value=&#8221;360&#8243; /&gt;<br />
14.         &lt;property name=&#8221;preferredTestQuery&#8221; value=&#8221;select 1&#8243; /&gt;<br />
15.         &lt;property name=&#8221;acquireIncrement&#8221; value=&#8221;5&#8243; /&gt;<br />
16.         &lt;property name=&#8221;acquireRetryAttempts&#8221; value=&#8221;50&#8243; /&gt;<br />
17.         &lt;property name=&#8221;acquireRetryDelay&#8221; value=&#8221;1000&#8243; /&gt;<br />
18.         &lt;property name=&#8221;breakAfterAcquireFailure&#8221; value=&#8221;true&#8221; /&gt;<br />
19.<br />
20.         &lt;!&#8211;property name=&#8221;checkoutTimeout&#8221; value=&#8221;1000&#8243; /&#8211;&gt;<br />
21.<br />
22.         &lt;property name=&#8221;autoCommitOnClose&#8221; value=&#8221;false&#8221; /&gt;<br />
23.         &lt;property name=&#8221;forceIgnoreUnresolvedTransactions&#8221; value=&#8221;false&#8221; /&gt;<br />
24.         &lt;property name=&#8221;unreturnedConnectionTimeout&#8221; value=&#8221;1000&#8243; /&gt;<br />
25.<br />
26.         &lt;property name=&#8221;maxStatements&#8221; value=&#8221;0&#8243; /&gt;<br />
27.         &lt;property name=&#8221;maxStatementsPerConnection&#8221; value=&#8221;0&#8243; /&gt;<br />
28.<br />
29.         &lt;property name=&#8221;testConnectionOnCheckin&#8221; value=&#8221;true&#8221; /&gt;<br />
30.         &lt;property name=&#8221;testConnectionOnCheckout&#8221; value=&#8221;false&#8221; /&gt;<br />
31.         &lt;property name=&#8221;usesTraditionalReflectiveProxies&#8221; value=&#8221;false&#8221; /&gt;<br />
32.<br />
33.         &lt;property name=&#8221;numHelperThreads&#8221; value=&#8221;5&#8243; /&gt;<br />
34. &lt;/bean&gt;<br />
35.<br />
36. &lt;bean id=&#8221;dataSource&#8221;&gt;<br />
37.   &lt;property name=&#8221;targetDataSource&#8221;&gt;&lt;ref local=&#8221;dataSource&#8221;/&gt;&lt;/property&gt;<br />
38. &lt;/bean&gt;</p>
<p>&lt;bean id=&#8221;dataSourceTarget&#8221; destroy-method=&#8221;close&#8221;&gt;<br />
&lt;property name=&#8221;driverClass&#8221;&gt;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;jdbcUrl&#8221;&gt;&lt;value&gt;jdbc:mysql<br />
://localhost:3306/imagedb&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;user&#8221;&gt;&lt;value&gt;admin&lt;/value&gt;&lt;/property&gt;<br />
&lt;property name=&#8221;password&#8221;&gt;&lt;value&gt;&lt;/value&gt;&lt;/property&gt;</p>
<p>&lt;property name=&#8221;initialPoolSize&#8221; value=&#8221;60&#8243; /&gt;<br />
&lt;property name=&#8221;minPoolSize&#8221; value=&#8221;50&#8243; /&gt;<br />
&lt;property name=&#8221;maxPoolSize&#8221; value=&#8221;80&#8243; /&gt;<br />
&lt;property name=&#8221;maxIdleTime&#8221; value=&#8221;7200&#8243; /&gt;</p>
<p>&lt;property name=&#8221;idleConnectionTestPeriod&#8221; value=&#8221;360&#8243; /&gt;<br />
&lt;property name=&#8221;preferredTestQuery&#8221; value=&#8221;select 1&#8243; /&gt;<br />
&lt;property name=&#8221;acquireIncrement&#8221; value=&#8221;5&#8243; /&gt;<br />
&lt;property name=&#8221;acquireRetryAttempts&#8221; value=&#8221;50&#8243; /&gt;<br />
&lt;property name=&#8221;acquireRetryDelay&#8221; value=&#8221;1000&#8243; /&gt;<br />
&lt;property name=&#8221;breakAfterAcquireFailure&#8221; value=&#8221;true&#8221; /&gt;</p>
<p>&lt;!&#8211;property name=&#8221;checkoutTimeout&#8221; value=&#8221;1000&#8243; /&#8211;&gt;</p>
<p>&lt;property name=&#8221;autoCommitOnClose&#8221; value=&#8221;false&#8221; /&gt;<br />
&lt;property name=&#8221;forceIgnoreUnresolvedTransactions&#8221; value=&#8221;false&#8221; /&gt;<br />
&lt;property name=&#8221;unreturnedConnectionTimeout&#8221; value=&#8221;1000&#8243; /&gt;</p>
<p>&lt;property name=&#8221;maxStatements&#8221; value=&#8221;0&#8243; /&gt;<br />
&lt;property name=&#8221;maxStatementsPerConnection&#8221; value=&#8221;0&#8243; /&gt;</p>
<p>&lt;property name=&#8221;testConnectionOnCheckin&#8221; value=&#8221;true&#8221; /&gt;<br />
&lt;property name=&#8221;testConnectionOnCheckout&#8221; value=&#8221;false&#8221; /&gt;<br />
&lt;property name=&#8221;usesTraditionalReflectiveProxies&#8221; value=&#8221;false&#8221; /&gt;</p>
<p>&lt;property name=&#8221;numHelperThreads&#8221; value=&#8221;5&#8243; /&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;bean id=&#8221;dataSource&#8221;&gt;<br />
&lt;property name=&#8221;targetDataSource&#8221;&gt;&lt;ref local=&#8221;dataSource&#8221;/&gt;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>第二个问题的解决方案：</p>
<p>通过conn pool 的jdbc url把autocommit设为false来解决，不过mysql driver好像不支持这个设置。</p>
<p>另外，如果你使用的是mysql，那么第一个问题还有一个更简单的解决方案，那就是在jdbcUrl中加入</p>
<p>useLocalSessionState=true</p>
<p>这可以达到和</p>
<p>1. LazyConnectionDataSourceProxy</p>
<p>LazyConnectionDataSourceProxy</p>
<p>一样的效果</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/spring-hibernate-autocommit-xing-neng-504/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES 异常处理</title>
		<link>http://javadou.com/java-security-nosuchalgorithmexception-cannot-find-any-provider-supporting-des-503/</link>
		<comments>http://javadou.com/java-security-nosuchalgorithmexception-cannot-find-any-provider-supporting-des-503/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 08:17:20 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Java基础]]></category>
		<category><![CDATA[异常]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=503</guid>
		<description><![CDATA[当我们使用DES等加密算法时，如下：
Security.addProvider(new com.sun.crypto.provider.SunJCE());
 //获得密钥
 Key generateKey = new KeyTools().getKey(key.getBytes());
 Cipher encryptCipher = Cipher.getInstance("DES");
将用到该算法类对应的工程在Ecl... ]]></description>
			<content:encoded><![CDATA[<p>当我们使用DES等加密算法时，如下：</p>
<pre class="java">Security.addProvider(new com.sun.crypto.provider.SunJCE());
 <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />//获得密钥
 <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />Key generateKey = new KeyTools().getKey(key.getBytes());
 <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />Cipher encryptCipher = Cipher.getInstance("DES");</pre>
<p>将用到该算法类对应的工程在Eclipse中发布为web工程，通过Eclipse启动Tomcat服务，可能会遇到这样的异常信息：<br />
java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES</p>
<p>网上的解决方案说什么sunjce_provider.jar路径问题啊，什么需要换成IBM的JDK之类的。。。。。<br />
除了没换JDK，其他的方法都试过，但是没一个起作用的。到底有没有更好的解决方案？</p>
<p>其实很简单，将编译好的工程部署好，直接启动Tomcat而不是通过Eclipse的Tomcat插件启动，那么将不会出现这样的异常信息。</p>
<p>原因剖析：<br />
对Eclipse的jar包，它隐掉了SUN公司关于某些Jar包的签名信息，这样当你在Eclipse中启动服务的话，就可能导致上述的异常。</p>
<p>个人觉得是这样的原因，因为目前为止也没看到有谁有更好的解决方案。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/java-security-nosuchalgorithmexception-cannot-find-any-provider-supporting-des-503/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2标签教程 标签</title>
		<link>http://javadou.com/struts2-tag-s-propert-502/</link>
		<comments>http://javadou.com/struts2-tag-s-propert-502/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 05:54:06 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[s:property标签]]></category>
		<category><![CDATA[struts.xml]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=502</guid>
		<description><![CDATA[Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文... ]]></description>
			<content:encoded><![CDATA[<p>Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、 Include标签、Param标签、Set标签、Text标签、Property标签等标签。</p>
<p>代码下载:<br />
<script type="text/javascript">// <![CDATA[
  google_ad_client = "pub-9439928162046667"; /* 468x15, 创建于 09-11-1 */ google_ad_slot = "8400307026"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script type="text/javascript">// <![CDATA[
google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
// ]]&gt;</script><ins><ins></ins></ins><br />
<a href="http://60.12.73.46/upload/Struts2DataTags.rar">Struts2DataTags</a></p>
<p>七、&lt;s:property&gt;标签<br />
Property顾名思义，可以与&lt;s:bean&gt;标签结合使用，一个是给bean赋值，一个是从bean中读取值。直接来看示例：<br />
1．WebRoot\pages\dataTags\propertyTag.jsp<br />
&lt;%@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Property Tag 示例&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;Property Tag 示例&lt;/h2&gt;<br />
&lt;!&#8211; Example to pick the value through bean class &#8211;&gt;<br />
&lt;s:bean name=&#8221;com.sterning.companyName&#8221; id=&#8221;uid&#8221;&gt;<br />
&lt;s:param name=&#8221;name&#8221;&gt;sterning&lt;/s:param&gt;<br />
&lt;s:property value=&#8221;%{name}&#8221; /&gt;&lt;br&gt;<br />
&lt;/s:bean&gt;<br />
&lt;!&#8211; Default value &#8211;&gt;<br />
&lt;s:property value=&#8221;name&#8221; default=&#8221;Default Value&#8221; /&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>2．Bean<br />
当然这里用到了Bean. com\sterning\ companyName.java，代码如下：<br />
package com.sterning;<br />
public class companyName {<br />
private String name;<br />
public void setName(String name){<br />
this.name =name ;<br />
}<br />
public String getName(){<br />
return name;<br />
}<br />
}</p>
<p>3．src&#8221;com&#8221;sterning&#8221; propertyTag.java<br />
进行页面跳转</p>
<p>package com.sterning;<br />
import com.opensymphony.xwork2.ActionSupport;<br />
public class propertyTag extends ActionSupport {<br />
public String execute() throws Exception{<br />
return SUCCESS;<br />
}<br />
}</p>
<p>4．Struts.xml配置<br />
&lt;action name=&#8221;propertyTag&#8221;&gt;<br />
&lt;result&gt;/pages/dataTags/propertyTag.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tag-s-propert-502/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Struts2标签教程之-Set标签</title>
		<link>http://javadou.com/struts2-tag-set-501/</link>
		<comments>http://javadou.com/struts2-tag-set-501/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 05:51:34 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[Set标签]]></category>
		<category><![CDATA[struts2]]></category>
		<category><![CDATA[struts2标签]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=501</guid>
		<description><![CDATA[Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文... ]]></description>
			<content:encoded><![CDATA[<p>Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、 Include标签、Param标签、Set标签、Text标签、Property标签等标签。</p>
<p>代码下载:<br />
<script type="text/javascript">// <![CDATA[
  google_ad_client = "pub-9439928162046667"; /* 468x15, 创建于 09-11-1 */ google_ad_slot = "8400307026"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script type="text/javascript">// <![CDATA[
google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
// ]]&gt;</script><ins><ins></ins></ins><br />
<a href="http://60.12.73.46/upload/Struts2DataTags.rar">Struts2DataTags</a></p>
<p>六、&lt;s:set&gt;标签</p>
<p>Set标签比较简单。Set标签用户将某一值赋给某一变量，因此，任何对该项值的引用都可以通过该变量来得到该值。该变量的活动范围可自定义。如下例中，定义一健/值对，对值的引用，直接引用值就可以。。请看示例<br />
1．WebRoot\pages\dataTags\ setTag.jsp</p>
<p>&lt;%@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Set Tag 示例&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;Set Tag 示例&lt;/h2&gt;<br />
&lt;s:set name=&#8221;technologyName&#8221; value=&#8221;%{&#8216;Java&#8217;}&#8221;/&gt;<br />
Technology Name: &lt;s:property value=&#8221;#technologyName&#8221;/&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
2．Struts.xml配置<br />
&lt;action name=&#8221;setTag&#8221;&gt;<br />
&lt;result&gt;/pages/dataTags/setTag.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>3．运行效果</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/sterning/Struts2DataTags-6-set.gif" border="0" alt="" width="456" height="180" /><br />
图6.&lt;s:set&gt;标签</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tag-set-501/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2标签系列教程之s:param标签</title>
		<link>http://javadou.com/struts2-tag-s-param-500/</link>
		<comments>http://javadou.com/struts2-tag-s-param-500/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 05:49:05 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[struts2]]></category>
		<category><![CDATA[struts2标签]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=500</guid>
		<description><![CDATA[Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文... ]]></description>
			<content:encoded><![CDATA[<p>Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、 Include标签、Param标签、Set标签、Text标签、Property标签等标签。</p>
<p>代码下载:<br />
<script type="text/javascript">// <![CDATA[
  google_ad_client = "pub-9439928162046667"; /* 468x15, 创建于 09-11-1 */ google_ad_slot = "8400307026"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script type="text/javascript">// <![CDATA[
google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
// ]]&gt;</script><ins><ins></ins></ins><br />
<a href="http://60.12.73.46/upload/Struts2DataTags.rar">Struts2DataTags</a></p>
<p>五、&lt;s:param&gt;标签</p>
<p>Param标签用于传递参数，如给&lt;s:bean&gt;标签传递参数。它有如下两个属性：<br />
Name(String)：参数名；<br />
Value(Object)：参数值。<br />
1．WebRoot\pages\dataTags\paramTag.jsp</p>
<p>&lt;%@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Param Tag 示例&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;Param Tag 示例&lt;/h2&gt;<br />
&lt;ui:component&gt;<br />
&lt;ui:param name=&#8221;empname&#8221;&gt;Emp1&lt;/ui:param&gt;&lt;br&gt;<br />
&lt;ui:param name=&#8221;empname&#8221;&gt;Emp2&lt;/ui:param&gt;&lt;br&gt;<br />
&lt;ui:param name=&#8221;empname&#8221;&gt;Emp3&lt;/ui:param&gt;<br />
&lt;/ui:component&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>2．Struts.xml配置<br />
&lt;action name=&#8221;paramTag&#8221;&gt;<br />
&lt;result&gt;/pages/dataTags/paramTag.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>3．运行效果</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/sterning/Struts2DataTags-5-param.gif" border="0" alt="" width="468" height="230" /><br />
图5.&lt;s:param&gt;标签</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tag-s-param-500/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2标签系列教程之s:include标签</title>
		<link>http://javadou.com/struts2-tag-s-include-499/</link>
		<comments>http://javadou.com/struts2-tag-s-include-499/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 05:45:10 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[struts2]]></category>
		<category><![CDATA[struts2标签]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=499</guid>
		<description><![CDATA[Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文... ]]></description>
			<content:encoded><![CDATA[<p>Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、 Include标签、Param标签、Set标签、Text标签、Property标签等标签。</p>
<p>代码下载:<br />
<script type="text/javascript">// <![CDATA[
  google_ad_client = "pub-9439928162046667"; /* 468x15, 创建于 09-11-1 */ google_ad_slot = "8400307026"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script type="text/javascript">// <![CDATA[
google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
// ]]&gt;</script><ins><ins></ins></ins><br />
<a href="http://60.12.73.46/upload/Struts2DataTags.rar">Struts2DataTags<br />
</a></p>
<p>四、&lt;s:include&gt;标签</p>
<p>&lt;s:include&gt;标签用于在当前页面中包含来自其它servlet或JSP页面的处理结果。由于是页面与页面（或servlet）之间的页面包含，因此不需要action来进行页面的跳转。<br />
1．WebRoot\pages\dataTags\includeTag.jsp</p>
<p>&lt;%@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Include Tag 示例&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;Include Tag 示例&lt;/h2&gt;<br />
&lt;s:include value=&#8221;myBirthday.jsp&#8221; /&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>这里包含了另外一个页面myBirthday.jsp，其实相当于在JSP页面里包含其它的页面。原理一样的。</p>
<p>2．WebRoot\pages\dataTags\myBirthday.jsp</p>
<p>这个页面利用了上面所讲的&lt;s:date&gt;标签进行日期的格式化输出</p>
<p>&lt;%@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Include Tag 示例&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;table border=&#8221;1&#8243; width=&#8221;35%&#8221;&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;b&gt;Date Format&lt;/b&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;b&gt;Date&lt;/b&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Day/Month/Year&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;myBirthday&#8221; format=&#8221;dd/MM/yyyy&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;myBirthday&#8221; format=&#8221;MM/dd/yyyy&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;myBirthday&#8221; format=&#8221;MM/dd/yy&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year Hour&lt;B&gt;:&lt;/B&gt;Minute&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;myBirthday&#8221; format=&#8221;MM/dd/yy hh:mm&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year Hour&lt;B&gt;:&lt;/B&gt;Minute&lt;B&gt;:&lt;/B&gt;Second&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;myBirthday&#8221; format=&#8221;MM/dd/yy hh:mm:ss&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Nice Date (Current Date &amp; Time)&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;myBirthday&#8221; nice=&#8221;false&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>3．Struts.xml配置</p>
<p>&lt;action name=&#8221;includeTag&#8221;&gt;<br />
&lt;result&gt;/pages/dataTags/includeTag.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
4．运行效果</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/sterning/Struts2DataTags-4-include.gif" border="0" alt="" width="494" height="404" /><br />
图4.&lt;s:include&gt;标签</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tag-s-include-499/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2标签系列教程之 s:date标签</title>
		<link>http://javadou.com/struts2-tags-s-date-498/</link>
		<comments>http://javadou.com/struts2-tags-s-date-498/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 05:40:20 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[struts2]]></category>
		<category><![CDATA[struts2标签]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=498</guid>
		<description><![CDATA[Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文... ]]></description>
			<content:encoded><![CDATA[<p>Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、 Include标签、Param标签、Set标签、Text标签、Property标签等标签。</p>
<p>代码下载:<br />
<script type="text/javascript">// <![CDATA[
  google_ad_client = "pub-9439928162046667"; /* 468x15, 创建于 09-11-1 */ google_ad_slot = "8400307026"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script type="text/javascript">// <![CDATA[
google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
// ]]&gt;</script><ins><ins></ins></ins><br />
<a href="http://60.12.73.46/upload/Struts2DataTags.rar">Struts2DataTags</a></p>
<p>三、&lt;s:date&gt;标签</p>
<p>Data标签方便在页面进行格式化的日期输出。格式有多种可供选择。同时，还可以通过在properties属性文件中定义好”struts.date.format”参数的值，从而自定义格式输出。</p>
<p>Date标签包含三个属性，可以从下面的代码中感受一下，分别是：</p>
<p>Name:<br />
Nice<br />
Format</p>
<p>WebRoot\pages\dataTags\dateTag.jsp</p>
<p>&lt;%@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Date Tag 示例&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;显示当前的时间&lt;/h2&gt;<br />
&lt;table border=&#8221;1&#8243; width=&#8221;35%&#8221;&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;&lt;b&gt;日期格式&lt;/b&gt;&lt;/td&gt;<br />
&lt;td&gt;&lt;b&gt;日期&lt;/b&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Day/Month/Year&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;currentDate&#8221; format=&#8221;dd/MM/yyyy&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;currentDate&#8221; format=&#8221;MM/dd/yyyy&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;currentDate&#8221; format=&#8221;MM/dd/yy&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year Hour&lt;B&gt;:&lt;/B&gt;Minute&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;currentDate&#8221; format=&#8221;MM/dd/yy hh:mm&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Month/Day/Year Hour&lt;B&gt;:&lt;/B&gt;Minute&lt;B&gt;:&lt;/B&gt;Second&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;currentDate&#8221; format=&#8221;MM/dd/yy hh:mm:ss&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Nice Date (Current Date &amp; Time)&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;currentDate&#8221; nice=&#8221;false&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td&gt;Nice Date&lt;/td&gt;<br />
&lt;td&gt;&lt;s:date name=&#8221;currentDate&#8221; nice=&#8221;true&#8221; /&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>2．src\com\sterning\beanTag.java<br />
该项类更加简单，页面跳转</p>
<p>package com.sterning;<br />
import com.opensymphony.xwork2.ActionSupport;<br />
public class beanTag extends ActionSupport {<br />
public String execute() throws Exception{<br />
return SUCCESS;<br />
}<br />
}</p>
<p>3．Struts.xml配置<br />
&lt;action name=&#8221;dateTag&#8221;&gt;<br />
&lt;result&gt;/pages/dataTags/dateTag.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
4．运行效果</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/sterning/Struts2DataTags-3-date.gif" border="0" alt="" width="612" height="426" /><br />
图3.&lt;s:date&gt;标签</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tags-s-date-498/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2标签 s:bean标签使用</title>
		<link>http://javadou.com/struts2-tag-s-bean-497/</link>
		<comments>http://javadou.com/struts2-tag-s-bean-497/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 05:34:55 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[struts2]]></category>
		<category><![CDATA[struts2标签]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=497</guid>
		<description><![CDATA[Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文... ]]></description>
			<content:encoded><![CDATA[<p>Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对 Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、 Include标签、Param标签、Set标签、Text标签、Property标签等标签。</p>
<p>代码下载:<br />
<script type="text/javascript">// <![CDATA[
  google_ad_client = "pub-9439928162046667"; /* 468x15, 创建于 09-11-1 */ google_ad_slot = "8400307026"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script type="text/javascript">// <![CDATA[
google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);
// ]]&gt;</script><ins><ins></ins></ins><br />
<a href="http://60.12.73.46/upload/Struts2DataTags.rar">Struts2DataTags</a></p>
<p><strong>二、</strong><strong>&lt;s:bean&gt;</strong><strong>标签</strong></p>
<p>Bean标签，当然需要一个JavaBean。其的属性值的操作是经由Bean标签中的参数属性来进行赋值。当然，它还有一个id属性可以进行赋值，由于就可以在上下文中使用这个Bean。请看如下的页面：</p>
<p>1．WebRoot\pages\dataTags\beanTag.jsp，代码如下：<br />
&lt;%@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Bean Tag 示例&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;Bean Tag 示例&lt;/h2&gt;<br />
&lt;s:bean name=&#8221;com.sterning.companyName&#8221; id=&#8221;uid&#8221;&gt;<br />
&lt;s:param name=&#8221;name&#8221;&gt;sterning&lt;/s:param&gt;<br />
&lt;s:property value=&#8221;%{name}&#8221; /&gt;&lt;br&gt;<br />
&lt;/s:bean&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>可参其关联的JavaBean是com.sterning.companyName，同时参数name赋值为sterning。<br />
2．首先创建Action进行跳转， src\com\sterning\beanTag.java，代码如下：</p>
<p>package com.sterning;<br />
import com.opensymphony.xwork2.ActionSupport;<br />
public class beanTag extends ActionSupport {<br />
public String execute() throws Exception{<br />
return SUCCESS;<br />
}<br />
}</p>
<p>然后创建JavaBean，src\com\sterning\companyName.java，代码如下：</p>
<p>package com.sterning;<br />
public class companyName {<br />
private String name;<br />
public void setName(String name){<br />
this.name =name ;<br />
}<br />
public String getName(){<br />
return name;<br />
}<br />
}</p>
<p>3．Struts.xml的配置</p>
<p>这里配置很简单，与前面的例子差不多。<br />
&lt;action name=&#8221;beanTag&#8221;&gt;<br />
&lt;result name=&#8221;success&#8221;&gt;/pages/dataTags/beanTag.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>4．运行效果</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/sterning/Struts2DataTags-2-bean.gif" border="0" alt="" width="494" height="164" /><br />
图2.&lt;s:bean&gt;标签</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tag-s-bean-497/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Struts2标签系列教程 struts2标签介绍、标签使用</title>
		<link>http://javadou.com/struts2-tag-struts2-s-action-tag-496/</link>
		<comments>http://javadou.com/struts2-tag-struts2-s-action-tag-496/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 05:31:37 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[struts2]]></category>
		<category><![CDATA[struts2标签]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=496</guid>
		<description><![CDATA[Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文... ]]></description>
			<content:encoded><![CDATA[<p>Struts2提供了大量丰富的标签供使用，它不再像Struts1中一样，将种类标签进行分门列别，但可以根据其使用的用途用以区别。本文通过对Struts2中数据标签的学习，来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、Include标签、Param标签、Set标签、Text标签、Property标签等标签。</p>
<p>代码下载:<br />
<script type="text/javascript">// <![CDATA[
  google_ad_client = "pub-9439928162046667"; /* 468x15, 创建于 09-11-1 */ google_ad_slot = "8400307026"; google_ad_width = 468; google_ad_height = 15;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><br />
<a href="http://60.12.73.46/upload/Struts2DataTags.rar">Struts2DataTags</a></p>
<p><strong>一、&lt;s:action&gt;</strong><strong>标签</strong></p>
<p>Action标签，顾名思义，是用来调用Action的标签，在JSP中页面中，可以指向具体指定某一命名空间中的某一Action。而标签的主体用于显示及渲染Actionr的处理结果。</p>
<p>1．WebRoot\pages\dataTagssuccess.jsp处理页面<br />
&lt;%<img src="http://www.blogjava.net/Images/dot.gif" alt="" />@ page contentType=&#8221;text/html; charset=GBK&#8221; %&gt;<br />
&lt;%<img src="http://www.blogjava.net/Images/dot.gif" alt="" />@ taglib prefix=&#8221;s&#8221; uri=&#8221;/struts-tags&#8221; %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;title&gt;Action Tag 示例&lt;/title&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;/head&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;body&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;h2&gt;Action Tag 示例&lt;/h2&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;s:action name=&#8221;success&#8221;&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;b&gt;&lt;i&gt;s:action标签用于在页面显示结果.&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;/s:action&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;/body&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;/html&gt;</p>
<p>这里使用&lt;s:action&gt;标签进行页面跳转，并用于显示处理的结果。</p>
<p>2．先来看struts.xml中的配置：<br />
&lt;action name=&#8221;actionTag&#8221; class=&#8221;com.sterning.actionTag&#8221;&gt;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&lt;result name=&#8221;success&#8221;&gt;/pages/dataTags/success.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
3．接着创建actionTag类：代码如下：<br />
package com.sterning;<br />
import com.opensymphony.xwork2.ActionSupport;<br />
publicclass actionTag extends ActionSupport {<br />
public String execute() throws Exception{<br />
returnSUCCESS;<br />
}<br />
}</p>
<p>其实该类中没有做任何处理，只是进行页面跳转而已。</p>
<p>4．运行效果。</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/sterning/Struts2DataTags-1-action.gif" border="0" alt="" width="520" height="197" /><br />
图1.&lt;s:action&gt;标签</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tag-struts2-s-action-tag-496/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>struts2 标签 OGNL取值</title>
		<link>http://javadou.com/struts2-tag-ognl-val-495/</link>
		<comments>http://javadou.com/struts2-tag-ognl-val-495/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 05:54:29 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Struts2]]></category>
		<category><![CDATA[ognl]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=495</guid>
		<description><![CDATA[1. OGNL 中有生成 List 和 Map 的表达式，分别是：{e1,e2,e3,&8230;} 和 {key1:val1,key2:val2,&8230;}。对集合 OGNL 提供了两个操作符 in 和 not in，如：
&60;s:if test=&8221;&8216;foo&8217; in {&8216;foo&8217;,'bar&8217;}&8221; &8230; &60;/s:if&62... ]]></description>
			<content:encoded><![CDATA[<div id="articleBody"><span style="font-family: Arial;">1. OGNL 中有生成 List 和 Map 的表达式，分别是：{e1,e2,e3,&#8230;} 和 #{key1:val1,key2:val2,&#8230;}。对集合 OGNL 提供了两个操作符 in 和 not in，如：<br />
&lt;s:if test=&#8221;&#8216;foo&#8217; in {&#8216;foo&#8217;,'bar&#8217;}&#8221; &#8230; &lt;/s:if&gt;            &#8212;- not in 的用法当然是一样的了。<br />
之外，OGNL 还允许通过某个规则取集合的子集<br />
·? ：取出所有符合条件逻辑的元素<br />
·^：取出符合条件的第一个元素<br />
·$：取出符合条件的最后一个元素<br />
请将上面这三个符号与正则表达式的表示法联系起来<br />
例了：persons.relatives.{? #this.gender == &#8216;male&#8217;}        //取出集合 persons 中所有 gender 属性为 &#8216;male&#8217; 的子集。<br />
理解 ValueStack 和 Stack Context：<br />
1) ValueStack 可以用 request.getAttribute(&#8220;struts.valueStack&#8221;) 取得的一个 com.opensymphony.xwork2.util.OgnlValueStack 实例，它实现为一个栈，有 peek()、pop()、push(obj) 方法。<br />
2) Stack Context 是在前面的 ValueStack 的上下中的一个 java.util.Stack 实例：<br />
//stack 为 ValueStack 实例，COMPONENT_STACK=&#8221;__component_stack&#8221;<br />
// org.apache.struts2.components.Component.getComponentStack() 中的代码<br />
Stack componentStack = (Stack) stack.getContext().get(COMPONENT_STACK);<br />
取值要通过&lt;s:property value=&#8221;" /&gt;或在任意的&lt;s:/&gt;标签内使用%{}；<br />
当Action的valueStack中有该属性的值时，只需直接使用该属性的名字即可；<br />
当Action的valueStack中没有该属性的值时，比如在session,application范围中的属性值时，需要加#或者#attr.；<br />
</span></p>
<div>
<ol>
<li><span style="font-family: Arial;">假设某Action中有person成员变量，在application中存在company属性</span></li>
<li><span style="font-family: Arial;">那么我们可以通过以下方法取值：</span></li>
<li><span style="font-family: Arial;">&lt;s:property value=&#8221;person.name&#8221; /&gt;</span></li>
<li><span style="font-family: Arial;">&lt;s:property value=&#8221;#person.name&#8221; /&gt;</span></li>
<li><span style="font-family: Arial;">&lt;s:property value=&#8221;company.name&#8221; /&gt; //无法取到，因为company不在action的valueStack中</span></li>
<li><span style="font-family: Arial;">&lt;s:property value=&#8221;#company.name&#8221; /&gt;</span></li>
<li><span style="font-family: Arial;">&lt;s:textfield name=&#8221;person.name&#8221; value=&#8221;person.name&#8221; /&gt; //错误，value会直接显示person.name字样</span></li>
<li><span style="font-family: Arial;">&lt;s:textfield name=&#8221;person.name&#8221; value=&#8221;%{person.name}&#8221; /&gt;</span></li>
<li><span style="font-family: Arial;">&lt;s:textfield name=&#8221;person.company.name&#8221; value=&#8221;%{#company.name}&#8221; /&gt;</span></li>
<li><span style="font-family: Arial;">&lt;s:textfield name=&#8221;person.company.name&#8221; value=&#8221;%{#attr.company.name}&#8221; /&gt;</span></li>
<li>
<div><span style="font-family: Arial;"><br />
</span></div>
</li>
</ol>
</div>
<p><span style="font-family: Arial;">2. Struts2 的各路标签<br />
&lt;s:if test=&#8221;exp&#8221;&gt;&#8230;&lt;/s:if&gt;&lt;s:elseif test=&#8221;exp&#8221;&gt;&#8230;&lt;/s:elseif&gt;&lt;s:else&gt;&#8230;&lt;/s:else&gt; 对应了 java 的 if/else if/else<br />
&lt;s:iterator&#8230;/&gt; value 未指定是默认为 ValueStack 栈顶集合。id 为当前元素变量名。status 为 IteratorStatus 实例，包含奇还是偶行，当前索引，是否第一或最后一条记录。</span></p>
<p>3. iterator 可以迭代 List、Set 和数组，也可以迭代 Map，用法如下：</p>
<div>
<ol>
<li><span style="font-family: Arial;">&lt;s:iterator value=&#8221;{&#8216;e1&#8242;,&#8217;e2&#8242;,&#8217;e3&#8242;}&#8221; id=&#8221;name&#8221; status=&#8221;st&#8221;&gt;   //这是用 OGNL 生成的 List</span></li>
<li><span style="font-family: Arial;"> &lt;s:property value=&#8221;name&#8221;/&gt; //也可以写成 &lt;s:property value=&#8221;#name&#8221;/&gt;</span></li>
<li><span style="font-family: Arial;"> &lt;s:if test=&#8221;#st.odd&#8221;&gt;偶数位&lt;/s:if&gt;</span></li>
<li><span style="font-family: Arial;"> // st 其他属必如：#st.count、#st.index、#st.even、#st.first、#st.last，前面的 # 号不能少</span></li>
<li><span style="font-family: Arial;"> &lt;/s:iterator&gt;</span></li>
<li><span style="font-family: Arial;"> 迭代 Map，用 key 和 map 对应</span></li>
<li><span style="font-family: Arial;"> &lt;s:iterator value=&#8221;#{&#8216;key1&#8242;:&#8217;val1&#8242;,&#8217;key2&#8242;:&#8217;val2&#8242;,&#8217;key3&#8242;:&#8217;val3&#8242;}&#8221;&gt;</span></li>
<li><span style="font-family: Arial;"> &lt;s:property value=&#8221;key&#8221;/&gt; | &lt;s:property value=&#8221;value&#8221;/&gt; //不能写成 #key 和 #value</span></li>
<li><span style="font-family: Arial;"> &lt;/s:iterator&gt;</span></li>
</ol>
</div>
<p><span style="font-family: Arial;">4. &lt;s:append&#8230;/&gt; 用于将多个集合拼成一个新集合，从而能用一个&lt;s:iterator &#8230;/&gt; 对多个集合迭代，也能拼 Map 的。&lt;s:merge &#8230;/&gt; 也是用来拼接集合，只是不像 &lt;s:append &#8230;/&gt; 那样依次保持着顺序，&lt;s:merge &#8230;/&gt; 是交错的。可以理解为前一个是深度拼接，后一个是广度拼接。</span></p>
<p>5. 在学习 &lt;s:generator &#8230;/&gt; 时我们能同时体验一下 Struts2 标签是如何操作栈的，当然这里指的是 ValueStack，而非 Java 的方法栈。<br />
&lt;s:generator val=&#8221;&#8216;1,2,3&#8242;&#8221; separator=&#8221;,&#8221;&gt; &lt;!&#8211;字符串&#8217;123&#8242;以&#8221;,&#8221;分隔生成一个集合，并压栈&#8211;&gt;<br />
&lt;s:iterator&gt;      &lt;!&#8211; 这里没有指定 value 属性，默认弹栈，并取一个元素压栈 &#8211;&gt;<br />
&lt;s:property/&gt; &lt;!&#8211; 也没有指定 value 属性，默认也是取栈顶元素 &#8211;&gt;<br />
&lt;/s:iterator&gt;     &lt;!&#8211; 迭代完成则从集合遍历的最后一个元素出栈 &#8211;&gt;<br />
&lt;/s:generator&gt;      &lt;!&#8211; 最后，自动出栈，generator 生成的集合出栈 &#8211;&gt;<br />
汇编是基于寄存器操作的，而 Java 是基于栈的操作，Struts2 引入了存放在 request 中的 ValueStack 正好完美再现了 Java 的这一原始本性，并可使标签使用更简洁，灵活。Struts2 还有很多标签也有这个特性：<br />
1) 生成的新实例，压栈，标签结束后自动出栈<br />
2) 在未指定数据来源时，默认从栈顶取数据。<br />
不禁回想起 Struts1 的 &lt;nested:root&gt; 等 nested 标签要显示的声明操作的根元素，是多么麻烦的一件事。<br />
补充：如果指定了 &lt;s:generator &#8230;/&gt; 的 id 属性的话，同时还会把生成的集合放到 pageContext 中，key 就是 id 指定的值。</p>
<p>6. &lt;s:subset &#8230;/&gt; 是用来取集合子集的，可从 source (未指定则为栈顶集合) 集合的 start 位置起取 count 个元素。或者按自定义的 decider 条件，取符合条件的子集。你的 decider 要实现 SubsetIteratorFilter.Decider 接口的 decide(object element) 方法，符合条件的返回 true。此处不列出具体用法的实例。</p>
<p>7. &lt;s:sort &#8230;/&gt; 依据 comparator 指定的比较器，对 source (未指定则为栈顶集合) 集合排序。排序头的集合当然也是压入栈中，标签结束自动出栈。</p>
<p>8. &lt;s:debug/&gt; 会在页面生成一个 debug 链接，展开能看到 ValueStack 和 Stack Context 中的内容，该页面有显示用 #key 能获取到 Stack Context 中的值。&lt;s:property &#8230;/&gt; 在前面用很多次了，就相当于 Struts1 的 &lt;bean:write &#8230;/&gt;，value 未指定，输出栈顶值；若要输出的值为 null 时，指定了 default 属性则输出它；escape 指定是否忽略 HTML 代码，同 &lt;bean:write &#8230;/&gt; 的 ignore 属性。</p>
<p>9. &lt;s:push &#8230;/&gt; 用于将某个值压栈，标签结束后自动出栈，可方便某些操作，Struts1 的 &lt;nested:root&gt; 有类似功能。&lt;s:set &#8230;/&gt; 标签用于把某个值放入指定范围内，用 scope 指定，如 application、session、request、page、action。若未指定 scope 则放到 Stack Context 中；name 为新变量名；value 为欲处理的变量，未指定则取栈顶值。</p>
<p>10. 从前面的标签，你也许已经注意到，Struts2 常操作的几个数据结构有 ValueStack、pageContext 和 StackContext。例如：generator、sort、subset 等生成的新实例会压到栈顶，并在标签结束自动出栈；如果 sort、subset 未指定 source 源集合，则从栈顶取，iterator、property 也是一样的；若为 generator 指定了 id 属性，则生的集合会存到 pageContext 中，key 就是 id 对应值；如果为 bean 指定了 id 属性，则会把 bean 实例存入到 Stack Context 中，key 就是 id 对应值，Stack Conext 中的值可以用 #key 取得。其他标签类似的地方应该要注意到。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-tag-ognl-val-495/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
