﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-shoppingbill</title><link>http://www.blogjava.net/shoppingbill/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 13:24:58 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 13:24:58 GMT</pubDate><ttl>60</ttl><item><title>ActionScript External API</title><link>http://www.blogjava.net/shoppingbill/archive/2010/11/24/338968.html</link><dc:creator>shoppingbill</dc:creator><author>shoppingbill</author><pubDate>Wed, 24 Nov 2010 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/shoppingbill/archive/2010/11/24/338968.html</guid><wfw:comment>http://www.blogjava.net/shoppingbill/comments/338968.html</wfw:comment><comments>http://www.blogjava.net/shoppingbill/archive/2010/11/24/338968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shoppingbill/comments/commentRss/338968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shoppingbill/services/trackbacks/338968.html</trackback:ping><description><![CDATA[1.在ActionScript&nbsp;中调用JavaScript<br />
<br />
Js 如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;language</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">javaScript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_70_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_70_133_Open_Text.style.display='none'; Codehighlighter1_70_133_Closed_Image.style.display='inline'; Codehighlighter1_70_133_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_70_133_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_70_133_Closed_Text.style.display='none'; Codehighlighter1_70_133_Open_Image.style.display='inline'; Codehighlighter1_70_133_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;printBookInfo(title,price)</span><span id="Codehighlighter1_70_133_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_70_133_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000">"</span><span style="color: #000000">Book&nbsp;Title:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">title</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;is&nbsp;price&nbsp;at:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">price;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span></div>
<br />
As如下：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_31_196_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_196_Open_Text.style.display='none'; Codehighlighter1_31_196_Closed_Image.style.display='inline'; Codehighlighter1_31_196_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_31_196_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_31_196_Closed_Text.style.display='none'; Codehighlighter1_31_196_Open_Image.style.display='inline'; Codehighlighter1_31_196_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">if</span><span style="color: #000000">(ExternalInterface.available)</span><span id="Codehighlighter1_31_196_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_196_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;title:String&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Actionscript</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;price:uint&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">300</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;result:String&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ExternalInterface.call(</span><span style="color: #000000">"</span><span style="color: #000000">printBookInfo</span><span style="color: #000000">"</span><span style="color: #000000">,title,price);<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Alert.show(result);<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_201_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_201_258_Open_Text.style.display='none'; Codehighlighter1_201_258_Closed_Image.style.display='inline'; Codehighlighter1_201_258_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_201_258_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_201_258_Closed_Text.style.display='none'; Codehighlighter1_201_258_Open_Image.style.display='inline'; Codehighlighter1_201_258_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />}</span></span><span style="color: #0000ff">else</span><span id="Codehighlighter1_201_258_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_201_258_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Alert.show(</span><span style="color: #000000">"</span><span style="color: #000000">External&nbsp;interface&nbsp;is&nbsp;not&nbsp;vaailable</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
<br />
2,JavaScript 调用 ActionScript<br />
<br />
ActionScript中注册调用方法<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ExternalInterface.addCallback(</span><span style="color: #000000">"</span><span style="color: #000000">myFunction</span><span style="color: #000000">"</span><span style="color: #000000">,sayHello);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_92_128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_128_Open_Text.style.display='none'; Codehighlighter1_92_128_Closed_Image.style.display='inline'; Codehighlighter1_92_128_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_92_128_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_92_128_Closed_Text.style.display='none'; Codehighlighter1_92_128_Open_Image.style.display='inline'; Codehighlighter1_92_128_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />private&nbsp;sayHello(name:String):String</span><span id="Codehighlighter1_92_128_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_92_128_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Helloo&nbsp;from&nbsp;AS,</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">name;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
JS:</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_30_151_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_151_Open_Text.style.display='none'; Codehighlighter1_30_151_Closed_Image.style.display='inline'; Codehighlighter1_30_151_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_30_151_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_30_151_Closed_Text.style.display='none'; Codehighlighter1_30_151_Open_Image.style.display='inline'; Codehighlighter1_30_151_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;thisMovie(movieName)&nbsp;</span><span id="Codehighlighter1_30_151_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_30_151_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_82_112_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_112_Open_Text.style.display='none'; Codehighlighter1_82_112_Closed_Image.style.display='inline'; Codehighlighter1_82_112_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_82_112_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_82_112_Closed_Text.style.display='none'; Codehighlighter1_82_112_Open_Image.style.display='inline'; Codehighlighter1_82_112_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(navigator.appName.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">Microsoft</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_82_112_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_82_112_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;window[movieName]<br />
<img id="Codehighlighter1_117_149_Open_Image" onclick="this.style.display='none'; Codehighlighter1_117_149_Open_Text.style.display='none'; Codehighlighter1_117_149_Closed_Image.style.display='inline'; Codehighlighter1_117_149_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_117_149_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_117_149_Closed_Text.style.display='none'; Codehighlighter1_117_149_Open_Image.style.display='inline'; Codehighlighter1_117_149_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />}</span></span><span style="color: #0000ff">else</span><span id="Codehighlighter1_117_149_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_117_149_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;document[movieName]<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_24_57_Open_Image" onclick="this.style.display='none'; Codehighlighter1_24_57_Open_Text.style.display='none'; Codehighlighter1_24_57_Closed_Image.style.display='inline'; Codehighlighter1_24_57_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_24_57_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_24_57_Closed_Text.style.display='none'; Codehighlighter1_24_57_Open_Image.style.display='inline'; Codehighlighter1_24_57_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;callExternal()&nbsp;</span><span id="Codehighlighter1_24_57_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_24_57_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />thisMovie(</span><span style="color: #000000">"</span><span style="color: #000000">swfId</span><span style="color: #000000">"</span><span style="color: #000000">).showAlert()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;f4</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SWFObject('test.swf',&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">swfId</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">400</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">300</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">8</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">#000</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">new&nbsp;SWFObject(swf,&nbsp;id,&nbsp;width,&nbsp;height,&nbsp;version,&nbsp;background-color&nbsp;[,&nbsp;quality,&nbsp;xiRedirectUrl,&nbsp;redirectUrl,&nbsp;detectKey]);</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f4.addParam('allowScriptAccess','sameDomain');<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f4.addParam('wmode','transparent');<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f4.skipDetect</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">false</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f4.addParam('bgcolor','#c5d1f0');<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f4.write(</span><span style="color: #000000">"</span><span style="color: #000000">flvPlayerDivId</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
&nbsp;</p>
<img src ="http://www.blogjava.net/shoppingbill/aggbug/338968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shoppingbill/" target="_blank">shoppingbill</a> 2010-11-24 18:47 <a href="http://www.blogjava.net/shoppingbill/archive/2010/11/24/338968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>REST WebService与SOAP WebService的比较</title><link>http://www.blogjava.net/shoppingbill/archive/2010/04/27/319476.html</link><dc:creator>shoppingbill</dc:creator><author>shoppingbill</author><pubDate>Tue, 27 Apr 2010 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/shoppingbill/archive/2010/04/27/319476.html</guid><wfw:comment>http://www.blogjava.net/shoppingbill/comments/319476.html</wfw:comment><comments>http://www.blogjava.net/shoppingbill/archive/2010/04/27/319476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shoppingbill/comments/commentRss/319476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shoppingbill/services/trackbacks/319476.html</trackback:ping><description><![CDATA[<font size="3" face="宋体"><span>在</span>SOA<span>的基础技术实现方式中</span>WebService<span>占据了很重要的地位，通常我们提到</span>WebService<span>第一想法就是</span>SOAP<span>消息在各种传输协议上交互。近几年</span>REST<span>的思想伴随着</span>SOA<span>逐渐被大家接受，同时各大网站不断开放</span>API<span>提供给开发者，也激起了</span>REST<span>风格</span>WebService<span>的热潮。</span> </font>
<h1><span style="font-size: 15pt; line-height: 240%;"><font size="3" face="宋体">SOAP</font></span></h1>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>什么是</span>SOAP<span>，我想不用多说，</span>google<span>一把满眼都是。其实</span>SOAP<span>最早是针对</span>RPC<span>的一种解决方案，简单对象访问协议，很轻量，同时作为应用协议可以基于多种传输协议来传递消息（</span>Http,SMTP<span>等）。但是随着</span>SOAP<span>作为</span>WebService<span>的广泛应用，不断地增加附加的内容，使得现在开发人员觉得</span>SOAP<span>很重，使用门槛很高。在</span>SOAP<span>后续的发展过程中，</span>WS-*<span>一系列协议的制定，增加了</span>SOAP<span>的成熟度，也给</span>SOAP<span>增加了负担。</span></font></font></p>
<h1><span style="font-size: 15pt; line-height: 240%;"><font size="3" face="宋体">REST</font></span></h1>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>其实并不是什么协议也不是什么标准，而是将</span>Http<span>协议的设计初衷作了诠释，在</span>Http<span>协议被广泛利用的今天，越来越多的是将其作为传输协议，而非原先设计者所考虑的应用协议。</span>SOAP<span>类型的</span>WebService<span>就是最好的例子，</span>SOAP<span>消息完全就是将</span>Http<span>协议作为消息承载，以至于对于</span>Http<span>协议中的各种参数（例如编码，错误码等）都置之不顾。其实，最轻量级的应用协议就是</span>Http<span>协议。</span>Http<span>协议所抽象的</span>get,post,put,delete<span>就好比数据库中最基本的增删改查，而互联网上的各种资源就好比数据库中的记录（可能这么比喻不是很好），对于各种资源的操作最后总是能抽象成为这四种基本操作，在定义了定位资源的规则以后，对于资源的操作通过标准的</span>Http<span>协议就可以实现，开发者也会受益于这种轻量级的协议。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;  REST<span>的思想归结以下有如下几个关键点：</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3">1<span>．面向资源的接口设计</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3"><span>所有的接口设计都是针对资源来设计的，也就很类似于我们的面向对象和面向过程的设计区别，只不过现在将网络上的操作实体都作为资源来看待，同时</span>URI<span>的设计也是体现了对于资源的定位设计。后面会提到有一些网站的</span>API<span>设计说是</span>REST<span>设计，其实是</span>RPC-REST<span>的混合体，并非是</span>REST<span>的思想。</span></font></font></p>
<p><font size="3" face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2<span>．抽象操作为基础的</span>CRUD</font></p>
<p><font size="3" face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>这点很简单，</span>Http<span>中的</span>get,put,post,delete<span>分别对应了</span>read,update,create,delete<span>四种操作，如果仅仅是作为对于资源的操作，抽象成为这四种已经足够了，但是对于现在的一些复杂的业务服务接口设计，可能这样的抽象未必能够满足。其实这也在后面的几个网站的</span>API<span>设计中暴露了这样的问题，如果要完全按照</span>REST<span>的思想来设计，那么适用的环境将会有限制，而非放之四海皆准的。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  3<span>．</span>Http<span>是应用协议而非传输协议</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>这点在后面各大网站的</span>API<span>分析中有很明显的体现，其实有些网站已经走到了</span>SOAP<span>的老路上，说是</span>REST<span>的理念设计，其实是作了一套私有的</span>SOAP<span>协议，因此称之为</span>REST<span>风格的自定义</span>SOAP<span>协议。</span></font></font></p>
<p style="text-indent: 21.75pt;"><font face="宋体"><font size="3">4<span>．无状态，自包含</span></font></font></p>
<p style="text-indent: 21.75pt;"><font face="宋体"><font size="3"><span>这点其实不仅仅是对于</span>REST<span>来说的，作为接口设计都需要能够做到这点，也是作为可扩展和高效性的最基本的保证，就算是使用</span>SOAP<span>的</span>WebService<span>也是一样。</span></font></font></p>
<h1><span style="font-size: 15pt; line-height: 240%;"><font size="3" face="宋体">REST vs SOAP</font></span></h1>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">成熟度：</font></span></h2>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3">SOAP<span>虽然发展到现在已经脱离了初衷，但是对于异构环境服务发布和调用，以及厂商的支持都已经达到了较为成熟的情况。不同平台，开发语言之间通过</span>SOAP<span>来交互的</span>web service<span>都能够较好的互通（在部分复杂和特殊的参数和返回对象解析上，协议没有作很细致的规定，导致还是需要作部分修正）</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3">REST<span>国外很多大网站都发布了自己的开发</span>API<span>，很多都提供了</span>SOAP<span>和</span>REST<span>两种</span>Web Service<span>，根据调查部分网站的</span>REST<span>风格的使用情况要高于</span>SOAP<span>。但是由于</span>REST<span>只是一种基于</span>Http<span>协议实现资源操作的思想，因此各个网站的</span>REST<span>实现都自有一套，在后面会讲诉各个大网站的</span>REST API<span>的风格。也正是因为这种各自实现的情况，在性能和可用性上会大大高于</span>SOAP<span>发布的</span>web service<span>，但统一通用方面远远不及</span>SOAP<span>。由于这些大网站的</span>SP<span>往往专注于此网站的</span>API<span>开发，因此通用性要求不高。</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3"><span>由于没有类似于</span>SOAP<span>的权威性协议作为规范，</span>REST<span>实现的各种协议仅仅只能算是私有协议，当然需要遵循</span>REST<span>的思想，但是这样细节方面有太多没有约束的地方。</span>REST<span>日后的发展所走向规范也会直接影响到这部分的设计是否能够有很好的生命力。</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3"><span>总的来说</span>SOAP<span>在成熟度上优于</span>REST<span>。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">效率和易用性：</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SOAP<span>协议对于消息体和消息头都有定义，同时消息头的可扩展性为各种互联网的标准提供了扩展的基础，</span>WS-*<span>系列就是较为成功的规范。但是也由于</span>SOAP<span>由于各种需求不断扩充其本身协议的内容，导致在</span>SOAP<span>处理方面的性能有所下降。同时在易用性方面以及学习成本上也有所增加。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>被人们的重视，其实很大一方面也是因为其高效以及简洁易用的特性。这种高效一方面源于其面向资源接口设计以及操作抽象简化了开发者的不良设计，同时也最大限度的利用了</span>Http<span>最初的应用协议设计理念。同时，在我看来</span>REST<span>还有一个很吸引开发者的就是能够很好的融合当前</span>Web2.0<span>的很多前端技术来提高开发效率。例如很多大型网站开放的</span>REST<span>风格的</span>API<span>都会有多种返回形式，除了传统的</span>xml<span>作为数据承载，还有（</span>JSON,RSS,ATOM<span>）等形式，这对很多网站前端开发人员来说就能够很好的</span>mashup<span>各种资源信息。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>因此在效率和易用性上来说，</span>REST<span>更胜一筹。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">安全性：</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>这点其实可以放入到成熟度中，不过在当前的互联网应用和平台开发设计过程中，安全已经被提到了很高的高度，特别是作为外部接口给第三方调用，安全性可能会高过业务逻辑本身。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SOAP<span>在安全方面是通过使用</span>XML-Security<span>和</span>XML-Signature<span>两个规范组成了</span>WS-Security<span>来实现安全控制的，当前已经得到了各个厂商的支持，</span>.net <span>，</span>php <span>，</span>java <span>都已经对其有了很好的支持（虽然在一些细节上还是有不兼容的问题，但是互通基本上是可以的）。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>没有任何规范对于安全方面作说明，同时现在开放</span>REST<span>风格</span>API<span>的网站主要分成两种，一种是自定义了安全信息封装在消息中（其实这和</span>SOAP<span>没有什么区别），另外一种就是靠硬件</span>SSL<span>来保障</span>,<span>但是这只能够保证点到点的安全，如果是需要多点传输的话</span>SSL<span>就无能为力了。安全这块其实也是一个很大的问题，今年在</span>BEA<span>峰会上看到有演示采用</span>SAML2<span>实现的网站间</span>SSO<span>，其实是直接采用了</span>XML-Security<span>和</span>XML-Signature<span>，效率看起来也不是很高。未来</span>REST<span>规范化和通用化过程中的安全是否也会采用这两种规范，是未知的，但是加入的越多，</span>REST<span>失去它高效性的优势越多。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">应用设计与改造：</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>我们的系统要么就是已经有了那些需要被发布出去的服务，要么就是刚刚设计好的服务，但是开发人员的传统设计思想让</span>REST<span>的形式被接受还需要一点时间。同时在资源型数据服务接口设计上来说按照</span>REST<span>的思想来设计相对来说要容易一些，而对于一些复杂的服务接口来说，可能强要去按照</span>REST<span>的风格来设计会有些牵强。这一点其实可以看看各大网站的接口就可以知道，很多网站还要传入</span>function<span>的名称作为参数，这就明显已经违背了</span>REST<span>本身的设计思路。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>而</span>SOAP<span>本身就是面向</span>RPC<span>来设计的，开发人员十分容易接受，所以不存在什么适应的过程。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">总的来说，其实还是一个老观念，适合的才是最好的</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>技术没有好坏，只有是不是合适，一种好的技术和思想被误用了，那么就会得到反效果。</span>REST<span>和</span>SOAP<span>各自都有自己的优点，同时如果在一些场景下如果去改造</span>REST<span>，其实就会走向</span>SOAP<span>（例如安全）。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>对于资源型服务接口来说很合适，同时特别适合对于效率要求很高，但是对于安全要求不高的场景。而</span>SOAP<span>的成熟性可以给需要提供给多开发语言的，对于安全性要求较高的接口设计带来便利。所以我觉得纯粹说什么设计模式将会占据主导地位没有什么意义，关键还是看应用场景。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>同时很重要一点就是不要扭曲了</span>REST<span>现在很多网站都跟风去开发</span>REST<span>风格的接口，其实都是在学其形，不知其心，最后弄得不伦不类，性能上不去，安全又保证不了，徒有一个看似象摸象样的皮囊。</span></font></font><font size="3" face="宋体"><span>在</span>SOA<span>的基础技术实现方式中</span>WebService<span>占据了很重要的地位，通常我们提到</span>WebService<span>第一想法就是</span>SOAP<span>消息在各种传输协议上交互。近几年</span>REST<span>的思想伴随着</span>SOA<span>逐渐被大家接受，同时各大网站不断开放</span>API<span>提供给开发者，也激起了</span>REST<span>风格</span>WebService<span>的热潮。</span> </font>
</p>
<h1><span style="font-size: 15pt; line-height: 240%;"><font size="3" face="宋体">SOAP</font></span></h1>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>什么是</span>SOAP<span>，我想不用多说，</span>google<span>一把满眼都是。其实</span>SOAP<span>最早是针对</span>RPC<span>的一种解决方案，简单对象访问协议，很轻量，同时作为应用协议可以基于多种传输协议来传递消息（</span>Http,SMTP<span>等）。但是随着</span>SOAP<span>作为</span>WebService<span>的广泛应用，不断地增加附加的内容，使得现在开发人员觉得</span>SOAP<span>很重，使用门槛很高。在</span>SOAP<span>后续的发展过程中，</span>WS-*<span>一系列协议的制定，增加了</span>SOAP<span>的成熟度，也给</span>SOAP<span>增加了负担。</span></font></font></p>
<h1><span style="font-size: 15pt; line-height: 240%;"><font size="3" face="宋体">REST</font></span></h1>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>其实并不是什么协议也不是什么标准，而是将</span>Http<span>协议的设计初衷作了诠释，在</span>Http<span>协议被广泛利用的今天，越来越多的是将其作为传输协议，而非原先设计者所考虑的应用协议。</span>SOAP<span>类型的</span>WebService<span>就是最好的例子，</span>SOAP<span>消息完全就是将</span>Http<span>协议作为消息承载，以至于对于</span>Http<span>协议中的各种参数（例如编码，错误码等）都置之不顾。其实，最轻量级的应用协议就是</span>Http<span>协议。</span>Http<span>协议所抽象的</span>get,post,put,delete<span>就好比数据库中最基本的增删改查，而互联网上的各种资源就好比数据库中的记录（可能这么比喻不是很好），对于各种资源的操作最后总是能抽象成为这四种基本操作，在定义了定位资源的规则以后，对于资源的操作通过标准的</span>Http<span>协议就可以实现，开发者也会受益于这种轻量级的协议。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;  REST<span>的思想归结以下有如下几个关键点：</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3">1<span>．面向资源的接口设计</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3"><span>所有的接口设计都是针对资源来设计的，也就很类似于我们的面向对象和面向过程的设计区别，只不过现在将网络上的操作实体都作为资源来看待，同时</span>URI<span>的设计也是体现了对于资源的定位设计。后面会提到有一些网站的</span>API<span>设计说是</span>REST<span>设计，其实是</span>RPC-REST<span>的混合体，并非是</span>REST<span>的思想。</span></font></font></p>
<p><font size="3" face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  2<span>．抽象操作为基础的</span>CRUD</font></p>
<p><font size="3" face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>这点很简单，</span>Http<span>中的</span>get,put,post,delete<span>分别对应了</span>read,update,create,delete<span>四种操作，如果仅仅是作为对于资源的操作，抽象成为这四种已经足够了，但是对于现在的一些复杂的业务服务接口设计，可能这样的抽象未必能够满足。其实这也在后面的几个网站的</span>API<span>设计中暴露了这样的问题，如果要完全按照</span>REST<span>的思想来设计，那么适用的环境将会有限制，而非放之四海皆准的。</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  3<span>．</span>Http<span>是应用协议而非传输协议</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>这点在后面各大网站的</span>API<span>分析中有很明显的体现，其实有些网站已经走到了</span>SOAP<span>的老路上，说是</span>REST<span>的理念设计，其实是作了一套私有的</span>SOAP<span>协议，因此称之为</span>REST<span>风格的自定义</span>SOAP<span>协议。</span></font></font></p>
<p style="text-indent: 21.75pt;"><font face="宋体"><font size="3">4<span>．无状态，自包含</span></font></font></p>
<p style="text-indent: 21.75pt;"><font face="宋体"><font size="3"><span>这点其实不仅仅是对于</span>REST<span>来说的，作为接口设计都需要能够做到这点，也是作为可扩展和高效性的最基本的保证，就算是使用</span>SOAP<span>的</span>WebService<span>也是一样。</span></font></font></p>
<h1><span style="font-size: 15pt; line-height: 240%;"><font size="3" face="宋体">REST vs SOAP</font></span></h1>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">成熟度：</font></span></h2>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3">SOAP<span>虽然发展到现在已经脱离了初衷，但是对于异构环境服务发布和调用，以及厂商的支持都已经达到了较为成熟的情况。不同平台，开发语言之间通过</span>SOAP<span>来交互的</span>web service<span>都能够较好的互通（在部分复杂和特殊的参数和返回对象解析上，协议没有作很细致的规定，导致还是需要作部分修正）</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3">REST<span>国外很多大网站都发布了自己的开发</span>API<span>，很多都提供了</span>SOAP<span>和</span>REST<span>两种</span>Web Service<span>，根据调查部分网站的</span>REST<span>风格的使用情况要高于</span>SOAP<span>。但是由于</span>REST<span>只是一种基于</span>Http<span>协议实现资源操作的思想，因此各个网站的</span>REST<span>实现都自有一套，在后面会讲诉各个大网站的</span>REST API<span>的风格。也正是因为这种各自实现的情况，在性能和可用性上会大大高于</span>SOAP<span>发布的</span>web service<span>，但统一通用方面远远不及</span>SOAP<span>。由于这些大网站的</span>SP<span>往往专注于此网站的</span>API<span>开发，因此通用性要求不高。</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3"><span>由于没有类似于</span>SOAP<span>的权威性协议作为规范，</span>REST<span>实现的各种协议仅仅只能算是私有协议，当然需要遵循</span>REST<span>的思想，但是这样细节方面有太多没有约束的地方。</span>REST<span>日后的发展所走向规范也会直接影响到这部分的设计是否能够有很好的生命力。</span></font></font></p>
<p style="text-indent: 21pt;"><font face="宋体"><font size="3"><span>总的来说</span>SOAP<span>在成熟度上优于</span>REST<span>。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">效率和易用性：</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SOAP<span>协议对于消息体和消息头都有定义，同时消息头的可扩展性为各种互联网的标准提供了扩展的基础，</span>WS-*<span>系列就是较为成功的规范。但是也由于</span>SOAP<span>由于各种需求不断扩充其本身协议的内容，导致在</span>SOAP<span>处理方面的性能有所下降。同时在易用性方面以及学习成本上也有所增加。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>被人们的重视，其实很大一方面也是因为其高效以及简洁易用的特性。这种高效一方面源于其面向资源接口设计以及操作抽象简化了开发者的不良设计，同时也最大限度的利用了</span>Http<span>最初的应用协议设计理念。同时，在我看来</span>REST<span>还有一个很吸引开发者的就是能够很好的融合当前</span>Web2.0<span>的很多前端技术来提高开发效率。例如很多大型网站开放的</span>REST<span>风格的</span>API<span>都会有多种返回形式，除了传统的</span>xml<span>作为数据承载，还有（</span>JSON,RSS,ATOM<span>）等形式，这对很多网站前端开发人员来说就能够很好的</span>mashup<span>各种资源信息。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>因此在效率和易用性上来说，</span>REST<span>更胜一筹。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">安全性：</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>这点其实可以放入到成熟度中，不过在当前的互联网应用和平台开发设计过程中，安全已经被提到了很高的高度，特别是作为外部接口给第三方调用，安全性可能会高过业务逻辑本身。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SOAP<span>在安全方面是通过使用</span>XML-Security<span>和</span>XML-Signature<span>两个规范组成了</span>WS-Security<span>来实现安全控制的，当前已经得到了各个厂商的支持，</span>.net <span>，</span>php <span>，</span>java <span>都已经对其有了很好的支持（虽然在一些细节上还是有不兼容的问题，但是互通基本上是可以的）。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>没有任何规范对于安全方面作说明，同时现在开放</span>REST<span>风格</span>API<span>的网站主要分成两种，一种是自定义了安全信息封装在消息中（其实这和</span>SOAP<span>没有什么区别），另外一种就是靠硬件</span>SSL<span>来保障</span>,<span>但是这只能够保证点到点的安全，如果是需要多点传输的话</span>SSL<span>就无能为力了。安全这块其实也是一个很大的问题，今年在</span>BEA<span>峰会上看到有演示采用</span>SAML2<span>实现的网站间</span>SSO<span>，其实是直接采用了</span>XML-Security<span>和</span>XML-Signature<span>，效率看起来也不是很高。未来</span>REST<span>规范化和通用化过程中的安全是否也会采用这两种规范，是未知的，但是加入的越多，</span>REST<span>失去它高效性的优势越多。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">应用设计与改造：</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>我们的系统要么就是已经有了那些需要被发布出去的服务，要么就是刚刚设计好的服务，但是开发人员的传统设计思想让</span>REST<span>的形式被接受还需要一点时间。同时在资源型数据服务接口设计上来说按照</span>REST<span>的思想来设计相对来说要容易一些，而对于一些复杂的服务接口来说，可能强要去按照</span>REST<span>的风格来设计会有些牵强。这一点其实可以看看各大网站的接口就可以知道，很多网站还要传入</span>function<span>的名称作为参数，这就明显已经违背了</span>REST<span>本身的设计思路。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>而</span>SOAP<span>本身就是面向</span>RPC<span>来设计的，开发人员十分容易接受，所以不存在什么适应的过程。</span></font></font></p>
<h2><span style="font-size: 14pt; line-height: 173%;"><font size="3" face="宋体">总的来说，其实还是一个老观念，适合的才是最好的</font></span></h2>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>技术没有好坏，只有是不是合适，一种好的技术和思想被误用了，那么就会得到反效果。</span>REST<span>和</span>SOAP<span>各自都有自己的优点，同时如果在一些场景下如果去改造</span>REST<span>，其实就会走向</span>SOAP<span>（例如安全）。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  REST<span>对于资源型服务接口来说很合适，同时特别适合对于效率要求很高，但是对于安全要求不高的场景。而</span>SOAP<span>的成熟性可以给需要提供给多开发语言的，对于安全性要求较高的接口设计带来便利。所以我觉得纯粹说什么设计模式将会占据主导地位没有什么意义，关键还是看应用场景。</span></font></font></p>
<p><font face="宋体"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <span>同时很重要一点就是不要扭曲了</span>REST<span>现在很多网站都跟风去开发</span>REST<span>风格的接口，其实都是在学其形，不知其心，最后弄得不伦不类，性能上不去，安全又保证不了，徒有一个看似象摸象样的皮囊。</span></font></font></p>
<img src ="http://www.blogjava.net/shoppingbill/aggbug/319476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shoppingbill/" target="_blank">shoppingbill</a> 2010-04-27 14:11 <a href="http://www.blogjava.net/shoppingbill/archive/2010/04/27/319476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2文件下载</title><link>http://www.blogjava.net/shoppingbill/archive/2009/12/17/306235.html</link><dc:creator>shoppingbill</dc:creator><author>shoppingbill</author><pubDate>Wed, 16 Dec 2009 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/shoppingbill/archive/2009/12/17/306235.html</guid><wfw:comment>http://www.blogjava.net/shoppingbill/comments/306235.html</wfw:comment><comments>http://www.blogjava.net/shoppingbill/archive/2009/12/17/306235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shoppingbill/comments/commentRss/306235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shoppingbill/services/trackbacks/306235.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_0_10_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_10_Open_Text.style.display='none'; Codehighlighter1_0_10_Closed_Image.style.display='inline'; Codehighlighter1_0_10_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_0_10_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_10_Closed_Text.style.display='none'; Codehighlighter1_0_10_Open_Image.style.display='inline'; Codehighlighter1_0_10_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span id="Codehighlighter1_0_10_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_0_10_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.download;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.ByteArrayInputStream;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.InputStream;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.UnsupportedEncodingException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.struts2.ServletActionContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_242_272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_242_272_Open_Text.style.display='none'; Codehighlighter1_242_272_Closed_Image.style.display='inline'; Codehighlighter1_242_272_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_242_272_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_242_272_Closed_Text.style.display='none'; Codehighlighter1_242_272_Open_Image.style.display='inline'; Codehighlighter1_242_272_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_242_272_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_242_272_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;billzhang<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_328_797_Open_Image" onclick="this.style.display='none'; Codehighlighter1_328_797_Open_Text.style.display='none'; Codehighlighter1_328_797_Closed_Image.style.display='inline'; Codehighlighter1_328_797_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_328_797_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_328_797_Closed_Text.style.display='none'; Codehighlighter1_328_797_Open_Image.style.display='inline'; Codehighlighter1_328_797_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DownloadFileAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span id="Codehighlighter1_328_797_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_328_797_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
<img id="Codehighlighter1_384_407_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_407_Open_Text.style.display='none'; Codehighlighter1_384_407_Closed_Image.style.display='inline'; Codehighlighter1_384_407_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_384_407_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_384_407_Closed_Text.style.display='none'; Codehighlighter1_384_407_Open_Image.style.display='inline'; Codehighlighter1_384_407_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_384_407_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_384_407_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">success</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_447_634_Open_Image" onclick="this.style.display='none'; Codehighlighter1_447_634_Open_Text.style.display='none'; Codehighlighter1_447_634_Closed_Image.style.display='inline'; Codehighlighter1_447_634_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_447_634_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_447_634_Closed_Text.style.display='none'; Codehighlighter1_447_634_Open_Image.style.display='inline'; Codehighlighter1_447_634_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;InputStream&nbsp;getInputStream()</span><span id="Codehighlighter1_447_634_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_447_634_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;ByteArrayInputStream("struts2文件下载".getBytes());</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ServletActionContext.<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getServletContext().getResourceAsStream(</span><span style="color: #000000">"</span><span style="color: #000000">/upload/sw01-1.swf</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_702_795_Open_Image" onclick="this.style.display='none'; Codehighlighter1_702_795_Open_Text.style.display='none'; Codehighlighter1_702_795_Closed_Image.style.display='inline'; Codehighlighter1_702_795_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_702_795_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_702_795_Closed_Text.style.display='none'; Codehighlighter1_702_795_Open_Image.style.display='inline'; Codehighlighter1_702_795_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getFileName()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;UnsupportedEncodingException</span><span id="Codehighlighter1_702_795_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_702_795_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">测试sw01-1.swf&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(fileName.getBytes(),</span><span style="color: #000000">"</span><span style="color: #000000">ISO8859-1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="struts2"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="downloadFile"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.download.DownloadFileAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="stream"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="contentType"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">application/octet-stream;charset=ISO8859-1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="contentDisposition"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">attachment;filename="${fileName}"</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="inputName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">inputStream</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="bufferSize"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">4096</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
今天在公司写同样的代码就是不能用迅雷下载。回到家再写一遍，我电脑上的迅雷就是可以的。hoho郁闷。今天搞了一天。没有结果。本人初步判断应该是公司电脑上的迅雷有问题。安装的时候就有些文件复制失败。hoho。。。。无语咯。
<img src ="http://www.blogjava.net/shoppingbill/aggbug/306235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shoppingbill/" target="_blank">shoppingbill</a> 2009-12-17 00:01 <a href="http://www.blogjava.net/shoppingbill/archive/2009/12/17/306235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring IoC</title><link>http://www.blogjava.net/shoppingbill/archive/2009/11/09/301700.html</link><dc:creator>shoppingbill</dc:creator><author>shoppingbill</author><pubDate>Mon, 09 Nov 2009 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/shoppingbill/archive/2009/11/09/301700.html</guid><wfw:comment>http://www.blogjava.net/shoppingbill/comments/301700.html</wfw:comment><comments>http://www.blogjava.net/shoppingbill/archive/2009/11/09/301700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shoppingbill/comments/commentRss/301700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shoppingbill/services/trackbacks/301700.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在Spring里Inversion of Control (Ioc)原理是用Dependency Injection(DI)设计模式实现的。让我们通过帮助例子来理解DI。首先我们看一个java版本的例子，然后我们会添加spring的功能。QuizMater接口暴露popQuestion()方法。1.QuizMaster.java2.----------------3.package...&nbsp;&nbsp;<a href='http://www.blogjava.net/shoppingbill/archive/2009/11/09/301700.html'>阅读全文</a><img src ="http://www.blogjava.net/shoppingbill/aggbug/301700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shoppingbill/" target="_blank">shoppingbill</a> 2009-11-09 14:34 <a href="http://www.blogjava.net/shoppingbill/archive/2009/11/09/301700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring IDE</title><link>http://www.blogjava.net/shoppingbill/archive/2009/11/09/301680.html</link><dc:creator>shoppingbill</dc:creator><author>shoppingbill</author><pubDate>Mon, 09 Nov 2009 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/shoppingbill/archive/2009/11/09/301680.html</guid><wfw:comment>http://www.blogjava.net/shoppingbill/comments/301680.html</wfw:comment><comments>http://www.blogjava.net/shoppingbill/archive/2009/11/09/301680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shoppingbill/comments/commentRss/301680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shoppingbill/services/trackbacks/301680.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Spring IDE是一个Eclipse插件帮助开发Spring 应用.首先我们先来看看怎么样安装Spring IDE，然后用Spring IDE创建我们一个Spring项目.我用的是Eclipse 3.4.1版本来演示它.安装Spring IDE,到Help -&gt; Software Updates.点击'Add Site'按钮,键入'http://sprin...&nbsp;&nbsp;<a href='http://www.blogjava.net/shoppingbill/archive/2009/11/09/301680.html'>阅读全文</a><img src ="http://www.blogjava.net/shoppingbill/aggbug/301680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shoppingbill/" target="_blank">shoppingbill</a> 2009-11-09 12:37 <a href="http://www.blogjava.net/shoppingbill/archive/2009/11/09/301680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Validation Using Annotation</title><link>http://www.blogjava.net/shoppingbill/archive/2009/11/06/301477.html</link><dc:creator>shoppingbill</dc:creator><author>shoppingbill</author><pubDate>Fri, 06 Nov 2009 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/shoppingbill/archive/2009/11/06/301477.html</guid><wfw:comment>http://www.blogjava.net/shoppingbill/comments/301477.html</wfw:comment><comments>http://www.blogjava.net/shoppingbill/archive/2009/11/06/301477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shoppingbill/comments/commentRss/301477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shoppingbill/services/trackbacks/301477.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring Validation Using Annotation            在这个例子中你会学到用spring annotation 验证。当你用注解的controller类时。validate()方法不会自动调用。            当表单提交的时候onSubmit()方法会被调用.这里你需要首先调用UserValidator 的validate()方法，然后用has...&nbsp;&nbsp;<a href='http://www.blogjava.net/shoppingbill/archive/2009/11/06/301477.html'>阅读全文</a><img src ="http://www.blogjava.net/shoppingbill/aggbug/301477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shoppingbill/" target="_blank">shoppingbill</a> 2009-11-06 18:14 <a href="http://www.blogjava.net/shoppingbill/archive/2009/11/06/301477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>