﻿<?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-viita技术空间</title><link>http://www.blogjava.net/viita/</link><description>J2EE开发</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 02:21:07 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 02:21:07 GMT</pubDate><ttl>60</ttl><item><title>MD5加密</title><link>http://www.blogjava.net/viita/archive/2008/10/21/235815.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Tue, 21 Oct 2008 15:36:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/10/21/235815.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/235815.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/10/21/235815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/235815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/235815.html</trackback:ping><description><![CDATA[&nbsp;MD5的全称是Message-digest Algorithm 5（信息-摘要算法），在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来，经MD2、MD3和MD4发展而来。
<p><span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">不管是MD2、MD4还是MD5，它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。</span></span></p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0"><span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">在MD5算法中，首先需要对信息进行填充，使其字节长度对512求余的结果等于448。因此，信息的字节长度（Bits Length）将被扩展至N*512+448，即N*64+56个字节（Bytes），N为一个正整数。填充的方法如下，在信息的后面填充一个1和无数个0，直到满足上面的条件时才停止用0对信息的填充。然后，在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理，现在的信息字节长度=N*512+448+64=(N+1)*512，即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。</span></span></span></p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0"><span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0"><span class="Apple-style-span" style="word-spacing: 0px; font: 14px/24px Arial; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体的一个MD5实现：</span></span></span></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"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.meng;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><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.security.MessageDigest;<br />
</span><span style="color: #008080">&nbsp;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">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_57_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_220_Open_Text.style.display='none'; Codehighlighter1_57_220_Closed_Image.style.display='inline'; Codehighlighter1_57_220_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_57_220_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_57_220_Closed_Text.style.display='none'; Codehighlighter1_57_220_Open_Image.style.display='inline'; Codehighlighter1_57_220_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_57_220_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_57_220_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;p&gt;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;Title:<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;/p&gt;<br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;p&gt;<br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;Description:<br />
</span><span style="color: #008080">12</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;/p&gt;<br />
</span><span style="color: #008080">13</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;p&gt;<br />
</span><span style="color: #008080">14</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;Copyright:&nbsp;Copyright&nbsp;(c)&nbsp;2003<br />
</span><span style="color: #008080">15</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;/p&gt;<br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;p&gt;<br />
</span><span style="color: #008080">17</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;Company:<br />
</span><span style="color: #008080">18</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;&lt;/p&gt;<br />
</span><span style="color: #008080">19</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;<br />
</span><span style="color: #008080">20</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;unascribed<br />
</span><span style="color: #008080">21</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;</span><span style="color: #808080">@version</span><span style="color: #008000">&nbsp;1.0<br />
</span><span style="color: #008080">22</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img id="Codehighlighter1_240_1479_Open_Image" onclick="this.style.display='none'; Codehighlighter1_240_1479_Open_Text.style.display='none'; Codehighlighter1_240_1479_Closed_Image.style.display='inline'; Codehighlighter1_240_1479_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_240_1479_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_240_1479_Closed_Text.style.display='none'; Codehighlighter1_240_1479_Open_Image.style.display='inline'; Codehighlighter1_240_1479_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;MD5&nbsp;</span><span id="Codehighlighter1_240_1479_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_240_1479_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img id="Codehighlighter1_289_382_Open_Image" onclick="this.style.display='none'; Codehighlighter1_289_382_Open_Text.style.display='none'; Codehighlighter1_289_382_Closed_Image.style.display='inline'; Codehighlighter1_289_382_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_289_382_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_289_382_Closed_Text.style.display='none'; Codehighlighter1_289_382_Open_Image.style.display='inline'; Codehighlighter1_289_382_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">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String[]&nbsp;hexDigits&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_289_382_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_289_382_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">0</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">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">2</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">3</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">4</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">5</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">6</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">7</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">9</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">b</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">c</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">e</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">f</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img id="Codehighlighter1_390_490_Open_Image" onclick="this.style.display='none'; Codehighlighter1_390_490_Open_Text.style.display='none'; Codehighlighter1_390_490_Closed_Image.style.display='inline'; Codehighlighter1_390_490_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_390_490_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_390_490_Closed_Text.style.display='none'; Codehighlighter1_390_490_Open_Image.style.display='inline'; Codehighlighter1_390_490_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_390_490_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_390_490_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">30</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;转换字节数组为16进制字串<br />
</span><span style="color: #008080">31</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080">32</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;b<br />
</span><span style="color: #008080">33</span><span style="color: #008000"><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;字节数组<br />
</span><span style="color: #008080">34</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;16进制字串<br />
</span><span style="color: #008080">35</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img id="Codehighlighter1_549_750_Open_Image" onclick="this.style.display='none'; Codehighlighter1_549_750_Open_Text.style.display='none'; Codehighlighter1_549_750_Closed_Image.style.display='inline'; Codehighlighter1_549_750_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_549_750_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_549_750_Closed_Text.style.display='none'; Codehighlighter1_549_750_Open_Image.style.display='inline'; Codehighlighter1_549_750_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;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;byteArrayToHexString(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;b)&nbsp;</span><span id="Codehighlighter1_549_750_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_549_750_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">38</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;&nbsp;StringBuffer&nbsp;resultSb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuffer();<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img id="Codehighlighter1_646_708_Open_Image" onclick="this.style.display='none'; Codehighlighter1_646_708_Open_Text.style.display='none'; Codehighlighter1_646_708_Closed_Image.style.display='inline'; Codehighlighter1_646_708_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_646_708_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_646_708_Closed_Text.style.display='none'; Codehighlighter1_646_708_Open_Image.style.display='inline'; Codehighlighter1_646_708_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;b.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_646_708_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_646_708_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">40</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultSb.append(byteToHexString(b[i]));<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">42</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;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;resultSb.toString();<br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img id="Codehighlighter1_803_968_Open_Image" onclick="this.style.display='none'; Codehighlighter1_803_968_Open_Text.style.display='none'; Codehighlighter1_803_968_Closed_Image.style.display='inline'; Codehighlighter1_803_968_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_803_968_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_803_968_Closed_Text.style.display='none'; Codehighlighter1_803_968_Open_Image.style.display='inline'; Codehighlighter1_803_968_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">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;byteToHexString(</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;b)&nbsp;</span><span id="Codehighlighter1_803_968_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_803_968_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">46</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;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;<br />
</span><span style="color: #008080">47</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;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
</span><span style="color: #008080">48</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">256</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;n;<br />
</span><span style="color: #008080">49</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;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">16</span><span style="color: #000000">;<br />
</span><span style="color: #008080">50</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;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">16</span><span style="color: #000000">;<br />
</span><span style="color: #008080">51</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;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;hexDigits[d1]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;hexDigits[d2];<br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img id="Codehighlighter1_1021_1369_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1021_1369_Open_Text.style.display='none'; Codehighlighter1_1021_1369_Closed_Image.style.display='inline'; Codehighlighter1_1021_1369_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1021_1369_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1021_1369_Closed_Text.style.display='none'; Codehighlighter1_1021_1369_Open_Image.style.display='inline'; Codehighlighter1_1021_1369_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;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;MD5Encode(String&nbsp;origin)&nbsp;</span><span id="Codehighlighter1_1021_1369_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_1021_1369_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">55</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;&nbsp;String&nbsp;resultString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">56</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">57</span><span style="color: #000000"><img id="Codehighlighter1_1072_1300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1072_1300_Open_Text.style.display='none'; Codehighlighter1_1072_1300_Closed_Image.style.display='inline'; Codehighlighter1_1072_1300_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1072_1300_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1072_1300_Closed_Text.style.display='none'; Codehighlighter1_1072_1300_Open_Image.style.display='inline'; Codehighlighter1_1072_1300_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_1072_1300_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_1072_1300_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">58</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(origin);<br />
</span><span style="color: #008080">59</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDigest&nbsp;md&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MessageDigest.getInstance(</span><span style="color: #000000">"</span><span style="color: #000000">MD5</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">60</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;byteArrayToHexString(md.digest(resultString<br />
</span><span style="color: #008080">61</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getBytes()));<br />
</span><span style="color: #008080">62</span><span style="color: #000000"><img id="Codehighlighter1_1323_1334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1323_1334_Open_Text.style.display='none'; Codehighlighter1_1323_1334_Closed_Image.style.display='inline'; Codehighlighter1_1323_1334_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1323_1334_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1323_1334_Closed_Text.style.display='none'; Codehighlighter1_1323_1334_Open_Image.style.display='inline'; Codehighlighter1_1323_1334_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_1323_1334_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_1323_1334_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">63</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">64</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">65</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;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;resultString;<br />
</span><span style="color: #008080">66</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">67</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">68</span><span style="color: #000000"><img id="Codehighlighter1_1415_1477_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1415_1477_Open_Text.style.display='none'; Codehighlighter1_1415_1477_Closed_Image.style.display='inline'; Codehighlighter1_1415_1477_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1415_1477_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1415_1477_Closed_Text.style.display='none'; Codehighlighter1_1415_1477_Open_Image.style.display='inline'; Codehighlighter1_1415_1477_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;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_1415_1477_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_1415_1477_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">69</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;&nbsp;System.err.println(MD5Encode(</span><span style="color: #000000">"</span><span style="color: #000000">哈哈</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
</span><span style="color: #008080">70</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">71</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">72</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;&nbsp;<br />
</span><span style="color: #008080">73</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">74</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">75</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">76</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/viita/aggbug/235815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-10-21 23:36 <a href="http://www.blogjava.net/viita/archive/2008/10/21/235815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精通hibernate（孙卫琴）</title><link>http://www.blogjava.net/viita/archive/2008/09/15/228965.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Mon, 15 Sep 2008 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/09/15/228965.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/228965.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/09/15/228965.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/228965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/228965.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前边发的资料可能因为空间的原因，不能下载，在这里给大家道歉了，但是给我留言的那两个朋友我已经把资料发到了他们邮箱，这次我用了魔力方的网盘供大家下载，呵呵 也希望大家多关注IT技术交流网站<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.52ict.cn">www.52ict.cn</a>&nbsp;&nbsp; 每天更新中！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载地址&nbsp; http://pickup.mofile.com/1662917638866465 </p>
<img src ="http://www.blogjava.net/viita/aggbug/228965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-09-15 11:10 <a href="http://www.blogjava.net/viita/archive/2008/09/15/228965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精通hibernate（孙卫琴） pdf版</title><link>http://www.blogjava.net/viita/articles/228963.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Mon, 15 Sep 2008 02:57:00 GMT</pubDate><guid>http://www.blogjava.net/viita/articles/228963.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/228963.html</wfw:comment><comments>http://www.blogjava.net/viita/articles/228963.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/228963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/228963.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;找了好长时间才找到的&nbsp;&nbsp;&nbsp; 我只是希望能找到更多大家可以用的上的好东西&nbsp; 呵呵 <a title="精通hibernate(孙卫琴)" href=""  href_cetemp>精通hibernate(孙卫琴)</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也希望大家多关心下我的新博客&nbsp;&nbsp; <a href="http://www.52ict.cn">www.52ict.cn</a>&nbsp; 专注于编程经验交流&nbsp; 技术分享&nbsp; 呵呵&nbsp;&nbsp; 有什么技术上的分享可以给我的网站留言&nbsp; 里面也有好多分享资源供大家下载&nbsp; 呵呵&nbsp; 记住哦&nbsp; &nbsp;&nbsp; 
<img src ="http://www.blogjava.net/viita/aggbug/228963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-09-15 10:57 <a href="http://www.blogjava.net/viita/articles/228963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>希望大家继续关注我的新博</title><link>http://www.blogjava.net/viita/archive/2008/09/10/228235.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Wed, 10 Sep 2008 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/09/10/228235.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/228235.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/09/10/228235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/228235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/228235.html</trackback:ping><description><![CDATA[&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; <a title="清华大学JAVA教程1.rar" href=""  href_cetemp>清华大学JAVA教程1.rar</a><br />
&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;&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; <a title="清华大学JAVA教程2.rar" href=""  href_cetemp>清华大学JAVA教程2.rar</a><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家如果喜欢可以继续关注我的新博客<a href="http://www.52ict.cn">www.52ict.cn</a>
<img src ="http://www.blogjava.net/viita/aggbug/228235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-09-10 22:59 <a href="http://www.blogjava.net/viita/archive/2008/09/10/228235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搬家也得做贡献！</title><link>http://www.blogjava.net/viita/archive/2008/09/10/228234.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Wed, 10 Sep 2008 14:56:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/09/10/228234.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/228234.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/09/10/228234.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/228234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/228234.html</trackback:ping><description><![CDATA[嘿嘿&nbsp; 给大家一点有用的东西吧&nbsp;&nbsp; JAVA图形设计卷下载：&nbsp;<a href=""  href_cetemp>link</a>
<img src ="http://www.blogjava.net/viita/aggbug/228234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-09-10 22:56 <a href="http://www.blogjava.net/viita/archive/2008/09/10/228234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将开源继续到底_我的博客搬家了（www.52ict.cn）</title><link>http://www.blogjava.net/viita/archive/2008/09/10/228230.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Wed, 10 Sep 2008 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/09/10/228230.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/228230.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/09/10/228230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/228230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/228230.html</trackback:ping><description><![CDATA[<p>最近这几天一直在忙着弄我的网站，所以没有在上面更新文章，&nbsp; 还好现在我的新窝已经成型，还希望原来关注的&nbsp; 还有现在的朋友能多去逛逛&nbsp; 每天都会给大家更新最新的东东哦 嘿嘿 <br />
<a href="http://www.52ict.cn">www.52ict.cn</a>&nbsp; 域名还不错吧 嘿嘿 我自己起的 郁闷的是没啥好的啦 都被别人起光了 哎~~~~</p>
<img src ="http://www.blogjava.net/viita/aggbug/228230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-09-10 22:51 <a href="http://www.blogjava.net/viita/archive/2008/09/10/228230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己写画图程序（基于工厂模式，MVC，单态模式）</title><link>http://www.blogjava.net/viita/archive/2008/08/28/225207.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Thu, 28 Aug 2008 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/08/28/225207.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/225207.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/08/28/225207.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/225207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/225207.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自己写的这个画图程序感觉还是不错的，并不是说功能多么全面，最重要是里面代码之间的关系处理，以及实现思想，大家学习交流下&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a title="Draw.rar" href="/Files/viita/Draw.rar">Draw.rar</a>&nbsp;</p>
<img src ="http://www.blogjava.net/viita/aggbug/225207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-08-28 10:49 <a href="http://www.blogjava.net/viita/archive/2008/08/28/225207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己动手写struts</title><link>http://www.blogjava.net/viita/archive/2008/08/27/224924.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Wed, 27 Aug 2008 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/08/27/224924.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/224924.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/08/27/224924.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/224924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/224924.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 仅仅停留在会用struts是远远不够的，最好能够自己实现struts，这样对于其中的运行机制可以有很好的理解，在以后使用的时候也可以炉火纯青<br />
<br />
&nbsp;&nbsp;&nbsp; 自己写的一个struts <a href="/Files/viita/DIYStruts.rar" title="DIY STRUTS">DIY STRUTS</a><br />
<img src ="http://www.blogjava.net/viita/aggbug/224924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-08-27 09:29 <a href="http://www.blogjava.net/viita/archive/2008/08/27/224924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts标签</title><link>http://www.blogjava.net/viita/archive/2008/08/23/223880.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Sat, 23 Aug 2008 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/08/23/223880.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/223880.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/08/23/223880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/223880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/223880.html</trackback:ping><description><![CDATA[<div>
<p>Struts是Apache Jakarta的一个著名的开源项目，目标是为构建基于Java的web应用程序提供一个框架。</p>
<p>Struts提供了非常多的标签，依据功能和使用习惯的不同被分到了五个标签库中:</p>
<ul>
    <li>Bean Tags:该标签库包含的标签可以用来创建bean、访问bean和访问bean的属性。同时提供了依据cookies、headers和parameters的值创建相关bean的能力。
    <li>HTML Tags:该标签库包含的标签可以用来创建Struts输入表单。
    <li>Logic Tags:该标签库包含的标签可以用来进行逻辑判断、集合迭代和流程控制。
    <li>Nested Tags:该标签库建立在前三个标签库的基础上，具有前三个标签库的所有功能，只是允许标签间的嵌套。
    <li>Tiles Tags:该标签库包含的标签可以用来创建tiles样式的页面。 </li>
</ul>
<p>这篇指南主要介绍前三个标签库中的标签。</p>
<h2><a name="d3e77">bean:cookie</a></h2>
<p>cookie最早是由Netscape公司提出来的，用来存储客户的少量状态信息。</p>
<p>bean:cookie标签取回请求中名称为name的cookie的值。如果没有指定multiple属性则依据刚取回的值创建一个Cookie类型的bean。如果指定了multiple属性则依据刚取回的值创建一个Cookie[]类型的数组。然后用id属性值将Cookie或Cookie[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值)，并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。</p>
<p>下面的代码片段示例了如何使用bean:cookie标签读取名为JSESSIONID的cookie的值，并且使用了两种方式进行了输出：</p>
<pre>&lt;logic:present cookie="JSESSIONID"&gt;
&lt;bean:cookie id="jSession" name="JSESSIONID"/&gt;
&lt;!-- 其它标签通过绑定到page作用域中的属性使用该值 --&gt;
这个cookie的名称是&lt;bean:write name="jSession" property="name"/&gt;，值为&lt;bean:write name="jSession" property="value"/&gt;。&lt;br/&gt;
&lt;!-- JSP脚本通过scripting变量使用该值 --&gt;
&lt;%
String name = jSession.getName();
String value = jSession.getValue();
out.println("这个cookie的名称是"+name+"，值为"+value+"。&lt;br/&gt;");
%&gt;
&lt;/logic:present&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e98">bean:define</a></h2>
<p>bean:define标签在toScope(如果没有指定值就使用page作用域)指定的作用域中创建一个新属性，同时创建一个scripting变量。我们可以通过id值使用它们。新创建的属性可以由其它标签使用，而新创建的scripting变量可以由JSP脚本使用。</p>
<p>我们可以使用三种方式为新创建的属性和scripting变量赋值：
<ul>
    <li>通过该标签的name、property和scope取回值，并且保持类型的一致性，除非取回的值为Java的原始类型，这时会使用适合的包装器类对这些值进行包装。
    <li>通过该标签的value指定值，这时新创建的属性和scripting变量的类型为java.lang.String。
    <li>通过在该标签的体中嵌入值，这时新创建的属性和scripting变量的类型为java.lang.String。 </li>
</ul>
<p>&nbsp;</p>
<p>下面的代码片段示例了如何使用bean:define标签创建新属性values和新scripting变量values，它将listForm中persons的值取出来赋给values:</p>
<pre>&lt;bean:define id="values" name="listForm" property = "persons" type="java.util.List"/&gt;
</pre>
<p>下面给出ListForm的代码片段以帮助您更好的理解，其中Person是一个只有id和name两个属性的简单bean：</p>
<pre>public class ListForm extends ActionForm {
private List&lt;Person&gt; persons = null;
public List&lt;Person&gt; getPersons() {
return persons;
}
public void setPersons(List&lt;Person&gt; persons) {
this.persons = persons;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
persons = null;
}
}
</pre>
<p>下面的代码片段示例了logic:iterate标签如何使用bean:define标签创建的新属性values:</p>
<pre>&lt;logic:iterate id="person" name="values"&gt;
&lt;bean:write name="person" property="id"/&gt;&lt;br/&gt;
&lt;/logic:iterate&gt;
</pre>
<p>下面的代码片段示例了JSP脚本如何使用bean:define标签创建的新scripting变量values:</p>
<pre>&lt;%
Person p = new Person();
for(int i=0;i&lt;values.size();i++){
p = (Person)values.get(i);
out.println(p.getId());
out.println("&lt;br/&gt;");
}
%&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e148">bean:header</a></h2>
<p>bean:header标签取回请求中名称为name的header的值。如果没有指定multiple属性则依据刚取回的值创建一个String类型的bean。如果指定了multiple属性则依据刚取回的值创建一个String[]类型的数组。然后用id属性值将String或String[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值)，并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。</p>
<p>下面是我的浏览器发送的header的内容，这些内容和浏览器有关，因此您的浏览器发送的内容可能和下面列出的不同。不过这没有关系，因为要理解bean:header标签您只要对这些内容有一个大概的认识就足够了。</p>
<pre>accept: */*
accept-language: zh-cn
accept-encoding: gzip, deflate
user-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
host: localhost:8080
connection: Keep-Alive
</pre>
<p>下面的代码片段示例了如何使用bean:header标签读取名为User-Agent的header的值，并且使用了两种方式进行了输出：</p>
<pre>&lt;logic:present header="User-Agent"&gt;
&lt;!-- 其它标签通过绑定到page作用域中的属性使用该值 --&gt;
您的浏览器是&lt;bean:header id="userAgent" name="User-Agent"/&gt;
&lt;bean:write name="userAgent"/&gt;。&lt;br/&gt;
&lt;!-- JSP脚本通过scripting变量使用该值 --&gt;
&lt;%
out.println("您的浏览器是"+userAgent+"。&lt;br/&gt;");
%&gt;
&lt;/logic:present&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e169">bean:include</a></h2>
<p>bean:include标签对指定url(由forward、href或page确定)处的资源做一个请求，将响应数据作为一个String类型的bean绑定到page作用域，同时创建一个scripting变量。我们可以通过id值访问它们。</p>
<p>下面的代码片段示例了bean:include标签的用法，其中include.txt文件包含要include的内容，然后将这些内容输出:</p>
<pre>&lt;bean:include id="value" page="/include.txt"/&gt;
&lt;!-- 其它标签通过绑定到page作用域中的属性使用该值 --&gt;
&lt;bean:write name="value"/&gt;&lt;br/&gt;
&lt;!-- JSP脚本通过scripting变量使用该值 --&gt;
&lt;%
out.println(value);
%&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e184">bean:message</a></h2>
<p>bean:message标签用来从指定的locale中取回国际化的消息并输出，在这个过程中我们还可以传递五个以内的参数。message key可以通过key直接指定，也可以通过name和property间接的指定。</p>
<p>bean:message标签有两种指定message key的方式，一是通过key属性直接指定；二是通过name和property属性间接的指定，其中message key是在message resources文件中定义的。</p>
<p>我们可以在struts-config.xml文件中使用&lt;message-resources&gt;来设置message resources文件。</p>
<p>为了介绍该标签我使用了三个message resources文件，三个文件的名字分别为Resources.properties、Resources_en.properties和Resources_zh.properties。在struts-config.xml文件中的设置(这里不用设置三个，struts会依据locale自动找到对应的文件)如下：</p>
<pre>&lt;message-resources parameter="Resources" /&gt;
</pre>
<p>三个message resources文件中定义的message key为：</p>
<pre>&lt;!-- Resources.properties --&gt;
resource=Resources.properties.
from=Resources.properties.
&lt;!-- Resources_en.properties --&gt;
from=Resources_en.properties.
&lt;!-- Resources_zh.properties
因为文件的编码被限制为ISO8859所以要有汉字必须用jdk的native2ascii提前转换
--&gt;
from=Resources_zh.properties.
</pre>
<p>下面的代码片段示例了bean:message标签的用法:</p>
<pre>&lt;bean:message key="from"/&gt;&lt;br/&gt;
&lt;bean:message key="resource"/&gt;&lt;br/&gt;
&lt;html:link action="/locale?language=en"&gt;English&lt;/html:link&gt;
&lt;html:link action="/locale?language=zh"&gt;Chinese&lt;/html:link&gt;
</pre>
<p>上面的代码中含有改变locale的两个html:link标签，要使它们工作您的struts-config.xml文件中必须含有下面定义的form和action:</p>
<pre>&lt;form-bean name="localeForm" type="org.apache.struts.action.DynaActionForm"&gt;
&lt;form-property name="language" type="java.lang.String" /&gt;
&lt;form-property name="country" type="java.lang.String" /&gt;
&lt;!--action成功后要跳到那里--&gt;
&lt;form-property name="page"  type="java.lang.String" initial="/message.jsp"/&gt;
&lt;/form-bean&gt;
&lt;action path="/locale" type="org.apache.struts.actions.LocaleAction" name="localeForm" scope="request"&gt;&lt;/action&gt;
</pre>
<p>在不同的locale下我们得到了如下的两个结果：</p>
<pre>在locale为zh时的结果：
Resources_zh.properties.
Resources.properties.
在locale为en时的结果：
Resources_en.properties.
Resources.properties.
</pre>
<p>让我们来看一下在locale为zh时如何得到的是上面的结果。因为locale为zh所以&lt;bean:message key="from"/&gt;&lt;br/&gt;先找Resources_zh.properties这个文件从中得到form键的值。而&lt;bean:message key="resource"/&gt;&lt;br/&gt;也会先找Resources_zh.properties这个文件但这次没有找到resource键，这时Struts会到Resources.properties这个文件中找，很幸运这里找到了。如果还没有找到，或message resource文件不存在就会抛出异常。当locale为en时类似，您可以自己试试。 </p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e235">bean:page</a></h2>
<p>bean:page标签将页上下文中的application、config、request、response 或 session取出，然后用id属性值将它们绑定到page作用域中(这种绑定是为了其它标签能够使用该值)，并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。</p>
<p>下面的代码片段示例了bean:page标签取出response，然后使用bean:write标签将response的characterEncoding和contentType属性输出：</p>
<pre>&lt;bean:page id="res" property="response"/&gt;
&lt;!-- 其它标签通过绑定到page作用域中的属性使用该值 --&gt;
&lt;bean:write name="res" property="characterEncoding"/&gt;&lt;br/&gt;
&lt;bean:write name="res" property="contentType"/&gt;&lt;br/&gt;
&lt;!-- JSP脚本通过scripting变量使用该值 --&gt;
&lt;%
String characterEncoding = res.getCharacterEncoding();
String contentType = res.getContentType();
out.println(characterEncoding+"&lt;br/&gt;");
out.println(contentType+"&lt;br/&gt;");
%&gt;
</pre>
<p>您可以用和上面类似的代码访问application、config、request 或 session中的任何一个对象。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e253">bean:parameter</a></h2>
<p>bean:parameter标签取回请求中的参数值。如果没有指定multiple属性则依据刚取回的值创建一个String类型的bean。如果指定了multiple属性则依据刚取回的值创建一个String[]类型的数组。然后用id属性值将String或String[]绑定到page作用域中(这种绑定是为了其它标签能够使用该值)，并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。</p>
<p>下面的两个代码片段使用相同的url传递参数，url的形式为http://127.0.0.1:8080/struts-demo/parameter.jsp?param=1&amp;param=2&amp;param=3。前面的代码片段中没有指定multiple属性，因此p是String类型而且仅仅读取了参数的第一个值。后面的代码片段中指定了multiple属性的值，因此ps是String[]类型的包含所有参数的值。</p>
<pre>&lt;bean:parameter id="p" name="param"/&gt;
&lt;bean:write name="p"/&gt;
</pre>
<pre>&lt;bean:parameter id="ps" multiple="true" name="param"/&gt;
&lt;logic:iterate id="p" name="ps"&gt;
&lt;bean:write name="p"/&gt;&lt;br/&gt;
&lt;/logic:iterate&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e271">bean:resource</a></h2>
<p>bean:resource标签取回指定的web应用程序的资源，以InputStream或String的形式保存到page作用域中并且创建scripting变量。采用什么形式取决于标签的input属性，如果指定input则以InputStream的形式保存，如果没有指定input则以String的形式保存。</p>
<p>下面的两个代码片段示例了bean:resource标签，其中resource.txt是要使用的资源文件。前面的代码片段中没有指定input属性，因此以String的形式处理资源文件，bean:write标签输出资源文件的内容。后面的代码片段中指定了input属性的值，因此以InputStream的形式使用资源文件，两个bean:write标签分别输出InputStream对象的实例名(如java.io.ByteArrayInputStream@16dadf9)和类名(如class java.io.ByteArrayInputStream)。 </p>
<pre>&lt;bean:resource id="str" name="/resource.txt"/&gt;
&lt;!-- 其它标签通过绑定到page作用域中的属性使用该值 --&gt;
&lt;bean:write name="str"/&gt;&lt;br/&gt;
&lt;!-- JSP脚本通过scripting变量使用该值 --&gt;
&lt;%
out.println(str+"&lt;br/&gt;");
%&gt;
</pre>
<pre>&lt;bean:resource id="is" input="true" name="/resource.txt"/&gt;
&lt;!-- 其它标签通过绑定到page作用域中的属性使用该值 --&gt;
&lt;bean:write name="is"/&gt;&lt;br/&gt;
&lt;bean:write name="is" property="class"/&gt;
&lt;!-- JSP脚本通过scripting变量使用该值 --&gt;
&lt;%
out.println(is+"&lt;br/&gt;");
out.println(is.getClass()+"&lt;br/&gt;");
%&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e290">bean:size</a></h2>
<p>bean:size标签创建一个java.lang.Integer类型的bean，这个bean的值为该标签指定的Collection或Map中所含元素的个数。 这可以和logic:iterate标签配合使用，因为logic:iterate标签不能得到所叠代的集合的元素的个数，这有时候很不方便。 </p>
<p>下面的代码片段示例了bean:size标签取出persons中还有元素的个数，其中listForm和persons的定义参见bean:define标签部分：</p>
<pre>&lt;logic:notEmpty name="listForm" property = "persons"&gt;
&lt;bean:size id="size" name="listForm" property = "persons"/&gt;
&lt;bean:write name="size"/&gt;
&lt;/logic:notEmpty&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e305">bean:struts</a></h2>
<p>bean:struts标签取回Struts的内部对象formBean、forward或mapping的值，然后用id绑定到page作用域中(这种绑定是为了其它标签能够使用该值)，并创建对应的scripting变量(这种变量是为了JSP脚本能够使用该值)。</p>
<p>下面的代码片段示例了bean:struts标签取出listForm对象，让我们先来看一下listForm的定义在读代码：</p>
<pre>&lt;!-- listForm的定义&lt;form-bean name="listForm" type="org.solo.struts.form.ListForm" /&gt; --&gt;
&lt;bean:struts id="listFormBean" formBean="listForm"/&gt;
name:&lt;bean:write name="listFormBean" property="name"/&gt;&lt;br/&gt;
type:&lt;bean:write name="listFormBean" property="type"/&gt;&lt;br/&gt;
dynamic:&lt;bean:write name="listFormBean" property="dynamic"/&gt;&lt;br/&gt;
</pre>
<p>上面代码运行的结果为：</p>
<pre>name:listForm
type:org.solo.struts.form.ListForm
dynamic:false
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e326">bean:write</a></h2>
<p>bean:write标签将指定的bean的属性值写到当前的JspWriter中，并且可以对输出进行格式化。</p>
<p>下面的代码片段示例了bean:write标签输出User-Agent：</p>
<pre>&lt;logic:present header="User-Agent"&gt;
&lt;bean:header id="header" name="User-Agent"/&gt;
&lt;bean:write name="header"/&gt;
&lt;/logic:present&gt;
</pre>
<p>下面的代码片段示例了bean:write标签格式化输出当前日期，其中now是在DataForm中定义的一个java.util.Date类型的域(值为new Date())，format.date.standard是在资源文件中的一个键(format.date.standard=yyyy-MM-dd)：</p>
<pre>&lt;bean:define id="date" name="dataForm" property="now"/&gt;
&lt;br/&gt;&lt;bean:write name="date"/&gt;
&lt;br/&gt;&lt;bean:write name="date" format="MM/dd/yyyy"/&gt;
&lt;br/&gt;&lt;bean:write name="date" formatKey="format.date.standard"/&gt;
</pre>
<p>上面代码运行的结果为：</p>
<pre>Sun Jun 04 17:04:05 CST 2006
06/04/2006
2006-06-04
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e355">html:base</a></h2>
<p>虽然这里的标题是html:base标签，但是这里也是这篇指南要介绍的第一个Struts html标签。因此我想在这里从整体上简单的介绍一下，最后给出一个对照表。其中的绝大多数标签就不一一介绍了，要介绍的也不会在这里介绍，而是将其独立出来以显重要性。</p>
<p>从用户处收集数据是动态web应用非常重要的一个方面，因此构建输入表单也就自然而然的成为struts框架的一个重要内容。Struts html标签库含有创建Struts输入表单的标签，和其它标签库(bean、logic、nested和tiles)中的标签一起协作就可以产生基于html的用户界面。</p>
<p>下面的对照表会使您对Struts html标签库有一个整体的印象：</p>
<p>
<div>图示 1. Struts HTML标签和HTML元素对照表</div>
<img height="755" alt="Struts HTML标签和HTML元素对照表" src="http://www.solol.org/technologic/java/j-struts/strutshtmlvshtml.gif" width="679" />
<p>&nbsp;</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e378">html:cancel</a></h2>
<p>html:cancel标签生成一个取消按钮。当点击该按钮后action servlet会绕过相应的form bean的validate()方法，同时将控制权交给相应的action。在该action中可以使用Action.isCancelled(HttpServletRequest)方法判断是否被取消了。如果返回true表示这个action被取消了，否则表示这个action没有被取消。</p>
<p>请注意，如果您修改了html:cancel标签的property属性值，那么struts提供的cancel探测机制就失效了，您自己必须提供类似的机制。</p>
<p>下面是可取消的action的配置文件，注意&lt;set-property property="cancellable" value="true"/&gt;这一行，如果不添加Struts会抛出org.apache.struts.action.InvalidCancelException异常。这是我在完成本指南的过程中发现的唯一向下不兼容的地方。</p>
<pre>&lt;action path="/cancel"
type="org.solo.struts.action.CancelAction" name="cancelForm" scope="request"&gt;
&lt;set-property property="cancellable" value="true"/&gt;
&lt;forward name="success" path="/cancel.jsp" /&gt;
&lt;/action&gt;
</pre>
<p>下面是html:cancel标签的代码：</p>
<pre>&lt;html:cancel&gt;取消&lt;/html:cancel&gt;
</pre>
<p>下面是对应的action中的代码：</p>
<pre>if(isCancelled(request)){
//action被取消时要做的事情写在这里
return mapping.findForward("cancel");
}else{
//action没有被取消时要做的事情写在这里
return mapping.findForward("success");
}
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e409">html:select</a></h2>
<p>html:select标签生成一个select元素。是单选还是多选取决于该标签的multiple属性。如果指定了multiple="true"则为多选，此时对应的属性应该是一个数组。如果没有指定multiple="true"则为单选，此时对应的属性应该是标量。</p>
<p>注意：为了正确的处理没有做任何的选择的情况，在ActionForm中的reset()方法中必须将标量属性设置为默认值而将数组的长度置为0。</p>
<p>另外的一个重要问题就是struts如何生成option元素了，这个任务struts交给了html:option、html:options和html:optionsCollection三个标签。</p>
<p>html:option标签</p>
<p>html:option标签生成一个HTML的option元素。该标签必须嵌在html:select标签中。它的显示文本来自其标签体，也可以来自于资源文件。它的value属性用来指定什么值将要被提交。</p>
<pre>&lt;html:option value="one"&gt;one&lt;/html:option&gt;
&lt;html:option value="two"&gt;two&lt;/html:option&gt;
</pre>
<p>html:options标签</p>
<p>html:options标签生成多个HTML的option元素。该标签必须嵌在html:select标签中。而且工作方式有些特殊，它的name与property属性和其它标签的name与property属性意义不一致，让我们具体看一下它的工作方式。</p>
<ul>
    <li>指定collection属性
    <li>没有指定collection属性 </li>
</ul>
<p>指定collection属性</p>
<p>让我通过示例来介绍在指定collection属性时该标签的工作方式，首先要说明selectForm中的persons和listForm中的persons完全一致。请参见bean:define标签。</p>
<p>下面的代码先利用bean:define标签将selectForm中的persons取到page作用域中，然后html:options标签再依据collection="personCollection"选中这个persons并将其中的每一个对象(Person类型)生成一个option元素。该标签的property="id"表示persons中的对象(Person类型)的id属性将作为option元素的value值。该标签的labelProperty="name"表示persons中的对象(Person类型)的name属性将作为option元素的label值。</p>
<p>当这个select提交时所选择的值将被提交到selectForm(name="selectForm")中的person对象(这是在SelectForm中声明的一个Person类型的域专门用来接收提交的值)的id属性中(property="person.id")。</p>
<pre>&lt;bean:define id="personCollection" name="selectForm"  property="persons"/&gt;
&lt;html:select name="selectForm" property="person.id" size="1"&gt;
&lt;html:options collection="personCollection" property="id" labelProperty="name"/&gt;
&lt;/html:select&gt;
</pre>
<p>没有指定collection属性</p>
<p>让我通过示例来介绍没有指定collection属性时该标签的工作方式，先来看看ids和names的定义：</p>
<pre>  private List&lt;String&gt; ids = null;
private List&lt;String&gt; names = null;
</pre>
<p>上面的代码来自SelectForm，其中ids是一个String的列表，names也是一个String的列表。我们暂时假定这两个列表含有相同数目的元素。有了这些让我们开始介绍下面的代码。html:options标签用ids中的第i个值作为option元素的value值同时使用names中相同位置的值(第i个值)作为option元素的label值。如果ids比names长那么多出的ids中的值将即作为option的value又作为option的label。如果ids比names短那么多出的names的值会被丢掉。</p>
<p>当这个select提交时所选择的值将被提交到selectForm(name="selectForm")中的person对象(这是在SelectForm中声明的一个Person类型的域专门用来接收提交的值)的id属性中(property="person.id")。</p>
<pre>&lt;html:select name="selectForm" property="person.id" size="1"&gt;
&lt;html:options property="ids" labelProperty="names"/&gt;
&lt;/html:select&gt;
</pre>
<p>html:optionsCollection标签</p>
<p>html:optionsCollection标签生成多个HTML的option元素。该标签必须嵌在html:select标签中。它的功能和html:options标签的相同，但是它的name与property属性和其它标签的name与property属性意义一致，理解起来比较自然。</p>
<p>让我通过示例来介绍html:optionsCollection标签的用法。首先依据name="selectForm"和property="persons"取到selectForm中的persons列表，然后将列表中的对象(Person类型)的id属性作为option元素的value值(value="id")，将列表中的对象(Person类型)的name属性作为option元素的label值(label="name")。</p>
<pre>&lt;html:select name="selectForm" property="person.id" size="1"&gt;
&lt;html:optionsCollection name="selectForm" property="persons" label="name" value="id"/&gt;
&lt;/html:select&gt;
</pre>
<p>下面是一个多选的示例，虽然示例中使用了html:options标签，但是html:option和html:optionsCollection也能够用来多选。而且您还必须意识到html:option、html:options和html:optionsCollection这三个标签可以同时使用。代码中的personIds是SelectForm中声明的一个String[]类型的数组用来接收提交的多个值。</p>
<pre>&lt;html:select name="selectForm" property="personIds" multiple="true" size="2"&gt;
&lt;html:options property="ids" labelProperty="names"/&gt;
&lt;/html:select&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e504">html:checkbox</a></h2>
<p>html:check标签生成一个checkbox。这里的value值可以是true，yes或on。如果您要提交其它的值(如某种形式的标识)应该考虑使用html:multibox标签。</p>
<p>注意:为了正确的处理没有选中的checkbox您必须在reset()中设置对应的属性为false。</p>
<p>下面的代码示例了html:checkbox标签的用法，其中CheckboxForm中声明了三个boolean类型的域，如下：</p>
<pre>  &lt;!-- 略掉了get方法(也可以是isXXX形式)和set方法 --&gt;
private boolean one = false;
private boolean two = false;
private boolean three = false;
</pre>
<pre>&lt;html:checkbox name="checkboxForm" property="one"&gt;One&lt;/html:checkbox&gt;
&lt;html:checkbox name="checkboxForm" property="two"&gt;Two&lt;/html:checkbox&gt;
&lt;html:checkbox name="checkboxForm" property="three"&gt;Three&lt;/html:checkbox&gt;
</pre>
<p>如果选中后被提交则相应的属性的值为true。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e529">html:radio</a></h2>
<p>html:radio标签生成一个radio。主要的用法有两种，下面我们通过代码来示例。</p>
<p>下面的代码示例了html:radio标签的一般用法，如果被提交则选中的radio的value值将被提交到radioForm中的id中。</p>
<pre>&lt;html:radio name="radioForm" property="id" value="00001"&gt;One&lt;/html:radio&gt;
&lt;html:radio name="radioForm" property="id" value="00002"&gt;Two&lt;/html:radio&gt;
</pre>
<p>下面的代码示例了html:radio标签的典型用法，其中的persons和bean:define标签中的一致，您可以参考bean:define标签。我只介绍这个&lt;html:radio idName="person" property="id" value="id"&gt;，idName指定html:radio要使用的bean(这里为person)，value="id"表示person的id属性将作为radio元素的value值而property="id"表示提交时选中的radio的值将被提交给radioForm中的id属性。 </p>
<pre>&lt;logic:notEmpty name="radioForm" property="persons"&gt;
&lt;logic:iterate id="person" name="radioForm" property="persons"&gt;
&lt;html:radio idName="person" property="id" value="id"&gt;
&lt;bean:write name="person" property="name"/&gt;
&lt;/html:radio&gt;
&lt;/logic:iterate&gt;
&lt;/logic:notEmpty&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e550">html:multibox</a></h2>
<p>html:multibox标签生成多个checkbox。当您要使用大量的checkbox时使用这个标签非常方便，可以使您避免在ActionForm中声明大量的boolean类型的变量，带之以一个数组就行了。</p>
<p>注意:为了正确的处理没有选中的checkbox您必须在reset()中设置数组的长度为0。</p>
<p>下面的代码示例了html:multibox标签的一般用法，如果被提交则选中的所有checkbox的value值将被提交到multiboxForm中的selectedItems中，这是一个String[]数组。</p>
<pre>&lt;html:multibox name="multiboxForm" property="selectedItems" value="00001"/&gt;
&lt;html:multibox name="multiboxForm" property="selectedItems" value="00002"/&gt;
</pre>
<p>下面的代码示例了html:multibox标签的典型用法：</p>
<pre>&lt;logic:iterate id="person" name="multiboxForm" property="persons"&gt;
&lt;html:multibox property="selectedItems"&gt;
&lt;bean:write name="person" property="id"/&gt;
&lt;/html:multibox&gt;
&lt;bean:write name="person" property="name"/&gt;
&lt;/logic:iterate&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e576">html:link</a></h2>
<p>html:link标签生成一个锚点(&lt;a&gt;)元素。我从html:link标签如何构造基本url和如何构造query参数两个方面来介绍这个标签。</p>
<p>构造基本url是依据该标签的如下四个属性进行的，这四个属性一次只能出现一个。让我们看看它们：
<ul>
    <li>forward，指定一个全局ActionForward的名称。另外如果forward是module相关的则该forward必须指向一个action而不能是一个页面。
    <li>action，指定一个Action的名称。
    <li>href，struts会直接使用这个值而不会对其进行任何处理。
    <li>page，指定一个页面的路径，必须以/开始。 </li>
</ul>
<p>&nbsp;</p>
<p>构造query参数，下面列举了可能的形式，其中baseurl只是一个占位符：
<ul>
    <li>baseurl?p=00001(单参单值)
    <li>baseurl?p1=00001&amp;p2=00002&amp;p3=00003(多参单值)
    <li>baseurl?p=00001&amp;p=00002&amp;p=00003(单参多值)
    <li>baseurl?p1=00001&amp;p2=00002&amp;p=00001&amp;p=00002&amp;p=00003(混合) </li>
</ul>
<p>&nbsp;</p>
<p>下面我们以代码示例来说明每一种html:link的用法，首先让我们花点时间看看相关action中的代码：</p>
<pre>&lt;!-- 下面所有代码的数据都是在这里构造的 --&gt;
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {
DataForm dataForm = (DataForm) form;
dataForm.setParam("00001");
HashMap paramSingleMap = new HashMap();
paramSingleMap.put("p1","00001");
paramSingleMap.put("p2","00002");
paramSingleMap.put("p3","00003");
dataForm.setParamSingleMap(paramSingleMap);
HashMap paramMultiMap = new HashMap();
paramMultiMap.put("p",new String[]{"00001","00002","00003"});
dataForm.setParamMultiMap(paramMultiMap);
HashMap paramSMMap = new HashMap();
paramSMMap.put("p1","00001");
paramSMMap.put("p2","00002");
paramSMMap.put("p",new String[]{"00001","00002","00003"});
dataForm.setParamSMMap(paramSMMap);
List&lt;Person&gt; persons = new ArrayList&lt;Person&gt;();
Person person1 = new Person();
person1.setId("00001");
person1.setName("赵辰");
Person person2 = new Person();
person2.setId("00002");
person2.setName("李为芳");
Person person3 = new Person();
person3.setId("00003");
person3.setName("王微");
persons.add(person1);
persons.add(person2);
persons.add(person3);
dataForm.setPersons(persons);
return mapping.findForward("success");
}
</pre>
<pre>&lt;!-- 这用来设置一个位置 --&gt;
&lt;html:link linkName="top"/&gt;
&lt;!-- 这用来定位到上面的那个位置 --&gt;
&lt;html:link page="/link.do" anchor="top"&gt;Go Top&lt;/html:link&gt;
</pre>
<pre>&lt;html:link page="/link.do" paramId="p" paramName="dataForm" paramProperty="param"&gt;单参单值&lt;/html:link&gt;&lt;br/&gt;
&lt;html:link page="/link.do" name="dataForm" property="paramSingleMap"&gt;多参单值&lt;/html:link&gt;&lt;br/&gt;
&lt;html:link page="/link.do" name="dataForm" property="paramMultiMap"&gt;单参多值&lt;/html:link&gt;&lt;br/&gt;
&lt;html:link page="/link.do" name="dataForm" property="paramSMMap"&gt;混合&lt;/html:link&gt;
</pre>
<p>下面的代码示例了html:link标签的indexed属性和indexId属性的用法，这两个属性只有html:link标签嵌套在logic:iterate标签中时才可用。</p>
<pre>&lt;logic:iterate id="person" name="dataForm" property="persons"&gt;
&lt;html:link action="/link.do" paramId="person" paramName="person" paramProperty="id" indexed="true" indexId="number"&gt;person&lt;/html:link&gt;
&lt;br/&gt;
&lt;/logic:iterate&gt;
&lt;!-- 下面是上面代码的运行结果(产生的html)
&lt;a href="/struts-demo/link.do?person=00001&amp;number=0"&gt;赵辰&lt;/a&gt;&lt;br/&gt;
&lt;a href="/struts-demo/link.do?person=00002&amp;number=1"&gt;李为芳&lt;/a&gt;&lt;br/&gt;
&lt;a href="/struts-demo/link.do?person=00003&amp;number=2"&gt;王微&lt;/a&gt;&lt;br/&gt;
其中的number是由indexId="number"确定的，而该参数的值为元素在集合中的位置。
--&gt;
</pre>
<p>html:rewrite标签和html:link标签类似只是不生成锚点(&lt;a&gt;)，而是简单的输出字符串。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e643">html:errors</a></h2>
<p>html:errors标签和html:messages标签的功能相似，所以我们放到一起来介绍。</p>
<p>html:errors标签将由name属性指定的ActionMessages、ActionErrors、String和String[]直接输出到页面中。</p>
<p>html:messages标签将用由name属性(注意message属性值对它的影响)指定的ActionMessages、ActionErrors、String和String[]创建一个新的属性和scripting变量，使用id属性值作为名称。</p>
<p>html:errors标签和html:messages标签的property属性是用来为errors和messages分类的。我们可以给这两个标签指定property属性，以便只显示某一类的错误或消息。</p>
<p>在资源文件增加了如下的内容：</p>
<pre># -- standard errors --
errors.header=&lt;ul&gt;
errors.prefix=&lt;li&gt;
errors.suffix=&lt;/li&gt;
errors.footer=&lt;/ul&gt;
error=error with none value .
error1=error1 with one value is {0} .
error2=error2 with two values are {0} , {1} .
error3=error3 with three values are {0} , {1} , {2} .
error4=error4 with four values are {0} , {1} , {2} ,{3} .
</pre>
<p>下面的代码示例了actionErrors的构造：</p>
<pre>public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors actionErrors = new ActionErrors();
actionErrors.add("property1",
new ActionMessage("error"));
actionErrors.add("property2",
new ActionMessage("error1","value0"));
actionErrors.add("property2",new ActionMessage("error2","value0","value1"));
actionErrors.add("property3",new ActionMessage("error3","value0","value1","value2"));
actionErrors.add("property3",new ActionMessage("error4","value0","value1","value2","value3"));
actionErrors.add("property4", new ActionMessage("error1",new Object[]{"value0"}));
actionErrors.add("property4", new ActionMessage("error2",new Object[]{"value0","value1"}));
actionErrors.add("property4", new ActionMessage("error3",new Object[]{"value0","value1", "value2"}));
actionErrors.add("property5",new ActionMessage("error4",new Object[]{"value0","value1", "value2","value3"}));
actionErrors.add("notBundle",new ActionMessage("not a bundle key",false));
return actionErrors;
}
</pre>
<p>errors标签代码示例：</p>
<pre>&lt;html:errors/&gt;
&lt;br/&gt;
&lt;html:errors property="property4"/&gt;
</pre>
<p>messages标签代码示例：</p>
<pre>&lt;logic:messagesPresent&gt;
&lt;ul&gt;
&lt;html:messages id="message"&gt;
&lt;li&gt;&lt;bean:write name="message"/&gt;&lt;/li&gt;
&lt;/html:messages&gt;
&lt;/ul&gt;
&lt;/logic:messagesPresent&gt;
&lt;br/&gt;
&lt;logic:messagesPresent&gt;
&lt;ul&gt;
&lt;html:messages id="message" property="property4"&gt;
&lt;li&gt;&lt;bean:write name="message"/&gt;&lt;/li&gt;
&lt;/html:messages&gt;
&lt;/ul&gt;
&lt;/logic:messagesPresent&gt;
</pre>
<p>
<div>图示 2. 上面的两段代码示例运行结果相同，如下所示：</div>
<img height="368" alt="运行结果" src="http://www.solol.org/technologic/java/j-struts/errorsmessages.gif" width="553" />
<p>&nbsp;</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e695">html:javascript</a></h2>
<p>html:javascript标签生成用于校验的javascript脚本代码。</p>
<p>下面的代码片段示例了html:javascript标签的基本用法，其中formName属性的值是在validation.xml文件的&lt;formset&gt;中定义的form的名称。有一点值得注意的是在确定&lt;formset&gt;时要使用合适的language属性值。</p>
<pre>&lt;html:javascript formName="dataForm"/&gt;
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e711">html:xhtml</a></h2>
<p>html:xhtml标签在页面中一出现就是告诉该页的所有其它的Struts html标签以XHTML1.0兼容的形式输出。这和将html:html标签的xhtml属性值指定为true有些类似。如果上述情况都没有出现，Struts html标签将以html4.01兼容的形式输出。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e720">logic:iterate</a></h2>
<p>logic:iterate标签用来迭代集合，您可以使用如下方式来为这个标签指定其要叠代的集合：</p>
<ul>
    <li>使用一个运行时表达式，这个表达式的值是一个集合。
    <li>用name属性引用一个JSP Bean，这个JSP Bean本身就是一个集合。
    <li>用name属性引用一个JSP Bean，这个JSP Bean的一个属性是一个集合，这时可以联合使用property来指定这个集合。 </li>
</ul>
<p>上面所提到的集合可以是：</p>
<ul>
    <li>对象类型或原子类型的数组(Array)。
    <li>java.util.Collection的实现，包括ArrayList，Vector。
    <li>java.util.Enumeration的实现。
    <li>java.util.Iterator的实现。
    <li>java.util.Map的实现，包括HashMap，Hashtable和TreeMap。 </li>
</ul>
<p>如果您叠代的集合中含有null的值，这时需要采取一定的措施，因为这时logic:iterate不会在page作用域中创建对象。一般是使用&lt;logic:present&gt;标签或&lt;logic:notPresent&gt;标签来判断一下。</p>
<p>下面是logic:iterate叠代ArrayList的示例的对象引用关系和部分代码：</p>
<p>
<div>图示 3. logic:iterate中对象的引用关系</div>
<img height="258" alt="logic:iterate中对象的引用关系" src="http://www.solol.org/technologic/java/j-struts/iterate.gif" width="614" />
<p>&nbsp;</p>
<p>图中的persons列表是在ListAction中填充的，在这里只是简单的加入了三个Person对象，在实际的应用中这些数据应该取自数据库。具体的代码如下：</p>
<pre>public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request,	HttpServletResponse response) {
ListForm listForm = (ListForm) form;
List&lt;Person&gt; persons = new ArrayList&lt;Person&gt;();
Person person1 = new Person();
person1.setId("00001");
person1.setName("赵辰");
Person person2 = new Person();
person2.setId("00002");
person2.setName("李为芳");
Person person3 = new Person();
person3.setId("00003");
person3.setName("王微");
persons.add(person1);
persons.add(person2);
persons.add(person3);
listForm.setPersons(persons);
return mapping.findForward("success");
}
</pre>
<p>标签输出的结果为：</p>
<pre>00001--&gt;赵辰
00002--&gt;李为芳
00003--&gt;王微
</pre>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e789">logic:present</a></h2>
<p>如果指定的值出现该标签就会创建其标签体内的内容。该标签用于以下情况：</p>
<ul>
    <li>检查具有指定名称的cookie是否出现。
    <li>检查具有指定名称的header是否出现。
    <li>检查具有指定名称的JSP Bean是否出现 或 检查具有指定名称的JSP Bean中的property属性是否出现。
    <li>检查request中指定名称的参数是否出现。
    <li>检查当前的认证用户是否与指定的安全角色相关联。
    <li>检查当前认证的主体是否具有指定的名字。 </li>
</ul>
<p>下面的代码示例了logic:present标签检查具有指定名称User-Agent的header是否出现：</p>
<pre>&lt;logic:present header="User-Agent"&gt;
您的浏览器是&lt;bean:header id="userAgent" name="User-Agent"/&gt; &lt;bean:write name="userAgent"/&gt;。&lt;br/&gt;
&lt;/logic:present&gt;
</pre>
<p>logic:notPresent标签的应用正好和logic:present标签相反。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e830">logic:messagesPresent</a></h2>
<p>logic:messagesPresent标签用于以下情况：</p>
<ul>
    <li>在request作用域中存在一个ActionMessages对象，标签的property属性和ActionMessages中的property对应。
    <li>在request作用域中存在一个ActionErrors对象，标签的property属性和ActionErrors中的property对应。
    <li>存在一个String对象，将其转换(构造)成ActionMessage然后在添加到ActionMessages中。
    <li>存在一个String Array对象，将数组中的每一个String转换成一个ActionMessage，在将其添加到ActionMessages中。 </li>
</ul>
<p>标签的message属性值为true时将以Globals.MESSAGE_KEY为key在request作用域中查找Message，其它情况下，将name的值作为key查找，如果name 没有出现，默认值为Globals.ERROR_KEY。 </p>
<p>下面的代码示例了logic:messagesPresent标签的典型用法：</p>
<pre>&lt;logic:messagesPresent&gt;
&lt;ul&gt;
&lt;html:messages id="message"&gt;
&lt;li&gt;&lt;bean:write name="message"/&gt;&lt;/li&gt;
&lt;/html:messages&gt;
&lt;/ul&gt;
&lt;/logic:messagesPresent&gt;
</pre>
<p>标签logic:messagesNotPresent的应用正好和logic:messagesPresent的应用相反。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e867">logic:empty</a></h2>
<p>logic:empty标签是用来判断是否为空的。如果为空，该标签体中嵌入的内容就会被处理。该标签用于以下情况：</p>
<ul>
    <li>当Java对象为null时
    <li>当String对象为""时
    <li>当java.util.Collection对象中的isEmpty()返回true时
    <li>当java.util.Map对象中的isEmpty()返回true时 </li>
</ul>
<p>下面的代码示例了logic:empty标签判断集合persons是否为空：</p>
<pre>&lt;logic:empty name="listForm" property = "persons"&gt;
&lt;div&gt;集合persons为空!&lt;/div&gt;
&lt;/logic:empty&gt;
</pre>
<p>logic:notEmpty标签的应用正好和logic:empty标签相反。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e900">logic:match</a></h2>
<p>logic:match标签用来处理子串匹配问题。</p>
<p>如果指定的值匹配该标签就会创建其标签体内的内容。该标签用于以下情况：
<ul>
    <li>检查具有指定名称的cookie是否与该标签的value匹配。
    <li>检查具有指定名称的header是否与该标签的value匹配。
    <li>检查具有指定名称的JSP Bean是否与该标签的value匹配 或 检查具有指定名称的JSP Bean中的property属性值是否与该标签的value匹配。
    <li>检查request中指定名称的参数值是否与该标签的value匹配。 </li>
</ul>
<p>&nbsp;</p>
<p>下面的代码示例了logic:match标签的典型用法：</p>
<pre>&lt;logic:present header="User-Agent"&gt;
&lt;logic:match header="User-Agent" value="MSIE 6.0"&gt;MS IE 6.0&lt;/logic:match&gt;
&lt;/logic:present&gt;
</pre>
<p>logic:notMatch标签的应用正好和logic:match标签相反。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e937">logic:equal</a></h2>
<p>这里要介绍的不只是logic:equal(=)标签，而是要介绍一类标签，这类标签完成比较运算，包括：</p>
<ul>
    <li>logic:equal(=)
    <li>logic:notEqual(!=)
    <li>logic:greaterEqual(&gt;=)
    <li>logic:lessEqual(&lt;=)
    <li>logic:graterThan(&gt;)
    <li>logic:lessThan(&lt;) </li>
</ul>
<p>该类标签的用法类似，我们只介绍logic:equal标签，其它的留给您自己去完成。</p>
<p>logic:equal是用来判断是否相等的。如果相等，该标签体中嵌入的内容就会被处理。该标签用于以下情况：</p>
<ul>
    <li>比较由该标签的cookie属性指定的cookie的值是否与该标签的value属性值相等。
    <li>比较由该标签的header属性指定的header的值是否与该标签的value属性值相等。
    <li>比较由该标签的name属性指定的JSP Bean是否与该标签的value属性值相等(property属性不出现)或比较由该标签的name属性指定的JSP Bean中的property属性值是否与该标签的value属性值相等。
    <li>比较由该标签的parameter属性指定的参数值(request中)是否与该标签的value属性值相等。 </li>
</ul>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e989">logic:forward</a></h2>
<p>我觉得将forward和redirect这两个动作放到一起对比着介绍更加有利于理解，基于此原因也就将logic:forward和logic:redirect这两个标签也拿到这里一起介绍了。</p>
<p>让我们看看这两个动作的区别：
<ul>
    <li>forward是在servlet内部执行，浏览器完全不会感知到这个动作，原始的url也不会改变，浏览器重新装载的话也只是对原始的请求进行简单的重复。
    <li>redirect则分成两个步骤：第一步是web应用程序告诉浏览器第二个url，然后浏览器向第二个url发送请求。 </li>
</ul>
<p>&nbsp;</p>
<p>redirect比forward慢，因为浏览器要做二次请求。还有就是要注意，在第一次的请求作用域(request作用域)内的bean对于第二次请求是不可见的。</p>
<p>理解了上面描述的区别也就知道了什么时候该选用logic:forward标签什么时候该选用logic:redirect标签了。logic:forward标签完成PageContext.forward()或HttpServletResponse.sendRedirect()，如何选择由控制器决定。logic:redirect标签完成HttpServletResponse.sendRedirect()。</p>
<p>在使用logic:redirect标签时我们可以向使用html:link一样构造baseurl和query参数。如果您感兴趣可以参考html:link标签。</p>
<div><a title="回页首" href="http://www.solol.org/technologic/java/j-struts/#top"><font color="#0066cc"></font></a>&nbsp;</div>
<h2><a name="d3e1019">总结</a></h2>
<p>这篇指南的背景是Struts-1.2.9，其中的所有的代码示例也都是在这个版本下调试通过的。目前Struts仍然在快速的发展中，但是从开发者应用的角度来讲还是比较稳定的。因此我有理由相信其中的代码示例也可以很好的运行在其它的版本之上。最后希望这篇指南能够让您心情愉快！</p>
</div>
<img src ="http://www.blogjava.net/viita/aggbug/223880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-08-23 17:21 <a href="http://www.blogjava.net/viita/archive/2008/08/23/223880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第六章　XML相关资源</title><link>http://www.blogjava.net/viita/archive/2008/08/21/223583.html</link><dc:creator>viita</dc:creator><author>viita</author><pubDate>Thu, 21 Aug 2008 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/viita/archive/2008/08/21/223583.html</guid><wfw:comment>http://www.blogjava.net/viita/comments/223583.html</wfw:comment><comments>http://www.blogjava.net/viita/archive/2008/08/21/223583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/viita/comments/commentRss/223583.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/viita/services/trackbacks/223583.html</trackback:ping><description><![CDATA[一. XML的大本营<br />
　　二. XML指南<br />
　　三. XML常见问题<br />
　　四. XML主题网站<br />
　　五. XML的编辑软件<br />
　　六. 支持XML的浏览器<br />
　　七. XML parser <br />
　　八. Schema编辑软件<br />
　　九. 国内XML资源
<p>　　<strong>一. XML的大本营</strong></p>
<p>　　XML是由W3C(World Wide Web Consortium)国际组织负责开发和制定标准的。关于XML最权威，最新的消息都来自W3C。<br />
　　网址是：<a href="http://w3c.org/XML/" target="_blank">http://w3c.org/XML/</a> <br />
　　另外一个名为OASIS的前著名的SGML研究组织也在一起推动XML的发展，网址是：<a href="http://www.oasis-open.org/" target="_blank">http://www.oasis-open.org/</a> </p>
<p>　　<strong>二. XML指南</strong></p>
<p>　　<a href="http://www.w3.org/TR/REC-xml" target="_blank">http://www.w3.org/TR/REC-xml</a> <br />
　　W3C关于XML规范的详细，完整的说明。不用多说，绝对权威。<br />
　　<a href="http://www.xml.com/axml/testaxml.htm" target="_blank">http://www.xml.com/axml/testaxml.htm</a> <br />
　　这是Tim Bary写的XML规范说明书，非常的详细和严密，是学习XML规范的好帮手。</p>
<p>　　<strong>三. XML常见问题</strong></p>
<p>　　Peter Flynn的XML FAQ <br />
　　<a href="http://www.ucc.ie/xml/" target="_blank">http://www.ucc.ie/xml/</a> <br />
　　包含大量详细的资料，经常更新，由W3C协会XML组维护。<br />
　　Lisa Rein&#8217;s finetuning XML FAQs <br />
　　<a href="http://www.finetuning.com/faq.html" target="_blank">http://www.finetuning.com/faq.html</a> <br />
　　这个FAQ列表有侧重点，主要包含XSLT FAQ,XPath FAQ和IE5中的XSL FAQ。<br />
　　Dave Pawson&#8217;s XSL FAQ <br />
　　<a href="http://www.dpawson.co.uk/xsl/idx.html" target="_blank">http://www.dpawson.co.uk/xsl/idx.html</a> <br />
　　提供最好的关于XSL方面的FAQ，创建于1999年。<br />
　　jGuru&#8217;s Extensible Markup Language (XML) FAQ <br />
　　<a href="http://www.jguru.com/jguru/faq/faqpage.jsp?name=XML" target="_blank">http://www.jguru.com/jguru/faq/faqpage.jsp?name=XML</a> <br />
　　这个FAQ列表是一个典型的"老百晓"，任何问题，从普通的到非常细节的XML问题都可以在这里找到。<br />
　　Ronald Bourret&#8217;s XML Namespaces FAQ <br />
　　<a href="http://www.informatik.tu-darmstadt.de/DVS1/staff/bourret/xml/NamespacesFAQ.htm" target="_blank">http://www.informatik.tu-darmstadt.de/DVS1/staff/bourret/xml/NamespacesFAQ.htm</a> <br />
　　创建于2000初，是关于namespaces概要的FAQ。</p>
<p>　　<strong>四. XML主题网站</strong></p>
<p>　　<a href="http://www.xml.com/" target="_blank">http://www.xml.com/</a> <br />
　　一个以XML为主题的内容丰富的网站<br />
　　<a href="http://www.xml-zone.com/" target="_blank">http://www.xml-zone.com/</a> <br />
　　另一个比较知名的XML网站，提供XML的新闻和资讯。<br />
　　<a href="http://www.xmlinfo.com/" target="_blank">http://www.xmlinfo.com/</a> <br />
　　网站创建者James Tauber&#8217;s是W3C组织XML发展组的成员之一，他的网站提供了大量的连接和例子。<br />
　　<a href="http://www.simonstl.com/" target="_blank">http://www.simonstl.com/</a> <br />
　　网站创建者Simon St. Laurent也是XML发展组的成员。他是W3C中XML初级入门教程的作者，他的站点主要提供有关XML的发展信息。<br />
　　<a href="http://msdn.microsoft.com/xml/c-frame.htm#/xml/default.asp" target="_blank">http://msdn.microsoft.com/xml/c-frame.htm#/xml/default.asp</a> <br />
　　微软的MSDN关于XML的主题网站。微软在推进XML应用方面不遗余力。<br />
　　<a href="http://www.xmlsoftware.com/" target="_blank">http://www.xmlsoftware.com/</a> <br />
　　是XML info的姐妹网站，内容包括XML/DTD/XSL编辑软件，XML API软件等。<br />
　　<a href="http://xmlhack.com/" target="_blank">http://xmlhack.com/</a> <br />
　　1999年9月建立的大型XML新闻网站，同时提供XML人才信息。<br />
　　<a href="http://xml.apache.org/" target="_blank">http://xml.apache.org/</a> <br />
　　Apache软件基金会(ASF),提供了大量open source的XML和XSL的工具软件。<br />
　　<a href="http://www.biztalk.org/" target="_blank">http://www.biztalk.org/</a> <br />
　　BizTalk是微软发起的以XML商业应用为目标的组织。BizTalk不是一个标准组织。</p>
<p>　　<strong>五. XML的编辑软件</strong></p>
<p>　　目前XML文档的编辑软件依然很少。虽然我们可以手工编写，但是如果有一个好的软件(类似用DW/FP编写HTML)，可以减少差错和提高效率。下面是现有的一些编辑软件。<br />
　　<a href="http://www.macromedia.com/software/dreamweaver/" target="_blank">http://www.macromedia.com/software/dreamweaver/</a> <br />
　　Macromedia最新的Dreamweaver 4.0已经支持XML文档的编写。推荐使用。<br />
　　<a href="http://www.microsoft.com/xml/notepad/intro.asp" target="_blank">http://www.microsoft.com/xml/notepad/intro.asp</a> <br />
　　微软在这方面向来不会落后，它推出的XML Notepad是一个非常小巧灵活的XML文档编辑器。推荐使用。<br />
　　<a href="http://www.adobe.com/prodindex/framemaker/prodinfosgml.html" target="_blank">http://www.adobe.com/prodindex/framemaker/prodinfosgml.html</a> <br />
　　Adobe公司的Framemaker plus是目前较好的XML编辑软件。<br />
　　<a href="http://www.arbortext.com/" target="_blank">http://www.arbortext.com/</a> <br />
　　Arbortext公司是重点开发XML游戏的公司。<br />
　　<a href="http://www.inso.com/" target="_blank">http://www.inso.com/</a> <br />
　　Inso，好象是用来处理大型SGML或者XML文档的软件。<br />
　　<a href="http://www.softquad.com/" target="_blank">http://www.softquad.com/</a> <br />
　　Softquad 是HTML和SGML软件的开发商，对XML自然不会放过。</p>
<p>　　<strong>六. 支持XML的浏览器</strong></p>
<p>　　<a href="http://www.microsoft.com/windows/ie/" target="_blank">http://www.microsoft.com/windows/ie/</a> <br />
　　IE 5.X是目前流行浏览器唯一支持XML的，它可以在微软的网站免费下载到。<br />
　　<a href="http://developer.netscape.com/software/communicator/ngl/index.html?cp=dev09fg01" target="_blank">http://developer.netscape.com/software/communicator/ngl/index.html?cp=dev09fg01</a> <br />
　　Gecko是另一种支持XML的浏览器，但目前只是测试版。</p>
<p>　　<strong>七. XML parser</strong> </p>
<p>　　Parser是一个检查XML文档语法是否符合DTD定义，并进行解析的软件。<br />
　　在线的parser <br />
　　<a href="http://validator.w3.org/" target="_blank">http://validator.w3.org/</a> <br />
　　W3C组织提供的一个在线paeser。可以根据你在线提交的XML文档URL，进行验证和解吸。<br />
　　<a href="http://www.stg.brown.edu/service/xmlvalid/" target="_blank">http://www.stg.brown.edu/service/xmlvalid/</a> <br />
　　一个Brown大学科技小组提供的parser，非常方便和容易理解。。<br />
　　可下载的Parser <br />
　　有很多可以下载到本机上运行的parser,下面列出一些主要的：<br />
　　<a href="http://www.jclark.com/xml/expat.html" target="_blank">http://www.jclark.com/xml/expat.html</a> <br />
　　James Clark是在SGML/XML领域的元老，他写的parser被广泛的运用。<br />
　　<a href="http://www.alphaworks.ibm.com/tech/xml" target="_blank">http://www.alphaworks.ibm.com/tech/xml</a> <br />
　　一个以Java语言编写的Parser，来自IBM。<br />
　　<a href="http://www.microsoft.com/xml/parser/cparser.asp" target="_blank">http://www.microsoft.com/xml/parser/cparser.asp</a> <br />
　　微软的XML Parser，用C++写成。<br />
　　<a href="http://www.stud.ifi.uio.no/%7Elarsga/download/python/xml/xmlproc.html" target="_blank">http://www.stud.ifi.uio.no/~larsga/download/python/xml/xmlproc.html</a> <br />
　　用Python写的parser。<br />
　　<a href="http://www.jeremie.com/Dev/XML/" target="_blank">http://www.jeremie.com/Dev/XML/</a> <br />
　　用Javascript写的parser，只用来检查语法，不进行解吸析。<br />
　　<a href="http://w3c.org/RDF/Implementations/SiRPAC/" target="_blank">http://w3c.org/RDF/Implementations/SiRPAC/</a> <br />
　　来自W3C组织的SiRPAC，全称是Simple RDF Parser and Compiler。</p>
<p>　　<strong>八. Schema编辑软件</strong></p>
<p>　　Schema我们前面介绍过，DTD就是一种Schema，我们可以手工写DTD，但现在已经有一些Schema编辑软件来帮助我们更方便的建立DTD。<br />
　　<a href="http://www.extensibility.com/" target="_blank">http://www.extensibility.com/</a> <br />
　　Extensibility这个软件被称为XML权威。可以以图形化方式建立和编辑schema，包括DTD文件。<br />
　　九. 国内XML资源<br />
　　<a href="http://www.xml.net.cn/" target="_blank">http://www.xml.net.cn/</a> <br />
　　XML中国论坛是一个非赢利的学术网站。由北京大学计算机科学与技术研究所创办，北大方正集团公司提供赞助。<br />
　　<a href="http://www.xml.org.cn:8188/" target="_blank">http://www.xml.org.cn:8188</a> <br />
　　中国XML联盟将建立为国内第一个开放性网络标准组织，提供XML技术认证、咨询和交流。由上海易方公司赞助。<br />
　　<a href="http://www.xml.com.cn/" target="_blank">http://www.xml.com.cn/</a> <br />
　　chinaasp.com的子站，提供XML文章和技术交流等。<br />
　　<a href="http://www.egroups.com/group/china_xml_list/info.html" target="_blank">http://www.egroups.com/group/china_xml_list/info.html</a> <br />
　　中国XML邮件组包括中文XML资源, XML的最新资料,同行的交流空间。由非盈利性组织中国XML联盟负责维护。<br />
　　<a href="http://weblab.crema.unimi.it/xmlzh/XML_FAQ.htm" target="_blank">http://weblab.crema.unimi.it/xmlzh/XML_FAQ.htm</a> <br />
　　一个XML FAQ邮件列表的中文翻译，可惜是1998年10月的。<br />
　　-------------- 全文完-----------</p>
<img src ="http://www.blogjava.net/viita/aggbug/223583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/viita/" target="_blank">viita</a> 2008-08-21 20:31 <a href="http://www.blogjava.net/viita/archive/2008/08/21/223583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>