﻿<?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-super-nini</title><link>http://www.blogjava.net/super-nini/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 08:55:27 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 08:55:27 GMT</pubDate><ttl>60</ttl><item><title>转：14个常用的Javascript操作</title><link>http://www.blogjava.net/super-nini/archive/2011/06/23/352865.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 23 Jun 2011 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2011/06/23/352865.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/352865.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2011/06/23/352865.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/352865.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/352865.html</trackback:ping><description><![CDATA[<div>14個經典的Javascript代碼(常见的操作代码：另存、打开、刷新等)</div>
<div>&nbsp;<strong><font color="#000099">原文地址</font></strong> <a href="http://www.80x86.cn/article.asp?id=780" target="_blank">http://www.80x86.cn/article.asp?id=780</a> </div>
<div>&#9632;打開&#9632;&nbsp;<br />　　&lt;input&nbsp;name=Button&nbsp;onClick=document.all.WebBrowser.ExecWB(1,1)&nbsp;type=button&nbsp;value=打開&gt;&nbsp;<br />　　&lt;OBJECT&nbsp;classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2&nbsp;height=0&nbsp;id=WebBrowser&nbsp;width=0&gt;&lt;/OBJECT&gt;<br />　　&nbsp;<br />　　&#9632;另存為&#9632;&nbsp;<br />　 　&lt;input&nbsp;name=Button&nbsp;onClick=document.all.WebBrowser.ExecWB(4,1)&nbsp;type=button&nbsp;value =另存為&gt;&lt;OBJECT&nbsp;classid=CLSID:8856F961-340A-11D0-A96B- 00C04FD705A2&nbsp;height=0&nbsp;id=WebBrowser&nbsp;width=0&gt;&lt;/OBJECT&gt;&nbsp;<br />　　<br />　　&#9632;屬性&#9632;&nbsp;<br />　 　&lt;input&nbsp;name=Button&nbsp;onClick=document.all.WebBrowser.ExecWB(10,1)&nbsp;type= button&nbsp;value=屬性&gt;&lt;OBJECT&nbsp;classid=CLSID:8856F961-340A-11D0-A96B- 00C04FD705A2&nbsp;height=0&nbsp;id=WebBrowser&nbsp;width=0&gt;&lt;/OBJECT&gt;&nbsp;<br />　　<br />　　&#9632;打印&#9632;&nbsp;<br />　 　&lt;input&nbsp;name=Button&nbsp;onClick=document.all.WebBrowser.ExecWB(6,1)&nbsp;type=button&nbsp;value =打印&gt;&lt;OBJECT&nbsp;classid=CLSID:8856F961-340A-11D0-A96B- 00C04FD705A2&nbsp;height=0&nbsp;id=WebBrowser&nbsp;width=0&gt;&lt;/OBJECT&gt;&nbsp;<br />　　<br />　　&#9632;頁面設置&#9632;&nbsp;<br />　 　&lt;input&nbsp;name=Button&nbsp;onClick=document.all.WebBrowser.ExecWB(8,1)&nbsp;type=button&nbsp;value =頁面設置&gt;&lt;OBJECT&nbsp;classid=CLSID:8856F961-340A-11D0-A96B- 00C04FD705A2&nbsp;height=0&nbsp;id=WebBrowser&nbsp;width=0&gt;&lt;/OBJECT&gt;&nbsp;<br />　　<br />　　&#9632;刷新&#9632;&nbsp;<br />　　&lt;input&nbsp;type=button&nbsp;value=刷新&nbsp;name=refresh&nbsp;onclick="window.location.reload()"&gt;&nbsp;<br />　　<br />　　&#9632;導入收藏&#9632;&nbsp;<br />　　&lt;input&nbsp;type="button"&nbsp;name="Button"&nbsp;value="導入收藏夾"&nbsp;onClick=window.external.ImportExportFavorites(true,);&gt;&nbsp;<br />　　<br />　　&#9632;導出收藏&#9632;&nbsp;<br />　　&lt;input&nbsp;type="button"&nbsp;name="Button3"&nbsp;value="導出收藏夾"&nbsp;onClick=window.external.ImportExportFavorites(false,);&gt;<br />　　&nbsp;<br />　　&#9632;加入收藏&#9632;&nbsp;<br />　　&lt;INPUT&nbsp;name=Button2&nbsp;onclick="window.external.AddFavorite(location.href,&nbsp;document.title)"&nbsp;type=button&nbsp;value=加入收藏夾&gt;&nbsp;<br />　　<br />　　&#9632;整理收藏夾&#9632;&nbsp;<br />　　&lt;INPUT&nbsp;name=Submit2&nbsp;onclick="window.external.ShowBrowserUI(OrganizeFavorites,&nbsp;null)"&nbsp;type=button&nbsp;value=整理收藏夾&gt;<br />　　&nbsp;<br />　　&#9632;查看原文件&#9632;&nbsp;<br />　　&lt;INPUT&nbsp;name=Button&nbsp;onclick=window.location&nbsp;=&nbsp;"view-source:"&nbsp;+&nbsp;window.location.href&nbsp;type=button&nbsp;value=查看源文件&gt;&nbsp;<br />　　<br />　　&#9632;語言設置&#9632;&nbsp;<br />　　&lt;INPUT&nbsp;name=Button&nbsp;onclick="window.external.ShowBrowserUI(LanguageDialog,&nbsp;null)"&nbsp;type=button&nbsp;value=語言設置&gt;&nbsp;<br />　　<br />　　&#9632;前進&#9632;&nbsp;<br />　　&lt;INPUT&nbsp;name=Submit&nbsp;onclick=history.go(1)&nbsp;type=submit&nbsp;value=前進&gt;&nbsp;<br />　　<br />　　&#9632;後退&#9632;&nbsp;<br />　　&lt;INPUT&nbsp;name=Submit2&nbsp;onclick=history.go(-1)&nbsp;type=submit&nbsp;value=後退&gt; <br /><br /></div>
<p align="left">&nbsp;</p><img src ="http://www.blogjava.net/super-nini/aggbug/352865.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2011-06-23 11:40 <a href="http://www.blogjava.net/super-nini/archive/2011/06/23/352865.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：CSS行高与行对齐精解：line-height 和 vertical-align （图文）</title><link>http://www.blogjava.net/super-nini/archive/2010/09/13/331883.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Mon, 13 Sep 2010 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/09/13/331883.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/331883.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/09/13/331883.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/331883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/331883.html</trackback:ping><description><![CDATA[<h2 class="postTitle"><a href="http://5d0d.net/2009/05/07/css%e8%a1%8c%e9%ab%98%e4%b8%8e%e8%a1%8c%e5%af%b9%e9%bd%90%e7%b2%be%e8%a7%a3%ef%bc%9aline-height-%e5%92%8c-vertical-align-%ef%bc%88%e5%9b%be%e6%96%87%ef%bc%89/">CSS行高与行对齐精解：line-height 和 vertical-align （图文）</a></h2>
<div class="postMeta">目录 <a title="显示css的所有日志" href="http://5d0d.net/category/css/" rel="category tag">css</a> 日期 2009.05.07</div>
<hr />
<div class="postMeta"><iframe height="60" marginheight="0" src="http://affiliate.godaddy.com/ad/20A93CE15F4E0E532FD3EB4997A9A4F8AFCA1FAEF56C4D399DEDFF0C601051E6" frameborder="0" width="468" allowTransparency marginwidth="0" scrolling="no"></iframe></div>
<!--鱼加 GoDaddy广告-->
<div class="postContent">
<h3><span style="color: #ff0000">7.3 line-height</span></h3>
<p><span style="font-size: small">行高指的是文本行的基线间的距离，但是文本之间的空白距离不仅仅是行高决定的，同时也受字号的影响。</span></p>
<p></p>
<p><span style="font-size: small"><strong>7.3.1</strong><strong> </strong><strong>语法</strong><strong></strong></span></p>
<p><span style="font-size: small">line-height属性的具体定义列表如下：</span></p>
<p><span style="font-size: small">语法： line-height : normal | &lt;实数&gt; | &lt;长度&gt; | &lt;百分比&gt; | inherit<br />
说明： 设置元素中行的高度。<br />
值： normal：默认行高，一般为1到1.2； 实数：实数值，缩放因子； 长度：合法的长度值，可为负数； 百分比：百分比取值基于元素的字体尺寸。<br />
初始值： normal<br />
继承性： 继承<br />
适用于： 所有元素<br />
媒体： 视觉<br />
计算值： 长度和百分比值为绝对值；其他同指定值。</span></p>
<p><span style="font-size: small">行高指的是文本行的基线间的距离。而基线（Base line），指的是一行字横排时下沿的基础线，基线并不是汉字的下端沿，而是英文字母x的下 端沿，同时还有文字的顶线（Top line）、中线（Middle line）和底线（Bottom line），用以确定文字行的位置，如图7-17 所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image001.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image001" src="http://5d0d.net/files/2009/05/clip-image001-thumb.gif" width="504" height="155" /></span></a><br />
<span style="font-size: small">图7-17 文字的基线</span></p>
<p><span style="font-size: small">行高与字体尺寸的差称为<strong>行距</strong>（leading），如图7-18所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image0021.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image002" src="http://5d0d.net/files/2009/05/clip-image002-thumb1.gif" width="406" height="146" /></span></a><br />
<span style="font-size: small">图7-18 行高与行距</span></p>
<p><span style="font-size: small"><strong>7.3.2</strong><strong> </strong><strong>内容区域、行内框和行框</strong><strong></strong></span></p>
<p><span style="font-size: small">理论上讲，一行中的每个元素都有一个内容区域，它是由字体尺寸决定的，如图7-19所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image0031.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image003" src="http://5d0d.net/files/2009/05/clip-image003-thumb1.gif" width="281" height="117" /></span></a><br />
<span style="font-size: small">图7-19 内容区域</span></p>
<p><span style="font-size: small">行内元素会生成一个行内框（inline box），行内框只是一个概念，它无法显示出来，但是它又确实存在。在没有其他因素影响的时候，行内框等于内容区域，而设定行高则可以增加或者减少行内框的高度，即：将行距的值（行高-字体尺寸）除以2，分别增加到内容区域的上下两边，如图7-20所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image0041.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image004" src="http://5d0d.net/files/2009/05/clip-image004-thumb1.gif" width="363" height="143" /></span></a><br />
<span style="font-size: small">图7-20 行内框与行高</span></p>
<p><span style="font-size: small">由于行高可以应用在任何元素上，因此同一行内的若干元素可能有不同的行高和行内框高，例如有如下代码，其显示如图7-21所示。</span></p>
<blockquote>
<p><span style="font-size: small">&lt;p style=&#8221;line-height:20px;&#8221;&gt;行高20px。&lt;strong style=&#8221;line-height:50px;&#8221;&gt; 行高50px。&lt;/strong&gt;&lt;span style=&#8221;line-height:30px;&#8221;&gt;行高30px。&lt;/span&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image005.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image005" src="http://5d0d.net/files/2009/05/clip-image005-thumb.gif" width="404" height="109" /></span></a><br />
<span style="font-size: small">图7-21 行内框与行框</span></p>
<p><span style="font-size: small">这里又有一个新的概念——行框（line box）。同行内框类似，行框是指本行的一个虚拟的矩形框，其高度等于本行内所有元素中行高最大的值。因此，当有多行内容时，每行都会有自己的行框，如图7-22所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image006.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image006" src="http://5d0d.net/files/2009/05/clip-image006-thumb.gif" width="404" height="175" /></span></a><br />
<span style="font-size: small">图7-22 多行内容的行框</span></p>
<p><span style="font-size: small"><strong>提示：</strong>理解行框和行内框的概念对于学习本章[7.4垂直对齐：vertical-align属性]一节的内容非常重要。<br />
<strong>注意：</strong>行框的高度只同本行内元素的行高有关，而和父元素的高度（height）无关。</span></p>
<p><span style="font-size: small"><strong>7.3.3</strong><strong> </strong><strong>行高的计算与继承</strong><strong></strong></span></p>
<p><span style="font-size: small">以em、ex和百分比为单位的行高，其基数是元素本身的字体尺寸。例如有代码如下：</span></p>
<blockquote>
<p><span style="font-size: small">&lt;p style=&#8221;font-size:20px;line-height:2em;&#8221;&gt;字高20px，行高2em。&lt;/p&gt; &lt;p style=&#8221;font-size:30px;line-height:2em;&#8221;&gt;字高30px，行高2em。&lt;/p&gt;</span></p>
</blockquote>
<p><span style="font-size: small">2个段落的行高都为2em，但是字体大小不同，因此显示如图7-23所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image007.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image007" src="http://5d0d.net/files/2009/05/clip-image007-thumb.gif" width="472" height="119" /></span></a><br />
<span style="font-size: small">图7-23 行高的计算</span></p>
<p><span style="font-size: small">行高可以设定得比字体高度小，此时多行的文字将叠加到一起，例如有如下代码，其显示如图7-24所示。</span></p>
<blockquote>
<p><span style="font-size: small">p { font-size : 20px; line-height :10px; }</span></p>
<p><span style="font-size: small">&lt;p&gt;字高20px，行高10px。此时多行的文字将叠加到一起。&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image008.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image008" src="http://5d0d.net/files/2009/05/clip-image008-thumb.gif" width="403" height="91" /></span></a><br />
<span style="font-size: small">图7-24 比字体高度小的行高</span></p>
<p><span style="font-size: small">行高是可继承的，但是继承的是计算值，例如有如下代码：</span></p>
<blockquote>
<p><span style="font-size: small">p { font-size :20px; line-height : 2em; }<br />
p span { font-size : 30px; }</span></p>
<p><span style="font-size: small">&lt;p&gt;字高20px。&lt;span&gt;字高30px。&lt;/span&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><span style="font-size: small">&lt;p&gt;元素的行高2em，字体尺寸为20px，因此计算值为40px，虽然&lt;span&gt;元素本身的字体尺寸为30px，不过其继承的行高仍为40px。但是在不同的浏览器内显示的效果却不尽相同，如图7-25所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image009.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image009" src="http://5d0d.net/files/2009/05/clip-image009-thumb.gif" width="324" height="153" /></span></a><br />
<span style="font-size: small">图7-25 行高的不同表现</span></p>
<p><span style="font-size: small">由于继承的是计算值，因此当元素内的文字字体尺寸不一样的时候，如果设定固定的行高很可能造成字体的重叠，例如有如下代码，其显示如图7-26所示。</span></p>
<blockquote>
<p><span style="font-size: small">p { font-size : 20px; line-height : 1em; }<br />
p span { font-size : 30px; }</span></p>
<p><span style="font-size: small">&lt;p&gt;字高20px，行高1em，当文本为多行时可能会发生文字重叠的现象。&lt;span&gt;字高30px。&lt;/span&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image010.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image010" src="http://5d0d.net/files/2009/05/clip-image010-thumb.gif" width="404" height="97" /></span></a><br />
<span style="font-size: small">图7-26行高继承造成文字叠加</span></p>
<p><span style="font-size: small">为了避免这种情况，可以为每个元素单独定义行高，但是这样很烦琐，因此可以定义一个没有单位的实数值作为缩放因子来统一控制行高，<strong>缩放因子是直接继承的，而不是继承计算值。</strong>例如修改上例中的行高为：</span></p>
<blockquote>
<p><span style="font-size: small">p { line-height : 1; }</span></p>
</blockquote>
<p><span style="font-size: small">则上例中的XHTML代码显示如图7-27所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image011.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image011" src="http://5d0d.net/files/2009/05/clip-image011-thumb.gif" width="405" height="112" /></span></a><br />
<span style="font-size: small">图7-27缩放因子对行高的影响</span></p>
<p><span style="font-size: small">当内容中含有图片的时候，如果图片的高度大于行高，<strong>则含有图片行的行框将被撑开到图片的高度</strong>，如图7-28所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image012.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image012" src="http://5d0d.net/files/2009/05/clip-image012-thumb.gif" width="404" height="72" /></span></a><br />
<span style="font-size: small">图7-28 含有图片的行</span></p>
<p><span style="font-size: small"><strong>注意：</strong>图片虽然撑开了行框，但是不会影响行高，因此也不会影响到基于行高来计算的其他属性。<br />
<strong>提示：</strong>当行内含有图片的时候，图片和文字的垂直对齐方式默认是基线对齐，关于垂直对齐将在本章[7.4 垂直对齐：vertical-align属性]一节中讨论。</span></p>
<p><span style="font-size: small"><strong>7.3.4</strong><strong> </strong><strong>浏览器的差别与错误</strong><strong></strong></span></p>
<p><span style="font-size: small">浏览器在显示的时候往往会有自己的表现形式，例如在Opera内，行高将按照CSS定义的将行距除以2增加到内容区域的上下两边，而IE和Firefox则不是完全平分，如图7-29所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image013.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image013" src="http://5d0d.net/files/2009/05/clip-image013-thumb.gif" width="364" height="91" /></span></a><br />
<span style="font-size: small">图7-29 不同浏览器对行高的显示</span></p>
<p><span style="font-size: small">不过，相差的1至2个像素在实际显示中一般不会有太大的影响，因此可以忽略不计。比较严重的错误是IE 6.0对于含有图片或者表单元等可替换行内元素的行高失效的问题，不过，在IE 7.0中已经修正了这个错误，但是其表现同其它浏览器也不相同。例如有如下代码，其显示如图7-30所示。</span></p>
<blockquote>
<p><span style="font-size: small">#lineHeight4 p { line-height : 60px; }<br />
#lineHeight4 fieldset{ border : 0; }</span></p>
<p><span style="font-size: small">&lt;div id=&#8221;lineHeight4&#8243;&gt; &lt;p&gt;内容含有图片在[IE 6]内浏览line-height将失效。&lt;img src=&#8221;../../img/ddcat_anim.gif&#8221; alt=&#8221;图片&#8221; width=&#8221;88&#8243; height=&#8221;31&#8243; /&gt;&lt;/p&gt; &lt;form id=&#8221;testForm&#8221; action=&#8221;#&#8221;&gt; &lt;fieldset&gt; &lt;p&gt;&lt;label for=&#8221;test1&#8243;&gt;表单元素&lt;/label&gt;&lt; input type=&#8221;text&#8221; maxlength=&#8221;16&#8243; value=&#8221;IE6内行高失效&#8221; /&gt;&lt;/p&gt; &lt;/fieldset&gt; &lt;/form&gt; &lt;/div&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image014.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image014" src="http://5d0d.net/files/2009/05/clip-image014-thumb.gif" width="406" height="422" /></span></a><br />
<span style="font-size: small">图7-30 包含替换元素的行高在IE内失效</span></p>
<p><span style="font-size: small">由图7-30读者可以发现，IE 7.0中，将半行距分别加在了图片的上下，而由于图片默认是基线对齐，因此文字的基线下移了，这显然不符合CSS中的规定。</span></p>
<p><span style="font-size: small">对于IE 6.0中行高失效的问题，需要使用CSS Hack手段来针对IE 6.0设定替换元素的上下补白来修正。</span></p>
<p><span style="font-size: small"><strong>提示：</strong>关于针对IE 6的CSS Hack，请参见本书[第16章：浏览器与Hack]。</span></p>
<p><span style="font-size: small"><strong>7.3.5</strong><strong> </strong><strong>应用：单行文字在垂直方向居中</strong></span></p>
<p><span style="font-size: small">在网页设计中，往往为了突出标题而添加背景图案，如图7-31所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image015.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image015" src="http://5d0d.net/files/2009/05/clip-image015-thumb.gif" width="227" height="178" /></span></a><br />
<span style="font-size: small">图7-31 包含背景图片的标题</span></p>
<p><span style="font-size: small">假设此标题的XHTML代码如下：</span></p>
<blockquote>
<p><span style="font-size: small">&lt;div id=&#8221;#sample&#8221;&gt; &lt;h2&gt;热门帖大盘点&lt;/h2&gt; &#8230;&#8230; &lt;/div&gt;</span></p>
</blockquote>
<p><span style="font-size: small">此时如果只设定&lt;h2&gt;的背景图片和高，则文字会偏上，如图7-32所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image016.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image016" src="http://5d0d.net/files/2009/05/clip-image016-thumb.gif" width="217" height="35" /></span></a><br />
<span style="font-size: small">图7-32 未设定行高的标题文字</span></p>
<p><span style="font-size: small">针对这个现象，一般只需要设定与高度相等的行高即可，相关代码如下：</span></p>
<blockquote>
<p><span style="font-size: small">#sample h2 { height : 31px; line-height : 31px; &#8230;&#8230; }</span></p>
</blockquote>
<p><span style="font-size: small">此时在浏览器内文字已经在垂直位置上居中显示，如图7-33所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image017.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image017" src="http://5d0d.net/files/2009/05/clip-image017-thumb.gif" width="217" height="35" /></span></a><br />
<span style="font-size: small">图7-33 设定行高后的标题文字</span></p>
<p><span style="font-size: small">此方法同样可以运用在其他需要文字垂直居中显示的地方，例如列表项、导航条等等。</span></p>
<p><span style="font-size: small">上一小节讲解了行高与单行纯文字的垂直居中，而如果行内含有图片和文字，在浏览器内浏览时，读者可以发现文字和图片在垂直方向并不是沿中线居中，而是沿基线对齐，如图7-34所示。 </span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image018.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image018" src="http://5d0d.net/files/2009/05/clip-image018-thumb.gif" width="261" height="112" /></span></a><br />
<span style="font-size: small">图7-34 文字和图片内容默认垂直对齐方式为基线对齐</span></p>
<p><span style="font-size: small">这是因为，元素默认的垂直对齐方式为基线对齐（vertical-align: baseline）。</span></p>
<h3><span style="color: #ff0000">7.4 vertical-align </span></h3>
<p><span style="font-size: small"><strong>7.4.1</strong><strong> </strong><strong>语法</strong></span></p>
<p><span style="font-size: small">vertical-align属性的具体定义列表如下：</span></p>
<p><span style="font-size: small">语法： vertical-align : baseline | sub | super | top | text- top | middle | bottom | text-bottom | &lt;百分比&gt; | &lt;长度&gt; | inherit<br />
说明： 设置元素内容的垂直对齐方式<br />
值： baseline：基线对齐；sub：下标；super：上标；top：顶端对齐；text-top：与文本的顶端对齐；middle：中部对齐；bottom：底端对齐；text-bottom：文本的底端对齐；<br />
百分比和长度： CSS2，可为负数。<br />
初始值： baseline<br />
继承性： 不继承<br />
适用于： 行内元素和单元格（table-cell）元素<br />
媒体： 视觉<br />
计算值： 百分比和长度值为绝对长度；其他同指定值 </span></p>
<p><span style="font-size: small">此处需要特别注意的是：垂直对齐属性只对<strong>行内元素</strong>有效。例如有如下代码： </span></p>
<blockquote>
<p><span style="font-size: small">&lt;p style=&#8221;vertical-align:super;&#8221;&gt;垂直对齐&lt;span&gt;上标&lt;/span&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><span style="font-size: small">&lt;p&gt;元素默认为块级元素，因此在浏览器内浏览时将不会有任何变化。而如下代码： </span></p>
<blockquote>
<p><span style="font-size: small">&lt;p&gt;垂直对齐&lt;span style=&#8221;vertical-align:super;&#8221;&gt;上标&lt;/span&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><span style="font-size: small">&lt;span&gt;元素默认为行内元素，因此显示如图7-35所示。 </span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image019.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image019" src="http://5d0d.net/files/2009/05/clip-image019-thumb.gif" width="273" height="118" /></span></a><br />
<span style="font-size: small">图7-35垂直对齐属性只对行内元素有效</span></p>
<p><span style="font-size: small">行内元素还包括图片、表单输入元素等，同时，垂直对齐不能被继承。 </span></p>
<p><span style="font-size: small"><strong>7.4.2</strong><strong> </strong><strong>属性值详解</strong></span></p>
<p><span style="font-size: small">在[7.3 行高 line-height]一节中，曾经介绍了文本的基线、顶线、中线和底线，还有内容区域、行内框和行框，而本节的垂直对齐和这几个概念密切相关。 </span></p>
<p><span style="font-size: small">垂直对齐主要属性值的表现形式如图7-36所示。 </span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image020.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image020" src="http://5d0d.net/files/2009/05/clip-image020-thumb.gif" width="504" height="197" /></span></a><br />
<span style="font-size: small">图7-36 垂直对齐的主要属性值示意</span></p>
<p><span style="font-size: small"><strong>(1). </strong><strong>基线对齐（vertical-align : baseline）</strong><strong> </strong></span></p>
<p><span style="font-size: small">基线对齐（vertical-align : baseline）使元素的基线同父元素的基线对齐，例如有如下代码： </span></p>
<blockquote>
<p><span style="font-size: small">p strong {<br />
line-height : 7em;<br />
font-size : 2em;<br />
vertical-align : baseline;<br />
} </span></p>
</blockquote>
<blockquote>
<p><span style="font-size: small">&lt;p&gt;基线对齐&lt;strong&gt;vertical-align:baseline;&lt;/strong&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><span style="font-size: small">则其显示如图7-37所示。 </span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image021.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image021" src="http://5d0d.net/files/2009/05/clip-image021-thumb.gif" width="404" height="114" /></span></a><br />
<span style="font-size: small">图7-37 基线对齐 </span></p>
<p><span style="font-size: small">而像图片或者输入框这样的元素，本身没有基线，则将其底端同父元素的基线对齐，如图7-34所示。 </span></p>
<p><span style="font-size: small"><strong>(2). </strong><strong>顶端对齐（vertical-align : top）</strong><strong> </strong></span></p>
<p><span style="font-size: small">顶端对齐（vertical-align : top）是将元素的行内框的顶端与行框的顶端对齐，例如有如下代码：</span></p>
<blockquote>
<p><span style="font-size: small">p {<br />
line-height : 7em;<br />
}<br />
p strong {<br />
vertical-align:top;<br />
line-height:2em;<br />
}<br />
p img {<br />
vertical-align : top;<br />
} </span></p>
<p><span style="font-size: small">&lt;p&gt;顶端对齐：&lt;strong&gt;vertical- align:top;&lt;/strong&gt;&lt;img src=&#8221;img/ddcat_anim.gif&#8221; alt=&#8221;图片&#8221; width=&#8221;88&#8243; height=&#8221;31&#8243; /&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><span style="font-size: small">则其显示如图7-38所示。 </span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image022.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image022" src="http://5d0d.net/files/2009/05/clip-image022-thumb.gif" width="404" height="141" /></span></a><br />
<span style="font-size: small">图7-38 顶端对齐</span></p>
<p><span style="font-size: small">对于&lt;strong&gt;元素，不仅设定了vertical-align，还设定了line-height，这是因为在本章 [7.3.2 内容区域、行内框和行框]一节中关于行内框的说明中介绍过，行高可以改变行内框的高度，如果不重新设定行高，则&lt;strong&gt;元素继承了父元素&lt;p&gt;的行高，因此行内框高和行框的高度是一样的，则顶端对齐将看不出效果。 </span></p>
<p><span style="font-size: small"><strong>(3). </strong><strong>文本顶端对齐（vertical-align : text-top）</strong><strong> </strong></span></p>
<p><span style="font-size: small">文本顶端对齐（vertical-align : text-top）是将元素行内框的顶端同文本行的顶线对齐，例如有如下代码，其显示如图7-39所示。 </span></p>
<blockquote>
<p><span style="font-size: small">p {<br />
line-height : 7em;<br />
}<br />
p strong {<br />
vertical-align : text-top;<br />
line-height : 2em;<br />
}<br />
p img {<br />
vertical-align : text-top;<br />
} </span></p>
<p><span style="font-size: small">&lt;p&gt;文本顶端对齐：&lt;strong&gt; vertical- align:top;&lt;/strong&gt;&lt;img src=&#8221;img/ddcat_anim.gif&#8221; alt=&#8221;图片&#8221; width=&#8221;88&#8243; height=&#8221;31&#8243; /&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image023.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image023" src="http://5d0d.net/files/2009/05/clip-image023-thumb.gif" width="404" height="107" /></span></a><br />
<span style="font-size: small">图7-39 文本顶端对齐 </span></p>
<p><span style="font-size: small"><strong>(4). </strong><strong>底端对齐（vertical-align : bottom）</strong><strong> </strong></span></p>
<p><span style="font-size: small">底端对齐（vertical-align : bottom）与顶端对齐（vertical-align : top）相反，如图7-40所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image024.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image024" src="http://5d0d.net/files/2009/05/clip-image024-thumb.gif" width="404" height="98" /></span></a><br />
<span style="font-size: small">图7-40 底端对齐</span></p>
<p><span style="font-size: small"><strong>(5). </strong><strong>文本底端对齐（vertical-align : text-bottom）</strong><strong> </strong></span></p>
<p><span style="font-size: small">文本底端对齐（vertical-align : text-bottom）与文本顶端对齐（vertical-align : text-top）相反，如图7-41所示。 </span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image025.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image025" src="http://5d0d.net/files/2009/05/clip-image025-thumb.gif" width="404" height="112" /></span></a><br />
<span style="font-size: small">图7-41 文本底端对齐</span></p>
<p><span style="font-size: small"><strong>(6). </strong><strong>中间对齐（vertical-align : middle）</strong><strong> </strong></span></p>
<p><span style="font-size: small">中间对齐（vertical-align : middle）通常使用在图片上，将图片的垂直方向的中线与文本行的中线对齐，例如有XHTML代码如下，其显示如图7-42所示。 </span></p>
<blockquote>
<p><span style="font-size: small">p img { vertical-align : middle; } </span></p>
<p><span style="font-size: small">&lt;p&gt;中间对齐为基线上方0.5ex处&lt;img src=&#8221;img/ddcat_ad.gif&#8221; alt=&#8221;图片&#8221; width=&#8221;180&#8243; height=&#8221;60&#8243; /&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image026.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image026" src="http://5d0d.net/files/2009/05/clip-image026-thumb.gif" width="404" height="98" /></span></a><br />
<span style="font-size: small">图7-42 中间对齐</span></p>
<p><span style="font-size: small">中线的定义为：中线位于基线的上方，与基线的距离为小写字母x高度（即ex）的一半，如图7-36所示。而ex同字体尺寸相关，大部分浏览器认为1ex = 0.5em，因此会将基线以上四分之一em处作为中线来对齐。 </span></p>
<p><span style="font-size: small"><strong>注意：</strong>同在行高显示上的差别一样，在中间对齐上，各浏览器之间也稍有些差异。</span></p>
<p><span style="font-size: small"><strong>(7). </strong><strong>上标和下标</strong><strong> </strong></span></p>
<p><span style="font-size: small">上标（vertical-align:super）使元素的基线（替换元素的底端）相对于父元素的基线升高，下标（vertical-align:sub）使元素的基线降低，移动的幅度CSS规范中没有规定，由浏览器来决定。例如有如下代码，其显示如图7-43所示。 </span></p>
<blockquote>
<p><span style="font-size: small">&lt;p&gt;上标文字&lt;span style=&#8221;vertical- align:super;&#8221;&gt;vertical-align:super;&lt;/span&gt;下标文字&lt;span style=&#8221;vertical-align:sub;&#8221;&gt;vertical-align:sub;&lt;/span&gt;&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image027.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image027" src="http://5d0d.net/files/2009/05/clip-image027-thumb.gif" width="404" height="116" /></span></a><br />
<span style="font-size: small">图7-43 上标和下标</span></p>
<p><span style="font-size: small">上下标不会改变元素文字的尺寸大小。 </span></p>
<p><span style="font-size: small"><strong>(8). </strong><strong>长度值和百分比</strong><strong> </strong></span></p>
<p><span style="font-size: small">和上下标类似，长度值和百分比值可使元素的基线（替换元素的底端）相对于父元素的基线升高（正值）或者降低（负值）。 </span></p>
<p><span style="font-size: small">上下标的移动尺寸是由浏览器确定的，而设定长度值或者百分比，可以精确控制文字上下移动的幅度。 </span></p>
<p><span style="font-size: small">百分比与行高有关，例如有如下代码，其显示如图7-44所示。 </span></p>
<blockquote>
<p><span style="font-size: small">p { line-height : 2em; } </span></p>
</blockquote>
<blockquote>
<p><span style="font-size: small">&lt;p&gt;行高2em，纵向百分比对齐：&lt;span style=&#8221;vertical-align:100%;&#8221;&gt;100% 正数向上&lt;/span&gt;，而&lt;span style=&#8221;vertical-align:-100%;&#8221;&gt;-100%负数向下&amp; lt;/span&gt;。&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image028.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image028" src="http://5d0d.net/files/2009/05/clip-image028-thumb.gif" width="404" height="86" /></span></a><br />
<span style="font-size: small">图7-44 百分比对齐</span></p>
<p><span style="font-size: small">设置垂直对齐会影响到行框高，例如有如下代码，其显示如图7-45所示。 </span></p>
<blockquote>
<p><span style="font-size: small">p { line-height : 2em; } </span></p>
<p><span style="font-size: small">&lt;p&gt;垂直对齐&lt;span style=&#8221;vertical-align:2em;&#8221;&gt;正数向上&lt;/span&amp; gt;，而&lt;span style=&#8221;vertical-align:-2em;&#8221;&gt;负数向下&lt;/span&gt;。&amp;lt; p&amp;gt;行高2em，而设置垂直对齐的文字撑开了行框。&lt;/p&gt;</span></p>
</blockquote>
<p><a href="http://5d0d.net/files/2009/05/clip-image029.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image029" src="http://5d0d.net/files/2009/05/clip-image029-thumb.gif" width="404" height="155" /></span></a><br />
<span style="font-size: small">图7-45 垂直对齐对行框的影响</span></p>
<p><span style="font-size: small"><em>注意：</em>在IE中设定百分比或者数值对齐会造成内容的叠加混乱，如图7-46所示。</span></p>
<p><a href="http://5d0d.net/files/2009/05/clip-image030.gif"><span style="color: #000000; font-size: small"><img border="0" alt="clip_image030" src="http://5d0d.net/files/2009/05/clip-image030-thumb.gif" width="406" height="64" /></span></a><br />
<span style="font-size: small">图7-46在IE中设定百分比或者数值对齐</span></p>
</div>
<div class="postTags">Tags: <a href="http://5d0d.net/tag/css/" rel="tag">css</a>, <a href="http://5d0d.net/tag/%e5%b8%83%e5%b1%80/" rel="tag">布局</a></div>
<img src ="http://www.blogjava.net/super-nini/aggbug/331883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-09-13 12:00 <a href="http://www.blogjava.net/super-nini/archive/2010/09/13/331883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：JSON与JAVA数据的转换</title><link>http://www.blogjava.net/super-nini/archive/2010/08/27/330084.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 27 Aug 2010 10:17:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/08/27/330084.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/330084.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/08/27/330084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/330084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/330084.html</trackback:ping><description><![CDATA[JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把JSON转回成bean和DynaBean。 <br />
<br />
下载地址:<a href="http://json-lib.sourceforge.net/" target="_blank"><font color="#7d0000">http://json-lib.sourceforge.net/</font></a> <br />
还要需要的第3方包: <br />
org.apache.commons(3.2以上版本) <br />
org.apache.oro <br />
net.sf.ezmorph(ezmorph-1.0.4.jar) <br />
nu.xom <br />
<br />
1、List <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span>[] boolArray = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> </span><span class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span>[]{</span><span class="keyword"><strong><font color="#7f0055">true</font></strong></span><span>,</span><span class="keyword"><strong><font color="#7f0055">false</font></strong></span><span>,</span><span class="keyword"><strong><font color="#7f0055">true</font></strong></span><span>};&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONArray jsonArray1 = JSONArray.fromObject( boolArray );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( jsonArray1 );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// prints [true,false,true]&nbsp;&nbsp; </font></span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ArrayList();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add( </span><span class="string"><font color="#0000ff">"first"</font></span><span> );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add( </span><span class="string"><font color="#0000ff">"second"</font></span><span> );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONArray jsonArray2 = JSONArray.fromObject( list );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( jsonArray2 );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// prints ["first","second"]&nbsp;&nbsp; </font></span><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONArray jsonArray3 = JSONArray.fromObject( </span><span class="string"><font color="#0000ff">"['json','is','easy']"</font></span><span> );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( jsonArray3 );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">// prints ["json","is","easy"]&nbsp;&nbsp;&nbsp;</font></span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre style="display: none" class="java" name="code">boolean[] boolArray = new boolean[]{true,false,true};
JSONArray jsonArray1 = JSONArray.fromObject( boolArray );
System.out.println( jsonArray1 );
// prints [true,false,true]
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray2 = JSONArray.fromObject( list );
System.out.println( jsonArray2 );
// prints ["first","second"]
JSONArray jsonArray3 = JSONArray.fromObject( "['json','is','easy']" );
System.out.println( jsonArray3 );
// prints ["json","is","easy"]</pre>
<br />
2、Map <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
    <li><span><span>Map map = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> HashMap();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put( </span><span class="string"><font color="#0000ff">"name"</font></span><span>, </span><span class="string"><font color="#0000ff">"json"</font></span><span> );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put( </span><span class="string"><font color="#0000ff">"bool"</font></span><span>, Boolean.TRUE );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put( </span><span class="string"><font color="#0000ff">"int"</font></span><span>, </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> Integer(</span><span class="number"><font color="#c00000">1</font></span><span>) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put( </span><span class="string"><font color="#0000ff">"arr"</font></span><span>, </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> String[]{</span><span class="string"><font color="#0000ff">"a"</font></span><span>,</span><span class="string"><font color="#0000ff">"b"</font></span><span>} );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put( </span><span class="string"><font color="#0000ff">"func"</font></span><span>, </span><span class="string"><font color="#0000ff">"function(i){ return this.arr[i]; }"</font></span><span> );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONObject json = JSONObject.fromObject( map );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( json );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">//{"func":function(i){ return this.arr[i]; },"arr":["a","b"],"int":1,"name":"json","bool":true}</font></span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre style="display: none" class="java" name="code">Map map = new HashMap();
map.put( "name", "json" );
map.put( "bool", Boolean.TRUE );
map.put( "int", new Integer(1) );
map.put( "arr", new String[]{"a","b"} );
map.put( "func", "function(i){ return this.arr[i]; }" );
JSONObject json = JSONObject.fromObject( map );
System.out.println( json );
//{"func":function(i){ return this.arr[i]; },"arr":["a","b"],"int":1,"name":"json","bool":true}</pre>
<br />
3、BEAN <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
    <li><span><span class="comment"><font color="#008200">/** </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Bean.java </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String name = "json";&nbsp;&nbsp;&nbsp; </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int pojoId = 1;&nbsp;&nbsp;&nbsp; </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private char[] options = new char[]{'a','f'};&nbsp;&nbsp;&nbsp; </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String func1 = "function(i){ return this.options[i]; }";&nbsp;&nbsp;&nbsp; </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];"); </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp; */</font></span><span> &nbsp;&nbsp;</span></span>
    <li><span>JSONObject jsonObject = JSONObject.fromObject( </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> JsonBean() );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>System.out.println( jsonObject );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span class="comment"><font color="#008200">//{"func1":function(i){ return this.options[i]; },"pojoId":1,"name":"json","options":["a","f"],"func2":function(i){ return this.options[i]; }}&nbsp;&nbsp;</font></span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre style="display: none" class="java" name="code">/**
* Bean.java
private String name = "json";
private int pojoId = 1;
private char[] options = new char[]{'a','f'};
private String func1 = "function(i){ return this.options[i]; }";
private JSONFunction func2 = new JSONFunction(new String[]{"i"},"return this.options[i];");
*/
JSONObject jsonObject = JSONObject.fromObject( new JsonBean() );
System.out.println( jsonObject );
//{"func1":function(i){ return this.options[i]; },"pojoId":1,"name":"json","options":["a","f"],"func2":function(i){ return this.options[i]; }}</pre>
<br />
4、BEANS <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
    <li><span><span class="comment"><font color="#008200">/** </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * private int row ; </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int col ; </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String value ; </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * </font></span></span>
    <li><span><span class="comment"><font color="#008200">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</font></span><span>&nbsp;&nbsp;</span></span>
    <li><span>List list = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ArrayList(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JsonBean2 jb1 = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> JsonBean2(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jb1.setCol(</span><span class="number"><font color="#c00000">1</font></span><span>); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jb1.setRow(</span><span class="number"><font color="#c00000">1</font></span><span>); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jb1.setValue(</span><span class="string"><font color="#0000ff">"xx"</font></span><span>); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JsonBean2 jb2 = </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> JsonBean2(); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jb2.setCol(</span><span class="number"><font color="#c00000">2</font></span><span>); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jb2.setRow(</span><span class="number"><font color="#c00000">2</font></span><span>); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jb2.setValue(</span><span class="string"><font color="#0000ff">""</font></span><span>); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(jb1); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(jb2); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSONArray ja = JSONArray.fromObject(list); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( ja.toString() ); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment"><font color="#008200">//[{"value":"xx","row":1,"col":1},{"value":"","row":2,"col":2}]</font></span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre style="display: none" class="java" name="code">/**
* private int row ;
private int col ;
private String value ;
*
*/
List list = new ArrayList();
JsonBean2 jb1 = new JsonBean2();
jb1.setCol(1);
jb1.setRow(1);
jb1.setValue("xx");
JsonBean2 jb2 = new JsonBean2();
jb2.setCol(2);
jb2.setRow(2);
jb2.setValue("");
list.add(jb1);
list.add(jb2);
JSONArray ja = JSONArray.fromObject(list);
System.out.println( ja.toString() );
//[{"value":"xx","row":1,"col":1},{"value":"","row":2,"col":2}]</pre>
<br />
5、String to bean <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
    <li><span><span>String json = </span><span class="string"><font color="#0000ff">"{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}"</font></span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>JSONObject jsonObject = JSONObject.fromString(json);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>Object bean = JSONObject.toBean( jsonObject );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"name"</font></span><span> ), PropertyUtils.getProperty( bean, </span><span class="string"><font color="#0000ff">"name"</font></span><span> ) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp; assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"bool"</font></span><span> ), PropertyUtils.getProperty( bean, </span><span class="string"><font color="#0000ff">"bool"</font></span><span> ) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp; assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"int"</font></span><span> ), PropertyUtils.getProperty( bean, </span><span class="string"><font color="#0000ff">"int"</font></span><span> ) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp; assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"double"</font></span><span> ), PropertyUtils.getProperty( bean, </span><span class="string"><font color="#0000ff">"double"</font></span><span> ) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp; assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"func"</font></span><span> ), PropertyUtils.getProperty( bean, </span><span class="string"><font color="#0000ff">"func"</font></span><span> ) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp; List expected = JSONArray.toList( jsonObject.getJSONArray( </span><span class="string"><font color="#0000ff">"array"</font></span><span> ) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp; assertEquals( expected, (List) PropertyUtils.getProperty( bean, </span><span class="string"><font color="#0000ff">"array"</font></span><span> ) );&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre style="display: none" class="java" name="code">String json = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}";
JSONObject jsonObject = JSONObject.fromString(json);
Object bean = JSONObject.toBean( jsonObject );
assertEquals( jsonObject.get( "name" ), PropertyUtils.getProperty( bean, "name" ) );
assertEquals( jsonObject.get( "bool" ), PropertyUtils.getProperty( bean, "bool" ) );
assertEquals( jsonObject.get( "int" ), PropertyUtils.getProperty( bean, "int" ) );
assertEquals( jsonObject.get( "double" ), PropertyUtils.getProperty( bean, "double" ) );
assertEquals( jsonObject.get( "func" ), PropertyUtils.getProperty( bean, "func" ) );
List expected = JSONArray.toList( jsonObject.getJSONArray( "array" ) );
assertEquals( expected, (List) PropertyUtils.getProperty( bean, "array" ) );</pre>
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码</div>
</div>
<ol class="dp-j">
    <li><span><span>String json = </span><span class="string"><font color="#0000ff">"{\"value\":\"xx\",\"row\":1,\"col\":1}"</font></span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>JSONObject jsonObject = JSONObject.fromString(json); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp; JsonBean2 bean = (JsonBean2) JSONObject.toBean( jsonObject, JsonBean2.</span><span class="keyword"><strong><font color="#7f0055">class</font></strong></span><span> );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp; assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"col"</font></span><span> ),</span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> Integer( bean.getCol())&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"row"</font></span><span> ), </span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> Integer( bean.getRow() ) );&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals( jsonObject.get( </span><span class="string"><font color="#0000ff">"value"</font></span><span> ), bean.getValue() );&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre style="display: none" class="java" name="code">String json = "{\"value\":\"xx\",\"row\":1,\"col\":1}";
JSONObject jsonObject = JSONObject.fromString(json);
JsonBean2 bean = (JsonBean2) JSONObject.toBean( jsonObject, JsonBean2.class );
assertEquals( jsonObject.get( "col" ),new Integer( bean.getCol())  );
assertEquals( jsonObject.get( "row" ), new Integer( bean.getRow() ) );
assertEquals( jsonObject.get( "value" ), bean.getValue() );</pre>
<p><br />
<br />
6 json to xml <br />
1) <br />
JSONObject json = new JSONObject( true ); <br />
String xml = XMLSerializer.write( json ); <br />
<br />
&lt;o class="object" null="true"&gt; <br />
<br />
2) <br />
JSONObject json = JSONObject.fromObject("{\"name\":\"json\",\"bool\":true,\"int\":1}"); <br />
String xml = XMLSerializer.write( json ); <br />
&lt;o class="object"&gt; <br />
&lt;name type="string"&gt;json&lt;/name&gt; <br />
&lt;bool type="boolean"&gt;true&lt;/bool&gt; <br />
&lt;int type="number"&gt;1&lt;/int&gt; <br />
&lt;/o&gt; <br />
&lt;o class="object"&gt; <br />
&lt;name type="string"&gt;json&lt;/name&gt; <br />
&lt;bool type="boolean"&gt;true&lt;/bool&gt; <br />
&lt;int type="number"&gt;1&lt;/int&gt; <br />
&lt;/o&gt; <br />
3) <br />
JSONArray json = JSONArray.fromObject("[1,2,3]"); <br />
String xml = XMLSerializer.write( json ); <br />
&lt;a class="array"&gt; <br />
&lt;e type="number"&gt;1&lt;/e&gt; <br />
&lt;e type="number"&gt;2&lt;/e&gt; <br />
&lt;e type="number"&gt;3&lt;/e&gt; <br />
&lt;/a&gt; <br />
<br />
7 、xml to json <br />
&lt;a class="array"&gt; <br />
&lt;e type="function" params="i,j"&gt; <br />
return matrix[i][j]; <br />
&lt;/e&gt; <br />
&lt;/a&gt; <br />
&lt;a class="array"&gt; <br />
&lt;e type="function" params="i,j"&gt; <br />
return matrix[i][j]; <br />
&lt;/e&gt; <br />
&lt;/a&gt; <br />
<br />
JSONArray json = (JSONArray) XMLSerializer.read( xml ); <br />
System.out.println( json ); <br />
// prints [function(i,j){ return matrix[i][j]; }]</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/330084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-08-27 18:17 <a href="http://www.blogjava.net/super-nini/archive/2010/08/27/330084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：动态链接库简介 </title><link>http://www.blogjava.net/super-nini/archive/2010/06/03/322645.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 03 Jun 2010 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/06/03/322645.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/322645.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/06/03/322645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/322645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/322645.html</trackback:ping><description><![CDATA[<p>http://blog.csdn.net/sendy888/archive/2007/07/25/1707175.aspx<br />
动态链接库简介</p>
<p>自从微软推出16位的Windows操作系统起，此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据，实际上Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着，例如显示的字体和图标存储在GDI DLL中、显示Windows桌面和处理用户的输入所需要的代码被存储在一个User DLL中、Windows编程所需要的大量的API函数也被包含在Kernel DLL中。<br />
DLL是建立在客户/服务器通信的概念上，包含若干函数、类或资源的库文件，函数和数据被存储在一个DLL（服务器）上并由一个或多个客户导出而使用，这些客户可以是应用程序或者是其它的DLL。</p>
<p>使用动态链接库的优点：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 最主要的一点是多个应用程序、甚至是不同语言编写的应用程序可以共享一个DLL文件，真正实现了资源"共享"，大大缩小了应用程序的执行代码，更加有效的利用了内存；<br />
&nbsp;&nbsp;&nbsp;&nbsp; 使用DLL的另一个优点是DLL文件作为一个单独的程序模块，封装性、独立性好，在软件需要升级的时候开发人员只需要修改相应的DLL文件就可以了，而且，当DLL中的函数改变后，只要不是参数的改变,程序代码并不需要重新编译。这在编程时十分有用，大大提高了软件开发和维护的效率。</p>
<p>静态库：<br />
函数和数据被编译进一个二进制文件（通常扩展名为LIB），在使用静态库的情况下，在编译链接可执行文件时，链接器从库中复制这些函数和数据并把他们和应用程序的其他模块组合起来创建最终的可执行文件（EXE文件）。这个过程称为"静态链接"，此时因为应用程序所需的全部内容都是从库中复制了出来，所以静态库本身并不需要与可执行文件一起发行。</p>
<p>动态库：<br />
在使用动态库的时候，往往提供两个文件，一个引入库和一个DLL，引入库包含被DLL导出的函数和变量的符号名，DLL包含实际的函数和数据，在编译链接可执行文件时，只需要链接引入库，DLL中的函数代码和数据并不复制到可执行文件中，在运行的时候再去加载DLL，访问DLL中导出的函数</p>
<p>动态链接库加载的2种方式<br />
1.隐式链接:隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易，只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。<br />
注意：要先将Dll.dll和Dll.lib拷贝到当前工程所在的目录下面，</p>
<p>2.显式链接:显式链接是应用程序在执行过程中随时可以加载DLL文件，也可以随时卸载DLL文件，这是隐式链接所无法作到的，所以显式链接具有更好的灵活性，对于解释性语言更为合适。<br />
首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。使用显式链接应用程序编译时不需要使用相应的Lib文件。<br />
主要是三个函数的调用<br />
LoadLibrary//加载动态链接库文件；<br />
GetProcAddress//获取导入到应用程序中的函数指针<br />
FreeLibrary(hDLL)//卸载动态链接库文件</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/sendy888/archive/2007/07/25/1707175.aspx</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/322645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-06-03 17:23 <a href="http://www.blogjava.net/super-nini/archive/2010/06/03/322645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：OCX和DLL的区别</title><link>http://www.blogjava.net/super-nini/archive/2010/06/03/322644.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 03 Jun 2010 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/06/03/322644.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/322644.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/06/03/322644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/322644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/322644.html</trackback:ping><description><![CDATA[<p>一、关于DLL的介绍<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; DLL，动态链接库，Dynamic Link Library的缩写，是一个包含函数和数据的模块集合，可以被其它应用程序共享的程序模块。DLL作为共享函数库的可执行文件，封装了一个或多个已被编译、链接的函数。多个进程可以同时使用一个 DLL，在内存中共享该 DLL 的一个副本。DLL 还有助于共享数据和资源。&nbsp;&nbsp; 它和可执行文件(.EXE文件)非常类似，他们的区别在于 DLL 中虽然包含了可执行代码却不能单独执行，只能由需要使用它的应用程序来直接或间接调。[1]</p>
<p>&nbsp;&nbsp;&nbsp; 通俗的说，在Windows操作系统中，许多应用程序并不是一个完整的可执行文件，它们的正确执行需要调用一些相对独立的动态链接库，即DLL文件。一个应用程序可以调用多个DLL文件，一个DLL文件也可能被几个应用程序所共用，这样的DLL文件被称为共享 DLL 文件。[2]DLL 文件一般被存在C:\Windows\System 目录下，也可能放在应用程序所在的目录或是子目录中。</p>
<p>&nbsp;&nbsp; 提到动态链接，先说明一下静态连接。什么是静态连接呢?在程序链接的过程中，需要将编译后的二进制代码链接成目标代码，链接器从静态链接库中获得所有被引用的函数，并将这些被引用的函数同代码一起放到可执行文件中。那么关于 DLL 的静态连接则是指链接器将被引用的库函数的代码复制到调用 DLL 的可执行模块(.dll 文件或 .exe 文件)中。</p>
<p>&nbsp; 什么是动态链接呢？动态链接是系统允许可执行模块(.dll 文件或 .exe 文件)在运行程中，只需要包含在定位 DLL 函数的可执行代码所需的信息。换句话说，可执行模块(.dll 文件或 .exe 文件)在运行时加载这些模块(亦即所需的模块映射到调用进程的地址空间)。[3]</p>
<p>&nbsp;&nbsp; 那么动态链接和静态连接 相比，优点有哪些呢？</p>
<p>&nbsp;&nbsp;&nbsp; (1)节省内存，减少交换操作。使用动态链接，多个进程可以同时使用一个 DLL，在内存中共享该 DLL 的一个副本。使用静态链接，每个应用程序都包含被引用的库函数的代码，那么Windows 必须在内存中为每个应用程序加载引用的库函数的代码的一个副本。 <br />
&nbsp;&nbsp;&nbsp; (2)节省磁盘空间。使用动态链接，在磁盘上仅需要 DLL 的一个副本。使用静态链接，每个应用程序都包含被引用的库函数的代码。 <br />
&nbsp;&nbsp;&nbsp; (3)更易于升级。使用动态链接，DLL 中的函数发生变化时，只要函数的参数和返回值没有更改，就不需重新编译或重新链接使用它们的应用程序。使用静态链接，在函数发生变化时，需要重新链接来生成应用程序。<br />
&nbsp;&nbsp;&nbsp; (4)支持多语言程序，只要程序遵循函数的调用约定，用不同编程语言编写的程序就可以调用相同的DLL 函数。<br />
&nbsp;&nbsp;&nbsp; (5)提供扩展 MFC 库类的机制。可以从现有 MFC 类派生类，并将它们放到 MFC 扩展 DLL 中供 MFC应用程序使用。 <br />
&nbsp;&nbsp;&nbsp; (6)支持多语言程序，并使国际版本的创建轻松完成。通过将资源放到 DLL 中，创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的 DLL 资源文件中，并使不同的语言版本加载合适的资源。[4] </p>
<p>&nbsp; DLL 中包含下面两类函数的定义： <br />
&nbsp; 导出函数：这些函数由可执行模块(.dll 文件或 .exe 文件)调用。<br />
&nbsp; 内部函数：这些函数仅从定义它们的 DLL 中调用。DLL 还导出数据。不过，这些数据由相应的函数使用。</p>
<p>&nbsp;&nbsp; 可以通过下列方式调用 DLL 中的函数：&nbsp; <br />
&nbsp;&nbsp;&nbsp; 加载时动态链接：可执行模块执行显式调用以导出 DLL 函数。为 DLL 创建导入库，然后将 DLL 链接到应用程序。在加载应用程序时，导入库提供加载 DLL 和查找导出的 DLL 函数所需的信息。<br />
&nbsp;&nbsp;&nbsp; 运行时动态链接：在运行时加载 DLL 时，可执行模块使用 LoadLibrary 函数或 LoadLibraryEx 函数。可执行模块调用 GetProcAddress 函数以获取导出的 DLL 函数的地址。在链接时，Windows 搜索预安装的一组 DLL，例如性能库 (Kernel32.dll) 和安全库 (User32.dll)。然后，Windows 按以下顺序搜索DLL： <br />
1.当前进程的可执行程序所在的目录。<br />
2.当前目录。<br />
3.Windows 系统目录。（GetSystemDirectory 函数获取 Windows 系统目录的路径。）<br />
4.Windows 目录。（GetWindowsDirectory 函数获取 Windows 目录的路径。）<br />
5.PATH 环境变量中列出的目录。注意：LIBPATH 环境变量不用于搜索。[3]</p>
<p>&nbsp;&nbsp;&nbsp; DLL 有一个特殊的入口点（DllMain 函数），它在附加和分离进程和线程时运行。此行为允许根据需要创建和销毁数据结构。文件扩展名为 .ocx、.cpl 和 .drv 的文件类型也是 DLL，尽管文件扩展名已改变。<br />
&nbsp;&nbsp;&nbsp; 您可以通过创建 DLL 实现以下目的：<br />
&nbsp;&nbsp;&nbsp; (1)将程序划分为可按需加载的单独模块。 <br />
&nbsp;&nbsp;&nbsp; (2)存储特定于语言或特定于区域的资源。 <br />
&nbsp;&nbsp;&nbsp; (3)使您自己的应用程序能够使用核心代码库。 <br />
&nbsp;&nbsp;&nbsp; (4)生成进程内 COM 对象或 ActiveX 控件 (OCX)。 <br />
&nbsp;&nbsp;&nbsp; (5)将 OLE 对象用作进程内 DLL。这一用法可改进 OLE 链接的性能。 <br />
&nbsp;&nbsp;&nbsp; (6)使用控制面板扩展或使用某些类型的驱动程序。 [3]</p>
<p>二、关于以.ocx为后缀名的ActiveX控件</p>
<p>&nbsp;&nbsp;&nbsp; 刚才提到过，文件扩展名为 .ocx、.cpl 和 .drv 的文件类型也是 DLL。</p>
<p>&nbsp;&nbsp;&nbsp; 现在的ActiveX 控件等价与以前的OLE控件或OCX，一个典型的控件包括设计时和运行时的用户界面，唯一的IDispatch接口定义了控件的属性和方法，唯一的 IConnectionPoint接口定义控件可引发的事件。一个控件可以在容器中运行，所以从运行的角度看它类似与一个DLL。[5]</p>
<p>&nbsp;&nbsp;&nbsp; 尽管 ActiveX 和 OLE 都基于组建对象模型(Component Object Model，COM)，它们为程序员提供的却是截然不同的服务。COM提供的是低级的对象捆绑机制，该机制支持对象之间的交互通讯。OLE使用COM来提供低级的应用服务，例如采用连接和嵌入机制，支持用户创建复合文档。与之不同，ActiveX提供更精细的结构，用以支持在网络站点上嵌入控件，以及对事件的交互反应。优化ActiveX，目的是为了提高时间和空间效率，而优化OLE，是为了便于终端用户的使用和集成台式系统的应用程序。ActiveX还为Internet技术带来了一些技术上的变革，例如，ActiveX大大减小了代码量(代码量减少了百分之五十到七十)，支持更多的提交和异步连接。 [6]</p>
<p>&nbsp;&nbsp; ActiveX的基础是OLE和COM，但是通过MS的各种开发工具可以屏蔽掉COM模型中许多另人费解的技术细节。ActiveX组件技术包括以下一些方面：(1)自动化服务器 (2)自动化控制器 (3)控件 (4)COM对象 (5)文档 (6)容器 。</p>
<p>&nbsp;&nbsp; 以.ocx为后缀名的ActiveX控件主要应用在WEB上和Window Forms程序开发上。应用程序使用ActiveX/COM组件来扩展自身的业务逻辑、事务处理和应用服务的范围。</p>
<p>&nbsp;&nbsp; 顺便提一下以.ocx为后缀名的ActiveX控件的注册和卸载方法，在&#8220;开始&#8221;菜单的&#8220;运行&#8221;输入以下代码完成任务：<br />
&nbsp;&nbsp;&nbsp; regsvr32 path &amp; "\xxx.ocx" '注册<br />
&nbsp;&nbsp;&nbsp; regsvr32 /u path &amp; "\xxx.ocx" '卸载</p>
<p>&nbsp;&nbsp;&nbsp; 其中path代表该xxx.ocx所以在的目录的路径。</p>
<p>三、OCX和DLL的区别</p>
<p>&nbsp;&nbsp; 以.ocx为后缀名的ActiveX控件是一种比较特殊的DLL，它的基础是OLE和COM，是有交互界面的可视化控件,定义了控件的属性和方法,定义控件可引发的事件的响应。我们通常说的.DLL为后缀名的文件是一个包含函数和数据的模块集合，可以被其它应用程序共享的程序模块。</p>
<p><br />
本文引用：<br />
[1]http://zhouyi2.jblog.cn/120494.shtml<br />
[2]http://www.symood.com/Article/ShowArticle.asp?ArticleID=197<br />
[3]http://www.jr163.org/cup2/54/54294.htm<br />
[4]MSDN：DLL<br />
[5]http://www.blog.edu.cn/user2/eliming/archives/2006/1127399.shtml<br />
[6]http://www.symood.com/Article/ShowArticle.asp?ArticleID=198</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/scucj/archive/2006/06/29/852181.aspx</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/322644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-06-03 17:22 <a href="http://www.blogjava.net/super-nini/archive/2010/06/03/322644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)XML的四种解析器原理及性能比较</title><link>http://www.blogjava.net/super-nini/archive/2010/03/31/317014.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Wed, 31 Mar 2010 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/03/31/317014.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/317014.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/03/31/317014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/317014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/317014.html</trackback:ping><description><![CDATA[<p>　　1: DOM<br />
<br />
　　DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。<br />
<br />
　　首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。<br />
<br />
　　另一方面，对于特别大的文档，解析和加载整个文档可能很慢且很耗资源，因此使用其他手段来处理这样的数据会更好。这些基于事件的模型，比如 SAX。<br />
<br />
　　2:SAX<br />
<br />
　　这种处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX 还比它的替代者 DOM 快许多。<br />
<br />
　　3:选择 DOM 还是选择 SAX ？<br />
<br />
　　对于需要自己编写代码来处理 XML 文档的开发人员来说，选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。 <br />
<br />
　　DOM 采用建立树形结构的方式访问 XML 文档，而 SAX 采用的事件模型。 <br />
<br />
　　DOM 解析器把 XML 文档转化为一个包含其内容的树，并可以对树进行遍历。用 DOM 解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档，所以对性能和内存的要求比较高，尤其是遇到很大的 XML 文件的时候。由于它的遍历能力，DOM 解析器常用于 XML 文档需要频繁的改变的服务中。 <br />
<br />
　　SAX 解析器采用了基于事件的模型，它在解析 XML 文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时，SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。</p>
<p>　　4:JDOM<br />
<br />
　　JDOM的目的是成为 Java 特定文档模型，它简化与 XML 的交互并且比使用 DOM 实现更快。由于是第一个 Java 特定模型，JDOM 一直得到大力推广和促进。正在考虑通过&#8220;Java 规范请求 JSR-102&#8221;将它最终用作&#8220;Java 标准扩展&#8221;。从 2000 年初就已经开始了 JDOM 开发。<br />
<br />
　　JDOM 与 DOM 主要有两方面不同。首先，JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API，但是也限制了灵活性。第二，API 大量使用了 Collections 类，简化了那些已经熟悉这些类的 Java 开发者的使用。<br />
<br />
　　JDOM 文档声明其目的是&#8220;使用 20%（或更少）的精力解决 80%（或更多）Java/XML 问题&#8221;（根据学习曲线假定为 20%）。JDOM 对于大多数 Java/XML 应用程序来说当然是有用的，并且大多数开发者发现 API 比 DOM 容易理解得多。JDOM 还包括对程序行为的相当广泛检查以防止用户做任何在 XML 中无意义的事。然而，它仍需要您充分理解 XML 以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习 DOM 或 JDOM 接口都更有意义的工作。<br />
<br />
　　JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档（尽管它还可以将以前构造的 DOM 表示作为输入）。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。<br />
<br />
　　5: DOM4J<br />
<br />
　　虽然 DOM4J 代表了完全独立的开发结果，但最初，它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能，包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始，它就一直处于开发之中。<br />
<br />
　　为支持所有这些功能，DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然 DOM4J 付出了更复杂的 API 的代价，但是它提供了比 JDOM 大得多的灵活性。<br />
<br />
　　在添加灵活性、XPath 集成和对大文档处理的目标时，DOM4J 的目标与 JDOM 是一样的：针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案，实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时，它比 JDOM 更少强调防止不正确的应用程序行为。<br />
<br />
　　DOM4J 是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML，特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。<br />
<br />
　　6:总述<br />
<br />
　　JDOM 和 DOM 在性能测试时表现不佳，在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础，因为它正式获得 W3C 推荐（与基于非标准的 Java 模型相对），所以在某些类型的项目中可能也需要它（如在 javascript 中使用 DOM）。<br />
<br />
　　SAX表现较好，这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。<br />
<br />
　　无疑，DOM4J是最好的，目前许多开源项目中大量采用 DOM4J，例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。如果不考虑可移植性，那就采用DOM4J吧！</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/317014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-03-31 10:46 <a href="http://www.blogjava.net/super-nini/archive/2010/03/31/317014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：jsp中使用java.net.URLEncoder.encode()传送字符编码</title><link>http://www.blogjava.net/super-nini/archive/2010/03/23/316253.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 23 Mar 2010 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/03/23/316253.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/316253.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/03/23/316253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/316253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/316253.html</trackback:ping><description><![CDATA[<p>jsp代码中，使用到了java.net.URLEncoder.encode()对要传递的中文进行编码。可是接收到的字符串却是乱码。最令人抓狂的就是这段代码在有的机器上运行正常，可是在某些机器上死活也不能正常运行。因为对jsp和网页都不是很熟所以查了很久才发现原因。</p>
<p>最后发现是这段代码没有规范的使用java.net.URLEncoder，虽然使用了java.net.URLEncoder.encode()对要传递的中文进行编码，可是接收页面接收时没有使用java.net.URLEncoder.decode()进行解码。导致在有的机器上运行正常，而有的就出错。</p>
<p>&nbsp;<wbr></p>
<p>下面贴一下解决这个问题参考的文章：</p>
<p>使用java.net.URLEncoder.encode()可以对要传递的中文进行编码</p>
<p><font color="#ff0000">a.</font>在传参数之前先把参数进行转码:<font color="#ff0000">java.net.URLEncoder.encode(param);</font><br />
取值时用语句<font color="#ff0000">java.net.URLDecoder.decode(param);</font>再转回中文<br />
b.在你的Tomcat目录--&gt;conf目录--&gt;server.xml里找出这段:<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;Connector<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> port="8080"&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> debug="0" connectionTimeout="20000"<br />
&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> disableUploadTimeout="true"<br />
<font color="#ff0000">&lt;!--在里边加上这个参数--&gt;<br />
URIEncoding="gb2312"<br />
</font>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> /&gt;</p>
<p>&nbsp;<font color="#ff0000">例如:</font><br />
&lt;%@ page contentType="text/html;charset=gb2312" %&gt;</p>
<p>&lt;a href="ds.jsp?url=&lt;%=java.net.URLEncoder.encode("编码的是这里","<font color="#ff0000">GB2312</font>")%&gt;"&gt;点击这里&lt;/a&gt;</p>
<p><br />
&lt;%<br />
if(request.getParameter("url")!=null)<br />
{</p>
<p>str=request.getParameter("url");<br />
str=java.net.URLDecoder.decode(str,"<font color="#ff0000">GB2312</font>");<br />
str=new String(str.getBytes("ISO-8859-1"));<br />
out.print(str);<br />
}</p>
<p>%&gt;</p>
<p>若,字符编码为<font color="#ff0000">utf-8</font>也可以实现.或者在此段代码中,不写出字符编码也可以(只写一个参数)。<wbr></p>
<img src ="http://www.blogjava.net/super-nini/aggbug/316253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-03-23 10:41 <a href="http://www.blogjava.net/super-nini/archive/2010/03/23/316253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:Oracle中插入图片并显示(用BLOB类型) </title><link>http://www.blogjava.net/super-nini/archive/2010/02/05/312076.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 05 Feb 2010 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/02/05/312076.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/312076.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/02/05/312076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/312076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/312076.html</trackback:ping><description><![CDATA[<span class="hilite2">Oracle</span>中插入图片并显示(用BLOB类型) <br />
要在<span class="hilite2">oracle</span>里面存入图片 用 blob类型 <br />
<br />
<br />
首先在数据库里建立： <br />
<br />
--连接到管理员 <br />
conn sys/tbsoft as sysdba; <br />
<br />
--为scott用户授权 <br />
<br />
grant create any directory to scott; <br />
<br />
--回到scott用户 <br />
<br />
conn scott/tiger; <br />
<br />
<br />
--创建存储图片的表 <br />
CREATE TABLE IMAGE_LOB (T_ID VARCHAR2 (5) NOT NULL,T_IMAGE BLOB NOT NULL); <br />
<br />
--创建存储图片的目录 <br />
CREATE OR REPLACE DIRECTORY IMAGES AS 'C:\picture'; <br />
<br />
--在c：下自己建一个叫picture的文件夹 <br />
<br />
CREATE OR REPLACE PROCEDURE IMG_INSERT (TID VARCHAR2,FILENAME VARCHAR2) AS <br />
F_LOB BFILE;--文件类型 <br />
B_LOB BLOB; <br />
BEGIN <br />
iNSERT INTO IMAGE_LOB (T_ID, T_IMAGE) <br />
VALUES (TID,EMPTY_BLOB ()) RETURN T_IMAGE INTO B_LOB; <br />
--插入空的blob <br />
F_LOB:= BFILENAME ('IMAGES', FILENAME); <br />
--获取指定目录下的文件 <br />
DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONLY); <br />
--以只读的方式打开文件 <br />
DBMS_LOB.LOADFROMFILE (B_LOB, F_LOB,DBMS_LOB.GETLENGTH (F_LOB)); <br />
--传递对象 <br />
DBMS_LOB.FILECLOSE (F_LOB); <br />
--关闭原始文件 <br />
COMMIT; <br />
END; <br />
/ <br />
<br />
<br />
--在C:\picture下放一张图片1.gif <br />
<br />
--将该图片存入表 <br />
call IMG_INSERT('1','1.gif'); <br />
<br />
<br />
然后创建一个web项目 连接数据库后 创建一个BlobDAO类 用来取出表中的blob类型图片 <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://pengyeer.javaeye.com/blog/183107#"><img alt="复制代码" src="http://pengyeer.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;BlobDAO&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;BlobDAO&nbsp;instance&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BlobDAO(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;BlobDAO()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;BlobDAO&nbsp;getInstance()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;instance; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;initConn()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;DBAccess.getInstance().getConn(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;getImage(String&nbsp;imgname)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream&nbsp;ins;</span><span class="comment">//取得BLOB的IO流 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;bt&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initConn(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blob&nbsp;bo&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement&nbsp;ps&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;</span><span class="string">"select&nbsp;T_IMAGE&nbsp;from&nbsp;IMAGE_LOB&nbsp;where&nbsp;t_id=?"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps&nbsp;=&nbsp;conn.prepareStatement(sql); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps.setString(</span><span class="number">1</span><span>,&nbsp;imgname); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;ps.executeQuery(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(rs.next())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bo&nbsp;=&nbsp;rs.getBlob(</span><span class="string">"T_IMAGE"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream(bo.getBinaryStream()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;bufferSize&nbsp;=&nbsp;(</span><span class="keyword">int</span><span>)&nbsp;bo.length();</span><span class="comment">//取得BLOB的长度 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[bufferSize]; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&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;ins.read(bt,&nbsp;</span><span class="number">0</span><span>,&nbsp;bufferSize); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&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;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&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;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//建立字节缓存 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ps.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;bt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public class BlobDAO {
private static final BlobDAO instance = new BlobDAO();
private Connection conn = null;
private BlobDAO() {
}
public static BlobDAO getInstance() {
return instance;
}
private void initConn() {
conn = DBAccess.getInstance().getConn();
}
public byte[] getImage(String imgname) {
BufferedInputStream ins;//取得BLOB的IO流
byte[] bt = null;
initConn();
Blob bo = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "select T_IMAGE from IMAGE_LOB where t_id=?";
try {
ps = conn.prepareStatement(sql);
ps.setString(1, imgname);
rs = ps.executeQuery();
if (rs.next()) {
bo = rs.getBlob("T_IMAGE");
try {
ins = new BufferedInputStream(bo.getBinaryStream());
int bufferSize = (int) bo.length();//取得BLOB的长度
bt = new byte[bufferSize];
try {
ins.read(bt, 0, bufferSize);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//建立字节缓存
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return bt;
}
}</pre>
<br />
<br />
在action里面调用getImage()方法并显示图片在页面上 <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://pengyeer.javaeye.com/blog/183107#"><img alt="复制代码" src="http://pengyeer.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BlobDAO&nbsp;blobDAO&nbsp;=&nbsp;BlobDAO.getInstance(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;bs&nbsp;=&nbsp;blobDAO.getImage(</span><span class="string">"1"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getOutputStream().write(bs); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
BlobDAO blobDAO = BlobDAO.getInstance();
byte[] bs = blobDAO.getImage("1");
try {
response.getOutputStream().write(bs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}</pre>
<br />
添加图片到数据库 <br />
<br />
请在c盘下放入图片--c:\\4.gif <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://pengyeer.javaeye.com/blog/183107#"><img alt="复制代码" src="http://pengyeer.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;savaImg(String&nbsp;imgId)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//传的是存入数据库图片的id </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initConn(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOB&nbsp;blob&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;</span><span class="comment">//图片类型 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;outputStream&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;</span><span class="comment">//输出流 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;</span><span class="comment">//文件 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;inputStream&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;</span><span class="comment">//输入流 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setAutoCommit(</span><span class="keyword">false</span><span>);&nbsp;</span><span class="comment">//事物由程序员操作 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st&nbsp;=&nbsp;conn.createStatement(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.executeQuery(</span><span class="string">"insert&nbsp;into&nbsp;IMAGE_LOB&nbsp;values('"</span><span>+&nbsp;imgId&nbsp;+</span><span class="string">"',empty_blob())"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs&nbsp;=&nbsp;st.executeQuery(</span><span class="string">"select&nbsp;T_IMAGE&nbsp;from&nbsp;IMAGE_LOB&nbsp;where&nbsp;t_id='"</span><span>+&nbsp;imgId&nbsp;+</span><span class="string">"'&nbsp;for&nbsp;update"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(rs.next())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blob&nbsp;=&nbsp;(BLOB)&nbsp;rs.getBlob(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream&nbsp;=&nbsp;blob.getBinaryOutputStream(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"c:\\4.gif"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileInputStream(file); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;b&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[blob.getBufferSize()]; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;len&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;((len&nbsp;=&nbsp;inputStream.read(b))&nbsp;!=&nbsp;-</span><span class="number">1</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&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;System.out.println(len); &nbsp;&nbsp;</span></li>
    <li><span>&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;outputStream.write(b,&nbsp;</span><span class="number">0</span><span>,&nbsp;len); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(FileNotFoundException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream.flush(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputStream.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.commit(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(SQLException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public void savaImg(String imgId) {
//传的是存入数据库图片的id
initConn();
Statement st = null;
BLOB blob = null; //图片类型
OutputStream outputStream = null; //输出流
File file = null; //文件
InputStream inputStream = null; //输入流
ResultSet rs = null;
try {
conn.setAutoCommit(false); //事物由程序员操作
st = conn.createStatement();
st.executeQuery("insert into IMAGE_LOB values('"+ imgId +"',empty_blob())");
rs = st.executeQuery("select T_IMAGE from IMAGE_LOB where t_id='"+ imgId +"' for update");
if (rs.next()) {
blob = (BLOB) rs.getBlob(1);
outputStream = blob.getBinaryOutputStream();
file = new File("c:\\4.gif");
inputStream = new FileInputStream(file);
byte[] b = new byte[blob.getBufferSize()];
int len = 0;
while ((len = inputStream.read(b)) != -1) {
System.out.println(len);
outputStream.write(b, 0, len);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
inputStream.close();
outputStream.flush();
outputStream.close();
rs.close();
st.close();
conn.commit();
conn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}</pre>
<br />
<br />
<br />
操作完毕！ <br />
<img src ="http://www.blogjava.net/super-nini/aggbug/312076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-02-05 11:26 <a href="http://www.blogjava.net/super-nini/archive/2010/02/05/312076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：高性能 高弹性JSP和Servlet性能优化</title><link>http://www.blogjava.net/super-nini/archive/2010/01/15/309646.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 15 Jan 2010 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2010/01/15/309646.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/309646.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2010/01/15/309646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/309646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/309646.html</trackback:ping><description><![CDATA[你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能、高弹性的<strong>JSP</strong>页面和Servlet的性能优化技术。其意思是建立尽可能快的并能适应数量增长的用户及其请求。在本文中，我将带领你学习已经实践和得到证实的性能调整技术，它将大大地提高你的<strong>servlet</strong>和jsp页面的性能，进而提升J2EE的性能。这些技术的部分用于开发阶段，例如，设计和编码阶段。另一部分技术则与配置相关。
<p>　　<strong>技术1：在HttpServlet init()方法中缓存数据</strong></p>
<p>　　服务器会在创建servlet实例之后和servlet处理任何请求之前调用servlet的init()方法。该方法在servlet的生命周期中仅调用一次。为了提高性能，在init()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如，一个最佳实践是使用实现了javax.sql.DataSource接口的JDBC连接池。DataSource从JNDI树中获得。每调用一次SQL就要使用JNDI查找DataSource是非常昂贵的工作，而且严重影响了应用的性能。Servlet的init()方法可以用于获取DataSource并缓存它以便之后的重用：</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="font-weight: bold; color: #990000">以下是引用片段：</font><br />
            　　public&nbsp;class&nbsp;ControllerServlet&nbsp;extends&nbsp;HttpServlet <br />
            　　{ <br />
            　　private&nbsp;javax.sql.DataSource&nbsp;testDS&nbsp;=&nbsp;null; <br />
            　　public&nbsp;void&nbsp;init(ServletConfig&nbsp;config)&nbsp;throws&nbsp;ServletException <br />
            　　{ <br />
            　　super.init(config); <br />
            　　Context&nbsp;ctx　=&nbsp;null; <br />
            　　try <br />
            　　{ <br />
            　　ctx&nbsp;=&nbsp;new&nbsp;InitialContext(); <br />
            　　testDS&nbsp;=&nbsp;(javax.sql.DataSource)ctx.lookup("jdbc/testDS"); <br />
            　　} <br />
            　　catch(NamingException&nbsp;ne) <br />
            　　{ <br />
            　　ne.printStackTrace(); <br />
            　　} <br />
            　　catch(Exception&nbsp;e) <br />
            　　{ <br />
            　　e.printStackTrace(); <br />
            　　} <br />
            　　} <br />
            　　public&nbsp;javax.sql.DataSource&nbsp;getTestDS() <br />
            　　{ <br />
            　　return&nbsp;testDS; <br />
            　　} <br />
            　　... <br />
            　　... <br />
            　　}</td>
        </tr>
    </tbody>
</table>
</p>
<p>　　<strong>技术2：禁用servlet和Jsp的自动装载功能</strong></p>
<p>　　当每次修改了Servlet/JSP之后，你将不得不重新启动服务器。由于自动装载功能减少开发时间，该功能被认为在开发阶段是非常有用的。但是，它在运行阶段是非常昂贵的;servlet/JSP由于不必要的装载，增加类装载器的负担而造成很差的性能。同样，这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突现象。因此，在运行环境中为了得到更好的性能，关闭servlet/JSP的自动装载功能。</p>
<p>　　<strong>技术3：控制HttpSession</strong></p>
<p>　　许多应用需要一系列客户端的请求，因此他们能互相相关联。由于HTTP协议是无状态的，所以基于Web的应用需要负责维护这样一个叫做session的状态。为了支持必须维护状态的应用，Java servlet技术提供了管理session和允许多种机制实现session的API。HttpSession对象扮演了session，但是使用它需要成本。无论何时HttpSession被使用和重写，它都由servlet读取。你可以通过使用下面的技术来提高性能：</p>
<p>　　在JSP页面中不要创建默认的HttpSession:默认情况下，JSP页面创建HttpSession。如果你在JSP页面中不用HttpSession，为了节省性能开销，使用下边的页面指令可以避免自动创建HttpSession对象：</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="font-weight: bold; color: #990000">以下是引用片段：</font><br />
            &lt;&nbsp;%@&nbsp;page&nbsp;session="false"%&gt;</td>
        </tr>
    </tbody>
</table>
</p>
<p>　　不要将大的对象图存储在HttpSession中：如果你将数据当作一个大的对象图存储在HttpSession中，应用服务器每次将不得不处理整个HttpSession对象。这将迫使Java序列化和增加计算开销。由于序列化的开销，随着存储在HttpSession对象中数据对象的增大，系统的吞吐量将会下降。</p>
<p>　　用完后释放HttpSession：当不在使用HttpSession时，使用HttpSession.invalidate()方法使sesion失效。</p>
<p>　　设置超时值：一个servlet引擎有一个默认的超时值。如果你不删除session或者一直把session用到它超时的时候，servlet引擎将把session从内存中删除。由于在内存和垃圾收集上的开销，session的超时值越大，它对系统弹性和性能的影响也越大。试着将session的超时值设置的尽可能低。</p>
<p>　　<strong>技术4：使用gzip压缩</strong></p>
<p>　　压缩是删除冗余信息的作法，用尽可能小的空间描述你的信息。使用gzip(GNU zip)压缩文档能有效地减少下载HTML文件的时间。你的信息量越小，它们被送出的速度越快。因此，如果你压缩了由你web应用产生的内容，它到达用户并显示在用户屏幕上的速度就越快。不是任何浏览器都支持gzip压缩的，但检查一个浏览器是否支持它并发送gzip压缩内容到浏览器是很容易的事情。下边的代码段说明了如何发送压缩的内容。</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="font-weight: bold; color: #990000">以下是引用片段：</font><br />
            　　public&nbsp;void&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response) <br />
            　　throws&nbsp;IOException,&nbsp;ServletException <br />
            　　{ <br />
            　　OutputStream&nbsp;out&nbsp;=&nbsp;null <br />
            　　//&nbsp;Check&nbsp;the&nbsp;Accepting-Encoding&nbsp;header&nbsp;from&nbsp;the&nbsp;HTTP&nbsp;request. <br />
            　　//&nbsp;If&nbsp;the&nbsp;header&nbsp;includes&nbsp;gzip,&nbsp;choose&nbsp;GZIP. <br />
            　　//&nbsp;If&nbsp;the&nbsp;header&nbsp;includes&nbsp;compress,&nbsp;choose&nbsp;ZIP. <br />
            　　//&nbsp;Otherwise&nbsp;choose&nbsp;no&nbsp;compression. <br />
            　　String&nbsp;encoding&nbsp;=&nbsp;request.getHeader("Accept-Encoding"); <br />
            　　if&nbsp;(encoding&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;encoding.indexOf("gzip")&nbsp;!=&nbsp;-1) <br />
            　　{ <br />
            　　response.setHeader("Content-Encoding"&nbsp;,&nbsp;"gzip"); <br />
            　　out&nbsp;=&nbsp;new&nbsp;GZIPOutputStream(response.getOutputStream()); <br />
            　　} <br />
            　　else&nbsp;if&nbsp;(encoding&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;encoding.indexOf("compress")&nbsp;!=&nbsp;-1) <br />
            　　{ <br />
            　　response.setHeader("Content-Encoding"&nbsp;,&nbsp;"compress"); <br />
            　　out&nbsp;=&nbsp;new&nbsp;ZIPOutputStream(response.getOutputStream()); <br />
            　　} <br />
            　　else <br />
            　　{ <br />
            　　out&nbsp;=&nbsp;response.getOutputStream(); <br />
            　　} <br />
            　　... <br />
            　　... <br />
            　　}</td>
        </tr>
    </tbody>
</table>
</p>
<p>　　<strong>技术5：不要使用SingleThreadModel</strong></p>
<p>　　SingleThreadModel保证servlet一次仅处理一个请求。如果一个servlet实现了这个接口，servlet引擎将为每个新的请求创建一个单独的servlet实例，这将引起大量的系统开销。如果你需要解决线程安全问题，请使用其他的办法替代这个接口。SingleThreadModel在Servlet 2.4中是不再提倡使用。</p>
<p>　　<strong>技术6：使用线程池</strong></p>
<p>　　servlet引擎为每个请求创建一个单独的线程，将该线程指派给service()方法，然后在service()方法执行完后删除该线程。默认情况下，servlet引擎可能为每个请求创建一个新的线程。由于创建和删除线程的开销是很昂贵的，于是这种默认行为降低了系统的性能。我们可以使用线程池来提高性能。根据预期的并发用户数量，配置一个线程池，设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值。起初，servlet引擎创建一个线程数与配置中的最小线程数量相等的线程池。然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程，完成操作之后，servlet引擎把线程放回到线程池中。使用线程池，性能可以显著地提高。如果需要，根据线程的最大数和增长数，可以创建更多的线程。</p>
<p>　　<strong>技术7：选择正确的包括机制</strong></p>
<p>　　在JSP页面中，有两中方式可以包括文件：包括指令(&lt; %@ include file="test.jsp" %&gt;)和包括动作(&lt; jsp:include page="test.jsp" flush="true" /&gt;)。包括指令在编译阶段包括一个指定文件的内容;例如，当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如，当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动，否则使用包括指令将会获得更好的性能。</p>
<p>　　<strong>技术8：在useBean动作中使用合适的范围</strong></p>
<p>　　使用JSP页面最强大方式之一是和JavaBean组件协同工作。JavaBean使用&lt; jsp:useBean&gt;标签可以嵌入到JSP页面中。语法如下：</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3"><font style="font-weight: bold; color: #990000">以下是引用片段：</font><br />
            　　&lt;&nbsp;jsp:useBean&nbsp;id="name"&nbsp;scope="page|request|session|application"&nbsp;class= <br />
            　　"package.className"&nbsp;type="typeName"&gt; <br />
            　　&lt;&nbsp;/jsp:useBean&gt;</td>
        </tr>
    </tbody>
</table>
</p>
<p>　　scope属性说明了bean的可见范围。scope属性的默认值是page。你应该根据你应用的需求选择正确的范围，否则它将影响应用的性能。</p>
<p>　　例如，如果你需要一个专用于某些请求的对象，但是你把范围设置成了session，那么那个对象将在请求结束之后还保留在内存中。它将一直保留在内存中除非你明确地把它从内存中删除、使session无效或session超时。如果你没有选择正确的范围属性，由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/309646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2010-01-15 10:43 <a href="http://www.blogjava.net/super-nini/archive/2010/01/15/309646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：struts2 标签简要</title><link>http://www.blogjava.net/super-nini/archive/2009/12/29/307648.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 29 Dec 2009 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/12/29/307648.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/307648.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/12/29/307648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/307648.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/307648.html</trackback:ping><description><![CDATA[（1）： &lt;s:textfield&gt;&nbsp; ----&nbsp; 文本输入框 <br />
&nbsp; &nbsp; 使用： &lt;s:textfield name=&#8221;实体Bean。属性&#8221;&gt; &lt;/s:textfield&gt; <br />
（2）： &lt;s:textarea&gt;&nbsp; -----&nbsp; 文本域输入框 <br />
使用： &lt;s:textarea name=&#8221;实体Bean。属性&#8221;&gt; &lt;/s:textarea&gt; <br />
（3）： &lt;s:password&gt;&nbsp; -----&nbsp; 密码输入框 <br />
使用： &lt;s:password name=&#8221;实体Bean。属性&#8221;&gt; &lt;/s:password&gt; <br />
前三个基本都是一样的。如果是要显示值的话可以这样：value = &#8220;实体Bean。Get***()&#8221;。 <br />
（4）： &lt;s:radio list=&#8221;&#8221;&gt; ---- 单选按钮 <br />
使用： &lt;s:radio list=&#8221;&#8221;&gt;其中list 属性是必须要有的。 <br />
&lt;1&gt;:第一种方式：list = &#8220;#{&#8216;male&#8217;:&#8217;男&#8217;,&#8217;female&#8217;:&#8217;女&#8217;}&#8221; <br />
&lt;2&gt;:第二中方式：list = &#8220;#request/session.list&#8221;。&nbsp; ----&nbsp; 与action结合起来了。 <br />
如果要默认选中的话后面加上value = &#8220;&#8221;.也可以通过javascript的方式来默认选中。 <br />
（5）： &lt;s:url/&gt;&nbsp; --- url连接 <br />
&nbsp; &nbsp; &nbsp; &lt;s:a/&gt;&nbsp; --- 超链接 <br />
&nbsp; &nbsp; &nbsp; 这两个标签一般结合起来来使用。 <br />
&nbsp; &nbsp; &nbsp; 使用： &lt;s:url id = &#8220;id&#8221; action = &#8220;userAction&#8221;/&gt; &lt;s:a href=&#8221;%{id}&#8221;/&gt; <br />
（6）： &lt;s:form/&gt;&nbsp; ---&nbsp; 获取相应form的值 <br />
使用： <br />
&lt;1&gt;： &lt;s:form action = &#8220;userAction&#8221;&gt; <br />
&lt;2&gt;： &lt;s:url id=&#8221;userId&#8221; action = &#8220;userAction&#8221;&gt;&nbsp; -- 定义了一个userId的指向userActionde 路径 <br />
&lt;s:form action=&#8221;%{userId}&#8221;&gt; <br />
（7）： &lt;s:submit/&gt;&nbsp; ---- 提交标签 <br />
（8）： &lt;s:reset/&gt;&nbsp; &nbsp; ---- 重置标签 <br />
（9）： &lt;s:hidden/&gt;&nbsp; ---- 隐藏域标签 <br />
&nbsp; &nbsp; 使用： &lt;s:hidden name=&#8221;实体Bean。属性&#8221; value=&#8221;%{#request/session.实体Bean。属性}&#8221;/&gt; <br />
（10）： &lt;s:combobox/&gt;&nbsp; ---- 下拉框配合输入框一起使用 <br />
&nbsp; &nbsp; 使用： &lt;s:combobox name=&#8221;age&#8221; list=&#8221;&#8221;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;1&gt;:list = &#8220;{18,20,30}&#8221; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;2&gt;:list = &#8220;#request/session.list&#8221; <br />
（11）： &lt;s:checkbox/&gt;&nbsp; ---- 多选框 <br />
&nbsp; &nbsp; 使用： &lt;s:checkbox name=&#8221;自己随便起&#8221; value = &#8220;值&#8221; &gt; 足球 <br />
（12）： &lt;s:checkboxlist/&gt;&nbsp; ---- 复选框 <br />
&nbsp; &nbsp; 使用： &lt;s:checkboxlist name=&#8221;自己随便起&#8221; label = &#8220;标签前面的名字&#8221; list=&#8221;&#8221;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;1&gt;：list = &#8220;{&#8216;hibernate&#8217;, &#8216;spring&#8217;, &#8216;strust2&#8217;}&#8221; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;2&gt;：list = &#8220;#request/session.list&#8221;. <br />
&nbsp; &nbsp; &nbsp; &nbsp; 如果想默认选中的话，那么加上value=&#8221;&#8221; <br />
（13）： &lt;s:if test=""&gt; &lt;/s:if&gt; <br />
&lt;s:elseif test=""&gt; &lt;/s:elseif&gt; <br />
&lt;s:else&gt; &lt;/s:else&gt;&nbsp; &nbsp; &nbsp; &nbsp; ----&nbsp; &nbsp; &nbsp; -这3个标签一起使用，表示条件判断 <br />
使用： <br />
&nbsp; &lt;s:if test="%{false}"&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;div&gt;Will Not Be Executed &lt;/div&gt; <br />
&lt;/s:if&gt; <br />
&lt;s:elseif test="%{true}"&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;div&gt;Will Be Executed &lt;/div&gt; <br />
&lt;/s:elseif&gt; <br />
&lt;s:else&gt; <br />
&nbsp; &nbsp; &lt;div&gt;Will Not Be Executed &lt;/div&gt; <br />
&lt;/s:else&gt; <br />
（14）： &lt;s:div/&gt;&nbsp; ---&nbsp; 表示一个块，类似与html中的div <br />
（15）： &lt;s:generator/&gt;&nbsp; ---- 一般和 &lt;s:iterator/&gt;一起使用。 <br />
使用： <br />
&nbsp; &lt;s:generator separator = &#8220;,&#8221; val=&#8221;%{aaa, bbb, ccc, ddd, eee}&#8221;&gt; <br />
&nbsp; &nbsp; &lt;s:iterator&gt; <br />
&nbsp; &nbsp; &nbsp; &lt;s:property/&gt; &lt;br /&gt; <br />
&nbsp; &nbsp; &lt;/s:iterator&gt; <br />
&nbsp; &lt;/s:generator&gt; <br />
&lt;s:iterator value=&#8221;days&#8221; status=&#8221;d&#8221;&gt; <br />
&nbsp; &lt;s:property name=&#8221;d.***&#8221;/&gt; <br />
&lt;/s:iterator&gt; <br />
Days表示：在action中存的值，status ：表示起的别名。 &lt;s:property name=&#8221;d.***&#8221;&gt;循环的一个个属性。 <br />
（16）： &lt;s:select/&gt;&nbsp; ----&nbsp; 下拉框的使用 <br />
&nbsp; 使用： <br />
&nbsp; &nbsp; &lt;s:select label=&#8221;请选择&#8221; list=&#8221;{&#8216;book&#8217;, &#8216;pen&#8217;, &#8216;moon&#8217;}&#8221; value=&#8221;%{&#8216;pen&#8217;}&#8221;&gt; <br />
&nbsp; &nbsp; Value : 表示默认值。 <br />
（17）： &lt;s:bean/&gt;&nbsp; ----- Bean标签，当然需要一个JavaBean。它的属性值的操作是经由Bean标签中的参数属性来进行赋值。当然，它还有一个id属性可以进行赋值，这样就可以在上下文中使用这个Bean. <br />
&nbsp; 使用： &lt;s:bean name=&#8221;le.tks.Books&#8221; id=&#8221;book&#8221;&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;s:param name=&#8221;bookName&#8221;&gt;jsf &lt;/s:param&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;s:property name=&#8221;%{bookname}&#8221;/&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/s:bean&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; 页面输出的结果：jsf。 <br />
（18）： &lt;s:date/&gt;&nbsp; ---- 方便在页面中进行格式化的输出。 <br />
&nbsp; 使用： <br />
&nbsp; &nbsp; &nbsp; &lt;s:date name=&#8221;currentDate&#8221; format=&#8221;dd/MM/yyyy&#8221;&gt; <br />
&nbsp; 页面中显示的结果：24/09/2008.&nbsp; 格式还有很多：MM/dd/yyyy、MM/dd/yyyy hh:mm:ss等。 <br />
（19）： &lt;s:include/&gt;&nbsp; ---- 包含标签,是把这个页面中的所有的内容都包含进来。 <br />
&nbsp; 使用： &lt;s:include name=&#8221;/**/**/**.jsp&#8221;/&gt; <br />
（20）： &lt;s:param/&gt;&nbsp; ---&nbsp; param标签用于传递参数，如给 &lt;s:bean&gt;标签传递参数，它有两个属性： <br />
&nbsp; &lt;1&gt;:name(String)：参数名。 <br />
&nbsp; &lt;2&gt;：value(Object)：参数值。 <br />
&nbsp; 使用： <br />
&nbsp; &lt;a href=" <br />
&lt;s:url action="book"&gt; <br />
&lt;s:param name="gId" value="20"&gt; &lt;/s:param&gt; <br />
&lt;s:param name="operate" value="50"&gt; &lt;/s:param&gt; <br />
&lt;s:param name="projectName" value="30"&gt; &lt;/s:param&gt; <br />
&lt;/s:url&gt;"&gt; <br />
insert &lt;/a&gt; <br />
（21）： &lt;s:set/&gt;&nbsp; ---&nbsp; Set标签用户将某一值赋给某一变量，因此，任何对该项值的引用都可以通过该变量来得到该值. <br />
&nbsp; 使用： <br />
&nbsp; &nbsp; &lt;s:set name="teacher" value="%{'数学高级教师'}"/&gt; <br />
&nbsp; 教师职称： &lt;s:property value="#teacher"/&gt; <br />
&nbsp; 页面显示：教师职称：数学高级教师。 <br />
（22）： &lt;s:token/&gt;&nbsp; ---- 防止重复提交 <br />
&nbsp; 使用：在页面加载时， &lt;s:token/&gt;会产生一个GUID（Globally Unique Identifier， <br />
全局唯一标识符）值的隐藏输入框如： <br />
&lt;input type="hidden" name="struts.token.name" value="struts.token"/&gt; <br />
&lt;input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/&gt; <br />
放在页面中随便的一个地方。 &lt;s:token/&gt;
 <img src ="http://www.blogjava.net/super-nini/aggbug/307648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-12-29 16:23 <a href="http://www.blogjava.net/super-nini/archive/2009/12/29/307648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Java 图形用户界面设计</title><link>http://www.blogjava.net/super-nini/archive/2009/12/24/307163.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 24 Dec 2009 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/12/24/307163.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/307163.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/12/24/307163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/307163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/307163.html</trackback:ping><description><![CDATA[作为一个 Java 程序员，从论坛上感受到使用 Java 开发程序的人越来多，心中不免欣慰。但是，同样是从论坛中，看到多数人提到 Java 就以为是网络开发——不是这样的，Java 也可以开发应用程序，而且可以开发出漂亮的图形用户界面的应用程序，也就是 Windows/XWindow 应用程序。因此，我写下这篇文章，希望能带你进入Java 图形用户界面设计之门。<br />
　　一. AWT 和 SWING <br />
　　AWT 和 SWING 是 Java 设计 GUI 用户界面的基础。与 AWT 的重量级组件不同，Swing 中大部分是轻量级组件。正是这个原因，Swing 几乎无所不能，不但有各式各样先进的组件，而且更为美观易用。所以一开始使用 AWT 的程序员很快就转向使用 Swing 了。<br />
　　那为什么 AWT 组件没有消亡呢？因为 Swing 是架构在 AWT 之上的，没有 AWT 就没有 Swing。所以程序员可以根据自己的习惯选择使用 AWT 或者是 Swing。但是，最好不要二者混用——除开显示风格不同不说，还很可能造成层次 (Z-Order) 错乱，比如下例：<br />
　　/**<br />
　　* TestPanels.java<br />
　　* @author Fancy<br />
　　*/ <br />
　　import javax.swing.*;<br />
　　import java.awt.*;<br />
　　public class TestPanels extends JFrame {<br />
　　public TestPanels() {<br />
　　setDefaultCloseOperation(EXIT_ON_CLOSE);<br />
　　JPanel panel = new JPanel();<br />
　　for (int i = 0; i &lt; 2; i++) {<br />
　　panel.add(new JButton("Button 00" + i));<br />
　　}<br />
　　JTextArea textArea = new JTextArea(5, 15);<br />
　　textArea.setLineWrap(true);<br />
　　JScrollPane scrollPane = new JScrollPane(textArea);<br />
　　getContentPane().add(panel, BorderLayout.NORTH);<br />
　　getContentPane().add(scrollPane, BorderLayout.CENTER);<br />
　　pack();<br />
　　}<br />
　　public static void main(String[] args) {<br />
　　TestPanels tp = new TestPanels();<br />
　　tp.show();<br />
　　}<br />
　　}<br />
　　运行这个程序，并用鼠标拖动那个名为&#8220;cover&#8221;的子窗口，我们会发现一个非常有趣的现象，如图：<br />
　　　 <br />
　　显然 cover 子窗口是在 controls 子窗口之上的，但是它只罩盖住了 Swing Button，没有罩盖住 AWT Button。再看一会儿，你是不是有这样一种感觉：Swing Button 是&#8220;画&#8221;上去的，而 AWT Button 则是&#8220;贴&#8221;上去的。这就是二者混用造成层次错乱的一个例子。<br />
　　Swing 组件有美观、易用、组件量大等特点，也有缺点——使用 Swing 组件的程序通常会比使用 AWT 组件的程序运行更慢。但是大家都还是更喜欢用 Swing 组件，原因何在？因为随着计算机硬件的升级，一点点速度已经不是问题。相反的，用户更需要美观的用户界面，开发人员则更需要易用的开发组件。<br />
　　——好，我这就来教你使用 Swing 组件开发图形用户界面的 Java 应用程序。<br />
　　二. 框架、监听器和事件<br />
　　框架 (Frame) 是 Java 图形用户界面的基础，它就是我们通常所说的窗口，是 Windows/XWindow 应用程序的典型特征。说到 Windows/XWindow，大家很容易联想到&#8220;事件 (Event) 驱动&#8221;。Java 的图形用户界面正是事件驱动的，并且由各种各样的监听器 (Listener) 负责捕捉各种事件。<br />
　　如果我们需要对某一个组件的某种事件进行捕捉和处理时，就需要为其添加监听器。比如，我们要在一个窗口 (JFrame) 激活时改变它的标题，我们就需要为这个窗口 (JFrame 对象) 添加一个可以监听到&#8220;激活窗口&#8221;这一事件的监听器——WindowListener。<br />
　　怎么添加监听器呢？这通常由组件类提供的一个 addXXXXXListener 的方法来完成。比如 JFrame 就提供有 addWindowListener 方法添加窗口监听器 (WindowListener)。<br />
　　一个监听器常常不只监听一个事件，而是可以监听相关的多个事件。比如 WindowListener 除了监听窗口激活事件 (windowActivate) 之外，还可以监听窗口关闭事件 (windowClosing) 等。那么这些事件怎么区分呢？就靠重载监听器类 (Class) 的多个方法 (Method) 了，监听器监听到某个事件后，会自动调用相关的方法。我们只要重载这个方法，就可以处理相应的事件了。<br />
　　不妨先看一个例子：<br />
　　/**<br />
　　* TestFrame.java<br />
　　* @author Fancy<br />
　　*/ <br />
　　import javax.swing.*;<br />
　　import java.awt.event.*;<br />
　　public class TestFrame extends JFrame {<br />
　　private int counter = 0;<br />
　　public TestFrame(){<br />
　　/* 使用匿名类添加一个窗口监听器 */<br />
　　addWindowListener(new WindowAdapter() {<br />
　　public void windowClosing(WindowEvent e) {<br />
　　System.out.println("Exit when Closed event");<br />
　　System.exit(0); //退出应用程序<br />
　　}<br />
　　public void windowActivated(WindowEvent e){setTitle("Test Frame " + counter++); // 改变窗口标题<br />
　　}<br />
　　});<br />
　　setResizable(false); // 设置窗口为固定大小<br />
　　setSize(200, 150);<br />
　　}<br />
　　public static void main(String[] args) {<br />
　　TestFrame tf = new TestFrame();<br />
　　tf.show();<br />
　　}<br />
　　}<br />
　　这个例子中，我们设计了一个窗口类(public class TestFrame extends JFrame { ...)，并且为这个窗口添加了一个窗口监听器 (addWindowListener(new WindowAdapter() ...)。而我们添加的这个窗口监听器主要监听了两个事件：窗口关闭 (public void windowClosing(WindowEvent e) ...) 和窗口激活 (public void windowActivated(WindowEvent e) ...)。在窗口关闭事件中我们退出了整个应用程序(System.exit(0);)，而在窗口激活事件中，我们改变了窗口的标题 (setTitle("Test Frame " + counter++);)。最后，我们在 main 方法中显示了这窗口类的一个实例，运行得到下图所示的结果：<br />
　　　 <br />
　　这个程序的运行结果就是一个什么东西都没有加的框架，也就是一个空窗口。那么，你知道显示一个窗口最主要的几句代码吗？不知道没关系，我来告诉你，显示一个窗口只需要做三件事：生成实例(对象) -&gt; 设置大小 -&gt; 显示，相应的，就是下面的三句代码：<br />
　　JFrame frame = new JFrame("Frame's Title");<br />
　　frame.setSize(400, 300);<br />
　　frame.show(); <br />
　　也许你会说：第一句的意思我清楚，第三句的意思我也明白，为什么一定要第二句呢？其实想想也就明白了，叫你画一个没法有大小的矩形你能画出来吗？不能。同样，没有大小的窗口，怎么显示？所以我们需要用 setSize(int width, int height) 方法为其设置大小。我们还有另一种方法：用 JFrame 的 pack() 方法让它自己适配一个大小。pack() 在多数时候是令人满意的，但有时，它也会让你哭笑不得——多试试就知道了。<br />
　　在 JFrame 中，我们使用 addWindowListener 方法加入一个监听器 WindowListener (addWindowListener(new WindowAdapter() ...) 去监听发生在 JFrame 上的窗口事件。WindowListener 是一个接口，在 java.awt.event 这个包中，但是上例中好象并没有使用 WindowListener，而是使用的 WindowsAdapter 吧，这是怎么回事？<br />
　　WindowAdapter 是 WindowsListener 接口的一个最简单的实现，也在包 java.awt.event 中。如果我们直接使用 WindowListener 产生一个匿名类，需要实现它的每一个方法 (一共 7 个)。但 WindowAdapter 作为 WindowListener 最简单的实现，已经实现了它的每一个方法为空方法 (即只包含空语句，或者说没有语句的方法)。用 WindowAdapter 就只需要重载可能用到的方法 (上例中只有 2 个) 就行了，而不需要再去实现每一个方法。优点显而易见——减少代码量。<br />
　　在 JFrame 上发生的窗口事件 (WindowEvent) 包括：<br />
　　windowActivated(WindowEvent e) 窗口得到焦点时触发 <br />
　　windowClosed(WindowEvent e) 窗口关闭之后触发 <br />
　　windowClosing(WindowEvent e) 窗口关闭时触发 <br />
　　windowDeactivated(WindowEvent e) 窗口失去焦点时触发 <br />
　　windowDeiconified(WindowEvent e)　 <br />
　　windowIconified(WindowEvent e)　 <br />
　　windowOpened(WindowEvent e) 窗口打开之后触发 <br />
　　上例重载了其中两个方法。如果在上例运行产生的窗口和另外一个应用程序窗口之间来回切换 (在 Windows 操作系统中你可以使用 Alt+Tab 进行切换)&#8230;&#8230;试试看，你发现了什么？有没有现我们的示例窗口标题上的数字一直在增加，这便是在 windowActivated 事件中 setTitle("Test Frame " + counter++); 的功劳。<br />
　　而另一个事件处理函数 windowClosing 中的 System.exit(0) 则保证了当窗口被关闭时退出当前的 Java 应用程序。如果不作这样的处理会怎样呢？试验之后你会发现，窗口虽然关闭了，但程序并没有结束，但此时，除了使用 ^C 强行结束之外，恐怕也没有其它办法了。所以，这一点非常重要：如果你想在关闭窗口的时候退出应用程序，需要你自己写代码处理 windowClosing 事件。&#8230;&#8230;也不尽然，其实还有另外一个更简单的办法，让 JFrame 自己处理这件事——你只需要如下调用 JFrame 的 setDefaultCloseOperation 即可：　frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); <br />
　　我们可以在 JFrame 对象中添加 AWT 或者 Swing 组件。但是，虽然它有 add 方法，却不能直接用于添加组件，否则会抛出异常——不信就试试。造成这个现象的原因只有一个解释：JFrame 不是一个容器，它只是一个框架。那么，应该怎么添加组件呢？<br />
<br />
　　JFrame 有一个 Content Pane，窗口是显示的所有组件都是添加在这个 Content Pane 中。JFrame 提供了两个方法：getContentPane 和 setContentPane 就是用于获取和设置其 Content Pane 的。通常我们不需要重新设置 JFrame 的 Content Pane，只需要直接获取 <br />
<br />
<br />
四. 文本输入框、密码输入框<br />
　　文本输入框包括两种，单行文本输入框 (JTextField) 和多行文本输入框 (JTextArea)。密码输入框则只有一种 (JPasswordField)。JPasswordField 是 JTextField 的子类，它们的主要区别是 JPasswordField 不会显示出用户输入的东西，而只会显示出程序员设定的一个固定字符，比如 '*'。<br />
　　下面的示例图和代码是 JTextField、JPasswordField 和 JTextArea 的示例：<br />
　　　 <br />
　　/**<br />
　　* TestTexts.java<br />
　　* @author Fancy<br />
　　*/ <br />
　　import javax.swing.*;<br />
　　import javax.swing.event.*;<br />
　　public class TestTexts extends JFrame {<br />
　　private JLabel label = new JLabel("Status");<br />
　　private JTextField textField;<br />
　　private JPasswordField pwdField;<br />
　　private JTextArea textArea;<br />
　　public TestTexts() {<br />
　　super("Test Texts");<br />
　　setDefaultCloseOperation(EXIT_ON_CLOSE);<br />
　　getContentPane().setLayout(new java.awt.FlowLayout());<br />
　　textField = new JTextField(15);<br />
　　/* 监听文本光标移动事件 */<br />
　　textField.addCaretListener(new CaretListener() {<br />
　　public void caretUpdate(CaretEvent e) {<br />
　　// 如果改变了内容，就可以即时更新 label 显示的内容<br />
　　label.setText(textField.getText());<br />
　　}<br />
　　});<br />
　　pwdField = new JPasswordField(15);<br />
　　pwdField.setEchoChar('#');<br />
　　textArea = new JTextArea(5, 15);<br />
　　textArea.setLineWrap(true);<br />
　　getContentPane().add(textField);<br />
　　getContentPane().add(pwdField);<br />
　　getContentPane().add(textArea);<br />
　　getContentPane().add(label);<br />
　　setSize(200, 200);<br />
　　}<br />
　　public static <br />
　　void main(String[] args) {<br />
　　TestTexts tt = new TestTexts();<br />
　　tt.show();<br />
　　}<br />
　　}<br />
　　上例中，我们构造了一个宽度为 15 个字符的单行文本框 (textField = new JTextField(15);)，并使用 addCaretListener 方法添加了一个 CaretListener (textField.addCaretListener ...)。CaretListener 监听文本光标的移动事件。当用户使用键盘、鼠标等移动了文本光标在 JTextField 中的位置时触发这个事件。我们需要重载 caretUpdate(CaretEvent e) 对事件进行处理 (public void caretUpdate(CaretEvent e) ...)。这样，我们可以在这里做类似 VB 中 TextBox 的 OnChange 事件中做的事情。<br />
　　JTextField 有 5 个构造方法，常用其中的四个：<br />
　　JTextField()<br />
　　JTextField(int columns)，如上例 textField = new JTextField(15);<br />
　　JTextField(String text)<br />
　　JTextField(String text, int columns) <br />
　　其中，参数 text 是单行文本框的初始内容，而 columns 指定了单行文本框的宽度，以字符为单位。JTextField 中的文本内容可以用 getText() 方法获得。也可以用 setText 方法指定 JTextField 中的文本内容。<br />
　　JPasswordField 是 JTextField 的子类，其构造方法也是类似的。JPasswordField 提供了 setEchoChar(char ch) 方法设置为了隐藏密码而显示的字符，默认为 '*' 字符，上例中则设置为了 '#' 字符 (pwdField.setEchoChar('#');)。与 JTextField 一样，JPasswordField 也用 getText 方法和 setText 获得或者设置文本内容 (当然在用户界面上是隐藏的)。<br />
　　JTextField 是单行文本框，不能显示多行文本，如果想要显示多行文本，就只好使用多行文本框 JTextArea 了。JTextArea 有六个构造方法，常用的也是四个：<br />
　　JTextArea()<br />
　　JTextArea(int rows, int columns) <br />
　　JTextArea(String text) <br />
　　JTextArea(String text, int rows, int columns)　 <br />
　　text 为 JTextArea 的初始化文本内容；rows 为 JTextArea 的高度，以行为单位；columns 为 JTextArea 的宽度，以字符为单位。如上例中就构造了一个高 5 行，宽 15 个字符的多行文本框 (textArea = new JTextArea(5, 15);)。<br />
　　多行文本框默认是不会自动折行的 (不过可以输入回车符换行)，我们可以使用 JTextArea 的 setLineWrap 方法设置是否允许自动折行。setLineWrap(true) 是允许自动折行，setLineWrap(false) 则是不允许自动折行。多行文本框会根据用户输入的内容自动扩展大小，不信，自己做个实验——如果不自动折行，那么多行文本框的宽度由最长的一行文字确定的；如果行数据超过了预设的行数，则多行文本框会扩展自身的高度去适应。换句话说，多行文本框不会自动产生滚动条。怎么办？后面讲到滚动窗格 (JScrollPane) 的时候，你就知道了。<br />
　　多行文本框里文本内容的获得和设置，同样可以使用 getText 和 setText 两个方法来完成。<br />
　　五. 窗格、滚动窗格和布局管理<br />
　　窗格 (JPanel) 和滚动窗格 (JScrollPane) 在图形用户界面设计中大量用于各种组件在窗口上的布置和安排。这里所谓的布置和安排，就是布局 (Layout)，因此不得不先说说布局。<br />
　　将加入到容器(通常为窗口等) 的组件按照一定的顺序和规则放置，使之看起来更美观，这就是布局。布局由布局管理器 (Layout Manager) 来管理。那么，我们在什么时候应该使用布局管理器？应用选择哪种布局管理器？又该怎样使用布局管理器呢？<br />
　　往往，我们设计一个窗口，其中是要添加若干组件的。为了管理好这些管理的布局，我们就要使用布局管理器。比如说，设计一个简单的编辑器，这个编辑器中只需要放置两个按钮和一个多行文本框。这些组件是让 Java 自己任意安排呢？还是按照一定的位置关系较规范的安排呢？当然应该选择后者。那么，为了按照一定的位置关系安排这些组件，我们就需要用到布局管理器了。<br />
　　然后我们遇到了一个选择题——使用哪种布局管理器。为此，我们首先要知道有些什么布局管理器，它们的布局特点是什么。常用的布局管理器有： FlowLayout、BorderLayout、GridLayout、BoxLayout 等，其中 FlowLayout 和 BorderLayout 最常用，本文主要也就只谈谈这两种布局管理器。下面列表说明它们的布局特点：<br />
　　　 <br />
　　就上述的编辑器为例，如果选用 FlowLayout，那么两个按钮和一个多行文本框就会排列在一行——当然这是窗口足够宽的情况；如果窗口稍窄一些，则可能分两行排列，第一行有两个按钮，而第二行是多行文本框——这是最理想的情况；如果窗口再窄一些，就可能分三行排列，第一行和第二行分别放置一个按钮，第三行放置多行文本框。因此，如果窗口大小可以改变，那么三个组件的位置关系也可能随着窗口大小的变化而变化。所以，FlowLayout 不适用。其实上面所举的例程中，大部分都是用的 FlowLayout，那是因为我们没有要求组件的布局。<br />
　　如果选用 BorderLayout 的情况又如何呢？我们可以试着加入一个窗格 (JPanel，稍后讲解)，并将两个按钮放置在其中，然后将这个窗格加入到 BorderLayout 的北部 (即上部)；再将多行文本框加入到 BorderLayout 中部。结果类似使用 FlowLayout 的第二种可能，是最理想的情况。而且，如果改变窗口大小，它们的位置关系仍然是北-中的关系，不会随之改变。<br />
　　剩下的两种布局管理器，加以窗格 (JPanel) 的配合，也能够很好的安排上述编辑器所需的三个组件。但是由于它们的使用稍为复杂一些，所以就不讲了。下面就讲讲如何使用 FlowLayout 和 BorderLayout。<br />
　　任何布局管理器，都需要用在容器上，比如 JFrame 的 Content Pane 和下面要说的 JPanel 都是容器。容器组件提供了一个 setLayout 方法，就是用来改变其布局管理器的。默认情况下，JFrame 的 Content Pane 使用的是 BorderLayout，而 JPanel 使用的是 FlowLayout。但不管怎样，我们都可以调用它们的 setLayout 方法来改变其布局管理器。比如上述的编辑器中，我们要让窗口 (JFrame 对象，假设为 frame) 使用 BorderLayout，就可以使用 frame.getContentPane().setLayout(new BorderLayout()); 来改变其布局管理器为一个新的 BorderLayout 对象。<br />
　　然后，我们对布局管理器的直接操作就结束了，剩下的只需要往容器里添加组件。如果使用 FlowLayout，我们只需要使用容器的 add(Component c) 方法添加组件就行了。但是，如果使用 BorderLayout 就不一样了，因为要指定是把组件添加到哪个区域啊。那我们就使用容器的 add(Component c, Object o) 方法添加组件，该方法的第二个参数就是指明添加到的区域用的。例如，上述编辑器中要添加一个多行文本框到 BorderLayout 的中部，就可以用 frame.getContentPane().add(new JTextArea(5, 15), BorderLayout.CENTER) 来实现。<br />
　　BorderLayout 的五个区域分别是用下列五个常量来描述的：<br />
　　BorderLayout.EAST 东 <br />
　　BorderLayout.SOUTH 南 <br />
　　BorderLayout.WEST 西 <br />
　　BorderLayout.NORTH 北 <br />
　　BorderLayout.CENTER 中 <br />
　　刚才已经提到了使用 JPanel。JPanel 作为一个容器，可以包容一些组件，然后将这个 JPanel 对象作为一个组件添加到另一个容器 (称作父容器) 中。这个功能有什么好处呢？<br />
　　上面不是提到 BorderLayout 的一个区域中只能添加一个组件吗？但是我们的编辑器需要添加两个按钮到它的北部，怎么办？上面的例子中，我们就是用的一个 JPanel 包容了这两个按钮，然后再将这个 JPanel 对象作为一个组件添加到设置布局管理器为 BorderLayout 的 Content Pane 中。<br />
　　上面说到各布局管理器的布局特点的时候，几乎每一种都是一个区域只能添加一个组件，那我们想添加多个组件到一个区域的时候，就要用到 JPanel 了。如果还没有明白，稍后看一段程序可能更易于理解。<br />
<img src ="http://www.blogjava.net/super-nini/aggbug/307163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-12-24 15:39 <a href="http://www.blogjava.net/super-nini/archive/2009/12/24/307163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Java处理Zip文件</title><link>http://www.blogjava.net/super-nini/archive/2009/12/09/305237.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Wed, 09 Dec 2009 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/12/09/305237.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/305237.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/12/09/305237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/305237.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/305237.html</trackback:ping><description><![CDATA[<div>作者：曾巧（numenzq）
<p>&nbsp;&nbsp;&nbsp; 最近做的一个项目需要用Java程序读写Zip文件，迫于找不到好的工具类来处理，也只好用java.util.zip包提供的类来实现Zip文件的压缩和解压操作了，在这之前你需要了解以下几个基本概念：</p>
<ul>
    <li>ZipEntry：This class is used to represent a ZIP file entry.</li>
</ul>
<ul>
    <li>ZipFile：This class is used to read entries from a zip file.</li>
</ul>
<ul>
    <li>ZipInputStream：This class implements an input stream filter for reading files in the ZIP file format.</li>
</ul>
<ul>
    <li>ZipOutputStream：This class implements an output stream filter for writing files in the ZIP file format.</li>
</ul>
<p style="text-indent: 21pt">现在我们了解一下读写Zip文件的基本流程。当解压时，从该Zip文件输入流中读取出ZipEntry，然后根据ZipEntry的信息，读取对应文件的相应字节。代码实现如下：</p>
<p style="text-indent: 21pt; text-align: left" align="left"><strong>&nbsp;</strong></p>
<p style="text-indent: 21pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">synchronized</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">static</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> Map&lt;String, </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">byte</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">[]&gt; unZip(InputStream is)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">throws</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> IOException {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">byte</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">[]&gt; result = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">new</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> HashMap&lt;String, </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">byte</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">[]&gt;();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">byte</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">[] buf;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipInputStream zis = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">new</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> ZipInputStream(is);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipEntry zipEntry = zis.getNextEntry();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">while</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> (zipEntry != </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">null</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">if</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> (zipEntry.isDirectory()) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipEntry = zis.getNextEntry();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">continue</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">else</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buf = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">new</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">byte</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">[(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">int</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">) zipEntry.getSize()];</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zis.read(buf, 0, (</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">int</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">) zipEntry.getSize());</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.put(zipEntry.getName(), buf);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipEntry = zis.getNextEntry();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">return</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> result;</span></p>
<p style="margin-left: 21pt"><span style="font-size: 10pt; color: black; font-family: &apos">}</span></p>
<p style="text-indent: 21pt">压缩操作与解压操作差不多，先将文件字节流组装成ZipEntry，然后把ZipEntry加入到输出流中即可。代码实现如下：</p>
<p style="text-indent: 21pt; text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">synchronized</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">static</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">ByteArrayOutputStream </span><span style="font-size: 10pt; color: black; font-family: &apos">zip(Map&lt;String, </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">byte</span></strong><span style="font-size: 10pt; color: black; font-family: &apos">[]&gt; map)</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">throws</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> IOException {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayOutputStream baos = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">new</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> ByteArrayOutputStream();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipOutputStream zos = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">new</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> ZipOutputStream(baos);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipEntry zipEntry;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">for</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> (String key : map.keySet()) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipEntry = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">new</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> ZipEntry(key);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipEntry.setSize(map.get(key).</span><span style="font-size: 10pt; color: #0000c0; font-family: &apos">length</span><span style="font-size: 10pt; color: black; font-family: &apos">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zipEntry.setTime(System.<em>currentTimeMillis</em>());</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zos.putNextEntry(zipEntry);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; zos.write(map.get(key));</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; zos.flush();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; zos.close();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: &apos">return</span></strong><span style="font-size: 10pt; color: black; font-family: &apos"> baos;</span></p>
<p><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; color: black; font-family: &apos">&nbsp;&nbsp;&nbsp; </span>至此，使用上面的两个方法就能完成基本的<span style="font-size: 10pt; color: black; font-family: &apos">Zip</span>文件压缩和解压缩处理了；该方法只适合处理<span style="font-size: 10pt; color: black; font-family: &apos">Zip</span>格式的文件，对于<span style="font-size: 10pt; color: black; font-family: &apos">GZip</span>格式的文件，我相信你也能轻松搞定了：）。</p>
</div>
<img src ="http://www.blogjava.net/super-nini/aggbug/305237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-12-09 09:50 <a href="http://www.blogjava.net/super-nini/archive/2009/12/09/305237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Java批量下载生成zip文件</title><link>http://www.blogjava.net/super-nini/archive/2009/12/09/305236.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Wed, 09 Dec 2009 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/12/09/305236.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/305236.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/12/09/305236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/305236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/305236.html</trackback:ping><description><![CDATA[<p>package com.bjca.ecms.credence.action;</p>
<p>import java.io.File;<br />
import java.io.FileInputStream;<br />
import java.io.FileOutputStream;<br />
import java.util.zip.ZipEntry;<br />
import java.util.zip.ZipOutputStream;</p>
<p>public class ZipOutputStreamDemo {<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[1024];&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //生成的ZIP文件名为Demo.zip&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String strZipName = "C:\\temp\\Demo.zip";&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ZipOutputStream out = new ZipOutputStream(new FileOutputStream(strZipName));&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //需要同时下载的两个文件result.txt ，source.txt&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File[] file1 = {new File("C:\\temp\\temp001.txt"),new File("C:\\temp\\temp002.txt")};&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;file1.length;i++) {&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream fis = new FileInputStream(file1[i]);&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.putNextEntry(new ZipEntry(file1[i].getName()));&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len;&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读入需要下载的文件的内容，打包到zip文件&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((len = fis.read(buffer))&gt;0) {&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(buffer,0,len);&nbsp;&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.closeEntry();&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fis.close();&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("生成Demo.zip成功");&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; </p>
<p>}<br />
</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/305236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-12-09 09:48 <a href="http://www.blogjava.net/super-nini/archive/2009/12/09/305236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:FSO有关的属性和方法(FileSystemObject)</title><link>http://www.blogjava.net/super-nini/archive/2009/11/19/302916.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 19 Nov 2009 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/11/19/302916.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/302916.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/11/19/302916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/302916.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/302916.html</trackback:ping><description><![CDATA[方法或者属性 描述 <br />
BuildPath()&nbsp;&nbsp; 生成一个文件路径 <br />
CopyFile()&nbsp; 复制文件 <br />
CopyFolder()&nbsp; 复制目录 <br />
CreateFolder()&nbsp; 创建新目录 <br />
CreateTextFile()&nbsp; 生成一个文件 <br />
DeleteFile()&nbsp; 删除一个文件 <br />
DeleteFolder() 删除一个目录 <br />
DriveExists() 检验盘符是否存在 <br />
Drives 返回盘符的集合 <br />
FileExists() 检验文件是否存在 <br />
FolderExists 检验一个目录是否存在 <br />
GetAbsolutePathName() 取得一个文件的绝对路径 <br />
GetBaseName() 取得文件名 <br />
GetDrive() 取得盘符名 <br />
GetDriveName() 取得盘符名 <br />
GetExtensionName() 取得文件的后缀 <br />
GetFile() 生成文件对象 <br />
GetFileName() 取得文件名 <br />
GetFolder() 取得目录对象 <br />
GetParentFolderName 取得文件或目录的父目录名 <br />
GetSpecialFolder() 取得特殊的目录名 <br />
GetTempName() 生成一个临时文件对象 <br />
MoveFile() 移动文件 <br />
MoveFolder() 移动目录 <br />
OpenTextFile() 打开一个文件流&nbsp;<br />
<br />
<br />
<p>实例说明 <br />
<br />
BuildPath(路径,文件名) //这个方法会对给定的路径加上文件，并自动加上分界符 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var newpath = fso.BuildPath("c:\\tmp", "51js.txt"); //生成 c:\tmp\51js.txt的路径 <br />
alert(newpath); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
CopyFile(源文件, 目标文件, 覆盖) //复制源文件到目标文件，当覆盖值为true时，如果目标文件存在会把文件覆盖 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bak"); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
CopyFolder(对象目录,目标目录 ,覆盖) //复制对象目录到目标目录，当覆盖为true时，如果目标目录存在会把文件覆盖 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //把C盘的Desktop目录复制到D盘的根目录 <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
CreateFolder(目录名) //创建一个新的目录 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var newFolderName = fso.CreateFolder("c:\\51JS"); //在C盘上创建一个51JS的目录 <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
CreateTextFile(文件名, 覆盖) //创建一个新的文件，如果此文件已经存在，你需要把覆盖值定为true <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var newFileObject = fso.CreateTextFile("c:\\autoexec51JS.bat", true); //脚本将在C盘创建一个叫 autoexec51JS.bat的文件 <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
DeleteFile(文件名, 只读？) //删除一个文件，如果文件的属性是只读的话，你需要把只读值设为true <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); //为了安全我先把要删除的autoexec.bat备份到你的D盘 <br />
var newpath = fso.CopyFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盘的autoexec.bat文件删除掉 <br />
fso.DeleteFile("c:\\autoexec.bat", true); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
DeleteFolder(文件名, 只读？)//删除一个目录，如果目录的属性是只读的话，你需要把只读值设为true <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
fso.CopyFolder("c:\\WINDOWS\\Desktop", "d:\\"); //为了安全我先把你C盘的Desktop目录复制到你D盘的根目录 <br />
fso.DeleteFolder("c:\\WINDOWS\\Desktop", true); //把你的Desktop目录删除，但因为desktop是系统的东西，所以不能全部删除，但......... <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
DriveExists(盘符) //检查一个盘是否存在，如果存在就返会真，不存在就返回....... <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
hasDriveD = fso.DriveExists("d"); //检查系统是否有D盘存在 <br />
hasDriveZ = fso.DriveExists("z"); //检查系统是否有Z盘存在 <br />
if (hasDriveD) alert("你的系统内有一个D盘"); <br />
if (!hasDriveZ) alert("你的系统内没有Z盘"); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
FileExists(文件名) //检查一个文件是否存在，如果存在就返会真，不存在就返回....... <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
fileName = fso.FileExists("c:\\autoexec.bat"); <br />
if (fileName) alert("你在C盘中有autoexec.bat文件，按下确定后这个文件将被删除！"); //开个玩笑:) <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
FolderExists(目录名) //检查一个目录是否存在，如果存在就返会真，不存在就返回....... <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
folderName = fso.FolderExists("c:\\WINDOWS\\Fonts"); <br />
if (folderName) alert("按下确定后系统的字库将被删除！"); //开个玩笑:) <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
GetAbsolutePathName(文件对象) //返回文件对象在系统的绝对路径 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
pathName = fso.GetAbsolutePathName("c:\\autoexec.bat"); <br />
alert(pathName); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
GetBaseName(文件对象) //返回文件对象的文件名 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
baseName = fso.GetBaseName("c:\\autoexec.bat"); //取得autoexec.bat的文件名autoexec <br />
alert(baseName); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
GetExtensionName(文件对象) //文件的后缀 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
exName = fso.GetExtensionName("c:\\autoexec.bat"); //取得autoexec.bat后缀bat <br />
alert(exName); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
GetParentFolderName(文件对象) //取得父级的目录名 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
parentName = fso.GetParentFolderName("c:\\autoexec.bat"); //取得autoexec.bat的父级目录C盘 <br />
alert(parentName); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
GetSpecialFolder(目录代码) //取得系统中一些特别的目录的路径，目录代码有3个分别是 0:安装Window的目录 1:系统文件目录 2:临时文件目录 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
tmpFolder = fso.GetSpecialFolder(2); //取得系统临时文件目录的路径 如我的是 C:\windows\temp <br />
alert(tmpFolder); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
GetTempName() //生成一个随机的临时文件对象，会以rad带头后面跟着些随机数，就好象一些<a>软件</a>在安装时会生成*.tmp <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
tmpName = fso.GetTempName(); //我在测试时就生成了radDB70E.tmp <br />
alert(tmpName); <br />
--&gt; <br />
&lt;/SCRIPT&gt; <br />
<br />
MoveFile(源文件, 目标文件) //把源文件移到目标文件的位置 <br />
&lt;SCRIPT LANGUAGE="<a>Java</a>Script"&gt; <br />
&lt;!-- <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var newpath = fso.MoveFile("c:\\autoexec.bat", "d:\\autoexec.bat"); //把C盘的autoexec.bat文件移移动到D盘 <br />
--&gt; <br />
&lt;/SCRIPT&gt;&nbsp;</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/302916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-11-19 14:33 <a href="http://www.blogjava.net/super-nini/archive/2009/11/19/302916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：UML中几种类间关系：继承、实现、依赖、关联、聚合、组合的联系与区别</title><link>http://www.blogjava.net/super-nini/archive/2009/10/20/299044.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 20 Oct 2009 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/20/299044.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/299044.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/20/299044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/299044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/299044.html</trackback:ping><description><![CDATA[<p>这是一堂关于UML基础知识的补习课；现在我们做项目时间都太紧了，基本上都没有做过真正的class级别的详细设计，更别提使用UML来实现规范建模了；本篇主要就以前自己一直感觉很迷糊的几种class之间的关系进行整理，让我们在真正用UML进行比如类图设计时能够更加清晰明了；以下就分别介绍这几种关系：</p>
<p>继承<br />
指的是一个类（称为子类、子接口）继承另外的一个类（称为父类、父接口）的功能，并可以增加它自己的新功能的能力，继承是类与类或者接口与接口之间最常见的关系；在Java中此类关系通过关键字extends明确标识，在设计时一般没有争议性；</p>
<p><img height="204" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Generalization.jpg" width="293" /><br />
实现<br />
指的是一个class类实现interface接口（可以是多个）的功能；实现是类与接口之间最常见的关系；在Java中此类关系通过关键字implements明确标识，在设计时一般没有争议性；</p>
<p><img height="203" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Realization.jpg" width="121" /><br />
依赖<br />
可以简单的理解，就是一个类A使用到了另一个类B，而这种使用关系是具有偶然性的、、临时性的、非常弱的，但是B类的变化会影响到A；比如某人要过河，需要借用一条船，此时人与船之间的关系就是依赖；表现在代码层面，为类B作为参数被类A在某个method方法中使用；</p>
<p><img height="97" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Dependence.jpg" width="430" /><br />
关联<br />
他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系，比如我和我的朋友；这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的，一般是长期性的，而且双方的关系一般是平等的、关联可以是单向、双向的；表现在代码层面，为被关联类B以类属性的形式出现在关联类A中，也可能是关联类A引用了一个类型为被关联类B的全局变量；</p>
<p><img height="105" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Association.jpg" width="430" /><br />
聚合<br />
聚合是关联关系的一种特例，他体现的是整体与部分、拥有的关系，即has-a的关系，此时整体与部分之间是可分离的，他们可以具有各自的生命周期，部分可以属于多个整体对象，也可以为多个整体对象共享；比如计算机与CPU、公司与员工的关系等；表现在代码层面，和关联关系是一致的，只能从语义级别来区分；</p>
<p><img height="108" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Aggregation.jpg" width="430" /><br />
组合<br />
组合也是关联关系的一种特例，他体现的是一种contains-a的关系，这种关系比聚合更强，也称为强聚合；他同样体现整体与部分间的关系，但此时整体与部分是不可分的，整体的生命周期结束也就意味着部分的生命周期结束；比如你和你的大脑；表现在代码层面，和关联关系是一致的，只能从语义级别来区分；</p>
<p><img height="106" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sfdev/EntryImages/20090218/Composition.jpg" width="430" /><br />
对于继承、实现这两种关系没多少疑问，他们体现的是一种类与类、或者类与接口间的纵向关系；其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系，是比较难区分的，有很多事物间的关系要想准备定位是很难的，前面也提到，这几种关系都是语义级别的，所以从代码层面并不能完全区分各种关系；但总的来说，后几种关系所表现的强弱程度依次为：组合&gt;聚合&gt;关联&gt;依赖；</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/sfdev/archive/2009/02/18/3906243.aspx</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/299044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-20 15:20 <a href="http://www.blogjava.net/super-nini/archive/2009/10/20/299044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)JDK 1.5中的ENUM用法 </title><link>http://www.blogjava.net/super-nini/archive/2009/10/19/298828.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Mon, 19 Oct 2009 04:05:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/19/298828.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298828.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/19/298828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298828.html</trackback:ping><description><![CDATA[<div class="postText">
<p>Enum是enumeration(列举)的简写形式,包含在java.lang包中.熟悉C, C++, C#, 或 Pascal人应该对列举有所了解,先看个例子:</p>
<p>public enum Season { winter, spring, summer, fall }</p>
<p>&nbsp;</p>
<p>一个enum是定义一组值的对象,它可以包括零个或多个值成员.它是属于enum类型的,一个enum对象中不可有两个或多个相同的属性或值.在次之前的java程序员一般是 用接口的方法实现列举的,如 :</p>
<p>public interface Season {</p>
<p>&nbsp;&nbsp; static winter = 0;</p>
<p>&nbsp;&nbsp; static spring = 1; //etc..</p>
<p>}</p>
<p>引入了enum的java的列举的编写方便了许多,只须定义一个enum型的对象.enum对象的值都回自动获得一个数字值,从0开始,依次递增.看一个比较简单的enum实现的例子:</p>
<p>EnumDemo.java</p>
<p>package net.javagarage.enums;</p>
<p>&nbsp;</p>
<p>/*</p>
<p>We can loop over the values we put into the enum</p>
<p>using the values() method.</p>
<p>Note that the enum Seasons is compiled into a</p>
<p>separate unit, called EnumDemo$Seasons.class</p>
<p>*/</p>
<p>public class EnumDemo {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*declare the enum and add values to it. note that, like in C#, we don't use a ; to</p>
<p>&nbsp;end this statement and we use commas to separate the values */</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private enum Seasons { winter, spring,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; summer, fall }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //list the values</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Seasons s : Seasons.values()){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(s);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>}<br />
运行上述代码你回得到 以下结果:</p>
<p>winter</p>
<p>spring</p>
<p>summer</p>
<p>fall</p>
<p>Enum的属性调用:</p>
<p>下面的代码展示了调用enum对象的方法,这也是它通常的用法:</p>
<p>package net.javagarage.enums;</p>
<p>/*</p>
<p>File: EnumSwitch.java</p>
<p>Purpose: show how to switch against the values in an enum.</p>
<p>*/</p>
<p>&nbsp;</p>
<p>public class EnumSwitch {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private enum Color { red, blue, green }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //list the values</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //refer to the qualified value</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doIt(Color.red);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*note that you switch against the UNQUALIFIED name. that is, "case Color.red:" is a</p>
<p>&nbsp;compiler error */</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static void doIt(Color c){</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (c) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case red: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("value is " + Color.red);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case green: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("value is " + Color.green);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case blue: </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("value is : " + Color.blue);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default : </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("default");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>为enums添加属性和方法</p>
<p>enums也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样.</p>
<p>package net.javagarage.enums;</p>
<p>&nbsp;</p>
<p>/*</p>
<p>File: EnumDemo.java</p>
<p>Purpose: show how to use an enum that also defines its own fields and methods</p>
<p>*/</p>
<p>&nbsp;</p>
<p>public class EnumWithMethods {</p>
<p>&nbsp;</p>
<p>//declare the enum and add values to it.</p>
<p>&nbsp;</p>
<p>public enum Season {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; winter, spring, summer, fall;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private final static String location = "Phoenix";</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Season getBest(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (location.equals("Phoenix"))</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return winter;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return summer;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(Season.getBest());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>就是这么的简单.但是有一点是需要注意的,那就是enums的值列表必须紧跟在enum声明,不然编译时将会出错.</p>
<p>Enums构造函数:</p>
<p>和类一样enums也可以有自己的构造函数,如下:</p>
<p>package net.javagarage.enums;</p>
<p>&nbsp;</p>
<p>public class EnumConstructor {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] a) {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //call our enum using the values method</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Temp t : Temp.values())</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(t + " is : " + t.getValue());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //make the enum</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public enum Temp {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; absoluteZero(-459), freezing(32),</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boiling(212), paperBurns(451);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //constructor here</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Temp(int value) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.value = value;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //regular field?but make it final,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //since that is the point, to make constants</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private final int value;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //regular get method</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int getValue() {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}<br />
输出结果是:</p>
<p>absoluteZero is : -459</p>
<p>freezing is : 32</p>
<p>boiling is : 212</p>
<p>paperBurns is : 451</p>
<p>尽管enums有这么多的属性,但并不是用的越多越好,如果那样还不如直接用类来的直接.enums的优势在定义int最终变量仅当这些值有一定特殊含义时.但是如果你需要的是一个类,就定义一个类,而不是enum.<br />
</p>
<div id="digg_block">
<div id="div_digg">
<div class="diggit" onclick="DiggIt(429390,9062,1)"><span class="diggnum" id="digg_count_429390">0</span> </div>
<div class="buryit" onclick="DiggIt(429390,9062,2)"><span class="burynum" id="bury_count_429390">0</span> </div>
<div class="clear"></div>
<span id="span_isdigged_429390" style="display: none">0</span>
<div class="diggword" id="digg_word_429390">(请您对文章做出评价)</div>
</div>
</div>
<div class="clear"></div>
</div>
<img src ="http://www.blogjava.net/super-nini/aggbug/298828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-19 12:05 <a href="http://www.blogjava.net/super-nini/archive/2009/10/19/298828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：OGNL入门  及 理解</title><link>http://www.blogjava.net/super-nini/archive/2009/10/19/298809.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Mon, 19 Oct 2009 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/19/298809.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298809.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/19/298809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298809.html</trackback:ping><description><![CDATA[<p>http://depravedangel.javaeye.com/blog/377740<br />
<br />
package org.darkness.ognl.test;</p>
<p>import java.util.ArrayList;<br />
import java.util.HashMap;<br />
import java.util.List;<br />
import java.util.Map;</p>
<p>import junit.framework.TestCase;<br />
import ognl.Ognl;</p>
<p>import org.darkness.oa.model.Person;<br />
import org.darkness.oa.model.User;</p>
<p>public class OgnlTest extends TestCase {<br />
&nbsp;<br />
&nbsp;// ***************** root对象的概念 ******************* //<br />
&nbsp;public void testOgnl_01() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;user.setUsername("暗之幻影");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//相当于调用user.getUsername()方法<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("username", user);<br />
&nbsp;&nbsp;System.out.println(value);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_02() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;Person p = new Person();<br />
&nbsp;&nbsp;p.setName("暗之幻影");<br />
&nbsp;&nbsp;user.setPerson(p);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//相当于调用user.getPerson().getName()方法<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("person.name", user);<br />
&nbsp;&nbsp;System.out.println(value);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_03() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;Person p = new Person();<br />
&nbsp;&nbsp;p.setName("暗之幻影");<br />
&nbsp;&nbsp;user.setPerson(p);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//可以使用#root来引用根对象，相当于调用user.getPerson().getName()方法<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("#root.person.name", user);<br />
&nbsp;&nbsp;System.out.println(value);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// *********************** context的概念 **********************//<br />
&nbsp;public void testOgnl_04() throws Exception{<br />
&nbsp;&nbsp;Person p1 = new Person();<br />
&nbsp;&nbsp;Person p2 = new Person();<br />
&nbsp;&nbsp;p1.setName("风");<br />
&nbsp;&nbsp;p2.setName("云");</p>
<p>&nbsp;&nbsp;Map&lt;String,Person&gt; context = new HashMap&lt;String,Person&gt;();<br />
&nbsp;&nbsp;context.put("p1", p1);<br />
&nbsp;&nbsp;context.put("p2", p2);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;// 需要加上#才表示到context中取数据，否则表示从根目录下取值<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("#p1.name + ',' + #p2.name", context, new Object());<br />
&nbsp;&nbsp;System.out.println(value);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_05() throws Exception{<br />
&nbsp;&nbsp;Person p1 = new Person();<br />
&nbsp;&nbsp;Person p2 = new Person();<br />
&nbsp;&nbsp;p1.setName("风");<br />
&nbsp;&nbsp;p2.setName("云");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Map&lt;String,Person&gt; context = new HashMap&lt;String,Person&gt;();<br />
&nbsp;&nbsp;context.put("p1", p1);<br />
&nbsp;&nbsp;context.put("p2", p2);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;User root = new User();<br />
&nbsp;&nbsp;root.setUsername("雨");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("#p1.name + ',' + #p2.name + ',' + username", context, root);<br />
&nbsp;&nbsp;System.out.println(value);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// ******************* OGNL赋值操作 ************************//<br />
&nbsp;public void testOgnl_06() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//给root对象的属性赋值，相当于调用user.setUsername()<br />
&nbsp;&nbsp;Ognl.setValue("username", user, "暗之幻影");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;System.out.println(user.getUsername());<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_07() throws Exception{<br />
&nbsp;&nbsp;User user = new User();</p>
<p>&nbsp;&nbsp;Map&lt;String, User&gt; context = new HashMap&lt;String, User&gt;();<br />
&nbsp;&nbsp;context.put("u", user);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//给context中的对象属性赋值，相当于调用user.setUsername()<br />
&nbsp;&nbsp;Ognl.setValue("#u.username", context, new Object(), "暗之幻影");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;System.out.println(user.getUsername());<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_08() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Map&lt;String, User&gt; context = new HashMap&lt;String, User&gt;();<br />
&nbsp;&nbsp;context.put("u", user);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//给context中的对象属性赋值，相当于调用user.setUsername()<br />
&nbsp;&nbsp;//在表达式中使用=赋值操作符来赋值<br />
&nbsp;&nbsp;Ognl.getValue("#u.username = '暗之幻影'",context, new Object());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;System.out.println(user.getUsername());<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_09() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;Person p = new Person();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Map&lt;String,Object&gt; context = new HashMap&lt;String,Object&gt;();<br />
&nbsp;&nbsp;context.put("u", user);<br />
&nbsp;&nbsp;context.put("p", p);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//给context中的对象属性赋值，相当于调用user.setUsername()<br />
&nbsp;&nbsp;//在表达式中使用=赋值操作符来赋值<br />
&nbsp;&nbsp;Ognl.getValue("#u.username = '风',#p.name = '云'",context, new Object());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;System.out.println(user.getUsername()+","+p.getName());<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;//****************** 使用OGNL调用对象的方法 **********************//<br />
&nbsp;public void testOgnl_10() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;user.setUsername("暗之幻影");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("getUsername()", user);<br />
&nbsp;&nbsp;System.out.println(value);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_11() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Ognl.getValue("setUsername('暗之幻影')", user);<br />
&nbsp;&nbsp;System.out.println(user.getUsername());<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// ******************* OGNL调用类变量、静态方法 *************************//<br />
&nbsp;public void testOgnl_12() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Ognl.getValue("setUsername('暗之幻影')", user);<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(username)", user);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_13() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Ognl.getValue("setUsername('暗之幻影')", user);<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(@org.darkness.struts2.test.Utils@toLowerCase(username))", user);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// ********************* OGNL中的this表达式 **********************//<br />
&nbsp;public void testOgnl_14() throws Exception{<br />
&nbsp;&nbsp;Object root = new Object();<br />
&nbsp;&nbsp;Map context = new HashMap();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;List values = new ArrayList();<br />
&nbsp;&nbsp;for(int i=0; i&lt;11; i++){<br />
&nbsp;&nbsp;&nbsp;values.add(i);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;context.put("values", values);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(#values.size.(#this &gt; 10 ? \"大于10\" : '不大于10'))", context, root);<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_15() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Ognl.getValue("setUsername('暗之幻影')", user);<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(#this.username)", user);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_16() throws Exception{<br />
&nbsp;&nbsp;User user = new User();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Ognl.getValue("setUsername('暗之幻影')", user);<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(username.(#this.toLowerCase()))", user);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// ******************* 如何把表达式的解释结果作为另外一个表达式,OGNL中括号的使用 **********************//<br />
&nbsp;public void testOgnl_17() throws Exception{<br />
&nbsp;&nbsp;Object root = new Object();<br />
&nbsp;&nbsp;Map context = new HashMap();<br />
&nbsp;&nbsp;User u = new User();<br />
&nbsp;&nbsp;u.setUsername("暗之幻影");<br />
&nbsp;&nbsp;context.put("u", u);<br />
&nbsp;&nbsp;context.put("fact", "username");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 1、首先把#fact表达式进行解释，得到一个值：username<br />
&nbsp;&nbsp; * 2、解释括号中的表达式#u，其结果是user对象<br />
&nbsp;&nbsp; * 3、把括号中表达式的结果作为root对象，解释在第一步中得到的结果（即把第一步的结果看成另外一个表达式） <br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("#fact(#u)", context, root);<br />
&nbsp;&nbsp;System.out.println(value);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_18() throws Exception{<br />
&nbsp;&nbsp;Person person = new Person();<br />
&nbsp;&nbsp;Map context = new HashMap();<br />
&nbsp;&nbsp;User u = new User();<br />
&nbsp;&nbsp;u.setUsername("暗之幻影");<br />
&nbsp;&nbsp;context.put("u", u);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 相当于调用person这个根对象的fact方法，并把#u的解释结果作为参数传入此方法 <br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("fact(#u)", context, person);<br />
&nbsp;&nbsp;System.out.println(value); //输出是 "暗之幻影,"<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public void testOgnl_19() throws Exception{<br />
&nbsp;&nbsp;Person person = new Person();<br />
&nbsp;&nbsp;Map context = new HashMap();<br />
&nbsp;&nbsp;User u = new User();<br />
&nbsp;&nbsp;u.setUsername("暗之幻影");<br />
&nbsp;&nbsp;context.put("u", u);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 1、先计算表达式fact，得到结果是：username<br />
&nbsp;&nbsp; * 2、解释括号中的表达式#u，其结果是user对象<br />
&nbsp;&nbsp; * 3、把括号中表达式的结果作为root对象，解释在第一步中得到的结果（即把第一步的结果看成另外一个表达式）<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;String value = (String)Ognl.getValue("(fact)(#u)", context, person);<br />
&nbsp;&nbsp;System.out.println(value); //输出"暗之幻影"<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// ********************* OGNL访问集合元素 **************************//<br />
&nbsp;public void testOgnl_20() throws Exception{<br />
&nbsp;&nbsp;Object root = new Object();<br />
&nbsp;&nbsp;Map context = new HashMap();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//用OGNL创建List对象<br />
&nbsp;&nbsp;List listvalue = (List)Ognl.getValue("{123,'暗之幻影','风之水影'}", context, root);<br />
&nbsp;&nbsp;context.put("listvalue", listvalue);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//用OGNL创建数组<br />
&nbsp;&nbsp;int[] intarray= (int[])Ognl.getValue("new int[]{23,45,67}", context, root);<br />
&nbsp;&nbsp;context.put("intarray", intarray);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//用OGNL创建Map对象<br />
&nbsp;&nbsp;Map mapvalue = (Map)Ognl.getValue("#{'listvalue':#listvalue,'intarray':#intarray}", context, root);<br />
&nbsp;&nbsp;context.put("mapvalue", mapvalue);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(#listvalue[0])", context, root);<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(#intarray[1])", context, root);<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(#mapvalue['intarray'][2])", context, root);<br />
&nbsp;&nbsp;Ognl.getValue("@System@out.println(#mapvalue.intarray[0])", context, root);<br />
&nbsp;}<br />
}</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/298809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-19 10:16 <a href="http://www.blogjava.net/super-nini/archive/2009/10/19/298809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Spring整合第三方MVC框架的通用配置 </title><link>http://www.blogjava.net/super-nini/archive/2009/10/15/298350.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 15 Oct 2009 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/15/298350.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298350.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/15/298350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298350.html</trackback:ping><description><![CDATA[&nbsp;如果需要使用第三方MVC框架，则不能在web.xml文件中配置ApplicationContext的启动。但是，ApplicationContext是Spring的容器，负责管理所有的组件，从业务逻辑层组件，到持久层组件，都必须运行在Spring容器中。因此，必须在Web应用启动时，创建Spring的ApplicationContext实例。事实上，Spring ApplictionContext作为IoC容器，总应该优先加载。<br />
不管采用怎样的方法，Spring容器都应该在应用启动时，自动加载。为了让Spring容器能自动加载，通常有两个做法：<br />
1.让MVC框架负责创建ApplicationContext实例，MVC框架加载时自动创建Spring容器。Struts就是采用这种机制与Spring整合。<br />
2.采用load-on-startup Servlet实现。<br />
根据Servlet2.3标准，所有的ServletContextListener都会比Servlet优先加载——即使是load-on-startup Servlet。ApplicationContext实例是Spring容器，负责管理应用中所有的组件，包括业务逻辑层组件和持久层组件。因此，应该尽可能早的创建Spring容器。<br />
为此，应该优先采用listener创建ApplicationContext。只是，ServletContextListener是从Servlet 2.3才出现的规范。如果使用了不支持Servlet2.3以上的Web服务器，则只能放弃ServletContextListener，采用load-on-startup Servlet策略。<br />
Spring管理的组件相当多，如果将所有的组件部署在同一个配置文件里。不仅会降低配置文件的可读性，增大修改配置文件时引入错误的可能性，也不符合软件工程&#8220;分而治之&#8221;的规则。通常推荐服务层对象，业务逻辑对象，DAO对象都存在于互不相同的Context中，而表现层对象如Spring MVC控制器，则被配置在表现层Context中。甚至将某个特定模块的组件部署在单独的Context中。<br />
实际的应用中，Spring的配置文件通常不只一个，而是按功能被分成多个。好在，所有负责加载Spring容器的工具都可同时加载多个配置文件。
<p>一. 采用ContextLoaderListener创建ApplicationContext<br />
使用ContextLoaderListener创建ApplicationContext必须服务器支持listener，下面这些服务器都是支持Listener的，如果使用这些服务器，则可以使用ContextLoaderListener创建ApplicationContext实例：<br />
1.Apache Tomcat 4.x+ 。<br />
2.etty 4.x+ 。<br />
3.Resin 2.1.8+ 。<br />
4.Orion 2.0.2+ 。<br />
5.BEA WebLogic 8.1 SP3。<br />
Spring提供ServletContextListener的一个实现类ContextLoaderListener，该类可以作为listener使用，它会在创建时候自动查找WEB-INF/下的applicationContext.xml文件，因此，如果只有一个配置文件，并且文件名为applicationContext.xml，只需在web.xml文件中增加如下一段即可：<br />
&lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;<br />
如果有多个配置文件需要载入，则考虑使用&lt;context-param&gt;元素来确定配置文件的文件名。ContextLoaderListener加载时，会查找名为contextConfigLocation的参数。因此，配置context-param时参数名字应该是contextConfigLocation。<br />
带多个配置文件的web.xml文件如下：<br />
&lt;!--&nbsp; XML文件的文件头--&gt;<br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;!--&nbsp; web.xml文件的DTD等信息--&gt;<br />
&lt;!DOCTYPE web-app<br />
&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />
&nbsp;&nbsp;&nbsp; "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br />
&lt;web-app&gt;<br />
&nbsp;&lt;!--&nbsp; 确定多个配置文件--&gt;<br />
在web.xml文件中加载Spring容器，这是最常见的做法。Spring自己的MVC框架就是采用这种策略。<br />
关于让MVC框架负责创建ApplicationContext实例的情况比较多，因为每个MVC框架的启动机制有区别，因此加载ApplicationContext的方式也各有不同。 <br />
对于在web.xml配置文件中配置ApplicationContext的自动创建有两种策略：<br />
1.利用ServletContextListener实现。<br />
&lt;context-param&gt;<br />
&nbsp;&nbsp;&lt;!--&nbsp; 参数名为contextConfigLocation --&gt;<br />
&nbsp;&nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&lt;!--&nbsp; 多个配置文件之间以,隔开 --&gt;<br />
&nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&nbsp;&lt;/context-param&gt;<br />
&nbsp;&lt;!--&nbsp; 采用listener创建ApplicationContext实例--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/listener&gt;<br />
&lt;/web-app&gt;<br />
如果没有contextConfigLocation制定配置文件，Spring自动查找applicationContext.xml配置文件。<br />
如果有contextConfigLocation，则利用该参数确定的配置文件，该参数指定的一个字符串，Spring的ContextLoaderListener负责将该字符串分解成多个配置文件，逗号&#8220;,&#8221;、空格&#8220; &#8221;、分号&#8220;;&#8221;都可作为字符串的分割符。<br />
如果既然没有applicationContext.xml文件，也没有使用contextConfigLocation参数确定配置文件，或者contextConfigLocation确定的配置文件不存在，都将导致：Spring无法加载配置文件，无法正常创建ApplicationContext实例。<br />
Spring根据bean定义创建 WebApplicationContext对象，并将其保存在Web应用的ServletContext中。大部分情况下，应用中的bean无需感受到ApplicationContext的存在，只要利用ApplicationContext的IoC即可。<br />
如果需要在应用中获取ApplicationContext实例，可以通过如下方法获取：<br />
WebApplicationContext ctx = <br />
WebApplicationContextUtils.getWebApplicationContext(servletContext);<br />
下面是采用Servlet获取ApplicationContext的完整源代码：<br />
public class SpringTestServlet extends HttpServlet <br />
{<br />
&nbsp;//Servlet的响应方法。<br />
&nbsp;public void service(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;throws ServletException,java.io.IOException<br />
&nbsp;{z<br />
&nbsp;&nbsp;//获取Servlet的ServletContext对象<br />
&nbsp;&nbsp;ServletContext sc = getServletContext();<br />
&nbsp;&nbsp;//使用WebApplicationContextUtils类获得ApplicationContext<br />
&nbsp;&nbsp;WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);<br />
&nbsp;&nbsp;//获取Servlet的页面输出流<br />
&nbsp;&nbsp;PrintWriter out = response.getWriter();<br />
&nbsp;&nbsp;//将ApplicationContext对象输出<br />
&nbsp;&nbsp;out.println(ctx);<br />
&nbsp;}<br />
}<br />
程序里手动获取ApplicationContext对象，然后直接输出到Servlet的响应。结果看到，ApplicationContext加载了web.xml文件中指定的两个配置文件。</p>
<p>二. 采用load-on-startup Servlet创建ApplicationContext<br />
如果容器不支持Listener，则只能使用load-on-startup Servlet创建ApplicationContext实例，下面的容器都不支持Listener：<br />
1.BEA WebLogic up to 8.1 SP2。 <br />
2.IBM WebSphere 5.x 。<br />
3.Oracle OC4J 9.0.3。<br />
Spring提供了一个特殊的Servlet类：ContextLoaderServlet。该Servlet在启动时，会自动查找WEB-INF/下的applicationContext.xml文件。<br />
当然，为了让ContextLoaderServlet随应用启动而启动，应将此Servlet配置成load-on-startup的Servlet，load-on-startup的值小一点比较合适，因为要保证ApplicationContext优先创建。如果只有一个配置文件，并且文件名为：applicationContext.xml。在web.xml文件中增加如下一段即可：<br />
&lt;servlet&gt;<br />
&nbsp;&lt;servlet-name&gt;context&lt;/servlet-name&gt;<br />
&nbsp;&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;<br />
&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
该Servlet用于提供&#8220;后台&#8221;服务，作为容器管理应用中的其他bean，不需要响应客户请求，因此无需配置servlet-mapping。<br />
如果有多个配置文件，一样使用&lt;context-param&gt;元素来确定多个配置文件。事实上，不管是ContextLoaderServlet，还是ContextLoaderListener，都依赖于ContextLoader创建ApplicationContext实例。在ContextLoader代码的第240行，有如下代码：<br />
String configLocation = servletContext.getInitParameter(CONFIG_LOCATION_PARAM);<br />
if (configLocation != null) {<br />
&nbsp;wac.setConfigLocations(StringUtils.tokenizeToStringArray(configLocation,<br />
&nbsp;ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS));<br />
}<br />
其中CONFIG_LOCATION_PARAM是该类的常量，其值为contextConfigLocation。可看出：ContextLoader首先检查servletContext中是否有contextConfigLocation的参数，如果有该参数，则加载该参数指定的配置文件。带多个配置文件的web.xml文件如下：<br />
&lt;!--&nbsp; XML文件的文件头--&gt;<br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;!--&nbsp; web.xml文件的DTD等信息--&gt;<br />
&lt;!DOCTYPE web-app<br />
&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br />
&nbsp;&nbsp;&nbsp; "http://java.sun.com/dtd/web-app_2_3.dtd"&gt;<br />
&lt;web-app&gt;<br />
&nbsp;&lt;!--&nbsp; 确定多个配置文件--&gt;<br />
&nbsp;&lt;context-param&gt;<br />
&nbsp;&nbsp;&lt;!--&nbsp; 参数名为contextConfigLocation --&gt;<br />
&nbsp;&nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&lt;!--&nbsp; 多个配置文件之间以,隔开 --&gt;<br />
&nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&nbsp;&lt;/context-param&gt;<br />
&nbsp;&lt;!--&nbsp; 采用load-on-startup Servlet创建ApplicationContext实例--&gt;<br />
&lt;servlet&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;context&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&lt;!--&nbsp; 下面值小一点比较合适，会优先加载--&gt;<br />
&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&lt;/servlet&gt;<br />
&lt;/web-app&gt;<br />
测试所用的Servlet与前面所用的没有区别。ContextLoaderServlet与ContextLoaderListener底层都依赖于ContextLoader。因此，二者的效果几乎没有区别。之间区别不是它们本身引起的，而是由于Servlet2.3的规范：listener比servlet优先加载。因此，采用ContextLoaderListener创建ApplicationContext的时机更早。<br />
当然，也可以通过ServletContext的getAttribute方法获取ApplicationContext，使用WebApplicationContextUtils类更便捷，因为无需记住ServletContext属性名。即使ServletContext的WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE属性没有对应对象，WebApplicationContextUtils的getWebApplicationContext()方法将会返回空，而不会引起异常。<br />
获得了WebApplicationContext实例的引用后，可以通过bean的名字访问容器中的bean实例。大部分时候，无需通过这种方式访问容器中的bean。将表现层的控制器bean置入容器的管理中，客户端请求直接转发给容器中的bean，然后由容器管理bean之间的依赖，因此，无需手动获取ApplicationContext引用。当然，每个框架都会有自己特定的整合策略。</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/298350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-15 11:21 <a href="http://www.blogjava.net/super-nini/archive/2009/10/15/298350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 转：在web.xml中通过contextConfigLocation配置spring </title><link>http://www.blogjava.net/super-nini/archive/2009/10/15/298348.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 15 Oct 2009 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/15/298348.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298348.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/15/298348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298348.html</trackback:ping><description><![CDATA[<p>SSI框架配置文件路径问题：<br />
<br />
struts2的 1个+N个&nbsp; 路径：src+src(可配置)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名称： struts.xml&nbsp; + N<br />
spring 的 1个&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;路径： src&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; 名称： applicationContext.xml<br />
ibatis 的 1个+N个&nbsp; 路径： src+src(可配置)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名称： SqlMapConfig.xml + N<br />
</p>
<p>部署到tomcat后，src目录下的配置文件会和class文件一样，自动copy到应用的 classes目录下</p>
<p>spring的 配置文件在启动时，加载的是web-info目录下的applicationContext.xml,<br />
运行时使用的是web-info/classes目录下的applicationContext.xml。<br />
<br />
配置web.xml使这2个路径一致：<br />
</p>
<p>&lt;context-param&gt;<br />
&nbsp;&nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/classes/applicationContext.xml&lt;/param-value&gt;<br />
&nbsp;&lt;/context-param&gt;</p>
<p>多个配置文件的加载<br />
&lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_core*.xml,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_dict*.xml,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_hibernate.xml,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_staff*.xml,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_security.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_modules*.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_cti*.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath*:conf/spring/applicationContext_apm*.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/context-param&gt; </p>
<p>contextConfigLocation 参数定义了要装入的 Spring 配置文件。</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/happyinggirl/archive/2008/03/13/2176285.aspx</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/298348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-15 11:18 <a href="http://www.blogjava.net/super-nini/archive/2009/10/15/298348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Struts2.0 Spring iBATIS整合</title><link>http://www.blogjava.net/super-nini/archive/2009/10/13/298094.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 13 Oct 2009 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/13/298094.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298094.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/13/298094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298094.html</trackback:ping><description><![CDATA[<p>web.xml配置</p>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font color="#0000ff">&lt;?</font><font color="#800000">xml</font> <font color="#ff0000">version</font><font color="#0000ff">="1.0"</font> <font color="#ff0000">encoding</font><font color="#0000ff">="UTF-8"</font><font color="#0000ff">?&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">web-app</font> <font color="#ff0000">version</font><font color="#0000ff">="2.5"</font> <font color="#ff0000">xmlns</font><font color="#0000ff">="http://java.sun.com/xml/ns/javaee"</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">xmlns:xsi</font><font color="#0000ff">="http://www.w3.org/2001/XMLSchema-instance"</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://java.sun.com/xml/ns/javaee <br />
&nbsp;&nbsp;&nbsp;&nbsp; http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"<font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font>struts-cleanup<font color="#0000ff">&lt;/</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-class</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">filter-class</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">filter</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-mapping</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font>struts-cleanup<font color="#0000ff">&lt;/</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">url-pattern</font><font color="#0000ff">&gt;</font>/*<font color="#0000ff">&lt;/</font><font color="#800000">url-pattern</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">filter-mapping</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font>struts2<font color="#0000ff">&lt;/</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-class</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.FilterDispatcher <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">filter-class</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">filter</font><font color="#0000ff">&gt;</font> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-mapping</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font>struts2<font color="#0000ff">&lt;/</font><font color="#800000">filter-name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">url-pattern</font><font color="#0000ff">&gt;</font>/*<font color="#0000ff">&lt;/</font><font color="#800000">url-pattern</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">filter-mapping</font><font color="#0000ff">&gt;</font> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">listener</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">listener-class</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.web.context.ContextLoaderListener <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">listener-class</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">listener</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">context-param</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">param-name</font><font color="#0000ff">&gt;</font>contextConfigLocation<font color="#0000ff">&lt;/</font><font color="#800000">param-name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">param-value</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath:applicationContext.xml,classpath:applicationContext-extend.xml <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">param-value</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">context-param</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">welcome-file-list</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">welcome-file</font><font color="#0000ff">&gt;</font>index.jsp<font color="#0000ff">&lt;/</font><font color="#800000">welcome-file</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">welcome-file-list</font><font color="#0000ff">&gt;</font> <br />
<font color="#0000ff">&lt;/</font><font color="#800000">web-app</font><font color="#0000ff">&gt;</font></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>struts.properties</p>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font color="#008080">1</font> struts.objectFactory=spring <br />
<font color="#008080">2</font> struts.objectFactory.spring.autoWire=auto</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>applicationContext.xml</p>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font color="#eeeeee">0</font><font color="#008080">1</font> &nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<font color="#008000"> 配置ibatis </font>--&gt; <br />
<font color="#eeeeee">0</font><font color="#008080">2</font> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">bean</font> <font color="#ff0000">id</font><font color="#0000ff">="sqlMapClient"</font> <br />
<font color="#eeeeee">0</font><font color="#008080">3</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">class</font><font color="#0000ff">="org.springframework.orm.ibatis.SqlMapClientFactoryBean"</font><font color="#0000ff">&gt;</font> <br />
<font color="#eeeeee">0</font><font color="#008080">4</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">property</font> <font color="#ff0000">name</font><font color="#0000ff">="configLocation"</font><font color="#0000ff">&gt;</font> <br />
<font color="#eeeeee">0</font><font color="#008080">5</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">value</font><font color="#0000ff">&gt;</font>classpath:SqlMapConfig.xml<font color="#0000ff">&lt;/</font><font color="#800000">value</font><font color="#0000ff">&gt;</font> <br />
<font color="#eeeeee">0</font><font color="#008080">6</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">property</font><font color="#0000ff">&gt;</font> <br />
<font color="#eeeeee">0</font><font color="#008080">7</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">property</font> <font color="#ff0000">name</font><font color="#0000ff">="dataSource"</font><font color="#0000ff">&gt;</font> <br />
<font color="#eeeeee">0</font><font color="#008080">8</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">ref</font> <font color="#ff0000">bean</font><font color="#0000ff">="dataSource"</font> <font color="#0000ff">/&gt;</font> <br />
<font color="#eeeeee">0</font><font color="#008080">9</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">property</font><font color="#0000ff">&gt;</font> <br />
<font color="#008080">10</font> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">bean</font><font color="#0000ff">&gt;</font></div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><font color="#008080">1</font> &nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<font color="#008000"> 配置DAO </font>--&gt; <br />
<font color="#008080">2</font> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">bean</font> <font color="#ff0000">id</font><font color="#0000ff">="AdminDAO"</font> <font color="#ff0000">class</font><font color="#0000ff">="cn.edu.hit.mis.dao.AdminDAOImpl"</font><font color="#0000ff">&gt;</font> <br />
<font color="#008080">3</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">property</font> <font color="#ff0000">name</font><font color="#0000ff">="sqlMapClient"</font><font color="#0000ff">&gt;</font> <br />
<font color="#008080">4</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">ref</font> <font color="#ff0000">bean</font><font color="#0000ff">="sqlMapClient"</font> <font color="#0000ff">/&gt;</font> <br />
<font color="#008080">5</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">property</font><font color="#0000ff">&gt;</font> <br />
<font color="#008080">6</font> &nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">bean</font><font color="#0000ff">&gt;</font></div>
其他地方都一样
<img src ="http://www.blogjava.net/super-nini/aggbug/298094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-13 17:51 <a href="http://www.blogjava.net/super-nini/archive/2009/10/13/298094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：struts2 数据校验 </title><link>http://www.blogjava.net/super-nini/archive/2009/10/13/298072.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 13 Oct 2009 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/13/298072.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298072.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/13/298072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298072.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p><span class="STYLE1"><span style="color: #0000ff">一. ActionSupport是个工具类</span></span>，他实现了Action, Validatable等接口, Validatable提供validate()方法进行数据验证．Action只要继承ActionSupport类，重写validate()方法就可以进行数据验证 </p>
<p><span style="color: #0000ff"><span class="STYLE1">二. 校验的流程</span><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp; 首先,Struts框架对输入数据进行类型转换,然后再进行数据校验,如果类型转换与数据校验都没有错误发生, 就进入execute(),否则请求将被转发到input视图</p>
<p><span style="color: #0000ff"><span class="STYLE1">三. 注册实例</span><br />
</span>&nbsp;&nbsp;&nbsp; 首先新建RegistAcion.java</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://dashi129.javaeye.com/blog/402312#"><img alt="复制代码" src="http://dashi129.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.util.Date; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork2.ActionSupport; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;RegistAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;ActionSupport&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;userName; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Integer&nbsp;age; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Date&nbsp;birthday; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getUserName()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;userName; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setUserName(String&nbsp;userName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.userName&nbsp;=&nbsp;userName; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Integer&nbsp;getAge()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;age; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setAge(Integer&nbsp;age)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.age&nbsp;=&nbsp;age; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Date&nbsp;getBirthday()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;birthday; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setBirthday(Date&nbsp;birthday)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.birthday&nbsp;=&nbsp;birthday; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;execute()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"注册成功"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;SUCCESS; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;validate()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="string">""</span><span>.equals(userName)){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addFieldError(</span><span class="string">"userName"</span><span>,&nbsp;</span><span class="string">"username&nbsp;is&nbsp;empty"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="keyword">null</span><span>&nbsp;!=&nbsp;age){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(</span><span class="number">1</span><span>&nbsp;&gt;&nbsp;age&nbsp;||&nbsp;</span><span class="number">150</span><span>&nbsp;&lt;&nbsp;age){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addFieldError(</span><span class="string">"age"</span><span>,&nbsp;</span><span class="string">"age&nbsp;invalid"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class RegistAction extends ActionSupport {
private String userName;
private Integer age;
private Date birthday;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String execute() throws Exception {
System.out.println("注册成功");
return SUCCESS;
}
@Override
public void validate() {
if("".equals(userName)){
addFieldError("userName", "username is empty");
}
if(null != age){
if(1 &gt; age || 150 &lt; age){
addFieldError("age", "age invalid");
}
}
}
}</pre>
<p>&nbsp;配置Action</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://dashi129.javaeye.com/blog/402312#"><img alt="复制代码" src="http://dashi129.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"regist"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.RegistAction"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"success"</span><span class="tag">&gt;</span><span>/welcome.jsp</span><span class="tag">&lt;/</span><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">result</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"input"</span><span class="tag">&gt;</span><span>/regist.jsp</span><span class="tag">&lt;/</span><span class="tag-name">result</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">&lt;action name="regist" class="com.RegistAction"&gt;
&lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;
&lt;result name="input"&gt;/regist.jsp&lt;/result&gt;
&lt;/action&gt;</pre>
<p>&nbsp;接着是注册页面和注册成功页面</p>
<p>regist.jsp</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Html代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://dashi129.javaeye.com/blog/402312#"><img alt="复制代码" src="http://dashi129.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">form</span><span>&nbsp;</span><span class="attribute">action</span><span>=</span><span class="attribute-value">"regist.action"</span><span>&nbsp;</span><span class="attribute">method</span><span>=</span><span class="attribute-value">"post"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:fielderror</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">s:fielderror</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">table</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>userName:</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"userName"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>age:</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"age"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>birthday:</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"birthday"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">td</span><span>&nbsp;</span><span class="attribute">colspan</span><span>=</span><span class="attribute-value">"2"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">s:submit</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"注册"</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">s:submit</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">td</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tr</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">form</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="html" style="display: none" name="code">&lt;body&gt;
&lt;form action="regist.action" method="post"&gt;
&lt;s:fielderror&gt;&lt;/s:fielderror&gt;
&lt;table&gt;&lt;tr&gt;
&lt;td&gt;userName:&lt;/td&gt;
&lt;td&gt;
&lt;input type="text" name="userName"&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;age:&lt;/td&gt;
&lt;td&gt;
&lt;input type="text" name="age"&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;birthday:&lt;/td&gt;
&lt;td&gt;
&lt;input type="text" name="birthday"&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="2"&gt;
&lt;s:submit value="注册"&gt;&lt;/s:submit&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/form&gt;
&lt;/body&gt;</pre>
<p>&nbsp;如果不输入userName, age输入为abc,会提示<br />
&nbsp;Invalid field value for field "age".<br />
&nbsp;username is empty </p>
<p>1. 其中Invalid field value for field "age" 信息是struts2通过内置的类型转换器进行类型转换时,如果不能成功转换, struts2框架自动生成一条错误信息，并将该错误信息放到addFieldError里面,这种默认的输出信息格式是在&nbsp; xwork-2.0.4.jar中定义的.&nbsp; com/opensymphony/xwork2/xwork-messages.properties文件中有一条xwork.default.invalid.fieldvalue=Invalid field value for field "{0}".</p>
<p>2. 这是一种全局的错误提示方式,整个系统中只要是字段类型转换错误都会这样提示,我们也可以改变这种输出格式,只要在全局的国际资源文件中重写xwork.default.invalid.fieldvalue就可以了.</p>
<p>实现方式:<br />
在struts.xml中加入&lt;constant name="struts.custom.i18n.resources" value="messageResource"&gt;&lt;/constant&gt; <span style="color: #ff0000">(此处i18n,不是l，是1)<br />
</span>或者也可以在struts.properties中加入struts.custom.i18n.resources=messageResource<br />
指定国际化资源文件名为messageResource. Properties</p>
<p>新建messageResource. Properties资源文件并添加数据xwork.default.invalid.fieldvalue={0} failure<br />
修改之后字段类型转换错误提示为 : {0} failure</p>
<p>3 所有的类型转换失败后,struts2会将基本类型设置为0,对象类型设置为null,这里的age的类型为Integer,当类型转换失败age值为null,如果age的类型为int,那么转换失败后值为0</p>
<p>4.这种提示信息不够友好,也可以定义局布的提示信息,为每一个Action新建一个properties文件,文件名为XXX.properties(Action名.properties)</p>
<p>实现方式:新建RegistAction.properties并添加<br />
invalid.fieldvalue.age=age error<br />
invalid.fieldvalue.birthday=birthday error<br />
其中age和birthday分别为字段的名称<br />
<br />
四.<br />
Struts2也提供类似BaseDispatchAction的功能</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://dashi129.javaeye.com/blog/402312#"><img alt="复制代码" src="http://dashi129.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork2.ActionSupport; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Regist2Action&nbsp;</span><span class="keyword">extends</span><span>&nbsp;ActionSupport&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;userName; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getUserName()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;userName; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setUserName(String&nbsp;userName)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.userName&nbsp;=&nbsp;userName; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;regist()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"注册成功-regist"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;SUCCESS; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;validateRegist()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(userName.equals(</span><span class="string">""</span><span>)){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addFieldError(</span><span class="string">"userName"</span><span>,&nbsp;</span><span class="string">"请输入用户名-registValidate"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com;
import com.opensymphony.xwork2.ActionSupport;
public class Regist2Action extends ActionSupport {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String regist() throws Exception {
System.out.println("注册成功-regist");
return SUCCESS;
}
public void validateRegist() {
if(userName.equals("")){
addFieldError("userName", "请输入用户名-registValidate");
}
}
}</pre>
<p>&nbsp;&nbsp;&lt;action name="regist2" class="com.Regist2Action" method="regist"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="input"&gt;/regist2.jsp&lt;/result&gt;<br />
&nbsp;&nbsp; &lt;/action&gt;</p>
<p>指定了method为regist,当请求时会执行regist(),不会再去执行默认的execute()方法了,<br />
validateRegist()方法是专门针对regist校验的.(格式为validate+方法名)</p>
</div>
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script>
<img src ="http://www.blogjava.net/super-nini/aggbug/298072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-13 14:58 <a href="http://www.blogjava.net/super-nini/archive/2009/10/13/298072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：struts2 异常处理总结 </title><link>http://www.blogjava.net/super-nini/archive/2009/10/13/298071.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 13 Oct 2009 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/13/298071.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298071.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/13/298071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298071.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298071.html</trackback:ping><description><![CDATA[<p id="p84r0" style="margin: 0px"><span style="color: #3d85c6">1---:java.lang.NoClassDefFoundError: org/apache/struts2/dojo/views/jsp/ui/HeadTag</span></p>
<p id="mbbf0" style="margin: 0px">解决办法：原因缺少了dojo的JAR包，引入即可:struts2-dojo-plugin-2.1.2.jar</p>
<p id="mbbf1" style="margin: 0px">(</p>
<p id="mbbf2" style="margin: 0px">The "head" tag renders required JavaScript code to configure Dojo and is required in order to use any of the tags included in the Dojo plugin.</p>
<p id="mbbf3" style="margin: 0px">--------------------</p>
<p id="mbbf4" style="margin: 0px">If you are planning to nest tags from the Dojo plugin, make sure you set parseContent="false", otherwise each request made by the inner tags will be performed twice.&nbsp;</p>
<p id="mbbf6" style="margin: 0px">)<br id="p84r2" />
</p>
<p id="zxws0" style="margin: 0px"><span style="color: #3d85c6">2---:Unable to load configuration. -&nbsp;bean -&nbsp;jar:file:/F:/Struts2/Struts2/WebRoot/WEB-INF/lib/struts2-core-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.1.2.jar!/struts-default.xml:46:178</span></p>
<p id="tv.j0" style="margin: 0px"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Caused by: Unable to load bean: type:org.apache.struts2.dispatcher.multipart.MultiPartRequest class:org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean -&nbsp;jar:file:/F:/Struts2/Struts2/WebRoot/WEB-INF/lib/struts2-core-2.1.2.jar!/struts-default.xml:46:178</span></p>
<p id="tv.j1" style="margin: 0px"><span style="color: #351c75"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/RequestContext&nbsp;</span><br id="tv.j2" />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解决办法：缺少JAR包，引入commons-fileupload-1.2.1.jar，commons-io-1.3.2.jar即可</p>
<p id="pwkf0" style="margin: 0px">&nbsp;</p>
<p id="pwkf1" style="margin: 0px"><span style="color: #3d85c6">3---:No tag "datetimepicker" defined in tag library imported with prefix "s"</span></p>
<p id="pwkf2" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原因版本问题：缺少struts-dojo-plugin JAR包，以及HTML的,&lt;HEAD&gt;&lt;/HEAD&gt;中没有使用&lt;s:head/&gt;标签</p>
<p id="khgj0" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If you're using Struts 2.1.x you're probably&nbsp;<span style="color: #ff0000">missing the&gt;</span>&nbsp;<span style="color: #ff0000">struts-dojo-plugin</span>.&nbsp; Micha&#235;l's reference below applies to Struts 2.1.xonly. In the lasts versions (since 2.0.9 I guess), all AJAX are in dojo&gt; plugin.<br id="iyxx0" />
&gt; &gt; So you need to&nbsp;<span style="color: #ff0000">include &lt;%@ taglib uri="/struts-dojo-tags" prefix="sx"%&gt;<br id="iyxx1" />
</span>&gt; &gt; and &lt;sx:head/&gt;<br id="iyxx2" />
&gt; &gt;( Temp1:<br id="j4wk0" />
&nbsp;&nbsp; &lt;sx:datetimepicker name="picker" /&gt;<br id="j4wk1" />
&nbsp;&nbsp; Temp2:<br id="j4wk2" />
&nbsp;&nbsp; &lt;sx:datetimepicker type="time" name="picker" /&gt;&lt;br/&gt;<br id="j4wk3" />
&nbsp;&nbsp; Temp3:<br id="j4wk4" />
&nbsp;&nbsp; &lt;sx:datetimepicker value="%{'2008-06-08'}" name="picker" /&gt;<br id="j4wk5" />
&nbsp;&nbsp; Temp4:<br id="j4wk6" />
&nbsp;&nbsp; &lt;sx:datetimepicker value="date" name="picker" /&gt;)<br id="iyxx3" />
&gt; &gt; and call&nbsp; :&lt;sx:datetimepicker .../&gt;<br id="iyxx4" />
<br id="ekd80" />
</p>
<p id="khgj1" style="margin: 0px">&nbsp;</p>
<p id="khgj2" style="margin: 0px"><span style="color: #3d85c6">4---:使用TILES框架&nbsp;&nbsp;&nbsp;</span>&nbsp;&nbsp;</p>
<p id="khgj3" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;If you use the Tiles 2 plugin, check your tiles.xml file(s) to ensure they contain a DOCTYPE.</p>
<div class="code" id="khgj4" style="margin-top: 0px; margin-bottom: 0px">
<div class="codeContent" id="khgj5" style="margin-top: 0px; margin-bottom: 0px">
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;&lt;!DOCTYPE <span style="color: #ff0000">tiles-definitions</span> PUBLIC <span class="code-quote" id="khgj7">"-<span class="code-comment" id="khgj8">//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"</span>
</span> &nbsp;&nbsp;&nbsp;&nbsp;<span class="code-quote" id="khgj9">"http:<span class="code-comment" id="khgj10">//tiles.apache.org/dtds/tiles-config_2_0.dtd"</span>&gt;
</span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;tiles-definitions&gt;
</pre>
<pre class="code-java"><span style="color: #3d85c6">5---:struts2中不支持EL表达式</span> <a id="ndk2" title="Troubleshooting guide migrating from Struts 2.0.x to 2.1.x" href="http://cwiki.apache.org/S2WIKI/troubleshooting-guide-migrating-from-struts-20x-to-21x.html"><span style="color: #108ac6">Convert EL expressions to OGNL</span></a> &nbsp;</pre>
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;Struts2.1 tags do not allow evaluation of JSP EL within their attributes.
&nbsp;&nbsp;&nbsp;&nbsp;Instead, Struts2 tags evaluate attribute values as OGNL. Allowing both
&nbsp;&nbsp;&nbsp;&nbsp;expression languages within the same attribute opens major security
&nbsp;&nbsp;&nbsp;&nbsp;vulnerabilities. </pre>
<pre class="code-java"><span style="color: #3d85c6">6---文件上传过程中取不到文件名和文件类型，即都取到NULL</span></pre>
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;原因：如果页面中file的name=&#8220;a&#8221;则我们ACTION中设置String aContentType,String aFileName;(此两个其实无所谓，关键是SET方法)</pre>
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;setA(File file)(){}; setAContentType(String s){};setAFileName(String name){} 即格式如下：setXContentType() setXFileName().X代表你给FILE取的NAME名字</pre>
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;必须和它相同，固定格式</pre>
<pre class="code-java"><span style="color: #3d85c6">7---严重: Unable to parse request<br id="x8ku0" />
&nbsp;&nbsp;&nbsp;&nbsp;org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)<br id="x8ku1" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.&lt;init&gt;(FileUploadBase.java:914)2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn<br id="kr3j1" />
&nbsp;&nbsp;&nbsp;&nbsp;警告: Could not find property [struts.valueStack]<br id="kr3j2" />
&nbsp;&nbsp;&nbsp;&nbsp;2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error<br id="kr3j3" />
&nbsp;&nbsp;&nbsp;&nbsp;严重: the request was rejected because its size (8523356) exceeds the configured maximum (2097152)<br id="kr3j4" />
&nbsp;&nbsp;&nbsp;&nbsp;2008-5-27 17:46:51 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn<br id="kr3j5" />
&nbsp;&nbsp;&nbsp;&nbsp;警告: Could not find property [org.apache.catalina.jsp_file]<br id="kr3j6" />
</span></pre>
<pre class="code-java">&nbsp;原因：上传文件大小超过预定大小，可以在struts.properties配置文件中设置struts.multipart.maxSize=XXX（XXX为文件大小）</pre>
<pre class="code-java"><span style="color: #3d85c6">&nbsp;8---配置了文件类型限制后，当传错误类型可以拦截不让用户上传该文件，可是跳转的页面却没有跳转到input配置的错误页面，而是返回</span></pre>
<pre class="code-java"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;到了success正确页面。</span></pre>
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;严重: Content-Type not allowed: filedata "upload__5b01657_11a329d4dcf__8000_00000000.tmp" text/plain<br id="nwwf2" />
<span style="color: #6aa84f">&nbsp;&nbsp;&nbsp;&nbsp;《我的打印输出DEBUG语句内容:File:null&nbsp; FlieName:null&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type:null》即拦截类型成功了<br id="nwwf3" />
</span>&nbsp;&nbsp;&nbsp;&nbsp;java.lang.NullPointerException<br id="nwwf4" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:103)<br id="nwwf5" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.study.web.util.FileUploadUtil.uploadFile(FileUploadUtil.java:36)<br id="nwwf6" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.study.web.action.UploadFileAction.execute(UploadFileAction.java:58)<br id="nwwf7" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)。。。</pre>
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn<br id="cs1b2" />
&nbsp;&nbsp;&nbsp;&nbsp;警告: Could not find property [org.apache.catalina.jsp_file]<br id="cs1b3" />
&nbsp;&nbsp;&nbsp;&nbsp;2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn<br id="cs1b4" />
&nbsp;&nbsp;&nbsp;&nbsp;警告: Could not find property [struts]<br id="cs1b5" />
&nbsp;&nbsp;&nbsp;&nbsp;2008-5-29 10:59:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger info<br id="cs1b6" />
&nbsp;&nbsp;&nbsp;&nbsp;信息: Removing file filedata \tmp\upload__5b01657_11a329d4dcf__8000_00000000.tmp</pre>
<pre class="code-java">&nbsp;&nbsp;<span style="color: #e06666">&nbsp;</span><span style="color: #cc0000">&nbsp;原因及解决办法：在该文件上传Action中只配置了FileUploadInterceptor后缺少配置了defaultStack拦截器.</span></pre>
<pre class="code-java"><span style="color: #cc0000">&nbsp;&nbsp;&nbsp;&nbsp;在ACTION中配置玩defaultStack拦截器后改错误消失。</span></pre>
<pre class="code-java"><span style="color: #3d85c6">9---struts.properties中全局配置文件大小，再使用默认FileUploadInterceptor拦截器时候能实现拦截的功能但是后台出现异常。</span></pre>
<pre class="code-java"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;严重: Unable to parse request<br id="h60y1" />
&nbsp;&nbsp;&nbsp;&nbsp;org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (380) exceeds the configured maximum (10)<br id="h60y2" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.&lt;init&gt;(FileUploadBase.java:914)</span></pre>
<pre class="code-java"><span style="color: #000000">原因：未知。将全局配置中的限制大小去掉，再重新在ACTION中覆盖配置FileUploadInterceptor拦截器设置大小和文件类型限制，可消除异常。</span></pre>
<pre class="code-java"><span style="color: #3d85c6">10---多文件上传中，其中一个传被限制的文件如限制aplication/msword(即.doc)文件，允许传文本文件。然而当夹杂在一起传的时候，后台能截获类型错误不可传信息，但是</span></pre>
<pre class="code-java"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;实际却还是上传成功。</span></pre>
<pre class="code-java">严重: <span style="color: #ff0000">Content-Type not allowed</span>: filedata "upload_4d958287_11a33e76ab9__8000_00000007.tmp" <span style="color: #ff0000">application/msword</span><br id="fipv1" />
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000006.tmp&nbsp; fileName:project.txt&nbsp; fileType:text/plain<br id="fipv2" />
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000007.tmp&nbsp; fileName:application base.doc&nbsp; fileType:application/msword<br id="fipv3" />
file is :\tmp\upload_4d958287_11a33e76ab9__8000_00000008.tmp&nbsp; fileName:zhongqi-bug.txt&nbsp; fileType:text/plain</pre>
<pre class="code-java">原因：忘记了继承ActionSupport类。继承后异常消失。</pre>
<pre class="code-java"><span style="color: #3d85c6">11--文件上传异常，不能创建File文件</span></pre>
<pre class="code-java"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0b5394">Cannot create type class java.io.File from value C:\Documents and Settings\admin\桌面\OrderReporterServiceImp.java - [unknown location]</span></pre>
<pre class="code-java">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0b5394"><span style="color: #000000">原因：忘记了在form表单里将enctype设置成文件上传格式：</span><span style="color: #cc0000">enctype="multipart/form-data"</span></span></pre>
<pre class="code-java"><span style="color: #3d85c6">12--当使用限制文件类型和大小的时候抛出空指针异常</span></pre>
<pre class="code-java"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;java.lang.NullPointerException
demo.struts2.action.ValidatFileUploadAction.execute(ValidatFileUploadAction.java:71)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
&nbsp;&nbsp;&nbsp;<span style="color: #000000">&nbsp;原因：在ACTION中配置了fileUpload拦截器后忘记了配置默认拦截器：defautlStack。注意当ACTION中配置自己的拦截器后需要显示配置默认</span></span></pre>
<pre class="code-java"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;拦截器defaultStack</span></pre>
<pre class="code-java"><span style="color: #3d85c6">13--在国际化时候抛空指针异常：</span>
<p id="acwa0" style="margin: 0px"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16:31:12,812 ERROR [jsp]:253 - Servlet.service() for servlet jsp threw exception<br id="v8.r1" />
&nbsp;&nbsp;&nbsp;&nbsp;java.lang.NullPointerException&nbsp; at java.text.MessageFormat.applyPattern(MessageFormat.java:414)</span></p>
<p id="acwa1" style="margin: 0px"><span style="color: #3d85c6">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at java.text.MessageFormat.&lt;init&gt;(MessageFormat.java:350)<br id="v8.r4" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.opensymphony.xwork2.DefaultTextProvider.getText(DefaultTextProvider.java:70)</span></p>
<p id="v8.r5" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p id="e:-f0" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;原因：忘记了在struts.xml中配置国际化常量，或者在struts.properties中配置全局国际化常量 struts.custom.i18n.resources=globeMessage</p>
<p id="xg_20" style="margin: 0px">&nbsp;</p>
<p id="xg_21" style="margin: 0px"><span style="color: #3d85c6">14-- struts action的配置文件加载失败：</span></p>
<p id="xg_22" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;Unable to load configuration. - result - file:/D:/Java/apache-tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26</p>
<p id="h-yb0" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Caused by: No result type specified for result named 'error', perhaps the parent package does not specify the result type? - result - file:/D:/Java/apache-tomcat-5.5.20/webapps/mysts/WEB-INF/classes/test.xml:10:26<br id="h-yb1" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.buildResults(XmlConfigurationProvider.java:609)</p>
<p id="rl940" style="margin: 0px">&nbsp; </p>
<p id="m1jt0" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #e06666">&nbsp;</span><span style="color: #ff0000">原因：忘记了继承包struts-default</span></p>
<p id="i3_f0" style="margin: 0px"><span style="color: #ff0000">15-- struts action 配置文件注意事项：</span></p>
<p id="i3_f2" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">1. 别忘记了继承struts-default默认配置包</span></p>
<p id="i3_f4" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">2.如果配置命名空间，一定要以"/"开始，例如：namespace="/test"</span></p>
<p id="ll:m0" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">3.每个模块struts action配置文件中都可以配置全局result，global-result 经测试不会冲突，STRTUS会智能寻找该Action请求的</span></p>
<p id="gyj:0" style="margin: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">&nbsp;模块STRUTS ACTION配置包</span></p>
</pre>
</div>
<strong>关键字: 警告: no configuration found for the specified action</strong>
<div class="blog_content">
<p>警告: No configuration found for the specified action: 'ShowMessage' in namespace: ''. Form action defaulting to 'action' attribute's literal value. <br />
&nbsp;</p>
<p>解决方法：</p>
<p>经过测试发现，是没有正确使用tag的原因，这种情况下，正确的写法应该是，&lt;s:form name="login" method="post" <span style="color: #ff0000">action="login"</span> &gt; <br />
您是否添加了action这个呢？</p>
</div>
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script></div>
<img src ="http://www.blogjava.net/super-nini/aggbug/298071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-13 14:57 <a href="http://www.blogjava.net/super-nini/archive/2009/10/13/298071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Struts2 + Hibernate开发笔记(一,二)  原文：http://www.itpub.net/viewthread.php?tid=851635</title><link>http://www.blogjava.net/super-nini/archive/2009/10/13/298038.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 13 Oct 2009 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/13/298038.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/298038.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/13/298038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/298038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/298038.html</trackback:ping><description><![CDATA[Struts2 + Hibernate开发笔记(一)<br />
<br />
<div class="t_msgfont" id="message8479180">由于开发任务紧张,因为这里的开发笔记,仅用于记录遇到的几个struts2和hibernate结合开发的现象.不对其做分析.<br />
1.&nbsp; &nbsp; &nbsp; &nbsp; 在使用struts2时,页面和action之间的传值<br />
这是struts2和struts1最大的区别.<br />
Struts2中,action和jsp页面之间的信息交互,是通过 action中定义的成员变量来实现的.<br />
例如,我在一个名为EstateAction的类中有如下定义<br />
public class CityAction extends BaseAction {<br />
&nbsp; &nbsp; &nbsp; &nbsp; private MthCity mthCity ;<br />
&nbsp; &nbsp; &nbsp; &nbsp; private String cityName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; private Long cityId<br />
&nbsp; &nbsp; &nbsp; &nbsp; private int couter;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public String loadCity() throws DataAccessException, BaseException{<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;counter ++;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "city";<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}<br />
然后,这里上面的类中的成员类MthCity的定义如下<br />
public class MthCity implements java.io.Serializable {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; private Long cityId&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; private String cityName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public MthCity() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; public Long getCityId() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this.cityId;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setCityId(Long cityId) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.cityId = cityId;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public String getCityName() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this.cityName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setCityName(String cityName) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.cityName = cityName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}<br />
这是一个Hibatenate使用的数据对象 POJO类.<br />
有了这两个类后,我们来看看Struts2的Action和JSP页面之间是如何交互的<br />
一.&nbsp; &nbsp; &nbsp; &nbsp; JSP -&gt; Action<br />
Jsp页面<br />
&nbsp; &nbsp; &nbsp; &nbsp; 以下是一个jsp页面submit.jsp.这个页面只有一个功能,就是向struts提交申请<br />
&lt;%@ page language="java" contentType="text/html; charset=gbk"%&gt;<br />
&lt;%@ include file="/common/taglibs.jsp"%&gt;<br />
<br />
<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=gbk" /&gt;<br />
&lt;title&gt;提交&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;script&gt;<br />
&nbsp; &nbsp; function go (){<br />
&nbsp; &nbsp;&nbsp; &nbsp;window.location ="${pageContext.request.contextPath}/admin/city/loadCity.do&#8221;;<br />
&nbsp;&nbsp;}<br />
&lt;/script&gt;<br />
&lt;body&gt;<br />
&lt;form name=&#8221;myform&#8221; &gt;<br />
&nbsp;&nbsp;&lt;input type="button" name="cityupdate" id="cityupdate" value="编辑" onclick="javascript:go();"/&gt;<br />
&nbsp;&nbsp;&lt;input type="hidden" name="mthCity.cityName" id=" mthCity " value="广州" /&gt;<br />
<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
大家可以看到,这个页面只有一个按钮,将页面提交到struts的一个action中,这是为什么呢.<br />
&nbsp; &nbsp; &nbsp; &nbsp; 我们先看一段struts2的配置文件admin-action.xml<br />
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;<br />
&lt;struts&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;package name="admin" namespace="/admin" extends="struts-default"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;action name="city/*" method="{1}"<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; class="com.mytophome.admin.representation.struts.action.CityAction"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="city"&gt;/admin/city.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="city_update"&gt;/admin/city_update.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/action&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/package&gt;<br />
&lt;/struts&gt;<br />
<br />
这是一个struts2的典型配置文件.<br />
上面有几处要注意的<br />
首先是namespace = &#8220;/admin&#8221; 这是一个struts模块名,可以不写,但如果写了,能比较方便的将struts2的action按配置来分模块.(何谓分模块呢?struts2有个特性,是action定义不需要像struts1一样写在同一个struts.xml文件中.而是可以使用include的形式.例如我使用的项目的struts.xml文件就是这样写的:<br />
&lt;struts&gt;<br />
&nbsp; &nbsp; &lt;include file="struts-action/admin-action.xml"/&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;include file="struts-action/agent-action.xml"/&gt;<br />
&lt;/struts&gt;<br />
这样include了一系统的xml配置,而上面的admin-action.xml文件就是其中一段,因此将这一段中涉及的action类设定为一个模块,就定namespace = &#8220;/admin&#8221;<br />
)<br />
其次<br />
&lt;action name="city/*" method="{1}"<br />
这一句配置的意思,就是,当用户提交一个符合struts2格式的申请时(所有包含.do形式的http链接)<br />
例如<a href="http://localhost/admin/city/loadCity.do" target="_blank">http://localhost/admin/city/loadCity.do</a><br />
其中包含了/city/那么在配置 文件中,只要定义action name=&#8221;city/*&#8221;,那么所有包含有/city/的do,都会提交到action定义的类中来,也就是类om.mytophome.admin.representation.struts.action.CityAction中,那么提交到这个类的哪个方法中呢? 因为选择的是city/*.而且mothed={1},所以方法名由链接指定<br />
也就是loadCity.do所指定的.loadCity方法.<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; 这个do方法后面是可以带参数的.所带的参数名,要是CityAction中定义的成员变量,包括成员类.例如,如果想提交后,CityAction中的cityId有值,链接可以这样写<br />
<a href="http://localhost/admin/city/loadCity.do?cityId=9" target="_blank">http://localhost/admin/city/loadCity.do?cityId=9</a><br />
这样,在loadCity方法中,如果你访问cityId,就可以发现cityId的值是9<br />
System.out.println(Long.toString(cityId));<br />
<br />
但这里有一个条件,就是CityAction中,必须要有cityId变量的getter/setter方法(这两个方法可以用MyEclipse自动生成)<br />
&nbsp; &nbsp; &nbsp; &nbsp; public Long getCityId() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return cityId;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setCityId(Long cityId) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.cityId = cityId;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }如果要给CityAction中的MthCity类的<br />
这样才能在jsp页面提交时,由struts为cityId赋值.(当然,getter方法就方便当action返回到jsp页面时,cityId的值能在页面取到.)<br />
&nbsp; &nbsp; &nbsp; &nbsp; 如果要为action中的类成员变量赋值也是可以的<br />
例如<a href="http://localhost/admin/city/loadCity.do?cityId=9&amp;mthCity.cityId=8" target="_blank">http://localhost/admin/city/load ... mp;mthCity.cityId=8</a><br />
这条链接提交后,会和上面一样调用CityAction的loadCity方法,但这里,action的成员mthCity会被创建实例,并为mthCity的一个属性cityId赋值,也就是说,在action中,大家可以通过mthCity.getCityId()来获得这个属性的值.<br />
当然,一定要在action设置mthCity的getter setter,jsp上的内容才能传到action中<br />
&nbsp; &nbsp; &nbsp; &nbsp; public MthCity getMthCity()<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return mthCity;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setMthCity(MthCity city) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this. mthCity = city;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; 从JSP提交内容到Action,还有一种方法,就是将参数内容放在表单form的元素中<br />
&nbsp;&nbsp;&lt;input type="hidden" name="mthCity.cityName" id=" mthCity " value="广州" /&gt;<br />
<br />
这样,当用以下语句表单提交的时候<br />
doucment. myform.submit();<br />
就能在Action中创建一个mthCity实例,并为mthCity.cityName设置值为:广州.<br />
原因是在页面的表单元素中,设置了name= mthCity.cityName,而action中刚好有成员类叫mthCity,而这个类中刚好有属性叫cityName.,就是通过这样的方法,能将表单的内容,提交到Action中.<br />
<br />
<br />
<div style="float: right" align="right"><a title="评分 0" href="http://www.itpub.net/misc.php?action=viewratings&amp;tid=851654&amp;pid=8479475"></a></div>
Struts2 + Hibernate开发笔记(二)<br />
<br />
<div class="t_msgfont" id="message8479475">二.&nbsp; &nbsp; &nbsp; &nbsp; Action -&gt; JSP<br />
当要从Action中执行的loadCity方法,要返回到jsp页面时,要在页面上指定一个return的页面.我们在admin-action.xml配置中可以看到一句<br />
&lt;result name="city"&gt;/admin/city.jsp&lt;/result&gt;<br />
而在loadCity方法中有这样一句<br />
return "city";<br />
这样,当loadCity执行完后,就会返回到<a href="http://localhost/admin/city.jsp页面." target="_blank">http://localhost/admin/city.jsp页面.</a><br />
由于在action中,cityId和mthCity.cityId是被前一个提交过来的jsp页面赋值过,所以当程序执行转到city.jsp页面的时候,这几个值是能被使用的.我们使用jstl来获得这些值<br />
${cityId} , ${mthCity.citId} (前提是只要在action中,设定了cityId和mthCity类的getter/setter.)<br />
<br />
<br />
2.&nbsp; &nbsp; &nbsp; &nbsp; 当action中的类,传到受hibernate管理的命名空间的类中时<br />
这个问题比较特殊.<br />
我的工程中,建立了一个类cityService.这个类是进行数据库操作的,也就是和hibernate打交道的.而这个类在hibernate的设置中设置为被一个hibernate Session管理的范围.<br />
这个cityService中有一个方法,用于更新city的信息的<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void updateCity(MthCity city) throws DataAccessException,<br />
&nbsp; &nbsp; &nbsp; &nbsp; BaseException{<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;MthCity icity = this.getCityById( city.getCityId());<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;icity.setCityName(city.getCityName());<br />
baseHibernateDAO.update(icity);//这个baseHibernateDAO只是一个封封装了hibernate&nbsp;&nbsp;API的包,网上常见.&nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
大家可以看到,方法中并没有直接update从参数传进来的city,而是新建了一个icity,装了city中的信息再进行update.<br />
<br />
这是因为,cityService这个类被hibernate管理,所以在这个类中创建的内容,才能被更新.所以我们必须使用一个新的MthCity类实例来装着外面传进来的内容,才能更新.否则就会出现类似have the same id object in the session的错误,也就是说session中有其它相同id的对象的错.<br />
<br />
当然,有另一个处理办法,就是使用baseHibernateDAO.merge来更新内容,而还是用update<br />
这里就可以写成<br />
public void updateCity(MthCity city) throws DataAccessException,<br />
&nbsp; &nbsp; &nbsp; &nbsp; BaseException{<br />
<br />
baseHibernateDAO.merge(icity);<br />
}<br />
<br />
<br />
3.&nbsp; &nbsp; &nbsp; &nbsp; Hibernate中的version类型成员<br />
在我的项目中,city有一个属性是timestamp,对应的是mth_city这个表,这个表通过hibernate的映射,映射成一个POJO对象<br />
public class MthCity implements java.io.Serializable {<br />
&nbsp; &nbsp; &nbsp; &nbsp; private Long cityId<br />
&nbsp; &nbsp; &nbsp; &nbsp; private Date timestamp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; private String cityName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public MthCity() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public Long getCityId() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this.cityId;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setCityId(Long cityId) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.cityId = cityId;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; public Date getTimestamp() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this.timestamp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setTimestamp(Date timestamp) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.timestamp = timestamp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public String getCityName() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this.cityName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setCityName(String cityName) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.cityName = cityName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}<br />
<br />
大家可以看到,类中有一个属性是timestamp,定义为Date类型.<br />
这个类型是用于记录数据库操作的日期的,数据库中的对应字段也叫timestamp.看一下hibernate的映射配置<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;<br />
&lt;!-- <br />
&nbsp; &nbsp; Mapping file autogenerated by MyEclipse Persistence Tools<br />
--&gt;<br />
&lt;hibernate-mapping&gt;<br />
&nbsp; &nbsp; &lt;class name="com.mytophome.admin.domain.MthCity" table="MTH_CITY" dynamic-update="true"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;id name="cityId" type="java.lang.Long"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;column name="CITY_ID" precision="10" scale="0" /&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;generator class="sequence" /&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/id&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;version name="timestamp" type="java.util.Date"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;column name="TIMESTAMP" length="7" /&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/version&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;property name="cityName" type="java.lang.String"&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;column name="CITY_NAME" length="80" /&gt;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp; &nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;<br />
<br />
大家可以看到,cityid对应数据库表中的CITY_ID字段,其值由oracle sequence生成<br />
而timestamp属性,对应的是数据库的TIMESTAMP字段,并且这个属性在mapping中定义为&lt;version&gt;属性<br />
这样,就会出现两点要注意的地方<br />
&nbsp; &nbsp; &nbsp; &nbsp; 数据库中的这个timestamp的字段一定要有值,并且是日期值,否则当hibernate更新这个字段没有值的那条记录时,会出现如下错误<br />
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.mytophome.admin.domain.MthCity#1]<br />
&nbsp; &nbsp; &nbsp; &nbsp; 在更新MthCity中的值到数据库中,也就是更新一条记录时,一定不设调用方法人工设置timestamp属性的值,也就是下面的语句不能出现<br />
mthCity.setTimeStamp(new Date());<br />
否则也会引起hibernate的出错.<br />
</div>
<br />
</div>
<img src ="http://www.blogjava.net/super-nini/aggbug/298038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-13 11:29 <a href="http://www.blogjava.net/super-nini/archive/2009/10/13/298038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Struts 2 标签中 # % 的作用</title><link>http://www.blogjava.net/super-nini/archive/2009/10/09/297505.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 09 Oct 2009 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/09/297505.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/297505.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/09/297505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/297505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/297505.html</trackback:ping><description><![CDATA[<div class="tit">Struts 2 标签中 # % 的作用</div>
<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <p class="cnt"><font color="#ff0000">&#8220;#&#8221;主要有三种用途：</font></p>
            <ol>
                <li>访问OGNL上下文和Action上下文，#相当于ActionContext.getContext()；下表有几个ActionContext中有用的属性：
                <table class="FCK__ShowTableBorders" style="border-top: #008000 2px solid; border-bottom: #008000 2px solid" cellspacing="0" cellpadding="2" border="0">
                    <tbody>
                        <tr>
                            <td style="font-weight: bold; border-bottom: #008000 1px solid; height: 21px; background-color: #ccffcc">名称</td>
                            <td style="font-weight: bold; border-bottom: #008000 1px solid; height: 21px; background-color: #ccffcc">作用</td>
                            <td style="font-weight: bold; border-bottom: #008000 1px solid; height: 21px; background-color: #ccffcc">例子</td>
                        </tr>
                        <tr>
                            <td>parameters</td>
                            <td>包含当前HTTP请求参数的Map</td>
                            <td>#parameters.id[0]作用相当于request.getParameter("id")</td>
                        </tr>
                        <tr>
                            <td>request</td>
                            <td>包含当前HttpServletRequest的属性（attribute)的Map</td>
                            <td>#request.userName相当于request.getAttribute("userName")</td>
                        </tr>
                        <tr>
                            <td>session</td>
                            <td>包含当前HttpSession的属性（attribute）的Map</td>
                            <td>#session.userName相当于session.getAttribute("userName")</td>
                        </tr>
                        <tr>
                            <td>application</td>
                            <td>包含当前应用的ServletContext的属性（attribute）的Map</td>
                            <td>#application.userName相当于application.getAttribute("userName")</td>
                        </tr>
                        <tr>
                            <td>attr</td>
                            <td>用于按request &gt; session &gt; application顺序访问其属性（attribute）</td>
                            <td>#attr.userName相当于按顺序在以上三个范围（scope）内读取userName属性，直到找到为止</td>
                        </tr>
                    </tbody>
                </table>
                </li>
            </ol>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#符号的用途一般有三种。 — 访问非根对象属性，例如示例中的#session.msg表达式，由于Struts 2中值栈被视为根对象，所以访问其他非根对象时，需要加#前缀。实际上，#相当于ActionContext. getContext()；#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;2.用于过滤和投影（projecting)集合，如<span style="background-color: lightgrey">books.{?#this.price&lt;100}</span>； </p>
            <p class="cnt">&nbsp;&nbsp;&nbsp;&nbsp; 投影就是选出集合中每个元素的相同属性组成新的集合，类似于关系数据库的字段操作。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 投影操作<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 语法: collection.{XXX}，<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 其中XXX 是这个集合中每个元素的公共属性。 <br />
            &nbsp;&nbsp;&nbsp;&nbsp; 例如：group.userList.{username}将获得某个group中的所有user的name的列表。&nbsp;<br />
            <br />
            &nbsp; &nbsp;&nbsp; 选择就是过滤满足selection 条件的集合元素，类似于关系数据库的纪录操作。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 选择操作<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 语法：collection.{X YYY}，<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中X 是一个选择操作符，YYY后面则是选择用的逻辑表达式。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择操作符有三种：&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;? 选择满足条件的所有元素&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^ 选择满足条件的第一个元素&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ 选择满足条件的最后一个元素&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：group.userList.{? #this.name != null}将获得某个group中user的name不为空的user的列表</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.构造Map，如<span style="background-color: lightgrey">#{'foo1':'bar1', 'foo2':'bar2'}</span>。 </p>
            <span>
            <p><font color="#ff0000">&#8220;%&#8221;符号的用途是在标志的属性为字符串类型时，计算OGNL表达式的值。</font></p>
            <p>例如在Ognl.jsp中加入以下代码：</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: #0000ff">&lt;</span><span style="color: #800000">hr </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h3</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">%的用途</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h3</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:url </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="#foobar['foo1']"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:url </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="%{#foobar['foo1']}"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span></div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/super-nini/aggbug/297505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-09 10:18 <a href="http://www.blogjava.net/super-nini/archive/2009/10/09/297505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Struts2页面开发中常用标签使用说明 </title><link>http://www.blogjava.net/super-nini/archive/2009/10/09/297496.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 09 Oct 2009 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/10/09/297496.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/297496.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/10/09/297496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/297496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/297496.html</trackback:ping><description><![CDATA[<p>1． Struts2页面开发中常用标签使用说明 </p>
<p>1.1．往action里传值的使用方式： </p>
<p>&lt;input name="userName" type="text" class="input6" size="15"&gt; </p>
<p>a. userName属性需要在访问的action中提供相应的属性，并有SET/GET方法。 </p>
<p>b. 可以不在访问的action中提供相应的属性，用request.getParameter(&#8220;userName&#8221;);1.2．显示标签 property 用于输出指定值： </p>
<p>&lt;s:property value=" userName "/&gt; 当action返回到指定页面是，可以通过该标签显示action中的属性信息。（注 userName必须在action中存在，并有GET方法）。 </p>
<p>1.3．往对象中传值&lt;s:textfield&gt; 用于从页面往action中的对象内传值： </p>
<p>&lt;s:text name="user. userName " id="username"/&gt; </p>
<p>该标签可以在页面中向action中的实体对象内直接传值。（注：在action中要存在user对象，并有SET/GET方法。） </p>
<p>1.4．判断&lt;s:if&gt; &lt;/s:if&gt; 用于在页面中判断指定数据 </p>
<p>&lt;s:if test="userName == admin"&gt;&#8230;. &lt;/s:if&gt; </p>
<p>&lt;s:else&gt;&#8230;. &lt;/s:else&gt; </p>
<p>该标签用于对指定的数据进行判断，但指定的数据必须在action中存在。 </p>
<p>1.5．迭代&lt;s:iterator&gt;用于将List、Map、ArrayList等集合进行循环遍历 </p>
<p>&lt;s:iterator value="userList" id="user" status="u"&gt; </p>
<p>&lt;s:property value="userName"/&gt;&lt;/a&gt; </p>
<p>&lt;/s:iterator&gt; </p>
<p>该标签用于将userList集合中的元素进行循环，用过property进行显示集合中的指定元素值。 </p>
<p>1.6．URL地址标签，&lt;s:url&gt;用于生成一个URL地址，可以通过URL标签指定的&lt;s:param&gt;子元素向URL地址发送请求参数 </p>
<p>&lt;s:url action=" "&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name=" " value=""&gt;&lt;/s:param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:url&gt; </p>
<p>其中action为请求地址，param子元素为地址后面所带的参数。 </p>
<p>1.7．超链接 &lt;a href &gt;一般和&lt;s:url&gt;标签一起使用，用于带多个参数。 </p>
<p>&lt;a href=" </p>
<p>&lt;s:url action=" "&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name=" " value=""&gt;&lt;/s:param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name=" " value=""&gt;&lt;/s:param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name=" " value=""&gt;&lt;/s:param&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:url&gt;"&gt; </p>
<p>超链接&lt;/a&gt; </p>
<p>1.8．set标签，用于将某个值放入指定的范围内。例如application,session等。 </p>
<p>&lt;s:set name="user" value="userName" scope=&#8221;request&#8221;/&gt; </p>
<p>将user值放入request范围内。 </p>
<p>2． Struts2页面开发中常用标签使用规范： </p>
<p>1.1．通过&lt;input name="userName" type="text" class=" " size="15"&gt; </p>
<p>往action中传值，action中要有相应的属性，并提供SET/GET方法。 </p>
<p>（在数量少时可以使用request.getParameter(&#8220;userName&#8221;);） </p>
<p>1.2．在页面显示action传来的数据，使用property标签。需要显示的数据从action中获得。 </p>
<p>1.3．往action中的实体对象内传值，使用textfield标签。 </p>
<p>1.4．在页面中判断指定值使用&lt;s:if&gt;标签。判断数据从action中获得。 </p>
<p>1.5．在页面中需要循环列表显示的数据使用&lt;s:iterator&gt;标签，列表数据从action中获得。 </p>
<p>1.6．URL地址和超链接可以使用&lt;a href&gt;和&lt;s:url&gt;，在传多值时建议&lt;a href&gt;和&lt;s:url&gt;一起使用 </p>
<img src ="http://www.blogjava.net/super-nini/aggbug/297496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-10-09 09:37 <a href="http://www.blogjava.net/super-nini/archive/2009/10/09/297496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：struts2.0的标签库（简介）</title><link>http://www.blogjava.net/super-nini/archive/2009/09/29/296860.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 29 Sep 2009 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/29/296860.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/296860.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/29/296860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/296860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/296860.html</trackback:ping><description><![CDATA[<p>以前标签库分html、bean、logic、tiles。而struts2.0里的标签却没有分类，只要在jsp头文件加上
<p>&lt;%@ taglib&nbsp; prefix="s" uri="/struts-tags" %&gt;就能使用。
<p>下面介绍各个标签的用法（若有错请指正）：
<p>A：&lt;s:a href=""&gt;&lt;/s:a&gt;-----超链接，类似于html里的&lt;a&gt;&lt;/a&gt;
<p>&lt;s:action name=""&gt;&lt;/s:action&gt;-----执行一个view里面的一个action
<p>&lt;s:actionerror/&gt;-----如果action的errors有值那么显示出来
<p>&lt;s:actionmessage/&gt;-----如果action的message有值那么显示出来
<p>&lt;s:append&gt;&lt;/s:append&gt;-----添加一个值到list，类似于list.add();
<p>&lt;s:autocompleter&gt;&lt;/s:autocompleter&gt;-----自动完成&lt;s:combobox&gt;标签的内容，这个是ajax
<p>B：
<p>&lt;s:bean name=""&gt;&lt;/s:bean&gt;-----类似于struts1.x中的，JavaBean的值
<p>C：
<p>&lt;s:checkbox&gt;&lt;/s:checkbox&gt;-----复选框
<p>&lt;s:checkboxlist list=""&gt;&lt;/s:checkboxlist&gt;-----多选框
<p>&lt;s:combobox list=""&gt;&lt;/s:combobox&gt;-----下拉框
<p>&lt;s:component&gt;&lt;/s:component&gt;-----图像符号
<p>D：
<p>&lt;s:date/&gt;-----获取日期格式
<p>&lt;s:datetimepicker&gt;&lt;/s:datetimepicker&gt;-----日期输入框
<p>&lt;s:debug&gt;&lt;/s:debug&gt;-----显示错误信息
<p>&lt;s:div&gt;&lt;/s:div&gt;-----表示一个块，类似于html的&lt;div&gt;&lt;/div&gt;
<p>&lt;s:doubleselect list="" doubleName="" doubleList=""&gt;&lt;/s:doubleselect&gt;-----双下拉框
<p>E：
<p>&lt;s:if test=""&gt;&lt;/s:if&gt;
<p>&lt;s:elseif test=""&gt;&lt;/s:elseif&gt;
<p>&lt;s:else&gt;&lt;/s:else&gt;-----这3个标签一起使用，表示条件判断
<p>F：
<p>&lt;s:fielderror&gt;&lt;/s:fielderror&gt;-----显示文件错误信息
<p>&lt;s:file&gt;&lt;/s:file&gt;-----文件上传
<p>&lt;s:form action=""&gt;&lt;/s:form&gt;-----获取相应form的值
<p>G：
<p>&lt;s:generator separator="" val=""&gt;&lt;/s:generator&gt;----和&lt;s:iterator&gt;标签一起使用
<p>H：
<p>&lt;s:head/&gt;-----在&lt;head&gt;&lt;/head&gt;里使用，表示头文件结束
<p>&lt;s:hidden&gt;&lt;/s:hidden&gt;-----隐藏值
<p>I：
<p>&lt;s:i18n name=""&gt;&lt;/s:i18n&gt;-----加载资源包到值堆栈
<p>&lt;s:include value=""&gt;&lt;/s:include&gt;-----包含一个输出，servlet或jsp页面
<p>&lt;s:inputtransferselect list=""&gt;&lt;/s:inputtransferselect&gt;-----获取form的一个输入
<p>&lt;s:iterator&gt;&lt;/s:iterator&gt;-----用于遍历集合
<p>L：
<p>&lt;s:label&gt;&lt;/s:label&gt;-----只读的标签
<p>M：
<p>&lt;s:merge&gt;&lt;/s:merge&gt;-----合并遍历集合出来的值
<p>O：
<p>&lt;s:optgroup&gt;&lt;/s:optgroup&gt;-----获取标签组
<p>&lt;s:optiontransferselect doubleList="" list="" doubleName=""&gt;&lt;/s:optiontransferselect&gt;-----左右选择框
<p>P：
<p>&lt;s:param&gt;&lt;/s:param&gt;-----为其他标签提供参数
<p>&lt;s:password&gt;&lt;/s:password&gt;-----密码输入框
<p>&lt;s:property/&gt;-----得到'value'的属性
<p>&lt;s:push value=""&gt;&lt;/s:push&gt;-----value的值push到栈中,从而使property标签的能够获取value的属性
<p>R：
<p>&lt;s:radio list=""&gt;&lt;/s:radio&gt;-----单选按钮
<p>&lt;s:reset&gt;&lt;/s:reset&gt;-----重置按钮
<p>S：
<p>&lt;s:select list=""&gt;&lt;/s:select&gt;-----单选框
<p>&lt;s:set name=""&gt;&lt;/s:set&gt;-----赋予变量一个特定范围内的值
<p>&lt;s:sort comparator=""&gt;&lt;/s:sort&gt;-----通过属性给list分类
<p>&lt;s:submit&gt;&lt;/s:submit&gt;-----提交按钮
<p>&lt;s:subset&gt;&lt;/s:subset&gt;-----为遍历集合输出子集
<p>T：
<p>&lt;s:tabbedPanel id=""&gt;&lt;/s:tabbedPanel&gt;-----表格框
<p>&lt;s:table&gt;&lt;/s:table&gt;-----表格
<p>&lt;s:text name=""&gt;&lt;/s:text&gt;-----I18n文本信息
<p>&lt;s:textarea&gt;&lt;/s:textarea&gt;-----文本域输入框
<p>&lt;s:textfield&gt;&lt;/s:textfield&gt;-----文本输入框
<p>&lt;s:token&gt;&lt;/s:token&gt;-----拦截器
<p>&lt;s:tree&gt;&lt;/s:tree&gt;-----树
<p>&lt;s:treenode label=""&gt;&lt;/s:treenode&gt;-----树的结构
<p>U：
<p>&lt;s:updownselect list=""&gt;&lt;/s:updownselect&gt;-----多选择框
<p>&lt;s:url&gt;&lt;/s:url&gt;-----创建url</p>
<script type="text/javascript">
addthis_pub= 'wolfit';
addthis_logo= 'http://download.rainbowsoft.org/image/common/zbloglogo.gif';
addthis_brand= 'Z-Blog';
addthis_options= 'favorites, delicious, twitter, digg, myspace, facebook, google, live,  email, more';
</script>
<img src ="http://www.blogjava.net/super-nini/aggbug/296860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-29 10:04 <a href="http://www.blogjava.net/super-nini/archive/2009/09/29/296860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：strust2实践总结</title><link>http://www.blogjava.net/super-nini/archive/2009/09/29/296858.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Tue, 29 Sep 2009 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/29/296858.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/296858.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/29/296858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/296858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/296858.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed; width: 100%">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">1：在action中定义的变量，在jsp页面中显示用：&lt;s:property value="变量名" /&gt; <br />
            <br />
            2：在页面中实现自动增加的序号用iterator的statuts的index属性 eg： <br />
            <br />
            &lt;s:iterator value="#request.inOutAccountList" id="data" status="listStat"&gt; <br />
            <br />
            &lt;s:property value="#listStat.index+1"/&gt; <br />
            <br />
            &lt;/s:iterator&gt; <br />
            <br />
            3:在action类中取得request和session对象的方法 <br />
            <br />
            Map session = ActionContext.getContext().getSession(); <br />
            HttpServletRequest request = ServletActionContext.getRequest (); <br />
            <br />
            设置它们的值的方法 <br />
            <br />
            session.put("operation", "add"); <br />
            request.setAttribute("name", name); <br />
            <br />
            页面中取得它们的值： <br />
            <br />
            &lt;s:property value="#session.operation"/&gt; <br />
            &lt;s:property value="#request.name"/&gt; <br />
            <br />
            4:页面中奇偶行样式不一样的控制方法： <br />
            <br />
            &lt;tr class="&lt;s:if test='#listStat.odd == true '&gt;tableStyle-tr1&lt;/s:if&gt;&lt;s:else&gt;tableStyle-tr2&lt;/s:else&gt;" &gt; <br />
            <br />
            5:单选框和复选框的使用方法 <br />
            <br />
            1):可以设置默认选中值，注意list的值的设置，通过这种方式使key和value不一样，这种方法比较常用(checkboxlist or radio) <br />
            <br />
            &lt;s:radio name="uncarInsPolicy.policyStateCode" <br />
            list="#{'5':'通过' , '2':'不通过'}" <br />
            listKey="key" <br />
            listValue="value" <br />
            value='5' <br />
            /&gt; <br />
            <br />
            2):这里的key和value的值是一样的(checkboxlist or radio) <br />
            <br />
            &lt;s:checkboxlist <br />
            list="{'Red', 'Blue', 'Green'}" <br />
            name="favoriteColor"/&gt; <br />
            <br />
            6:struts2 中的标签会生成类似由&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;构成的字串（具体什么标签生成什么，可以查看生成后的页面的源代码）如果不限制这些多余代码的生成，页面将变得无法控制，所以一般我们是不希望它生成多余的代码的，具体的设置方法如果，在struts.xml中统一配置 <br />
            &lt;constant name="struts.ui.theme" value="simple"/&gt;加上该句即可 <br />
            也可以通过在页面中将tag的theme属性设为"simple"取消其默认的表格布局 <br />
            不过最好是：自定义一个theme，并将其设为默认应用到整个站点，如此一来就可以得到统一的站点风格 <br />
            <br />
            7：jsp页面中格式化日期的方法 <br />
            <br />
            &lt;s:date name="unCarInsModificationInfo.createTime" format="yyyy-MM-dd" nice="false"/&gt;这样就可以将日期格式化为yyyy－MM－dd的形式 <br />
            <br />
            8：默认情况下，当请求action发生时，Struts运行时（Runtime）根据struts.xml里的Action映射集(Mapping)，实例化action对应的类，并调用其execute方法。当然，我们可以通过以下两种方法改变这种默认调用 <br />
            <br />
            1）在classes/sturts.xml中新建Action，并指明其调用的方法 <br />
            比如想调用action类中的 <br />
            <br />
            public String aliasAction() { <br />
            message ="自定义Action调用方法"; <br />
            return SUCCESS; <br />
            } <br />
            则在classes/sturts.xml中加入下面代码： <br />
            &lt;action name="AliasHelloWorld" class="tutorial.HelloWorld" method="aliasAction"&gt; <br />
            &lt;result&gt;/HelloWorld.jsp&lt;/result&gt; <br />
            &lt;/action&gt; <br />
            既可用action名调用该方法了 <br />
            <br />
            2）（比较常用） <br />
            <br />
            访问Action时，在Action名后加上&#8220;!xxx&#8221;（xxx为方法名）。 <br />
            <br />
            9：Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。 <br />
            struts.xml用于应用程序相关的配置 <br />
            struts.properties用于Struts 2.0的运行时（Runtime）的配置 <br />
            <br />
            10:在action类中取得web下某一文件夹物理路径（绝对路径）的方法 <br />
            filePath = ServletActionContext.getServletContext().getRealPath("/upLoadFiles") <br />
            <br />
            11：要想返回的页面不是一个直接JSP页面而是要先通过返回action中的方法读取相应的数据再返回到jsp页面，有两种方法 <br />
            <br />
            1）在struts.xml中这么设置 <br />
            <br />
            &lt;result name="list" type="redirect-action"&gt;sysmanage/UserBaseInfoAction!findUserBaseInfo.action&lt;/result&gt; <br />
            <br />
            2）在action中返回时直接调用这个方法即可 <br />
            <br />
            return findList（）； <br />
            <br />
            12：设置checkboxlist中默认值的方法 <br />
            <br />
            &lt;s:checkboxlist name="skills1" <br />
            ="Skills 1" <br />
            list="{ 'Java', '.Net', 'RoR', 'PHP' }" <br />
            value="{ 'Java', '.Net' }" /&gt; <br />
            &lt;s:checkboxlist name="skills2" <br />
            label="Skills 2" <br />
            list="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }" <br />
            listKey="key" <br />
            listValue="value" <br />
            value="{ 1, 2, 3 }"/&gt; <br />
            <br />
            13：二级级连下拉框 <br />
            <br />
            &lt;s:set name="foobar" <br />
            value="#{'Java': {'Spring', 'Hibernate', 'Struts 2'}, '.Net': {'Linq', ' ASP.NET 2.0'}, 'Database': {'Oracle', 'SQL Server', 'DB2', 'MySQL'}}" /&gt; <br />
            &lt;s:doubleselect list="#foobar.keySet()" <br />
            doubleName="technology" <br />
            doubleList="#foobar[top]" <br />
            label="Technology" /&gt;</div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/super-nini/aggbug/296858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-29 09:11 <a href="http://www.blogjava.net/super-nini/archive/2009/09/29/296858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：struts2的struts.properties配置文件详解</title><link>http://www.blogjava.net/super-nini/archive/2009/09/28/296819.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Mon, 28 Sep 2009 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/28/296819.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/296819.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/28/296819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/296819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/296819.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div id="articlebody">
<div>
<p>struts.action.extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;URL&nbsp;extension&nbsp;to&nbsp;use&nbsp;to&nbsp;determine&nbsp;if&nbsp;the&nbsp;request&nbsp;is&nbsp;meant&nbsp;for&nbsp;a&nbsp;Struts&nbsp;action&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用URL扩展名来确定是否这个请求是被用作Struts&nbsp;action，其实也就是设置&nbsp;action的后缀，例如login.do的'do'字。<br />
<br />
struts.configuration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.config.Configuration&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.config.Configuration接口名<br />
<br />
struts.configuration.files<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;list&nbsp;of&nbsp;configuration&nbsp;files&nbsp;automatically&nbsp;loaded&nbsp;by&nbsp;Struts&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struts自动加载的一个配置文件列表<br />
<br />
struts.configuration.xml.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;reload&nbsp;the&nbsp;XML&nbsp;configuration&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否加载xml配置(true,false)<br />
<br />
struts.continuations.package<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;package&nbsp;containing&nbsp;actions&nbsp;that&nbsp;use&nbsp;Rife&nbsp;continuations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含有actions的完整连续的package名称<br />
<br />
struts.custom.i18n.resources<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;localization&nbsp;properties&nbsp;files&nbsp;to&nbsp;load&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的国际化属性文件（不包含.properties后缀）<br />
<br />
struts.custom.properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;configuration&nbsp;properties&nbsp;files&nbsp;to&nbsp;load<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的配置文件的位置<br />
<br />
<br />
struts.devMode<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Struts&nbsp;is&nbsp;in&nbsp;development&nbsp;mode&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否为struts开发模式<br />
<br />
struts.dispatcher.parametersWorkaround<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;a&nbsp;Servlet&nbsp;request&nbsp;parameter&nbsp;workaround&nbsp;necessary&nbsp;for&nbsp;some&nbsp;versions&nbsp;of&nbsp;WebLogic<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（某些版本的weblogic专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）<br />
<br />
struts.enable.DynamicMethodInvocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Allows&nbsp;one&nbsp;to&nbsp;disable&nbsp;dynamic&nbsp;method&nbsp;invocation&nbsp;from&nbsp;the&nbsp;URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许动态方法调用<br />
<br />
struts.freemarker.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.views.freemarker.FreemarkerManager&nbsp;implementation&nbsp;class&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.freemarker.FreemarkerManager接口名<br />
<br />
struts.i18n.encoding<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;encoding&nbsp;to&nbsp;use&nbsp;for&nbsp;localization&nbsp;messages<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;国际化信息内码<br />
<br />
struts.i18n.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;localization&nbsp;messages&nbsp;should&nbsp;automatically&nbsp;be&nbsp;reloaded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否国际化信息自动加载&nbsp;<br />
<br />
struts.locale<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;locale&nbsp;for&nbsp;the&nbsp;Struts&nbsp;application<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的国际化地区信息<br />
<br />
struts.mapper.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.dispatcher.mapper.ActionMapper&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.dispatcher.mapper.ActionMapper接口<br />
<br />
struts.multipart.maxSize<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;maximize&nbsp;size&nbsp;of&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart请求信息的最大尺寸（文件上传用）&nbsp;<br />
<br />
struts.multipart.parser<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.struts2.dispatcher.multipart.MultiPartRequest&nbsp;parser&nbsp;implementation&nbsp;for&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）<br />
<br />
<br />
struts.multipart.saveDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;to&nbsp;use&nbsp;for&nbsp;storing&nbsp;uploaded&nbsp;files&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置存储上传文件的目录夹<br />
<br />
struts.objectFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.ObjectFactory&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.ObjectFactory接口（spring）<br />
<br />
struts.objectFactory.spring.autoWire<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;autoWire&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否自动绑定Spring<br />
<br />
struts.objectFactory.spring.useClassCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;use&nbsp;its&nbsp;class&nbsp;cache&nbsp;or&nbsp;not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否spring应该使用自身的cache&nbsp;<br />
<br />
struts.objectTypeDeterminer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer接口<br />
<br />
struts.serve.static.browserCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;static&nbsp;content&nbsp;served&nbsp;by&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;set&nbsp;browser&nbsp;caching&nbsp;header&nbsp;properties&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中<br />
<br />
struts.serve.static<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;serve&nbsp;static&nbsp;content&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否struts过滤器应该提供静态内容<br />
<br />
struts.tag.altSyntax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;the&nbsp;alterative&nbsp;syntax&nbsp;for&nbsp;the&nbsp;tags&nbsp;or&nbsp;not&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否可以用替代的语法替代tags<br />
<br />
struts.ui.templateDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;containing&nbsp;UI&nbsp;templates<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI&nbsp;templates的目录夹&nbsp;<br />
<br />
struts.ui.theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;UI&nbsp;template&nbsp;theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的UI&nbsp;template主题<br />
<br />
struts.url.http.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTP&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置http端口<br />
<br />
struts.url.https.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTPS&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置https端口<br />
<br />
struts.url.includeParams<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;includeParams&nbsp;method&nbsp;to&nbsp;generate&nbsp;Struts&nbsp;URLs&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在url中产生&nbsp;默认的includeParams<br />
<br />
<br />
struts.velocity.configfile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;Velocity&nbsp;configuration&nbsp;file&nbsp;path<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity配置文件路径<br />
<br />
struts.velocity.contexts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;of&nbsp;Velocity&nbsp;context&nbsp;names<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity的context列表<br />
<br />
<br />
struts.velocity.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.velocity.VelocityManager&nbsp;implementation&nbsp;class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.views.velocity.VelocityManager接口名<br />
<br />
struts.velocity.toolboxlocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;location&nbsp;of&nbsp;the&nbsp;Velocity&nbsp;toolbox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity工具盒的位置&nbsp;<br />
struts.xslt.nocache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;or&nbsp;not&nbsp;XSLT&nbsp;templates&nbsp;should&nbsp;not&nbsp;be&nbsp;cached<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否XSLT模版应该被缓存</p>
<p>struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时，我们希望每次请求都获得服务器的最新响应，则可设置该属性为false。</p>
<p>struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用，该属性的默认值是true。如果需要关闭动态方法调用，则可设置该属性为false。</p>
<p>struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线，该属性的默认值是false。如果开发者希望允许在Action名中使用斜线，则可设置该属性为true。</p>
<p>struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法，因为通常都需要在标签中使用表达式语法，故此属性应该设置为true，该属性的默认值是true。</p>
<p>struts.devMode该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true，则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值，该属性的默认值是false。通常，应用在开发阶段，将该属性设置为true，当进入产品发布阶段后，则该属性设置为false。</p>
<p>struts.i18n.reload该属性设置是否每次HTTP请求到达时，系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发，但在产品发布阶段应将该属性设置为false。</p>
<p>提示 开发阶段将该属性设置了true，将可以在每次请求时都重新加载国际化资源文件，从而可以让开发者看到实时开发效果；产品发布阶段应该将该属性设置为false，是为了提供响应性能，每次请求都需要重新加载资源文件会大大降低应用的性能。</p>
<p>struts.ui.theme该属性指定视图标签默认的视图主题，该属性的默认值是xhtml。</p>
<p>struts.ui.templateDir该属性指定视图主题所需要模板文件的位置，该属性的默认值是template，即默认加载template路径下的模板文件。</p>
<p>struts.ui.templateSuffix该属性指定模板文件的后缀，该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp，分别对应FreeMarker、Velocity和JSP模板。</p>
<p>struts.configuration.xml.reload该属性设置当struts.xml文件改变后，系统是否自动重新加载该文件。该属性的默认值是false。</p>
<p>struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。</p>
<p>struts.velocity.contexts该属性指定Velocity框架的Context位置，如果该框架有多个Context，则多个Context之间以英文逗号（,）隔开。</p>
<p>struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。</p>
<p>struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户，只是当Struts 2需要生成URL时（例如Url标签），该属性才提供Web应用的默认端口。</p>
<p>struts.url.https.port该属性类似于struts.url.http.port属性的作用，区别是该属性指定的是Web应用的加密服务端口。</p>
<p>struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值，分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。</p>
<p><br />
struts.custom.i18n.resources该属性指定Struts 2应用所需要的国际化资源文件，如果有多份国际化资源文件，则多个资源文件的文件名以英文逗号（,）隔开。</p>
<p><br />
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器，不支持HttpServlet Request调用getParameterMap()方法，此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于 WebLogic、Orion和OC4J服务器，通常应该设置该属性为true。</p>
<p>struts.freemarker.manager.classname 该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是 org.apache.struts2.views.freemarker.FreemarkerManager，这是Struts 2内建的FreeMarker管理器。</p>
<p>struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值，默认值是true。通常无需修改该属性值。</p>
<p>struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时，该属性通常被设置为true；当应用处于产品使用阶段时，该属性通常被设置为false。</p>
<p>struts.configuration.files 该属性指定Struts 2框架默认加载的配置文件，如果需要指定默认加载多个配置文件，则多个配置文件的文件名之间以英文逗号（,）隔开。该属性的默认值为struts- default.xml,struts-plugin.xml,struts.xml，看到该属性值，读者应该明白为什么Struts 2框架默认加载struts.xml文件了。</p>
</div>
</div>
<img src ="http://www.blogjava.net/super-nini/aggbug/296819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-28 17:16 <a href="http://www.blogjava.net/super-nini/archive/2009/09/28/296819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：struts2 所需jar包详解 </title><link>http://www.blogjava.net/super-nini/archive/2009/09/28/296817.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Mon, 28 Sep 2009 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/28/296817.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/296817.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/28/296817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/296817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/296817.html</trackback:ping><description><![CDATA[<div class="postText"><strong style="color: black; background-color: #ffff66">Struts2</strong>.1.x终于推出正式版了，下载后按照Struts 2.0.14版进行配置，抛出异常说无法装载 (org.apache.<strong style="color: black; background-color: #ffff66">struts2</strong>.dispatcher.multipart.MultiPartRequest)，异常信息提示摘不到 org.apache.commons.fileupload.RequestContext类，搜索<strong style="color: black; background-color: #ffff66">struts2</strong>.1.6带的所有jar包，发现RequestContext类并不在<strong style="color: black; background-color: #ffff66">struts2</strong>-core-2.1.6.jar 中，在commons-fileupload-1.2.1.jar包中，之前<strong style="color: black; background-color: #ffff66">struts2</strong>.0.14并不需要此包，只有在要用到上传组件的时候才需要。可能是<strong style="color: black; background-color: #ffff66">struts2</strong>.1.6对文件上传功能的改进。因此要想正常使用<strong style="color: black; background-color: #ffff66">struts2</strong>.1.6，至少需要如下6 个jar包：
<ul>
    <li><strong style="color: black; background-color: #ffff66">struts2</strong>-core-2.1.6.jar
    <li>freemarker-2.3.13.jar
    <li>commons-logging-1.0.4.jar
    <li>ognl-2.6.11.jar
    <li>xwork-2.1.2.jar
    <li>commons-fileupload-1.2.1.jar <br />
    <br />
    要注意的是，Struts 2.1.6的最小jar包配置比<strong style="color: black; background-color: #ffff66">Struts2</strong>.0.14多了一个commons-fileupload-1.2.1.jar。 <br />
    如果要使用<strong style="color: black; background-color: #ffff66">Struts2</strong>的注释功能，在<strong style="color: black; background-color: #ffff66">Struts2</strong>.0.14中只要引用了<strong style="color: black; background-color: #ffff66">struts2</strong>-core-2.1.6.jar文件即可，而在 <strong style="color: black; background-color: #ffff66">struts2</strong>.1.6中还需要引用<strong style="color: black; background-color: #ffff66">struts2</strong>-convention-plugin-2.1.6.jar文件，而且注释类的包也变了（又增加了一些新的注释类），<strong style="color: black; background-color: #ffff66">Struts2</strong>.0.14中的注释类在org.apache.<strong style="color: black; background-color: #ffff66">struts2</strong>.config包中，而<strong style="color: black; background-color: #ffff66">struts2</strong>.1.6的注释类在 org.apache.<strong style="color: black; background-color: #ffff66">struts2</strong>.convention.annotation包中。除此之外，有些注释的属性名也变了，如Result注释在 <strong style="color: black; background-color: #ffff66">struts2</strong>.0.14中有一个value属性，表示一个要转入的URL，而在<strong style="color: black; background-color: #ffff66">Struts2</strong>.1.6的Result注释中使用location属性代替了value属性（不再有value属性了），但它们的使用方法相同。 <br />
    因此，读者在使用<strong style="color: black; background-color: #ffff66">Struts2</strong>.1.x时要注意，这一版本与<strong style="color: black; background-color: #ffff66">Struts2</strong>.0.x并不完全兼容（但大部分还是兼容的）。据我的经验，<strong style="color: black; background-color: #ffff66">Struts2</strong>.1.x版本将是比较稳定的一个<strong style="color: black; background-color: #ffff66">Struts2</strong>版本，因此，Struts1.x就是在Struts1.1版本才开始流行起来的。 <br />
    以前也测试过<strong style="color: black; background-color: #ffff66">Struts2</strong>的其他版本，经部分测试，目前Struts 2分为三个版本阶段：Struts 2.0.9及以前版本、<strong style="color: black; background-color: #ffff66">Struts2</strong>.0.10至<strong style="color: black; background-color: #ffff66">Struts2</strong>.0.14、Struts 2.1.x，这三类版本都不太兼容，如果确定使用<strong style="color: black; background-color: #ffff66">struts2</strong>来开发程序，建议直接使用<strong style="color: black; background-color: #ffff66">struts2</strong>.1.6及以后的版本，这是一个比较稳定的<strong style="color: black; background-color: #ffff66">Struts2</strong>版本。 <br />
    </li>
</ul>
</div>
<img src ="http://www.blogjava.net/super-nini/aggbug/296817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-28 17:12 <a href="http://www.blogjava.net/super-nini/archive/2009/09/28/296817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Could not commit Hibernate 问题，spring 事物 提交前session关闭问题</title><link>http://www.blogjava.net/super-nini/archive/2009/09/11/294762.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 11 Sep 2009 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/11/294762.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/294762.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/11/294762.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/294762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/294762.html</trackback:ping><description><![CDATA[<p>org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started<br />
最近在写操作CLOB的过程中总是报这个异常,数据去插入进去了.</p>
<p><br />
先看看SessionFactory.getCurrentSession与openSession的区别<br />
1. 如果使用的是getCurrentSession来创建session的话，在commit后，session就自动被关闭了，<br />
&nbsp;&nbsp;&nbsp; 也就是不用再session.close()了。但是如果使用的是openSession方法创建的session的话，<br />
&nbsp;&nbsp;&nbsp; 那么必须显示的关闭session，也就是调用session.close()方法。这样commit后，session并没有关闭<br />
/*2. getCurrentSession的使用可以参见hibernate\hibernate-3.2\doc\tutorial\src项目<br />
3. 使用SessionFactory.getCurrentSession()需要在hibernate.cfg.xml中如下配置：<br />
&nbsp;&nbsp; * 如果采用jdbc独立引用程序配置如下：<br />
&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.current_session_context_class"&gt;thread&lt;/property&gt;<br />
&nbsp;&nbsp; * 如果采用了JTA事务配置如下 <br />
&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.current_session_context_class"&gt;jta&lt;/property&gt;*/</p>
<p>开始用的:</p>
<p>Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();<br />
Transaction tran=session.beginTransaction();</p>
<p>好多文章里都说只需在Spring配置&lt;bean id="sessionFactory"...---&gt;&lt;property name="hibernateProperties"&gt;&nbsp;&nbsp; 中加入 &lt;prop key="hibernate.current_session_context_class"&gt;thread&lt;/prop&gt;就可以解决,试了没用.</p>
<p>修改后的:</p>
<p>Session session = this.getHibernateTemplate().getSessionFactory().openSession();</p>
<p>Transaction tran=session.beginTransaction();</p>
<p>......</p>
<p>finally<br />
&nbsp;&nbsp; {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; session.close();&nbsp;&nbsp; <br />
&nbsp;&nbsp; }</p>
<p>问题解决<br />
</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/294762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-11 17:06 <a href="http://www.blogjava.net/super-nini/archive/2009/09/11/294762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Hibernate3一级缓存和二级缓存的理解</title><link>http://www.blogjava.net/super-nini/archive/2009/09/11/294738.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 11 Sep 2009 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/11/294738.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/294738.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/11/294738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/294738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/294738.html</trackback:ping><description><![CDATA[<p style="text-align: center" align="center"><strong><span style="font-size: 14pt">Hiberante3 </span></strong><strong><span style="font-size: 14pt; font-family: 宋体">一级缓存总结</span></strong></p>
<p style="margin-left: 21.75pt; text-indent: -21.75pt"><strong><span style="font-size: 14pt">1．<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong>Session <span style="font-family: 宋体">级别的缓存，它同</span>session<span style="font-family: 宋体">邦定。它的生命周期和</span>session<span style="font-family: 宋体">相同。</span>Session<span style="font-family: 宋体">消毁，它也同时消毁；管理一级缓存，一级缓存无法取消，用两个方法管理，</span>clear(),evict()</p>
<p style="margin-left: 21.75pt; text-indent: -21.75pt"><strong><span style="font-size: 14pt">2．<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="font-family: 宋体">两个</span>session <span style="font-family: 宋体">不能共享一级缓存，因它会伴随</span>session<span style="font-family: 宋体">的生命周期的创建和消毁；</span></p>
<p style="margin-left: 21.75pt; text-indent: -21.75pt"><strong><span style="font-size: 14pt">3．<span style="font: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong>Session<span style="font-family: 宋体">缓存是实体级别的缓存，就是只有在查询对象级别的时候才使用，如果</span></p>
<p style="margin-left: 21.75pt"><span style="font-family: 宋体">使用</span>HQL<span style="font-family: 宋体">和</span>SQL<span style="font-family: 宋体">是查询属性级别的，是不使用一级缓存的！切记！！！！</span></p>
<p><strong>4 . </strong>&nbsp;iterate <span style="font-family: 宋体">查询使用缓存，会发出查询</span>Id<span style="font-family: 宋体">的</span>SQL<span style="font-family: 宋体">和</span>HQL<span style="font-family: 宋体">语句，但不会发出查实体的，</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">它查询完会把相应的实体放到缓存里边，一些实体查询如果缓存里边有，就从缓存中查询，但还是会发出查询</span>id<span style="font-family: 宋体">的</span>SQL<span style="font-family: 宋体">和</span>HQL<span style="font-family: 宋体">语句。如果缓存中没有它会数据库中查询，然后将查询到的实体一个一个放到缓存中去，所以会有</span>N+1<span style="font-family: 宋体">问题出现。</span></p>
<p style="margin-left: 8.95pt; text-indent: -8.85pt"><strong>5 .&nbsp;List()</strong><strong><span style="font-family: 宋体">和</span></strong><strong>iterate </strong><strong><span style="font-family: 宋体">查询区别：</span></strong></p>
<p style="margin-left: 42pt; text-align: left" align="left"><strong><span style="color: rgb(63,95,191); font-family: 宋体">使用</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">iterate,list</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">查询实体对象</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">*</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">N</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">+</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">1</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">问题，在默认情况下，使用</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">query.iterate</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">查询，有可以能出现</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">N+1</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">问题</span></strong></p>
<p style="margin-left: 42pt; text-indent: 5.25pt; text-align: left" align="left"><strong><span style="color: rgb(63,95,191); font-family: 宋体">所谓的</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">N+1</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">是在查询的时候发出了</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">N+1</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">条</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">sql</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">语句</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">1:</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">首先发出一条查询对象</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">id</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">列表的</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">sql</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">N:</span></strong></p>
<p style="margin-left: 42pt; text-indent: 5.25pt; text-align: left" align="left"><strong><span style="color: rgb(63,95,191); font-family: 宋体">根据</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">id</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">列表到缓存中查询，如果缓存中不存在与之匹配的数据，那么会根据</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">id</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">发出相应的</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">sql</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">语句</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">list</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">和</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">iterate</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">的区别？</span></strong></p>
<p style="margin-left: 21pt; text-indent: 21pt; text-align: left" align="left"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">list</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">每次都会发出</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">sql</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">语句，</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">list</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">会向缓存中放入数据，而不利用缓存中的数据</span></strong></p>
<p style="margin-left: 41.9pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">iterate</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">：在默认情况下</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">iterate</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">利用缓存数据，但如果缓存中不存在数据有可以能出现</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">N+1</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">问题</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">6</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">．</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">Get()</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">和</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">load(),iterate</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">方法都会使用一级缓存，</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong>&nbsp;</strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">7.hiberate3 session </span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">存储过程如下：</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">例如</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'"> object </span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">对象</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session.save(object);</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">这时候不会把数据放到数据库，会先放到</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">session</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">缓存中去，数据库中没有相应记录，</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">session.flush();</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">才发</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">SQL</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">和</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">HQL</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">语句，数据库中有了相应记录，</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">但是数据库用</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">select</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">查不到，这是跟数据库事物级别有关系，（这里在说下数据库的事务隔离级别一共四种如下：）<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">数据库隔离级别：<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; 是否存在幻读；<br />
&nbsp;&nbsp;&nbsp;&nbsp;Read UnCommited(未提交读)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y<br />
&nbsp;&nbsp;&nbsp;&nbsp;Read Commited&nbsp;(提交读 oraclel默认)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y<br />
&nbsp;&nbsp;&nbsp;&nbsp;Repeatable Read(不可重复读（Msql默认）)&nbsp; N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Y&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Serializable(使用很少)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session.beginTrransaction().commit();</span></strong></p>
<p style="margin-left: 41.85pt; text-indent: -41.85pt"><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事物提交后</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">可以查询到了。<br />
<br />
</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">Session.flush()</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">语句但是为什么不写呢，因为</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">commit()</span></strong><strong><span style="color: rgb(63,95,191); font-family: 宋体">会默认调用</span></strong><strong><span style="color: rgb(63,95,191); font-family: 'Courier New'">flush();</span></strong></p>
<strong><span style="font-size: 10.5pt; color: rgb(63,95,191); font-family: 'Courier New'"><br style="page-break-before: always" clear="all" />
</span></strong>
<p style="text-align: center" align="center"><strong><span style="font-size: 14pt">Hiberante3 </span></strong><strong><span style="font-size: 14pt; font-family: 宋体">二级缓存总结</span></strong></p>
<p style="margin-left: 18pt; text-indent: -18pt"><strong>1．</strong>Hibernate3<span style="font-family: 宋体">的（</span>sessionFactory<span style="font-family: 宋体">）二级缓存和</span>session<span style="font-family: 宋体">级别的缓存一样都只对实体对象做缓存，不对属性级别的查询做缓存；二级缓存的生命周期和</span>sessionFactory<span style="font-family: 宋体">的生命周期是一样的，</span>sessionFactory<span style="font-family: 宋体">可以管理二级缓存；</span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><strong>2．</strong>sessionFactory<span style="font-family: 宋体">级别的缓存，需要手动配置；所有的</span>session<span style="font-family: 宋体">可以共享</span>sessionFactory <span style="font-family: 宋体">级别的缓存；（一般把一些不经常变化的实体对象放到</span>sessionFactory<span style="font-family: 宋体">级别的缓存中，适合放不经常变化的实体对象。）</span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><strong>3．</strong>Hiberante3<span style="font-family: 宋体">二级缓存的配置和使用方法如下：</span></p>
<p style="margin-left: 45pt; text-indent: -18pt">1．&nbsp;<span style="font-family: 宋体">必须把</span>ehcache.jar<span style="font-family: 宋体">包导入，然后到</span>Hibernate3.2<span style="font-family: 宋体">的</span>etc<span style="font-family: 宋体">文件下把</span>ehcache.xml<span style="font-family: 宋体">复制到工程</span>src<span style="font-family: 宋体">目录下（</span>ehcache.xml<span style="font-family: 宋体">里边的参数里边有详细英文说明）；</span></p>
<p style="margin-left: 68.25pt; text-indent: -47.25pt"><span style="font-family: 宋体">（说明：</span>ehcache.jar<span style="font-family: 宋体">是第三方法的缓存产品，</span>hiberante<span style="font-family: 宋体">只是把它做了集成，还有好多第三方</span>hibernate<span style="font-family: 宋体">集成的缓存产品，相关说明请查阅</span>hiberante3<span style="font-family: 宋体">开发手册；</span>ehcache<span style="font-family: 宋体">支持分布应用的（这个和Hibernate3.2开发手册有出入，经过官网查证确实支持了），如果有分布式需求，请换成支持分布式的二级缓存产品，</span>hiberate3<span style="font-family: 宋体">开发手册都有相头说明。配置方法都类似）；</span></p>
<p style="margin-left: 18pt; text-indent: -18pt"><strong>4．</strong>Hibernate3<span style="font-family: 宋体">的二级缓存默认是开起的，也可以指定开起。在</span>hibernate.cfg.xml <span style="font-family: 宋体">文件下配置如下：</span></p>
<p style="margin-left: 63pt">*<span style="font-family: 宋体">修改</span>hibernate.cfg.xml<span style="font-family: 宋体">文件，开户二级缓存；</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&#8221;hibernate.cache.use_second_level_cache&#8221;&gt;true&lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<span style="font-family: 宋体">指定二级缓存产品的提供商；</span></p>
<p style="margin-left: 63pt">&lt;property name=&#8221;hibernate.cache.provider_class&#8221;&gt;<co<wbr>de&gt;<span style="font-size: 12pt"> org.hibernate.cache.EhCacheProvider</span></co<wbr>de&gt;</p>
<p style="margin-left: 63pt">&lt;/property&gt;</p>
<p style="margin-left: 63pt"><span style="font-family: 宋体">要让那些实体使用二级缓存，在</span>hibernate.cfg.xml<span style="font-family: 宋体">配置文件中加入：</span></p>
<p style="margin-left: 63pt">&lt;!—</p>
<p style="margin-left: 63pt"><span style="font-family: 宋体">让这个实体用二级缓存</span>&nbsp;<span style="font-family: 宋体">也可以在实体中映射文件去配置即：</span></p>
<p style="margin-left: 63pt">&lt;cache usage="read-on<wbr>ly"/&gt; </p>
<p style="margin-left: 63pt">--&gt;</p>
<p style="margin-left: 63pt">&lt;class-cache class=&#8221;com.zzz.hibernate.ClassT&#8221; usage=&#8221;read-on<wbr>ly&#8221;/&gt;</p>
<p style="margin-left: 63pt">Read-on<wbr>ly<span style="font-family: 宋体">一般使用这个策略，其它的</span>hibernate3<span style="font-family: 宋体">开发手册中也有详细介绍；</span></p>
<p style="margin-left: 63pt">CacheMode<span style="font-family: 宋体">去</span>hibernate3<span style="font-family: 宋体">开发手册中搜索这个关键字，可以找到一级缓存和二级缓存交互使用的问题；</span></p>
<img src ="http://www.blogjava.net/super-nini/aggbug/294738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-11 15:24 <a href="http://www.blogjava.net/super-nini/archive/2009/09/11/294738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：hibernate createSQLQuery</title><link>http://www.blogjava.net/super-nini/archive/2009/09/11/294722.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Fri, 11 Sep 2009 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/11/294722.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/294722.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/11/294722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/294722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/294722.html</trackback:ping><description><![CDATA[原来的查询语句： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://eternal1025.javaeye.com/blog/456192#"></a></div>
</div>
<ol class="dp-j">
    <li><span><span>String&nbsp;sql&nbsp;=&nbsp;</span><span class="string">"select&nbsp;a.*&nbsp;from&nbsp;tb_doc_catalog&nbsp;a&nbsp;where&nbsp;a.cat_code&nbsp;like&nbsp;'"</span><span>+catCode+</span><span class="string">"%'"</span><span>; &nbsp;&nbsp;</span></span>
    <li><span>Session&nbsp;session&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getSession(); &nbsp;&nbsp;</span></span>
    <li><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>List&nbsp;catNameList&nbsp;=&nbsp;session.createSQLQuery(sql).list(); &nbsp;&nbsp;</span>
    <li><span class="keyword">return</span><span>&nbsp;catNameList&nbsp;; &nbsp;&nbsp;</span></span>
    <li><span>}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>releaseSession(session);&nbsp;</span><span class="comment">//释放session </span><span>&nbsp;&nbsp;</span></span>
    <li><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {
List catNameList = session.createSQLQuery(sql).list();
return catNameList ;
} finally {
releaseSession(session); //释放session
}</pre>
<br />
<br />
分析：原来是查询出来的字段并不能自动转换为bean对象。 <br />
<br />
解决思路一（采用hql查询）： <br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://eternal1025.javaeye.com/blog/456192#"></a></div>
</div>
<ol class="dp-j">
    <li><span><span>String&nbsp;sql&nbsp;=&nbsp;</span><span class="string">"select&nbsp;a&nbsp;from&nbsp;DocCatalogInfo&nbsp;a&nbsp;where&nbsp;a.catCode&nbsp;like&nbsp;'"</span><span>+catCode+</span><span class="string">"%'"</span><span>; &nbsp;&nbsp;</span></span>
    <li><span>List&nbsp;catNameList&nbsp;=getHibernateTemplate().find(sql); &nbsp;&nbsp;</span>
    <li><span class="keyword">return</span><span>&nbsp;catNameList&nbsp;;&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">String sql = "select a from DocCatalogInfo a where a.catCode like '"+catCode+"%'";
List catNameList =getHibernateTemplate().find(sql);
return catNameList ;</pre>
<br />
ok，测试一下发现没问题，看来还是因为用原生sql查询的原因，网上搜一下：createsqlQuery返回对象，看到一篇文章才觉悟到： <br />
<br />
解决思路二（采用原生sql查询）： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://eternal1025.javaeye.com/blog/456192#"></a></div>
</div>
<ol class="dp-j">
    <li><span><span>String&nbsp;sql&nbsp;=&nbsp;</span><span class="string">"select&nbsp;a.*&nbsp;from&nbsp;tb_doc_catalog&nbsp;a&nbsp;where&nbsp;a.cat_code&nbsp;like&nbsp;'"</span><span>+catCode+</span><span class="string">"%'"</span><span>; &nbsp;&nbsp;</span></span>
    <li><span>Session&nbsp;session&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getSession(); &nbsp;&nbsp;</span></span>
    <li><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>List&nbsp;catNameList&nbsp;=&nbsp;session.createSQLQuery(sql).addEntity(DocCatalogInfo.</span><span class="keyword">class</span><span>).list(); &nbsp;&nbsp;</span></span>
    <li><span class="keyword">return</span><span>&nbsp;catNameList&nbsp;; &nbsp;&nbsp;</span></span>
    <li><span>}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>releaseSession(session);&nbsp;</span><span class="comment">//释放session </span><span>&nbsp;&nbsp;</span></span>
    <li><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">String sql = "select a.* from tb_doc_catalog a where a.cat_code like '"+catCode+"%'";
Session session = this.getSession();
try {
List catNameList = session.createSQLQuery(sql).addEntity(DocCatalogInfo.class).list();
return catNameList ;
} finally {
releaseSession(session); //释放session
}</pre>
<br />
<br />
又ok了。 <br />
<br />
该篇文章也贴上来： <br />
hibernate 中createQuery与createSQLQuery两者区别是： <br />
前者用的hql语句进行查询，后者可以用sql语句查询 <br />
前者以hibernate生成的Bean为对象装入list返回 <br />
后者则是以对象数组进行存储 <br />
所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回，就不是很方便 <br />
突然发现createSQLQuery有这样一个方法可以直接转换对象 <br />
Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class); <br />
XXXXXXX 代表以hibernate生成的Bean的对象，也就是数据表映射出的Bean。 <br />
呵呵以后多注意，还是时不时的要看看hibernate各个对象方法的使用。 <br />
<br />
还有另外一个相关的小细节应注意： <br />
比如有这样一个po <br />
PO: User.class <br />
properties: userId,userName <br />
DDL: create table tuser (userid varchar(10),username varchar(20)); <br />
当执行： <br />
session.createQuery("from User u").list()时生成的SQL： <br />
　　select userid,username from tuser; <br />
当执行： <br />
<br />
session.createQuery("from User u").iterator()时生成的SQL： <br />
　　 <br />
select userid from tuser; <br />
　　 <br />
可以看出list()一次将数据从数据库中读出直接填充到List中 <br />
　　 <br />
iterator()将数据的主键从数据库中读出，当循环这个Iterator时才添加执行： <br />
　　 <br />
select userid,username from user where userid=?;把数据读出。 <br />
<img src ="http://www.blogjava.net/super-nini/aggbug/294722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-11 14:13 <a href="http://www.blogjava.net/super-nini/archive/2009/09/11/294722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate关系维护记录.txt</title><link>http://www.blogjava.net/super-nini/archive/2009/09/10/294631.html</link><dc:creator>super_nini</dc:creator><author>super_nini</author><pubDate>Thu, 10 Sep 2009 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/super-nini/archive/2009/09/10/294631.html</guid><wfw:comment>http://www.blogjava.net/super-nini/comments/294631.html</wfw:comment><comments>http://www.blogjava.net/super-nini/archive/2009/09/10/294631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super-nini/comments/commentRss/294631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super-nini/services/trackbacks/294631.html</trackback:ping><description><![CDATA[<p>配置文件：<br />
班级：<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;<br />
&nbsp;&lt;class name="bjca.testHibernate.entity.impl.ClassInfo" table="t_class"&gt;<br />
&nbsp;&nbsp; &lt;id name="claId" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="claId" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="native" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="claName" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="claName" length="50" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&lt;set name="students" inverse="true"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;key column="classId"&gt;&lt;/key&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;one-to-many class="bjca.testHibernate.entity.impl.StudentInfo"/&gt;<br />
&nbsp;&nbsp;&lt;/set&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p>学生<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;<br />
&nbsp;&lt;class name="bjca.testHibernate.entity.impl.StudentInfo" table="t_student"&gt;<br />
&nbsp;&nbsp; &lt;id name="stuId" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="native" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp;&lt;property name="stuName" type="java.lang.String"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="stuName" length="50" not-null="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="classes" column="classId" </p>
<p>class="bjca.testHibernate.entity.impl.ClassInfo" cascade="all"/&gt;<br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p><br />
插入一个班级：<br />
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).<br />
log4j:WARN Please initialize the log4j system properly.<br />
Hibernate: select hibernate_sequence.nextval from dual<br />
Hibernate: insert into t_class (claName, claId) values (?, ?)<br />
11111</p>
<p><br />
插入一个学生：<br />
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).<br />
log4j:WARN Please initialize the log4j system properly.<br />
Hibernate: select hibernate_sequence.nextval from dual<br />
Hibernate: insert into t_student (stuName, classId, id) values (?, ?, ?)<br />
11111</p>
<p><br />
修改一条学生信息：<br />
11111<br />
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).<br />
log4j:WARN Please initialize the log4j system properly.<br />
Hibernate: select studentinf0_.id as id0_, studentinf0_.stuName as stuName0_, </p>
<p>studentinf0_.classId as classId0_ from t_student studentinf0_ where studentinf0_.id=10<br />
Hibernate: select classinfo0_.claId as claId1_, classinfo0_.claName as claName1_ from t_class </p>
<p>classinfo0_ where classinfo0_.claId=11<br />
Hibernate: select studentinf0_.id as id0_0_, studentinf0_.stuName as stuName0_0_, </p>
<p>studentinf0_.classId as classId0_0_ from t_student studentinf0_ where studentinf0_.id=?<br />
Hibernate: update t_student set stuName=?, classId=? where id=?<br />
Hibernate: update t_class set claName=? where claId=?</p>
<p>修改一条班级信息：<br />
11111<br />
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).<br />
log4j:WARN Please initialize the log4j system properly.<br />
Hibernate: select classinfo0_.claId as claId1_, classinfo0_.claName as claName1_ from t_class </p>
<p>classinfo0_ where classinfo0_.claId=11<br />
Hibernate: update t_class set claName='大象二班' where claId=11</p>
<p>班级信息级联 all<br />
11111<br />
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).<br />
log4j:WARN Please initialize the log4j system properly.<br />
Hibernate: select studentinf0_.id as id0_, studentinf0_.stuName as stuName0_, </p>
<p>studentinf0_.classId as classId0_ from t_student studentinf0_ where studentinf0_.id=12<br />
Hibernate: select classinfo0_.claId as claId1_, classinfo0_.claName as claName1_ from t_class </p>
<p>classinfo0_ where classinfo0_.claId=11<br />
Hibernate: select studentinf0_.id as id0_0_, studentinf0_.stuName as stuName0_0_, </p>
<p>studentinf0_.classId as classId0_0_ from t_student studentinf0_ where studentinf0_.id=?<br />
Hibernate: update t_class set claName=? where claId=?</p>
<p>&nbsp;</p>
<p>结论：<br />
1对多，多的那方 cascade="all" </p>
<p><br />
**********************************<br />
1方， 班级：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
**********************************<br />
实体类包含set对象，放置多方对象 名自取</p>
<p>配置文件中配置&lt;set&gt;标记,标记name取本方实体中的对方set对象的名字，即set的名字 ,<br />
&lt;set&gt; 下的 &lt;key&gt; 指向多方主键 <br />
&lt;set&gt; 下的 &lt;one-to-many&gt; 指向多方对象</p>
<p>&nbsp;</p>
<p><br />
***********************************<br />
多方&nbsp; 学生：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
***********************************<br />
实体类包含1方对象，名自取</p>
<p>配置文件中配置&lt;many-to-one&gt; 指向1方对象 name 属性取本方实体方法中的对方对象的名字。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/super-nini/aggbug/294631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super-nini/" target="_blank">super_nini</a> 2009-09-10 17:38 <a href="http://www.blogjava.net/super-nini/archive/2009/09/10/294631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>