??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲伊人久久综合中文成人网,亚洲中文久久精品无码,国产亚洲一卡2卡3卡4卡新区http://www.tkk7.com/Even/Sharezh-cnSun, 11 May 2025 15:31:11 GMTSun, 11 May 2025 15:31:11 GMT60web2.0 兼容IE6/IE7/FF的通用Ҏ(gu)http://www.tkk7.com/Even/archive/2009/04/13/265220.htmlE.venE.venMon, 13 Apr 2009 01:44:00 GMThttp://www.tkk7.com/Even/archive/2009/04/13/265220.htmlhttp://www.tkk7.com/Even/comments/265220.htmlhttp://www.tkk7.com/Even/archive/2009/04/13/265220.html#Feedback0http://www.tkk7.com/Even/comments/commentRss/265220.htmlhttp://www.tkk7.com/Even/services/trackbacks/265220.html 以下两种Ҏ(gu)几乎能解决现今所有HACK.

1, !important

随着IE7?important的支? !important Ҏ(gu)现在只针对IE6的HACK.(注意写法.记得该声明位|需要提?)
<style>
#wrapper
{
width: 100px!important; /* IE7+FF */
width: 80px; /* IE6 */
}
</style>


2, IE6/IE77对FireFox

*+html ?*html 是IEҎ(gu)的标{? firefox 暂不支持.?+html 又ؓ(f) IE7Ҏ(gu)标签.
<style>
#wrapper
{
#wrapper { width: 120px; } /* FireFox */
*html #wrapper { width: 80px;} /* ie6 fixed */
*+html #wrapper { width: 60px;} /* ie7 fixed, 注意序 */
}
</style>


注意:
*+html 对IE7的HACK 必须保证HTML剙有如下声明:(x)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

二、万?float 闭合(非常重要!)

关于 clear float 的原理可参见 [How To Clear Floats Without Structural Markup]
以下代码加入Global CSS ?l需要闭合的div加上 class="clearfix" 卛_,屡试不爽.
<style>
/* Clear Fix */

.clearfix:after
{
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
}
.clearfix
{
display:inline-block;
}
/* Hide from IE Mac */
.clearfix {display:block;}
/* End hide from IE Mac */
/* end of clearfix */
</style>

三、其他兼Ҏ(gu)?再次啰嗦)

1, FF下给 div 讄 padding 后会(x)D width ?height 增加, 但IE不会(x).(可用!important解决)
2, 居中问题.
1).垂直居中.?line-height 讄?当前 div 相同的高? 再通过 vertical-align: middle.( 注意内容不要换行.)
2).水^居中. margin: 0 auto;(当然不是万能)
3, 若需l?a 标签内内容加?样式, 需要设|?display: block;(常见于导航标{?
4, FF ?IE ?BOX 理解的差异导致相?2px 的还有设?float的div在ie?margin加倍等问题.
5, ul 标签?FF 下面默认?list-style ?padding . 最好事先声? 以避免不必要的麻? (常见于导航标{֒内容列表)
6, 作ؓ(f)外部 wrapper ?div 不要定死高度, 最好还加上 overflow: hidden.以达到高度自适应.
7, 关于手Ş光标. cursor: pointer. 而hand 只适用?IE.

1 针对firefox ie6 ie7的css样式
现在大部分都是用!important来hackQ对于ie6和firefox试可以正常昄Q?
但是ie7?important可以正确解释Q会(x)D面没按要求昄Q找C个针
对IE7不错的hack方式是使用“*+html”Q现在用IE7览一下,应该没有问题?jin)?
现在写一个CSS可以q样Q?

#1 { color: #333; } /* Moz */
* html #1 { color: #666; } /* IE6 */
*+html #1 { color: #999; } /* IE7 */
那么在firefox下字体颜色显CZؓ(f)#333QIE6下字体颜色显CZؓ(f)#666QIE7下字体颜色显CZؓ(f)#999?

2 css布局中的居中问题
主要的样式定义如下:(x)

body {TEXT-ALIGN: center;}
#center { MARGIN-RIGHT: auto; MARGIN-LEFT: auto; }
说明Q?
首先在父U元素定义TEXT-ALIGN: center;q个的意思就是在父元素内的内容居中Q对于IEq样讑֮已l可以了(jin)?
但在mozilla中不能居中。解军_法就是在子元素定义时候设定时再加?#8220;MARGIN-RIGHT: auto;MARGIN-LEFT: auto; ”
需要说明的是,如果你想用这个方法整个面要居中,不要套在一个DIV里,你可以依ơ拆出多个divQ?
只要在每个拆出的div里定义MARGIN-RIGHT: auto;MARGIN-LEFT: auto; 可以了(jin)?

3 盒模型不同解?

#box{ width:600px; //for ie6.0- w\idth:500px; //for ff+ie6.0}
#box{ width:600px!important //for ff width:600px; //for ff+ie6.0 width /**/:500px; //for ie6.0-}

4 动ie产生的双倍距?

#box{ float:left; width:100px; margin:0 0 0 100px; //q种情况之下IE?x)?00px的距?display:inline; //使Q动忽略}
q里l说一下block,inline两个元素,Block元素的特Ҏ(gu):L在新行上开?高度,宽度,行高,边距都可以控?块元?;Inline元素的特Ҏ(gu):和其他元素在同一行上,...不可控制(内嵌元素);

#box{ display:block; //可以为内嵌元素模拟ؓ(f)块元?display:inline; //实现同一行排列的的效?diplay:table;

5 IE与宽度和高度的问?

IE不认得min-q个定义Q但实际上它把正常的width和height当作有min的情冉|ѝ这样问题就大了(jin)Q如果只用宽度和高度Q?
正常的浏览器里这两个值就不会(x)变,如果只用min-width和min-height的话QIE下面Ҏ(gu){于没有讄宽度和高度?
比如要设|背景图片,q个宽度是比较重要的。要解决q个问题Q可以这P(x)
#box{ width: 80px; height: 35px;}html>body #box{ width: auto; height: auto; min-width: 80px; min-height: 35px;}

6 面的最宽?

min-width是个非常方便的CSS命o(h)Q它可以指定元素最也不能于某个宽度Q这样就能保证排版一直正。但IE不认得这个,
而它实际上把width当做最宽度来ѝؓ(f)?jin)让q一命o(h)在IE上也能用Q可以把一?lt;div> 攑ֈ <body> 标签下,然后为div指定一个类Q?
然后CSSq样设计Q?
#container{ min-width: 600px; width:expression(document.body.clientWidth < 600? "600px": "auto" );}
W一个min-width是正常的Q但W?行的width使用?jin)JavascriptQ这只有IE才认得,q也?x)让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最宽度?

7 清除动

.hackbox{ display:table; //对象作为块元素U的表格昄}或?hackbox{ clear:both;}
或者加?afterQ伪对象Q?讄在对象后发生的内容,通常和content配合使用QIE不支持此伪对象,非Ie 览器支持,
所以ƈ不媄(jing)响到IE/WIN览器。这U的最ȝ(ch)?.....#box:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden;}

8 DIV动IE文本产生3象素的bug

左边对象动Q右辚w用外补丁的左边距来定位,双对象内的文本?x)离左边?px的间?

#box{ float:left; width:800px;}#left{ float:left; width:50%;}#right{ width:50%;}*html #left{ margin-right:-3px; //q句是关键}
HTML代码<div id="box"> <div id="left"></div> <div id="right"></div></div>

9 属性选择?q个不能是兼容,是隐藏css的一个bug)

p[id]{}div[id]{}
q个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera作用
属性选择器和子选择器还是有区别?子选择器的范围从Ş式来说羃?yu)?jin),属性选择器的范围比较?如p[id]?所有p标签中有id的都是同样式?

10 IE捉迷藏的问题

当div应用复杂的时候每个栏中又有一些链接,DIV{这个时候容易发生捉q的问题?
有些内容昄不出来,当鼠标选择q个区域是发现内容确实在面?
解决办法Q对#layout使用line-height属?或者给#layout使用固定高和宽。页面结构尽量简单?

11 高度不适应

高度不适应是当内层对象的高度发生变化时外层高度不能自动q行调节Q特别是当内层对象?
margin 或paddign 时?
例:(x)
<div id="box">
<p>p对象中的内容</p>
</div>
CSSQ?box {background-color:#eee; }
#box p {margin-top: 20px;margin-bottom: 20px; text-align:center; }
解决Ҏ(gu)Q在P对象上下各加2个空的div对象CSS代码Q?1{height:0px;overflow:hidden;}或者ؓ(f)DIV加上border属性?

E.ven 2009-04-13 09:44 发表评论
]]>
SVN 自动邮g通知 的两U方式以?qing)中文解x?Q{Q?/title><link>http://www.tkk7.com/Even/archive/2009/01/21/252198.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Wed, 21 Jan 2009 04:47:00 GMT</pubDate><guid>http://www.tkk7.com/Even/archive/2009/01/21/252198.html</guid><wfw:comment>http://www.tkk7.com/Even/comments/252198.html</wfw:comment><comments>http://www.tkk7.com/Even/archive/2009/01/21/252198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Even/comments/commentRss/252198.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Even/services/trackbacks/252198.html</trackback:ping><description><![CDATA[互联|上有很多相关的文章Q但是说明的不够明了(jin)Q我参考这些文章来配置的时候,C(jin)不少弯\。现在将q两U方式整理一下?br /> <br /> W一U方?通过svnnotify来发送邮?br /> <br /> /usr/bin/svnnotify --repos-path "$1" --revision "$2" --to real@admin.net --from real@admin99.net --handler "HTML::ColorDiff"  --with-diff --smtp mail.admin99.net --charset zh_CN:GB2312  -g zh_CN --svnlook /usr/local/subversion/bin/svnlook --subject-prefix '[SVN更新]'<br /> <br /> svnnotify有很多参敎ͼ可以通过svnnotify --help 或者man svnnotify 查看<br /> <br /> 好多文章中在介绍q种方式的时候,没有加上svnlook的绝对\径,我实在是很纳P可能是他们的subversiong在安装的时候没有加?--prefix=/yourpath 参数Q把subversion安装在了(jin)默认路径Q我的subversion是安装在/usr/local/subversion之下的,svnnotify在默认的/usr/bin下找不到svnlookQ所以,在邮仉知中无法出现l(f)og信息Qdiff信息{等。加上这个参C后,问题解决?br /> <br /> q有更搞W的是,很多关于q个的文章把 -l 参数当作svn 记录日志文g的参敎ͼ寒~~ -_-!! 可能是把svnnotify和commit-email.pl搞؜?jin),在svnnotify中,q个参数?--language ?br /> <br /> q种方式q有另外一个问题,中文转码的问题,l过Nơ尝试之后,log信息中的中文Qdiff信息中的中文仍然昄的是qQ最后因为时间紧q,不得不先攑ּq种方式?br /> <br /> W二U方?通过commit-email.pl 来发送邮?br /> <br /> /usr/local/subversion/bin/commit-email.pl "$1" "$2" --from real@admin99.net -h admin99.net  -s "[SVN 更新]" --diff y svnhejia@51hejia.com<br /> <br /> 默认情况下,在subversion的bin目录下,没有commit-email.plq个文gQ是我从src中copyq来的?br /> <br /> 关于commit-email.pl所能用的参敎ͼ可以通过直接执行/usr/local/subversion/bin/commit-email.pl 来查看,当然q个时候是执行不了(jin)?jin),提示错误是参数太,然后l你列出来一些参数。参C多?br /> <br /> --diff y 是表C在邮g中加入diff信息Q这个当然是要的<br /> <br /> 后面跟的邮g地址Q是接收邮g的地址Q有可以在后面写上N个地址Q用I格分开pQ事实上我测试的时候,q种方式Ҏ(gu)收不到邮g?jin),旉紧迫Q不能详l测试。最后不得不在邮件服务器上做?jin)一个组邮g地址?br /> <br /> 关于中文问题Q通过在commit-email.pl中更改字W集Q基本上可以很完的解决diff信息中的中文问题?br /> <br /> 但是对于log信息中的中文Q至今尚未找到合适的解决办法?br /> <br /> q个问题的关键应该是在于Qsvn客户端在提交更新的时候,输入的log信息Q用的是非ascii~码(应该是unicode) Qcommit-email.pl(q不~问题是不是出在commit-email.plq是出在svn本n)在处理非ascii~码Ӟ其转换成了(jin)诸如 ?\230?\181?\139?\232?\175?\149?\228?\186?\140 q样的不可读的数字Ş式?br /> 在互联网上找C文章,?6q写的,提到?jin)一U解册个的办法Q不q我试下来没有成功Q还是脓(chung)出来吧,不定谁的可以成功了(jin)<br /> <br /> my @difflines; (?87) 的前面加上:(x)<br /> <br /> for (my $i=0; $i<@body; ++$i){<br />    my @rsa = split( /\?\\/, $body[$i] );<br />    $body[$i] = "";<br />    foreach my $val (@rsa) {<br />        $val =~ /(^[0-9]{3})(.*)/;<br />        if(defined $1 and $1 gt 0){<br />            #print "\n[".$1 . "," . $2."]";<br />            $body[$i] .= chr($1) . $2;<br />        }<br />        else{<br />            $body[$i] .= $val;<br />        }<br />    }<br /> }<br /> <br /> 把之?push ?@body 变量的所有内定w新进行处理,发现 ?\ 后面跟三个数字就替换为相应的字符?!-- Added by RelatedTopic, plugin for Bo-Blog 2.0.0 --> <img src ="http://www.tkk7.com/Even/aggbug/252198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Even/" target="_blank">E.ven</a> 2009-01-21 12:47 <a href="http://www.tkk7.com/Even/archive/2009/01/21/252198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 删除文g多w所有文?/title><link>http://www.tkk7.com/Even/archive/2008/08/25/224234.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Mon, 25 Aug 2008 10:30:00 GMT</pubDate><guid>http://www.tkk7.com/Even/archive/2008/08/25/224234.html</guid><wfw:comment>http://www.tkk7.com/Even/comments/224234.html</wfw:comment><comments>http://www.tkk7.com/Even/archive/2008/08/25/224234.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/Even/comments/commentRss/224234.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Even/services/trackbacks/224234.html</trackback:ping><description><![CDATA[<span style="color: #0000ff">import</span><span style="color: #000000"> java.io.File;<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Test<br /> <img id="Codehighlighter1_40_1461_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_1461_Open_Text.style.display='none'; Codehighlighter1_40_1461_Closed_Image.style.display='inline'; Codehighlighter1_40_1461_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_40_1461_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_40_1461_Closed_Text.style.display='none'; Codehighlighter1_40_1461_Open_Image.style.display='inline'; Codehighlighter1_40_1461_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span id="Codehighlighter1_40_1461_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_40_1461_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_80_178_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_178_Open_Text.style.display='none'; Codehighlighter1_80_178_Closed_Image.style.display='inline'; Codehighlighter1_80_178_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_80_178_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_80_178_Closed_Text.style.display='none'; Codehighlighter1_80_178_Open_Image.style.display='inline'; Codehighlighter1_80_178_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />   </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String args[])</span><span id="Codehighlighter1_80_178_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_80_178_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       Test t </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Test();<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       delFolder(</span><span style="color: #000000">"</span><span style="color: #000000">c:/bb</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">deleted<img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">删除文g?br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">param folderPath 文g夹完整绝对\?/span><span style="color: #008000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000"><br /> <img id="Codehighlighter1_267_567_Open_Image" onclick="this.style.display='none'; Codehighlighter1_267_567_Open_Text.style.display='none'; Codehighlighter1_267_567_Closed_Image.style.display='inline'; Codehighlighter1_267_567_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_267_567_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_267_567_Closed_Text.style.display='none'; Codehighlighter1_267_567_Open_Image.style.display='inline'; Codehighlighter1_267_567_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />     </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> delFolder(String folderPath) </span><span id="Codehighlighter1_267_567_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_267_567_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_278_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_278_507_Open_Text.style.display='none'; Codehighlighter1_278_507_Closed_Image.style.display='inline'; Codehighlighter1_278_507_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_278_507_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_278_507_Closed_Text.style.display='none'; Codehighlighter1_278_507_Open_Image.style.display='inline'; Codehighlighter1_278_507_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />     </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_278_507_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_278_507_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />        delAllFile(folderPath); </span><span style="color: #008000">//</span><span style="color: #008000">删除完里面所有内?/span><span style="color: #008000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        String filePath </span><span style="color: #000000">=</span><span style="color: #000000"> folderPath;<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />        filePath </span><span style="color: #000000">=</span><span style="color: #000000"> filePath.toString();<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />        java.io.File myFilePath </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> java.io.File(filePath);<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />        myFilePath.delete(); </span><span style="color: #008000">//</span><span style="color: #008000">删除I文件夹</span><span style="color: #008000"><br /> <img id="Codehighlighter1_529_565_Open_Image" onclick="this.style.display='none'; Codehighlighter1_529_565_Open_Text.style.display='none'; Codehighlighter1_529_565_Closed_Image.style.display='inline'; Codehighlighter1_529_565_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_529_565_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_529_565_Closed_Text.style.display='none'; Codehighlighter1_529_565_Open_Image.style.display='inline'; Codehighlighter1_529_565_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #000000">     }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) </span><span id="Codehighlighter1_529_565_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_529_565_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       e.printStackTrace(); <br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />     }</span></span><span style="color: #000000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">删除指定文g夹下所有文?br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">param path 文g夹完整绝对\?/span><span style="color: #008000"><br /> <img id="Codehighlighter1_654_1459_Open_Image" onclick="this.style.display='none'; Codehighlighter1_654_1459_Open_Text.style.display='none'; Codehighlighter1_654_1459_Closed_Image.style.display='inline'; Codehighlighter1_654_1459_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_654_1459_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_654_1459_Closed_Text.style.display='none'; Codehighlighter1_654_1459_Open_Image.style.display='inline'; Codehighlighter1_654_1459_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />   </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> delAllFile(String path) </span><span id="Codehighlighter1_654_1459_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_654_1459_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> flag </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       File file </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> File(path);<br /> <img id="Codehighlighter1_747_778_Open_Image" onclick="this.style.display='none'; Codehighlighter1_747_778_Open_Text.style.display='none'; Codehighlighter1_747_778_Closed_Image.style.display='inline'; Codehighlighter1_747_778_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_747_778_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_747_778_Closed_Text.style.display='none'; Codehighlighter1_747_778_Open_Image.style.display='inline'; Codehighlighter1_747_778_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />       </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">file.exists()) </span><span id="Codehighlighter1_747_778_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_747_778_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />         </span><span style="color: #0000ff">return</span><span style="color: #000000"> flag;<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />       }</span></span><span style="color: #000000"><br /> <img id="Codehighlighter1_812_843_Open_Image" onclick="this.style.display='none'; Codehighlighter1_812_843_Open_Text.style.display='none'; Codehighlighter1_812_843_Closed_Image.style.display='inline'; Codehighlighter1_812_843_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_812_843_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_812_843_Closed_Text.style.display='none'; Codehighlighter1_812_843_Open_Image.style.display='inline'; Codehighlighter1_812_843_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />       </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">file.isDirectory()) </span><span id="Codehighlighter1_812_843_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_812_843_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />         </span><span style="color: #0000ff">return</span><span style="color: #000000"> flag;<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />       }</span></span><span style="color: #000000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       String[] tempList </span><span style="color: #000000">=</span><span style="color: #000000"> file.list();<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       File temp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br /> <img id="Codehighlighter1_959_1432_Open_Image" onclick="this.style.display='none'; Codehighlighter1_959_1432_Open_Text.style.display='none'; Codehighlighter1_959_1432_Closed_Image.style.display='inline'; Codehighlighter1_959_1432_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_959_1432_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_959_1432_Closed_Text.style.display='none'; Codehighlighter1_959_1432_Open_Image.style.display='inline'; Codehighlighter1_959_1432_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />       </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000"><</span><span style="color: #000000"> tempList.length; i</span><span style="color: #000000">++</span><span style="color: #000000">) </span><span id="Codehighlighter1_959_1432_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_959_1432_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_1006_1068_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1006_1068_Open_Text.style.display='none'; Codehighlighter1_1006_1068_Closed_Image.style.display='inline'; Codehighlighter1_1006_1068_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_1006_1068_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1006_1068_Closed_Text.style.display='none'; Codehighlighter1_1006_1068_Open_Image.style.display='inline'; Codehighlighter1_1006_1068_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />          </span><span style="color: #0000ff">if</span><span style="color: #000000"> (path.endsWith(File.separator)) </span><span id="Codehighlighter1_1006_1068_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1006_1068_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />             temp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> File(path </span><span style="color: #000000">+</span><span style="color: #000000"> tempList[i]);<br /> <img id="Codehighlighter1_1075_1155_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1075_1155_Open_Text.style.display='none'; Codehighlighter1_1075_1155_Closed_Image.style.display='inline'; Codehighlighter1_1075_1155_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_1075_1155_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1075_1155_Closed_Text.style.display='none'; Codehighlighter1_1075_1155_Open_Image.style.display='inline'; Codehighlighter1_1075_1155_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />          }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span id="Codehighlighter1_1075_1155_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1075_1155_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />              temp </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> File(path </span><span style="color: #000000">+</span><span style="color: #000000"> File.separator </span><span style="color: #000000">+</span><span style="color: #000000"> tempList[i]);<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />          }</span></span><span style="color: #000000"><br /> <img id="Codehighlighter1_1186_1226_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1186_1226_Open_Text.style.display='none'; Codehighlighter1_1186_1226_Closed_Image.style.display='inline'; Codehighlighter1_1186_1226_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_1186_1226_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1186_1226_Closed_Text.style.display='none'; Codehighlighter1_1186_1226_Open_Image.style.display='inline'; Codehighlighter1_1186_1226_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />          </span><span style="color: #0000ff">if</span><span style="color: #000000"> (temp.isFile()) </span><span id="Codehighlighter1_1186_1226_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1186_1226_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />             temp.delete();<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />          }</span></span><span style="color: #000000"><br /> <img id="Codehighlighter1_1262_1423_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1262_1423_Open_Text.style.display='none'; Codehighlighter1_1262_1423_Closed_Image.style.display='inline'; Codehighlighter1_1262_1423_Closed_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_1262_1423_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1262_1423_Closed_Text.style.display='none'; Codehighlighter1_1262_1423_Open_Image.style.display='inline'; Codehighlighter1_1262_1423_Open_Text.style.display='inline';" src="http://www.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />          </span><span style="color: #0000ff">if</span><span style="color: #000000"> (temp.isDirectory()) </span><span id="Codehighlighter1_1262_1423_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1262_1423_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />             delAllFile(path </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> tempList[i]);</span><span style="color: #008000">//</span><span style="color: #008000">先删除文件夹里面的文?/span><span style="color: #008000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">             delFolder(path </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> tempList[i]);</span><span style="color: #008000">//</span><span style="color: #008000">再删除空文g?/span><span style="color: #008000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">             flag </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />          }</span></span><span style="color: #000000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />       }</span></span><span style="color: #000000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />       </span><span style="color: #0000ff">return</span><span style="color: #000000"> flag;<br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />     }</span></span><span style="color: #000000"><br /> <img src="http://www.tkk7.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span> <img src ="http://www.tkk7.com/Even/aggbug/224234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Even/" target="_blank">E.ven</a> 2008-08-25 18:30 <a href="http://www.tkk7.com/Even/archive/2008/08/25/224234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate ~存http://www.tkk7.com/Even/archive/2008/03/22/187851.htmlE.venE.venSat, 22 Mar 2008 01:50:00 GMThttp://www.tkk7.com/Even/archive/2008/03/22/187851.htmlhttp://www.tkk7.com/Even/comments/187851.htmlhttp://www.tkk7.com/Even/archive/2008/03/22/187851.html#Feedback0http://www.tkk7.com/Even/comments/commentRss/187851.htmlhttp://www.tkk7.com/Even/services/trackbacks/187851.htmlhibernate~存

Q一Qhibernate数据~存{略
  ~存是数据库数据在内存中的(f)时容器,它包含了(jin)库表数据在内存中的拷贝,位于数据库与数据讉K层之间。对于查询操作相当频J的pȝQ论坛,新闻发布{)(j)Q良好的~存机制昑־ؓ(f)重要?br />   ORM在进行数据读取时Q首先在~存中查询,避免?jin)数据库调用的性能开销?br /> ORM的数据缓存应包含下面几个层次Q?br /> 1Q事务~存   2Q应用~存   3Q分布式~存
具体针对Hibernate而言Q采用两U缓存策略,其过E描qͼ(x)
(1)条g查询的时候,L发出一条select * from table_name where …. q样的SQL语句查询数据库,一ơ获得所有的数据对象?br /> (2) 把获得的所有数据对象根据ID攑օ到第二~存中?br /> (3) 当HibernateҎ(gu)ID讉K数据对象的时候,首先从Session一U缓存中查;查不刎ͼ如果配置?jin)二U缓存,那么从二U缓存中查;查不刎ͼ再查询数据库Q把l果按照ID攑օ到缓存?br /> (4) 删除、更新、增加数据的时候,同时更新~存?br /> 1. 一U缓?session level)Q数据库事务U缓?br />   1Q根据主键id加蝲数据时?Session.load()Q?Session.iterate()Ҏ(gu)
    2Qgq加载时
    Session内部l护一个数据对象集合,包括?jin)本Session内选取的、操作的数据对象。这UCؓ(f)Session内部~存Q是Hibernate的第一U最快缓存,属于Hibernate的既定行为,不需要进行配|?也没有办法配|?:-)?br />     内部~存正常情况下由hibernate自动l护Q但也可人工q预Q?br />             1) Session.evict (): 某个特定对象从内部~存中清?br />             2)Session.clear(): 清空内部~存
2.二~存(SessionFactory level)Q应用~存
    二~存由SessionFactory的所有session实例׃n?br /> 3. W三方缓存实?br />     EHCache, OSCahe
hibernate扚w查询引v的内存溢出问?br />     扚w查询基本不适合使用现有的持久层技术来做,如CMP或hibernateQIBatis倒是可以.
    因ؓ(f)每次调用Session.save()Ҏ(gu)Ӟ当前session都会(x)对象纳入到自n的内部缓存中。内部缓存不同于二~存Q我们可以在二~存的配|中指定其最大容量?br /> 解决Ҏ(gu)Q?br /> 1Q在批处理情况下Q关闭Hibernate~存Q如果关闭Hibernate~存Q那么和直接使用JDBC没有区别?
2Q?每隔一D|间清ISession内部~存
  Session实现?jin)异步write-behindQ它允许Hibernate昑ּ地写操作的批处理?q里Q我l出Hibernate如何实现扚w插入的方法:(x) 首先Q我们设|一个合理的JDBC批处理大,hibernate.jdbc.batch_size 20?然后在一定间隔对Sessionq行flush()和clear()?br /> Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) {
//flush 插入数据和释攑ֆ?
session.flush(); session.clear(); }
}
tx.commit();
session.close();
  Z(jin)优化性能Q可执行扚w操作。在传统的JDBC~程中,扚w操作方式如下Q将CSQL操作扚w提交Q?br /> PrepareStatement ps=conn.prepareStatement("insert into users(name) values(?)");  
for(int i=0;i<100000;i++){
  ps.setString(1, "user"+i);
  ps.addBatch();
}
int[] counts=ps.executeBatch
在Hibernate中,可以讄hibernate.jdbc.batch_size 参数来指定每ơ提交的sql数量?br /> hibernate2和hibernate3数据扚w删除机制分析
1.hibernate2
    Transaction tx=session.beginTransaction();
    session.delete("from users");
    tx.commit();
  观察日志输出Q?br /> select ... from users
Hibernate:delete from users where id=?
Hibernate:delete from users where id=?
Hibernate:delete from users where id=?
...
    hibernate2版本?x)首先从数据库中查询出所有符合条件的记录Q再Ҏ(gu)记录循环删除。如果记录量q大Q势必引起内存溢出和删除效率问题。ORMZ么要q么做呢Q因为ORMZ(jin)自动l护内存状态,必须知道用户到底对哪些数据进行了(jin)操作。问题的解决Ҏ(gu)Q?br /> 1Q内存消?br />     扚w删除前首先从数据库中查询出所有符合条件的记录Q如果数据量q大Q就?x)导?OutOfMemoryError.
    可以采用Session .iterate或Query.iterateҎ(gu)逐条获取记录Q再执行delete操作。另外,hibernate2.16后的版本提供?jin)基于游标的数据遍历操作Q?br /> Transaction tx=session.beginTransaction();
String hql="from users";
Query query=session.createQrery(hql);
ScrollableResults sr=query.scroll();
while(sr.next()){
TUser user=(TUser)sr.get(0);
session.delete();
}
tx.commit();
2Q@环删除的效率问题
  ׃hibernate在批量删除操作过E中Q需要反复调用delete SQLQ存在性能问题。我们仍然可以通过调整hibernate.jdbc.batch_size参数来解冟?br /> 2.hibernate3
  hibernate3 HQL中引入了(jin) bulk delete/update操作Q?即通过一条独立的sql语句来完成数据的扚w操作?br /> Transaction tx=session.beginTransaction();
String hql="delete TUser";
Query query=session.createQrery(hql);
int count=query.executeUpdate();
tx.commit();
观察日志输出Q?br /> Hibernate:delete from TUser

Q二Qibatis数据~存
  相对Hibernate {封装较Z密的ORM 实现而言Q因为对数据对象的操作实?br /> ?jin)较Z密的装Q可以保证其作用范围内的~存同步Q而ibatis 提供的是半封?br /> 的封装实玎ͼ因此对缓存的操作难以做到完全的自动化同步Q?br />   ibatis 的缓存机制用必ȝ别}慎。特别是flushOnExecute 的设定(?br /> “ibatis配置”一节中的相兛_容)(j)Q需要考虑到所有可能引起实际数据与~存数据
不符的操作。如本模块中其他StatementҎ(gu)据的更新Q其他模块对数据的更斎ͼ?br /> 至第三方pȝҎ(gu)据的更新。否则,脏数据的出现ؓ(f)pȝ的正常运行造成极大隐?zhn)?br /> 如果不能完全定数据更新操作的L?qing)范_(d)避免Cache的盲目用?br /> 1.iBatis cache讄
sqlmap-config.xml?lt;sqlMapConfig>里面加入
<settings
  cacheModelsEnabled="true"
  enhancementEnabled="true"
  lazyLoadingEnabled="true" />
maps.xml?lt;sqlMap>里面加入
<cacheModel   id="userCache"   type="LRU"   readonly="true"   serialize="false">
    <flushInterval hours="24"/>
    <flushOnExecute statement="insertTest"/>
    <property name="size" value="1000" />
</cacheModel>
可以看到QCache有如下几个比较重要的属性:(x)readOnlyQserializeQtype

readOnly
  readOnly值的是缓存中的数据对象是否只诅R这里的只读q不是意味着数据对象一
旦放入缓存中无法再Ҏ(gu)据进行修攏V而是当数据对象发生变化的时候,如数据对
象的某个属性发生了(jin)变化Q则此数据对象就被从缓存中废除Q下ơ需要重C数据
库读取数据,构造新的数据对象?br /> serialize
  如果需要全局的数据缓存,CacheModel的serialize属性必被设ؓ(f)true。否则数据缓存只对当前SessionQ可单理解ؓ(f)当前U程Q有效,局部缓存对pȝ的整体性能提升有限?br /> Cache Type:
  与hibernatecMQibatis通过~冲接口的插件式实现Q提供了(jin)多种Cache的实现机制可供选择Q?br /> 1Q?MEMORY
2Q?LRU
3Q?FIFO
4Q?OSCACHE
MEMORYcdCache与WeakReference
    MEMORY cd的Cache 实现Q实际上是通过Java 对象引用q行。ibatis 中,其实现类
为com.ibatis.db.sqlmap.cache.memory.MemoryCacheControllerQMemoryCacheController 内部Q?br /> 使用一个HashMap来保存当前需要缓存的数据对象的引用?br /> LRU型Cache
    当Cache辑ֈ预先讑֮的最大容量时Qibatis?x)按?#8220;最?#8221;原则用频率最?br /> 的对象从~冲中清除。可配置的参数有Q?br /> flushIntervalQ指定了(jin)多长旉清除~存Q上例中指定?4时清空~存区的所有内宏V?br /> size
FIFO型Cache
先进先出型缓存,最先放入Cache中的数据被最先废除?br /> OSCache
Q三Q开源数据缓存策略OSCache
可以解决的问题:(x)
1Q信息系l中需要处理的基础数据的内容短旉内是不会(x)发生变化的,但是在一个相寚w一些的旉里,它却可能是动态增加或者减的?br /> 2Q统计报表是一个周期性的工作Q可能是半个月、一个月或者更长的旉才会(x)需要更Cơ,然而统计报表通常是图形显C或者是生成pdf、word、excel{格式的文gQ这些图形内宏V文件的生成通常需要消耗很多的pȝ资源Q给pȝq行造成很大的负担?br />     OSCache是OpenSymphonyl织提供的一个J2EE架构中Web应用层的~存技术实现组件。OSCache支持寚w分页面内Ҏ(gu)者对面U的响应内容q行~存Q编E者可以根据不同的需求、不同的环境选择不同的缓存别。可以用内存、硬盘空间、同时用内存和盘或者提供自q其他资源Q需要自己提供适配器)(j)作ؓ(f)~存区?br /> 使用步骤Q?br /> 1. 下蝲、解压羃OSCache
请到OSCache的主?a target="_blank">http://www.opensymphony.com/oscache/download.html下蝲Oscache的最新版本,作者下载的是OSCache的最新稳定版?.0?br /> 下载后的。Zip文g解压~到c:\oscacheQ后面的章节中将使用%OSCache_Home%来表C个目录)(j)目录?br /> 2. 新徏立一个web应用
3. 主要组?OSCache_Home%\oscache.jar攑օWEB-INF\lib目录
4. commons-logging.jar、commons-collections.jar的处?br /> •      OSCachelg用Jakarta Commons Logging来处理日志信息,所以需要commons-logging.jar的支持,请将%OSCache_Home%\lib\core\commons-logging.jar攑օclasspathQ通常意味着这个文件放入WEB-INF\lib目录Q?
•      如果使用JDK1.3,请将%OSCache_Home%\lib\core\commons-collections.jar攑օclasspathQ如果用JDK1.4或者以上版本,则不需要了(jin)
5. oscache.properties、oscache.tld攑օWEB-INF\class目录
•      %OSCache_Home%\oscache.properties包含?jin)对OSCacheq行特征值的讄信息
•      %OSCache_Home%\oscache.tld包含?jin)OSCache提供的标{ֺ的定义内?
6. 修改web.xml文g
在web.xml文g中增加下面的内容Q增加对OSCache提供的taglib的支持:(x)
<taglib><taglib-uri>oscache</taglib-uri><taglib-location>/WEB-INF/classes/oscache.tld</taglib-location></taglib>
7.最单的cache标签用法
使用默认的关键字来标识cache内容Q超时时间是默认?600U?br /> <cache:cache><%//自己的JSP代码内容%></cache:cache>
8. ~存单个文g
      在OSCachelg中提供了(jin)一个CacheFilter用于实现面U的~存Q主要用于对web应用中的某些动态页面进行缓存,其是那些需要生成pdf格式文g/报表、图片文件等的页面,不仅减少?jin)数据库的交互、减数据库服务器的压力Q而且对于减少web服务器的性能消耗有很显著的效果?br /> 修改web.xmlQ增加如下内容,定?testContent.jsp面q行~存?br /> <filter>     <filter-name>CacheFilter</filter-name><filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class></filter><filter-mapping><filter-name>CacheFilter</filter-name><!-?testContent.jsp面内容q行~存-->     <url-pattern>/testContent.jsp</url-pattern></filter-mapping>

另一:(x)
很多人对二~存都不太了(jin)解,或者是有错误的认识Q我一直想写一文章介l一下hibernate的二U缓存的Q今天终于忍不住?jin)?
我的l验主要来自hibernate2.1版本Q基本原理和3.0?.1是一L(fng)Q请原谅我的固不化?br /> hibernate的session提供?jin)一U缓存,每个sessionQ对同一个idq行两次loadQ不?x)发送两条sqll数据库Q但是session关闭的时候,一U缓存就失效?jin)?br /> 二~存是SessionFactoryU别的全局~存Q它底下可以使用不同的缓存类库,比如ehcache、oscache{,需要设|hibernate.cache.provider_classQ我们这里用ehcacheQ在2.1中就?
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
如果使用查询~存Q加?
hibernate.cache.use_query_cache=true
~存可以单的看成一个MapQ通过key在缓存里面找value?br /> Class的缓?
对于一条记录,也就是一个PO来说Q是Ҏ(gu)ID来找的,~存的key是IDQvalue是POJO。无论listQloadq是iterateQ只要读Z个对象,都会(x)填充~存。但是list不会(x)使用~存Q而iterate?x)先取数据库select id出来Q然后一个id一个id的loadQ如果在~存里面有,׃~存取,没有的话去数据库load。假设是d~存Q需要设|:(x)
<cache usage="read-write"/>
如果你用的二~存实现是ehcache的话Q需要配|ehcache.xml
<cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" />
其中eternal表示~存是不是永q不时QtimeToLiveSeconds是缓存中每个元素Q这里也是一个POJOQ的时旉Q如果eternal="false"Q超q指定的旉Q这个元素就被移C(jin)。timeToIdleSeconds是发呆时_(d)是可选的。当往~存里面put的元素超q?00个时Q如果overflowToDisk="true"Q就?x)把~存中的部分数据保存在硬盘上的(f)时文仉面?
每个需要缓存的class都要q样配置。如果你没有配置Qhibernate?x)在启动的时候警告你Q然后用defaultCache的配|,q样多个class?x)共享一个配|?
当某个ID通过hibernate修改Ӟhibernate?x)知道,于是U除~存?
q样大家可能?x)想Q同L(fng)查询条gQ第一ơ先listQ第二次再iterateQ就可以使用到缓存了(jin)。实际上q是很难的,因ؓ(f)你无法判断什么时候是W一ơ,而且每次查询的条仉常是不一L(fng)Q假如数据库里面?00条记录,id??00Q第一ơlist的时候出?jin)?0个idQ第二次iterate的时候却查询?0?0号idQ那?0-50是从~存里面取的Q?1?0是从数据库取的,共发?+20条sql。所以我一直认为iterate没有什么用QL?x)?+N的问题?
Q题外话Q有说法说大型查询用list?x)把整个l果集装入内存,很慢Q而iterate只select id比较好,但是大型查询L要分|的,谁也不会(x)真的把整个结果集装进来,假如一?0条的话,iterate共需要执?1条语句,list虽然选择若干字段Q比iterateW一条select id语句慢一些,但只有一条语句,不装入整个结果集hibernateq会(x)Ҏ(gu)数据库方a做优化,比如使用mysql的limitQ整体看来应该还是list快。)(j)
如果惌对list或者iterate查询的结果缓存,p用到查询~存?br /> 查询~存
首先需要配|hibernate.cache.use_query_cache=true
如果用ehcacheQ配|ehcache.xmlQ注意hibernate3.0以后不是net.sf的包名了(jin)
<cache name="net.sf.hibernate.cache.StandardQueryCache"
maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="7200" overflowToDisk="true"/>
<cache name="net.sf.hibernate.cache.UpdateTimestampsCache"
maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/>
然后
query.setCacheable(true);//ȀzL询缓?
query.setCacheRegion("myCacheRegion");//指定要用的cacheRegionQ可?
W二行指定要使用的cacheRegion是myCacheRegionQ即你可以给每个查询~存做一个单独的配置Q用setCacheRegion来做q个指定Q需要在ehcache.xml里面配置它:(x)
<cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" />
如果省略W二行,不设|cacheRegion的话Q那么会(x)使用上面提到的标准查询缓存的配置Q也是net.sf.hibernate.cache.StandardQueryCache
对于查询~存来说Q缓存的key是根据hql生成的sqlQ再加上参数Q分늭信息Q可以通过日志输出看到Q不q它的输Z是很可读Q最好改一下它的代码)(j)?
比如hqlQ?
from Cat c where c.name like ?
生成大致如下的sqlQ?
select * from cat c where c.name like ?
参数?tiger%"Q那么查询缓存的key*大约*是这L(fng)字符Ԍ我是凭记忆写的,q不_Q不q看?jin)也该明白?jin)Q:(x)
select * from cat c where c.name like ? , parameter:tiger%
q样Q保证了(jin)同样的查询、同L(fng)参数{条件下h一L(fng)key?
现在说说~存的valueQ如果是list方式的话Qvalue在这里ƈ不是整个l果集,而是查询出来的这一串ID。也是_(d)不管是listҎ(gu)q是iterateҎ(gu)Q第一ơ查询的时候,它们的查询方式很它们qx的方式是一L(fng)Qlist执行一条sqlQiterate执行1+N条,多出来的行ؓ(f)是它们填充了(jin)~存。但是到同样条gW二ơ查询的时候,都和iterate的行Z样了(jin)Q根据缓存的keyȝ存里面查C(jin)valueQvalue是一串idQ然后在到class的缓存里面去一个一个的load出来。这样做是ؓ(f)?jin)节U内存?
可以看出来,查询~存需要打开相关cȝclass~存。list和iterateҎ(gu)W一ơ执行的时候,都是既填充查询缓存又填充class~存的?
q里q有一个很Ҏ(gu)被忽视的重要问题Q即打开查询~存以后Q即使是listҎ(gu)也可能遇?+N的问题!相同条gW一ơlist的时候,因ؓ(f)查询~存中找不到Q不class~存是否存在数据QL发送一条sql语句到数据库获取全部数据Q然后填充查询缓存和class~存。但是第二次执行的时候,问题来?jin),如果你的class~存的超时时间比较短Q现在class~存都超时了(jin)Q但是查询缓存还在,那么listҎ(gu)在获取id串以后,会(x)一个一个去数据库loadQ因此,class~存的超时时间一定不能短于查询缓存设|的时旉Q如果还讄?jin)发呆时间的话,保证class~存的发呆时间也大于查询的缓存的生存旉。这里还有其他情况,比如class~存被程序强制evict?jin),q种情况p自己注意?jin)?br /> 另外Q如果hql查询包含select字句Q那么查询缓存里面的value是整个l果集了(jin)?br /> 当hibernate更新数据库的时候,它怎么知道更新哪些查询~存呢?
hibernate在一个地方维护每个表的最后更新时_(d)其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配|里面?
当通过hibernate更新的时候,hibernate?x)知道这ơ更新?jing)响了(jin)哪些表。然后它更新q些表的最后更新时间。每个缓存都有一个生成时间和q个~存所查询的表Q当hibernate查询一个缓存是否存在的时候,如果~存存在Q它q要取出~存的生成时间和q个~存所查询的表Q然后去查找q些表的最后更新时_(d)如果有一个表在生成时间后更新q了(jin)Q那么这个缓存是无效的?
可以看出Q只要更新过一个表Q那么凡是涉?qing)到q个表的查询~存失效了(jin)Q因此查询缓存的命中率可能会(x)比较低?br /> Collection~存
需要在hbm的collection里面讄
<cache usage="read-write"/>
假如class是CatQcollection叫childrenQ那么ehcache里面配置
<cache name="com.xxx.pojo.Cat.children"
maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
overflowToDisk="true" />
Collection的缓存和前面查询~存的list一P也是只保持一串idQ但它不?x)因个表更新q就失效Q一个collection~存仅在q个collection里面的元素有增删时才失效?
q样有一个问题,如果你的collection是根据某个字D|序的Q当其中一个元素更C(jin)该字D|Q导致顺序改变时Qcollection~存里面的顺序没有做更新?br /> ~存{略
只读~存Qread-onlyQ:(x)没有什么好说的
?写缓存(read-writeQ?E序可能要的更新数据
不严格的?写缓存(nonstrict-read-writeQ:(x)需要更新数据,但是两个事务更新同一条记录的可能性很,性能比读写缓存好
事务~存QtransactionalQ:(x)~存支持事务Q发生异常的时候,~存也能够回滚,只支持jta环境Q这个我没有怎么研究q?br /> d~存和不严格d~存在实C的区别在于,d~存更新~存的时候会(x)把缓存里面的数据换成一个锁Q其他事务如果去取相应的~存数据Q发现被锁住?jin),然后q接取数据库查询?
在hibernate2.1的ehcache实现中,如果锁住部分~存的事务发生了(jin)异常Q那么缓存会(x)一直被锁住Q直?0U后时?
不严D写缓存不锁定~存中的数据?br /> 使用二~存的前|条?
你的hibernateE序Ҏ(gu)据库有独占的写访问权Q其他的q程更新?jin)数据库Qhibernate是不可能知道的。你操作数据库必需直接通过hibernateQ如果你调用存储q程Q或者自׃用jdbc更新数据库,hibernate也是不知道的。hibernate3.0的大扚w更新和删除是不更CU缓存的Q但是据?.1已经解决?jin)这个问题?
q个限制相当的棘手,有时候hibernate做批量更新、删除很慢,但是你却不能自己写jdbc来优化,很郁闷吧?
SessionFactory也提供了(jin)U除~存的方法,你一定要自己写一些JDBC的话Q可以调用这些方法移除缓存,q些Ҏ(gu)是:(x)
void evict(Class persistentClass)
Evict all entries from the second-level cache.
void evict(Class persistentClass, Serializable id)
Evict an entry from the second-level cache.
void evictCollection(String roleName)
Evict all entries from the second-level cache.
void evictCollection(String roleName, Serializable id)
Evict an entry from the second-level cache.
void evictQueries()
Evict any query result sets cached in the default query cache region.
void evictQueries(String cacheRegion)
Evict any query result sets cached in the named query cache region.
不过我不q样做,因ؓ(f)q样很难l护。比如你现在用JDBC扚w更新?jin)某个表Q有3个查询缓存会(x)用到q个表,用evictQueries(String cacheRegion)U除?个查询缓存,然后用evict(Class persistentClass)U除?jin)class~存Q看上去好像完整?jin)。不q哪天你d?jin)一个相x询缓存,可能?x)忘记更新这里的U除代码。如果你的jdbc代码到处都是Q在你添加一个查询缓存的时候,q知道其他什么地方也要做相应的改动吗Q?br /> ----------------------------------------------------
ȝQ?
不要惛_然的以ؓ(f)~存一定能提高性能Q仅仅在你能够驾驭它q且条g合适的情况下才是这L(fng)。hibernate的二U缓存限制还是比较多的,不方便用jdbc可能?x)大大的降低更新性能。在不了(jin)解原理的情况下ؕ用,可能?x)?+N的问题。不当的使用q可能导致读数据?
如果受不?jin)hibernate的诸多限Ӟ那么q是自己在应用程序的层面上做~存吧?
在越高的层面上做~存Q效果就?x)越好。就好像管盘有缓存,数据库还是要实现自己的缓存,管数据库有~存Q咱们的应用E序q是要做~存。因为底层的~存它ƈ不知道高层要用这些数据干什么,只能做的比较通用Q而高层可以有针对性的实现~存Q所以在更高的别上做缓存,效果也要好些吧?br /> 转自Qhttp://blog.ccidnet.com/blog-htm-do-showone-uid-44291-type-blog-itemid-125551.html



E.ven 2008-03-22 09:50 发表评论
]]>
jspsmartupload文g上下传攻略{CSDNhttp://www.tkk7.com/Even/archive/2007/06/12/123527.htmlE.venE.venTue, 12 Jun 2007 01:45:00 GMThttp://www.tkk7.com/Even/archive/2007/06/12/123527.htmlhttp://www.tkk7.com/Even/comments/123527.htmlhttp://www.tkk7.com/Even/archive/2007/06/12/123527.html#Feedback0http://www.tkk7.com/Even/comments/commentRss/123527.htmlhttp://www.tkk7.com/Even/services/trackbacks/123527.html一、安装篇

  jspSmartUpload是由www.jspsmart.com|站开发的一个可免费使用的全功能的文件上传下载组Ӟ适于嵌入执行上传下蝲操作的JSP文g中。该lg有以下几个特点:(x)

1、用简单。在JSP文g中仅仅书写三五行JAVA代码可以搞定文件的上传或下载,方便?

2、能全程控制上传。利用jspSmartUploadlg提供的对象及(qing)其操作方法,可以获得全部上传文g的信息(包括文g名,大小Q类型,扩展名,文g数据{)(j)Q方便存取?

3、能对上传的文g在大、类型等斚w做出限制。如此可以o(h)掉不W合要求的文件?

4、下载灵zR仅写两行代码,p把Web服务器变成文件服务器。不文件在Web服务器的目录下或在其它Q何目录下Q都可以利用jspSmartUploadq行下蝲?

5、能文件上传到数据库中Q也能将数据库中的数据下载下来?/strong>q种功能针对的是MYSQL数据库,因ؓ(f)不具有通用性,所以本文不准备举例介绍q种用法?

  jspSmartUploadlg可以从www.jspsmart.com|站上自׃载,压羃包的名字是jspSmartUpload.zip。下载后Q用WinZip或WinRAR其解压到Tomcat的webapps目录下(本文以Tomcat服务器ؓ(f)例进行介l)(j)。解压后Q将webapps/jspsmartupload目录下的子目录Web-inf名字改ؓ(f)全大写的WEB-INFQ这样一改jspSmartUploadcL能用。因为TomcatҎ(gu)件名大小写敏感,它要求Web应用E序相关的类所在目录ؓ(f)WEB-INFQ且必须是大写。接着重新启动TomcatQ这样就可以在JSP文g中用jspSmartUploadlg?jin)?

  注意Q按上述Ҏ(gu)安装后,只有webapps/jspsmartupload目录下的E序可以使用jspSmartUploadlgQ如果想让Tomcat服务器的所有Web应用E序都能用它Q必d如下工作Q?

1Q进入命令行状态,目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下?

2Q运行JAR打包命o(h)Qjar cvf jspSmartUpload.jar com

Q也可以打开资源理器,切换到当前目录,用WinZipcom目录下的所有文件压~成jspSmartUpload.zipQ然后将jspSmartUpload.zip换名为jspSmartUpload.jar文g卛_。)(j)

3Q将jspSmartUpload.jar拯到Tomcat的shared/lib目录下?

二、相关类说明?/strong>

?Filec?/strong>

  q个cd装了(jin)一个上传文件的所有信息。通过它,可以得到上传文g的文件名、文件大、扩展名、文件数据等信息?

  FilecM要提供以下方法:(x)

1、saveAs作用Q将文g换名另存?

原型Q?

public void saveAs(java.lang.String destFilePathName)

?

public void saveAs(java.lang.String destFilePathName, int optionSaveAs)

其中QdestFilePathName是另存的文g名,optionSaveAs是另存的选项Q该选项有三个|分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUALQSAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系l的根目录ؓ(f)文g根目录另存文ӞSAVEAS_VIRTUAL表明以Web应用E序的根目录为文件根目录另存文gQSAVEAS_AUTO则表Clg军_Q当Web应用E序的根目录存在另存文g的目录时Q它?x)选择SAVEAS_VIRTUALQ否则会(x)选择SAVEAS_PHYSICAL?

例如QsaveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文g名实际是c:uploadsample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用E序的根目录是webapps/jspsmartuploadQ则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用E序根目录下存在upload目录Q则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)Q否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)?

Q对于WebE序的开发来_(d)最好用SAVEAS_VIRTUALQ以便移植?

2、isMissing

作用Q这个方法用于判断用h否选择?jin)文Ӟ也即对应的表单项是否有倹{选择?jin)文件时Q它q回false。未选文件时Q它q回true?

原型Qpublic boolean isMissing()

3、getFieldName

作用Q取HTML表单中对应于此上传文件的表单的名字?

原型Qpublic String getFieldName()

4、getFileName

作用Q取文g名(不含目录信息Q?

原型Qpublic String getFileName()

5、getFilePathName

作用Q取文g全名Q带目录Q?

原型Qpublic String getFilePathName

6、getFileExt

作用Q取文g扩展名(后缀Q?

原型Qpublic String getFileExt()

7、getSize

作用Q取文g长度Q以字节计)(j)

原型Qpublic int getSize()

8、getBinaryData

作用Q取文g数据中指定位Ud的一个字节,用于(g)文件等处理?

原型Qpublic byte getBinaryData(int index)。其中,index表示位移Q其值在0到getSize()-1之间?

?Filesc?/strong>

  q个c表C所有上传文件的集合Q通过它可以得C传文件的数目、大等信息。有以下Ҏ(gu)Q?

1、getCount

作用Q取得上传文件的数目?

原型Qpublic int getCount()

2、getFile

作用Q取得指定位Ud的文件对象FileQ这是com.jspsmart.upload.FileQ不是java.io.FileQ注意区分)(j)?

原型Qpublic File getFile(int index)。其中,index为指定位U,其值在0到getCount()-1之间?

3、getSize

作用Q取得上传文件的总长度,可用于限制一ơ性上传的数据量大?

原型Qpublic long getSize()

4、getCollection

作用Q将所有上传文件对象以Collection的Ş式返回,以便其它应用E序引用Q浏览上传文件信息?

原型Qpublic Collection getCollection()

5、getEnumeration

作用Q将所有上传文件对象以EnumerationQ枚举)(j)的Ş式返回,以便其它应用E序览上传文g信息?

原型Qpublic Enumeration getEnumeration()

?Requestc?/strong>

  q个cȝ功能{同于JSP内置的对象request。只所以提供这个类Q是因ؓ(f)对于文g上传表单Q通过request对象无法获得表单的|必须通过jspSmartUploadlg提供的Request对象来获取。该cL供如下方法:(x)

1、getParameter

作用Q获取指定参C倹{当参数不存在时Q返回gؓ(f)null?

原型Qpublic String getParameter(String name)。其中,name为参数的名字?

2、getParameterValues

作用Q当一个参数可以有多个值时Q用此方法来取其倹{它q回的是一个字W串数组。当参数不存在时Q返回gؓ(f)null?

原型Qpublic String[] getParameterValues(String name)。其中,name为参数的名字?

3、getParameterNames

作用Q取得Request对象中所有参数的名字Q用于遍历所有参数。它q回的是一个枚丑֞的对象?

原型Qpublic Enumeration getParameterNames()

?SmartUploadc?/strong>q个cd成上传下载工作?

AQ上传与下蝲q的方法:(x)

只有一个:(x)initialize?

作用Q执行上传下载的初始化工作,必须W一个执行?

原型Q有多个Q主要用下面这个:(x)

public final void initialize(javax.servlet.jsp.PageContext pageContext)

其中QpageContext为JSP面内置对象Q页面上下文Q?

BQ上传文件用的Ҏ(gu)Q?/strong>

1、upload

作用Q上传文件数据。对于上传操作,W一步执行initializeҎ(gu)Q第二步p执行q个Ҏ(gu)?

原型Qpublic void upload()

2、save

作用Q将全部上传文g保存到指定目录下Qƈq回保存的文件个数?

原型Qpublic int save(String destPathName)

和public int save(String destPathName,int option)

其中QdestPathName为文件保存目录,optionZ存选项Q它有三个|分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。(同FilecȝsaveAsҎ(gu)的选项之值类|(j)SAVE_PHYSICAL指示lg文件保存到以操作系l根目录为文件根目录的目录下QSAVE_VIRTUAL指示lg文件保存到以Web应用E序根目录ؓ(f)文g根目录的目录下,而SAVE_AUTO则表C由lg自动选择?

注:(x)save(destPathName)作用{同于save(destPathName,SAVE_AUTO)?

3、getSize

作用Q取上传文g数据的总长?

原型Qpublic int getSize()

4、getFiles

作用Q取全部上传文gQ以Files对象形式q回Q可以利用Filescȝ操作Ҏ(gu)来获得上传文件的数目{信息?

原型Qpublic Files getFiles()

5、getRequest

作用Q取得Request对象Q以便由此对象获得上传表单参C倹{?

原型Qpublic Request getRequest()

6、setAllowedFilesList

作用Q设定允怸传带有指定扩展名的文Ӟ当上传过E中有文件名不允许时Q组件将抛出异常?

原型Qpublic void setAllowedFilesList(String allowedFilesList)

其中QallowedFilesList为允怸传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文gQ可以用两个逗号表示。例如:(x)setAllowedFilesList("doc,txt,,")允怸传带doc和txt扩展名的文g以及(qing)没有扩展名的文g?

7、setDeniedFilesList

作用Q用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限Ӟ则上传时lg抛出异常?

原型Qpublic void setDeniedFilesList(String deniedFilesList)

其中QdeniedFilesList为禁止上传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想止上传那些没有扩展名的文gQ可以用两个逗号来表C。例如:(x)setDeniedFilesList("exe,bat,,")禁止上传带exe和bat扩展名的文g以及(qing)没有扩展名的文g?

8、setMaxFileSize

作用Q设定每个文件允怸传的最大长度?

原型Qpublic void setMaxFileSize(long maxFileSize)

其中QmaxFileSizeZؓ(f)每个文g允许上传的最大长度,当文件超出此长度Ӟ不被上传?

9、setTotalMaxFileSize

作用Q设定允怸传的文g的总长度,用于限制一ơ性上传的数据量大?

原型Qpublic void setTotalMaxFileSize(long totalMaxFileSize)

其中QtotalMaxFileSize为允怸传的文g的总长度?

CQ下载文件常用的Ҏ(gu)

1、setContentDisposition

作用Q将数据q加到MIME文g头的CONTENT-DISPOSITION域。jspSmartUploadlg?x)在q回下蝲的信息时自动填写MIME文g头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,L(fng)此方法?

原型Qpublic void setContentDisposition(String contentDisposition)

其中QcontentDispositiond的数据。如果contentDisposition为nullQ则lg自动添?attachment;"Q以表明下载的文g作ؓ(f)附gQ结果是IE览器将?x)提C另存文Ӟ而不是自动打开q个文gQIE览器一般根据下载的文g扩展名决定执行什么操作,扩展名ؓ(f)doc的将用wordE序打开Q扩展名为pdf的将用acrobatE序打开Q等{)(j)?

2、downloadFile

作用Q下载文件?

原型Q共有以下三个原型可用,W一个最常用Q后两个用于Ҏ(gu)情况下的文g下蝲Q如更改内容cdQ更改另存的文g名)(j)?

?public void downloadFile(String sourceFilePathName)

其中QsourceFilePathName下蝲的文件名Q带目录的文件全名)(j)

?public void downloadFile(String sourceFilePathName,String contentType)

其中QsourceFilePathName下蝲的文件名Q带目录的文件全名)(j),contentType为内容类型(MIME格式的文件类型信息,可被览器识别)(j)?

?public void downloadFile(String sourceFilePathName,String contentType,String destFileName)

其中QsourceFilePathName下蝲的文件名Q带目录的文件全名)(j),contentType为内容类型(MIME格式的文件类型信息,可被览器识别)(j),destFileNameZ载后默认的另存文件名?

三、文件上传篇

?表单要求

对于上传文g的FORM表单Q有两个要求Q?

1、METHOD应用POSTQ即METHOD="POST"?

2、增加属性:(x)ENCTYPE="multipart/form-data"

下面是一个用于上传文件的FORM表单的例子:(x)

<FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="/jspSmartUpload/upload.jsp"><INPUT TYPE="FILE" NAME="MYFILE"><INPUT TYPE="SUBMIT"></FORM>


?上传的例?/strong>

1、上传页面upload.html

本页面提供表单,让用户选择要上传的文gQ点?上传"按钮执行上传操作?

面源码如下Q?

<!-- 文g名:(x)upload.html ?者:(x)U|软g制作中心雨亦?zhsoft88@sohu.com)--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>文g上传</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body><p>&nbsp;</p><p align="center">上传文g选择</p><FORM METHOD="POST" ACTION="jsp/do_upload.jsp"ENCTYPE="multipart/form-data"><input type="hidden" name="TEST" value="good"> <table width="75%" border="1" align="center"> <tr> <td><div align="center">1?<input type="FILE" name="FILE1" size="30"> </div></td> </tr> <tr> <td><div align="center">2?<input type="FILE" name="FILE2" size="30"> </div></td> </tr> <tr> <td><div align="center">3?<input type="FILE" name="FILE3" size="30"> </div></td> </tr> <tr> <td><div align="center">4?<input type="FILE" name="FILE4" size="30"> </div></td> </tr> <tr> <td><div align="center"> <input type="submit" name="Submit" value="上传它!"> </div></td> </tr> </table></FORM></body></html>


2、上传处理页面do_upload.jsp

本页面执行文件上传操作。页面源码中详细介绍?jin)上传方法的用法Q在此不赘述?jin)?

面源码如下Q?

<%-- 文g名:(x)do_upload.jsp ?者:(x)U|软g制作中心雨亦?zhsoft88@sohu.com)--%><%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,com.jspsmart.upload.*" errorPage="" %><html><head><title>文g上传处理面</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body><% // 新徏一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 上传初始?su.initialize(pageContext); // 讑֮上传限制 // 1.限制每个上传文g的最大长度?// su.setMaxFileSize(10000); // 2.限制M传数据的长度?// su.setTotalMaxFileSize(20000); // 3.讑֮允许上传的文Ӟ通过扩展名限Ӟ(j),仅允许doc,txt文g?// su.setAllowedFilesList("doc,txt"); // 4.讑֮止上传的文Ӟ通过扩展名限Ӟ(j),止上传带有exe,bat, jsp,htm,html扩展名的文g和没有扩展名的文件?// su.setDeniedFilesList("exe,bat,jsp,htm,html,,"); // 上传文g su.upload(); // 上传文件全部保存到指定目录 int count = su.save("/upload"); out.println(count+"个文件上传成功!<br>"); // 利用Request对象获取参数之?out.println("TEST="+su.getRequest().getParameter("TEST") +"<BR><BR>"); // 逐一提取上传文g信息Q同时可保存文g?for (int i=0;i<su.getFiles().getCount();i++) { com.jspsmart.upload.File file = su.getFiles().getFile(i); // 若文件不存在则l?if (file.isMissing()) continue; // 昄当前文g信息 out.println("<TABLE BORDER=1>"); out.println("<TR><TD>表单名QF(tun)ieldNameQ?lt;/TD><TD>" + file.getFieldName() + "</TD></TR>"); out.println("<TR><TD>文g长度QSizeQ?lt;/TD><TD>" + file.getSize() + "</TD></TR>"); out.println("<TR><TD>文g名(F(tun)ileNameQ?lt;/TD><TD>" + file.getFileName() + "</TD></TR>"); out.println("<TR><TD>文g扩展名(F(tun)ileExtQ?lt;/TD><TD>" + file.getFileExt() + "</TD></TR>"); out.println("<TR><TD>文g全名QF(tun)ilePathNameQ?lt;/TD><TD>" + file.getFilePathName() + "</TD></TR>"); out.println("</TABLE><BR>"); // 文件另?// file.saveAs("/upload/" + myFile.getFileName()); // 另存CWEB应用E序的根目录为文件根目录的目录下 // file.saveAs("/upload/" + myFile.getFileName(), su.SAVE_VIRTUAL); // 另存到操作系l的根目录ؓ(f)文g根目录的目录?// file.saveAs("c:\temp\" + myFile.getFileName(), su.SAVE_PHYSICAL); }%></body></html>


四、文件下载篇

1、下载链接页面download.html

面源码如下Q?

<!-- 文g名:(x)download.html ?者:(x)U|软g制作中心雨亦?zhsoft88@sohu.com)--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>下蝲</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body><a href="jsp/do_download.jsp">点击下蝲</a></body></html>


2、下载处理页面do_download.jsp do_download.jsp展示?jin)如何利用jspSmartUploadlg来下载文Ӟ从下面的源码中就可以看到Q下载何其简单?

源码如下Q?

<%@ page contentType="text/html;charset=gb2312" import="com.jspsmart.upload.*" %><% // 新徏一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始?su.initialize(pageContext); // 讑֮contentDisposition为null以禁止浏览器自动打开文gQ?//保证点击链接后是下蝲文g。若不设定,则下载的文g扩展名ؓ(f) //docӞ览器将自动用word打开它。扩展名为pdfӞ //览器将用acrobat打开?su.setContentDisposition(null); // 下蝲文g su.downloadFile("/upload/如何赚取我的W一桉.doc");%>


注意Q执行下载的面Q在Java脚本范围外(?lt;% ... %>之外Q,不要包含HTML代码、空根{回车或换行{字W,有的话将不能正确下蝲。不信的话,可以在上q源码中%><%之间加入一个换行符Q再下蝲一下,保证出错。因为它影响?jin)返回给览器的数据,D解析出错?/ccid_code>

3、如何下载中文文?/strong>

jspSmartUpload虽然能下载文Ӟ但对中文支持不。若下蝲的文件名中有汉字Q则览器在提示另存的文件名Ӟ昄的是一堆ؕ码,很扫人兴。上面的例子是q样。(q个问题也是众多下蝲lg所存在的问题,很少有h解决Q搜索不到相兌料,可叹Q)(j)

Z(jin)ljspSmartUploadlg增加下蝲中文文g的支持,我对该组件进行了(jin)研究Q发现对q回l浏览器的另存文件名q行UTF-8~码后,览器便能正显CZ文名字了(jin)。这是一个o(h)人高兴的发现。于是我对jspSmartUploadlg的SmartUploadcd?jin)升U处理,增加?jin)toUtf8Stringq个Ҏ(gu)Q改动部分源码如下:(x)

public void downloadFile(String s, String s1, String s2, int i) throws ServletException, IOException, SmartUploadException { if(s == null) throw new IllegalArgumentException("File '" + s + "' not found (1040)."); if(s.equals("")) throw new IllegalArgumentException("File '" + s + "' not found (1040)."); if(!isVirtual(s) && m_denyPhysicalPath) throw new SecurityException("Physical path is denied (1035)."); if(isVirtual(s)) s = m_application.getRealPath(s); java.io.File file = new java.io.File(s); FileInputStream fileinputstream = new FileInputStream(file); long l = file.length(); boolean flag = false; int k = 0; byte abyte0[] = new byte[i]; if(s1 == null) m_response.setContentType("application/x-msdownload"); else if(s1.length() == 0) m_response.setContentType("application/x-msdownload"); else m_response.setContentType(s1); m_response.setContentLength((int)l); m_contentDisposition = m_contentDisposition != null ? m_contentDisposition : "attachment;"; if(s2 == null) m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + toUtf8String(getFileName(s))); else if(s2.length() == 0) m_response.setHeader("Content-Disposition", m_contentDisposition); else m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + toUtf8String(s2)); while((long)k < l) { int j = fileinputstream.read(abyte0, 0, i); k += j; m_response.getOutputStream().write(abyte0, 0, j); } fileinputstream.close(); } /** * 文件名中的汉字转ؓ(f)UTF8~码的串,以便下蝲时能正确昄另存的文件名. * U|软g制作中心雨亦?003.08.01 * @param s 原文件名 * @return 重新~码后的文g?*/ public static String toUtf8String(String s) { StringBuffer sb = new StringBuffer(); for (int i=0;i<s.length();i++) { char c = s.charAt(i); if (c >= 0 && c <= 255) { sb.append(c); } else { byte[] b; try { b = Character.toString(c).getBytes("utf-8"); } catch (Exception ex) { System.out.println(ex); b = new byte[0]; } for (int j = 0; j < b.length; j++) { int k = b[j]; if (k < 0) k += 256; sb.append("%" + Integer.toHexString(k). toUpperCase()); } } } return sb.toString(); }


注意源码中粗体部分,原jspSmartUploadlg对返回的文g未作M处理Q现在做?jin)编码的转换工作Q将文g名{换ؓ(f)UTF-8形式的编码Ş式。UTF-8~码对英文未作Q何处理,对中文则需要{换ؓ(f)%XX的Ş式。toUtf8StringҎ(gu)中,直接利用Java语言提供的编码{换方法获得汉字字W的UTF-8~码Q之后将其{换ؓ(f)%XX的Ş式?

源码编译后打包成jspSmartUpload.jarQ拷贝到Tomcat的shared/lib目录下(可ؓ(f)所有WEB应用E序所׃nQ,然后重启Tomcat服务器就可以正常下蝲含有中文名字的文件了(jin)。另QtoUtf8StringҎ(gu)也可用于转换含有中文的超U链接,以保证链接的有效Q因为有的WEB服务器不支持中文链接?

结QjspSmartUploadlg是应用JSPq行B/SE序开发过E中l常使用的上传下载组Ӟ它用简单,方便。现在我又ؓ(f)其加上了(jin)下蝲中文名字的文件的支持Q真个是如虎ȝQ必赢得更多开发者的青睐?



E.ven 2007-06-12 09:45 发表评论
]]>
Java RMI的简单例?/title><link>http://www.tkk7.com/Even/archive/2007/05/26/120137.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Sat, 26 May 2007 01:41:00 GMT</pubDate><guid>http://www.tkk7.com/Even/archive/2007/05/26/120137.html</guid><wfw:comment>http://www.tkk7.com/Even/comments/120137.html</wfw:comment><comments>http://www.tkk7.com/Even/archive/2007/05/26/120137.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.tkk7.com/Even/comments/commentRss/120137.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Even/services/trackbacks/120137.html</trackback:ping><description><![CDATA[<span id=ArticleContent1_ArticleContent1_lblContent>  <p>现在虽然我们很少用到RMIq行~程Q但是做为Java一个最早的分布式解x案,我们q是有了(jin)解的必要Q从例子开始吧Q虽然是几年前的?jin)?j)Q?/p> <p>q程接口RmiHelloRemoteIntfc .java</p> <p>import java.rmi.*;</p> <p>public interface RmiHelloRemoteIntfc extends Remote<br>{<br>   String helloRemoteObj(String client) throws RemoteException;<br>}</p> <p>q程接口的实现类RmiHelloRemoteObj.java</p> <p>import java.rmi.server.*;<br>import java.rmi.*;</p> <p>public class RmiHelloRemoteObj extends UnicastRemoteObject implements RmiHelloRemoteIntfc<br>{</p> <p>  public RmiHelloRemoteObj() throws RemoteException<br>  {<br>    super();<br>  }</p> <p>  public String helloRemoteObj(String client) throws RemoteException<br>  {<br>     return "Hello World"+client;<br>  }</p> <p>}</p> <p>服务器类RmiHelloServer.java</p> <p>import java.io.*;<br>import java.rmi.*;<br>import java.rmi.server.*;<br>import sun.applet.*;<br>import java.rmi.registry.LocateRegistry;</p> <p>public class RmiHelloServer<br>{</p> <p>  public RmiHelloServer()<br>  {<br>  }<br>  public static void main(String[] args)<br>  {<br>    //创徏q安装安全管理器<br>    if(System.getSecurityManager()==null)<br>    {<br>       System.setSecurityManager(new RMISecurityManager());<br>    }</p> <p>    try{<br>         //创徏q程对象<br>         RmiHelloRemoteObj ttt=new RmiHelloRemoteObj();<br>         //启动注册?br>         LocateRegistry.createRegistry(2222);<br>         //奖名U绑定到对象<br>         Naming.rebind("http://Fangm:2222/helloObj",ttt);</p> <p>         System.out.println("RMI服务器正在运行。。。。。?);<br>      }<br>      catch(Exception e)<br>      {<br>         e.printStackTrace();<br>      }</p> <p><br>  }<br>}</p> <p>服务器端的权限文件RmiHelloServer.policy</p> <p>grant codeBase<br>"file:/e:/download/rmitest/"<br>{<br> permission java.net.SocketPermission <br>      "*:1000-9999","accept,connect,listen,resolve";<br>};</p> <p> </p> <p>现在q看Client端是如何q接服务器和q行q程Ҏ(gu)的调用的?br></p> <p>import java.rmi.*;<br>import java.rmi.server.*;</p> <p>public class RmiHelloClient<br>{</p> <p>  public RmiHelloClient()<br>  {<br>  }<br>  public static void main(String[] args)<br>  {<br>    //创徏q安装安全管理器<br>    if(System.getSecurityManager()==null)<br>    {<br>       System.setSecurityManager(new RMISecurityManager());<br>    }</p> <p>    try{<br>          RmiHelloRemoteIntfc c1=(RmiHelloRemoteIntfc)Naming.lookup("rmi://Fangm:2222/helloObj");<br>          System.out.println(c1.helloRemoteObj("Everyone"));<br>    }<br>    catch(Exception e)<br>    {<br>       e.printStackTrace();<br>    }<br>    System.exit(0);</p> <p> </p> <p>  }<br>}</p> <p>Client端的权限文gRmiHelloClient.policy</p> <p>grant codeBase<br>"file:/e:/download/rmitest/"<br>{<br>  permission java.net.SocketPermission <br>      "*:1000-9999","accept,connect,listen,resolve";<br>};</p> <p>好了(jin)Q一个最单的RMI例子安无了(jin)Q对?jin)还?jin)最重要的一步,那就是编译和q行呢?我们来?jin)个Bat或Cmd的批处理来进行吧Q?/p> <p>看看RmiHello.bat?/p> <p>javac RmiHelloRemoteIntfc.java</p> <p>javac RmiHelloRemoteObj.java</p> <p>rmic RmiHelloRemoteObj</p> <p>javac RmiHelloServer.java</p> <p>javac RmiHelloClient.java</p> <p>echo 在另一个窗口启动服务器Q请E后。。?br>start java  -Djava.security.policy=RmiHelloServer.policy RmiHelloServer</p> <p>echo q行客户E序。。?br>java -Djava.security.policy=RmiHelloClient.policy RmiHelloClient<br><br>q个文g很简单吧Q包你一试就通,虽然单,不过对于初学者来_(d)q是很不错的哦!</p> </span> <img src ="http://www.tkk7.com/Even/aggbug/120137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Even/" target="_blank">E.ven</a> 2007-05-26 09:41 <a href="http://www.tkk7.com/Even/archive/2007/05/26/120137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javad配置文g的方?/title><link>http://www.tkk7.com/Even/archive/2007/05/26/120136.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Sat, 26 May 2007 01:40:00 GMT</pubDate><guid>http://www.tkk7.com/Even/archive/2007/05/26/120136.html</guid><wfw:comment>http://www.tkk7.com/Even/comments/120136.html</wfw:comment><comments>http://www.tkk7.com/Even/archive/2007/05/26/120136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Even/comments/commentRss/120136.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Even/services/trackbacks/120136.html</trackback:ping><description><![CDATA[       在现实工作中Q我们常帔R要保存一些系l配|信息,大家一般都?x)选择配置文g来完成,本文Ҏ(gu)W者工作中用到的读取配|文件的Ҏ(gu)小ȝ一下,主要叙述的是springd配置文g的方法? <div><strong>一.dxml配置文g</strong></div> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <div>(一)新徏一个java bean <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> chb.demo.vo;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img id=_45_217_Open_Image onclick="this.style.display='none'; document.getElementById('_45_217_Open_Text').style.display='none'; document.getElementById('_45_217_Closed_Image').style.display='inline'; document.getElementById('_45_217_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_45_217_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_45_217_Closed_Text').style.display='none'; document.getElementById('_45_217_Open_Image').style.display='inline'; document.getElementById('_45_217_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> HelloBean </span><span id=_45_217_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_45_217_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top> </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String helloWorld;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img id=_107_131_Open_Image onclick="this.style.display='none'; document.getElementById('_107_131_Open_Text').style.display='none'; document.getElementById('_107_131_Closed_Image').style.display='inline'; document.getElementById('_107_131_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_107_131_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_107_131_Closed_Text').style.display='none'; document.getElementById('_107_131_Open_Image').style.display='inline'; document.getElementById('_107_131_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String getHelloWorld() </span><span id=_107_131_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_107_131_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>  </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> helloWorld;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> }</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img id=_180_215_Open_Image onclick="this.style.display='none'; document.getElementById('_180_215_Open_Text').style.display='none'; document.getElementById('_180_215_Closed_Image').style.display='inline'; document.getElementById('_180_215_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_180_215_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_180_215_Closed_Text').style.display='none'; document.getElementById('_180_215_Open_Image').style.display='inline'; document.getElementById('_180_215_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top> </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setHelloWorld(String helloWorld) </span><span id=_180_215_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_180_215_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>  </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.helloWorld </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> helloWorld;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> }</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div> </div> </div> <p>(?构造一个配|文?/p> <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff"><?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff"><!</span><span style="COLOR: #ff00ff">DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" </span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="helloBean"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="chb.demo.vo.HelloBean"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="helloWorld"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>   </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">Hello!chb!</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div> </div> <p> </p> <p>(?dxml文g</p> <div>1.利用ClassPathXmlApplicationContext <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">ApplicationContext context </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ClassPathXmlApplicationContext(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">beanConfig.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top> HelloBean helloBean </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (HelloBean)context.getBean(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">helloBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top> System.out.println(helloBean.getHelloWorld());<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div> </div> </div> <div>  2.利用FileSystemResourced <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"> Resource rs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> FileSystemResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">D:/software/tomcat/webapps/springWebDemo/WEB-INF/classes/beanConfig.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  BeanFactory factory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> XmlBeanFactory(rs);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  HelloBean helloBean </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (HelloBean)factory.getBean(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">helloBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  System.out.println(helloBean.getHelloWorld());<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div> </div> </div> <div> 值得注意的是Q利用FileSystemResourceQ则配置文g必须攑֜project直接目录下,或者写明绝对\径,否则׃(x)抛出找不到文件的异常</div> </blockquote> <div><strong>?dproperties配置文g</strong></div> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <div>q里介绍两种技术:(x)利用springdproperties 文g和利用java.util.Propertiesd</div> <div></div> <div>(一)利用springdproperties 文g</div> <div></div> <div>我们q利用上面的HelloBean.java文gQ构造如下beanConfig.properties文g:</div> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <div>helloBean.class=chb.demo.vo.HelloBean<br>helloBean.helloWorld=Hello!chb!</div> </blockquote> <div>属性文件中?helloBean"名称xBean的别名设定,.class用于指定cL源?/div> <div>然后利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文? <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">  BeanDefinitionRegistry reg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> DefaultListableBeanFactory();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  PropertiesBeanDefinitionReader reader </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> PropertiesBeanDefinitionReader(reg);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  reader.loadBeanDefinitions(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ClassPathResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">beanConfig.properties</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  BeanFactory factory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (BeanFactory)reg;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  HelloBean helloBean </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (HelloBean)factory.getBean(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">helloBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  System.out.println(helloBean.getHelloWorld());</span></div> </div> </div> <div></div> <div>(?利用java.util.Propertiesd属性文?/div> <div></div> <div>比如Q我们构造一个ipConfig.properties来保存服务器ip地址和端口,如:(x)</div> <blockquote dir=ltr style="MARGIN-RIGHT: 0px"> <div> <div>ip=192.168.0.1<br>port=8080</div> </div> </blockquote> <div>则,我们可以用如下程序来获得服务器配|信息:(x)</div> <div> <div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid"> <div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">  InputStream inputStream </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.getClass().getClassLoader().getResourceAsStream(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ipConfig.properties</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>  Properties p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Properties();<br><img id=_146_174_Open_Image onclick="this.style.display='none'; document.getElementById('_146_174_Open_Text').style.display='none'; document.getElementById('_146_174_Closed_Image').style.display='inline'; document.getElementById('_146_174_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_146_174_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_146_174_Closed_Text').style.display='none'; document.getElementById('_146_174_Open_Image').style.display='inline'; document.getElementById('_146_174_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>  </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id=_146_174_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_146_174_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>   p.load(inputStream);<br><img id=_199_228_Open_Image onclick="this.style.display='none'; document.getElementById('_199_228_Open_Text').style.display='none'; document.getElementById('_199_228_Closed_Image').style.display='inline'; document.getElementById('_199_228_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_199_228_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_199_228_Closed_Text').style.display='none'; document.getElementById('_199_228_Open_Image').style.display='inline'; document.getElementById('_199_228_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>  }</span></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (IOException e1) </span><span id=_199_228_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_199_228_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>   e1.printStackTrace();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>  }</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ip:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">p.getProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ip</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,port:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">p.getProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">port</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));</span></div> </div> </div> <div></div> <div>本文只介l了(jin)一些简单操作,不当之处希望大家多多指教</div> </blockquote> <br><br> <p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1516911</p> <img src ="http://www.tkk7.com/Even/aggbug/120136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Even/" target="_blank">E.ven</a> 2007-05-26 09:40 <a href="http://www.tkk7.com/Even/archive/2007/05/26/120136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail发送邮?/title><link>http://www.tkk7.com/Even/archive/2007/05/26/120135.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Sat, 26 May 2007 01:38:00 GMT</pubDate><guid>http://www.tkk7.com/Even/archive/2007/05/26/120135.html</guid><wfw:comment>http://www.tkk7.com/Even/comments/120135.html</wfw:comment><comments>http://www.tkk7.com/Even/archive/2007/05/26/120135.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.tkk7.com/Even/comments/commentRss/120135.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Even/services/trackbacks/120135.html</trackback:ping><description><![CDATA[<p>昨天写一个JavaMail的程序,发现原来自己忘记?jin)那么多呢,现在补上资料Q方便以后回忆?br><br></p> <div>1.介绍: <br><br>Java Mail API的开发是SUN为Java开发者提供公用API框架的持l努力的良好例证。提倡公用框Ӟ反对受限于供应商的解x案,充分预示着一个日益开攄开发环境的建立?<br>  Java Mail API的结构本w证明了(jin)它的开发者的基本目标之一--软g开发的工作量应该取决于应用E序本n的复杂程度以?qing)开发者所要求的控制程度。换句话_(d)Java Mail API可能地保持单。乍看v来,JavaMail API所拥有的类L以及(qing)cM间的关系可能让h误解p漫长的学?fn)时间。实际上Q一旦正式开始用,你就?x)发现该API不失为在应用E序中加入健壮的邮g/通讯支持的简单工兗?<br><br>2.安装: <br><br>安装前要保你的机子上安装得有标准版的JDK和W(xu)eb服务?q且已配|好,有关它们的安装方?请参考其它文?|上到处都有). <br><br>(1).安装JavaMail API。现在最常用?JavaMail API 版本?.3. <br>  要?JavaMail 1.3 APIQ请下蝲 JavaMail 1.3 实现Q解开Javamail-1_3.zip 文gQƈ?mail.jar 文gd?CLASSPATH 中。除?jin)核心类Q随版本 1.3 实现一h供的q有 SMTP、IMAP4 ?POP3 供应商?<br>   <br>(2).JavaBeans Activation Framework(1.0.2? 的安?<br>JavaMail API 的所有版本都需?JavaBeans Activation Framework 来支持Q意数据块的输入及(qing)相应处理。功能似乎不多,但目前许多浏览器和邮件工具中都能扑ֈq种基本?MIME 型支持。下载完框架后,解开 jaf1_0_2.zip 文gQƈ?activation.jar 文gd?CLASSPATH 中?<br>   <br><br>? 如果(zhn)用的JDK是J2EEQ就没有什么特定的事非要用基本 JavaMail API来做不可QJ2EE 的类p处理?因ؓ(f)它本w就包含有JavaMail API和JAF,(zhn)只需要确?j2ee.jar 文gd到?zhn)的CLASSPATH 中ƈ已全部设|好?</div> <div> </div> <div><br>3.JavaMail的常用类介绍 <br><br>事先说明: <br><br>没用qJavaMail的h可能看不懂这些介l?不过不要?后面的文章有具体的实?到时也可倒回来查看这些类的用? <br><br><br>(1) javax.mail.Propertiesc?<br>  JavaMail需要Properties来创Z个session对象。它?yu)寻扑֭W串"mail.smtp.host"Q属性值就是发送邮件的L. <br><br>用法: <br> Properties props = new Properties (); <br>   props.put("mail.smtp.host", "smtp.163.com");//可以换上你的smtpL名?<br><br><br>(2) javax.mail.Sessionc?<br>  q个SessioncM表JavaMail 中的一个邮件session. 每一个基?JavaMail的应用程序至有一个session但是可以有Q意多的session?在这个例子中, Session对象需要知道用来处理邮件的SMTP 服务器?<br><br>用法: <br>   Session sendMailSession; <br>   sendMailSession = Session.getInstance(props, null); <br><br><br>(3) javax.mail.Transportc?<br>  邮g是既可以被发送也可以被受到。JavaMail使用?jin)两个不同的cL完成q两个功能:(x)Transport 和Store. Transport 是用来发送信息的Q而Store用来收信。对于这的教E我们只需要用到Transport对象?<br><br>用法Q?<br>Transport transport; <br>  transport = sendMailSession.getTransport("smtp"); <br><br>  用JavaMail Session对象的getTransport Ҏ(gu)来初始化Transport。传q去的字W串x?jin)对象所要用的协议Q如"smtp"。这ؓ(f)我们省了(jin)很多旉。因为JavaMail以境内置?jin)很多协议的实现?gu)?<br><br> 注意: JavaMailq不是绝Ҏ(gu)持每一个协议,目前支持IMAP?SMTP?POP3. <br><br><br>(4) javax.mail.MimeMessagec?<br>  Message对象存储我们实际发送的?sh)子邮g信息QMessage对象被作Z个MimeMessage对象来创建ƈ且需要知道应当选择哪一个JavaMail session?<br><br>  用法Q?<br>Message newMessage = new MimeMessage(sendMailSession); <br><br><br>(5) javax.mail.InternetAddressc?<br>一旦?zhn)创徏?Session ?MessageQƈ内容填入消息后Q就可以用Address定信g地址?jin)。和 Message 一PAddress 也是个抽象类。?zhn)用的是Javax.mail.internet.InternetAddress c? <br><br>用法: <br>InternetAddress from=new InternetAddress("xxf@cafe.com"); <br><br><br>(6) javax.mail.Storec?<br>Storecd现特定邮件协议上的读、写、监视、查扄操作。通过Javax.mail.Storecd以访问Javax.mail.FoldercR?<br><br>用法: <br>Store store=s.getSorte("pop3");//sZ个邮件会(x)?<br>store.connect(popserver,username,password);//通过你提供的pop地址,用户名和密码d你的邮箱 <br><br><br>(7) javax.mail.Folderc?<br>Foldercȝ于分U组l邮Ӟq提供照Javax.mail.Message格式讉Kemail的能力?<br><br>用法: <br>Folder folder=store.getFolder("INBOX"); <br>folder.open(Folder.READ_ONLY); <br><br><br>(8) javax.mail.Internet.MimeMultpart <br>一般保存电(sh)子邮件内容的容器是Multipart抽象c?它定义了(jin)增加和删除及(qing)获得?sh)子邮g不同部分内容的方?׃Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpartcL使用MimeMessage对象. <br><br>用法: <br>MimeMultipart multipart=new MimeMultipart(); <br><br>?我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电(sh)子邮件内定wdBodyPart(BodyPartcd下面紧接着要介l?对象.消息可以有很多部?一个BodyPart可以代表一个部? <br><br><br>(9) javax.mail.Internet.MimeBodyPartc?<br><br>MimeBodyPart是BodyPart具体用于mimeMessage的一个子c? <br>MimeBodyPart对象代表一个MimeMessage对象内容的一部分.每个MimeBodyPart被认为有两部? <br>⊙一个MIMEcd <br>⊙匹配这个类型的内容 <br><br>用法: <br>MimeBodyPart mdp=new MimeBodyPart(); <br>String text="Hello JavaMail!"; <br>mdp.setContent(text,"text/plain");//定义MIMEcd为text/plain,q设|MimeBodyPart的内? <br><br><br>(10) javax.activation.DataHandlerc?包含在JAF? <br>JavaMail API不限制信息只为文?M形式的信息都可能作茧(do)自缚(x)MimeMessage的一部分.除了(jin)文本信息,作ؓ(f)文g附g包含在电(sh)子邮件信息的一部分是很普遍?JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方? <br><br>用法: <br>DataHandler dh=new DataHandler(text,type); <br>mdp.setDatahandler(dh);//mdp是一个MimeBodyPart对象 <br><br><br>(11) javax.activation.FileDataSourcec?包含在JAF? <br>一个FileDataSource对象可以表示本地文g和服务器可以直接讉K的资?一个本地文件可以通过创徏一个新的MimeBodyPart对象附在一个mimeMessage对象? <br><br>用法: <br>MimeMultipart mm=new MimeMultipart(); <br>MimeBodyPart mdp=new MimeBodyPart(); <br>FileDataSource fds=new FileDataSource("c:/exam.txt"); <br>mdp.setDataHandler(new DataHandler(fds)); //讄数据?<br>mm.addBodyPart(mdp); //为当前消息MimeMultipart对象增加MimeBodyPart <br><br><br>(12) javax.activation.URLDataSourcec?包含在JAF? <br>q程资源,URL不会(x)指向它们,׃个URLDataSource对象表示.一个远E资源可以通过创徏一个新mimeBodyPart对象附在一个mimeMessage对象?同FileDataSource差不?. <br><br>用法: <br>与FileDataSource唯一不同的是数据源的讄: <br>URLDataSource uds=new URLDataSource( <a ><u><font color=#0000ff>http://www.cnjsp.com/logo.gif</font></u></a> ); </div> <div> </div> <div><br>4.试着~写W一个发送程?<br><br>在前面我们已对JavaMail作了(jin)一些介l?下面我们可试着写自qE序? <br><br>首先,我们先写一个撰写邮件的htmlE序index.htm,如下: <br>------------------------------------------------------------------------------------------- <br>< html > <br>< head > <br>< meta http-equiv="Content-Type" content="text/html; charset=gb2312" > <br>< title > 撰写邮g < /title > <br>< /head > <br><br>< body > <br>< form name="form1" method="post" action="testmail.jsp" > <br>< table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black" > <br>< tr bgcolor="#FFFFFF" > <br>< td width="24%" > 收信人地址: < /td > <br>< td width="76%" > <br>< input name="to" type="text" id="to" >< /td > <br>< /tr > <br>< tr bgcolor="#FFFFFF" > <br>< td > 主题: < /td > <br>< td > <br>< input name="title" type="text" id="title" >< /td > <br>< /tr > <br>< tr > <br>< td height="107" colspan="2" bgcolor="#FFFFFF" > <br>< textarea name="content" cols="50" rows="5" id="content" >< /textarea >< /td > <br>< /tr > <br>< tr align="center" > <br>< td colspan="2" bgcolor="#FFFFFF" > <br>< input type="submit" name="Submit" value="发? > <br>< input type="reset" name="Submit2" value="重置" > <br>< /td > <br>< /tr > <br>< /table > <br>< /form > <br>< /body > <br>< /html > <br><br><br>接着,我们再写一个处理程序testmail.jsp,如下: <br>----------------------------------------------------------------------------------------- <br>< %@ page contentType="text/html;charset=GB2312" % > <br>< %request.setCharacterEncoding("gb2312");% >< !--中文处理代码-- > <br><br>< !--引入要用到的cd-- > <br>< %@ page import="java.util.*,javax.mail.*"% > <br>< %@ page import="javax.mail.internet.*"% > <br><br>< html > <br>< head > <br>< meta http-equiv="Content-Type" content="text/html; charset=gb2312" > <br>< title > 发送成?< /title > <br>< /head > <br><br>< body > <br>< % <br>try{ <br><br>//从html表单中获取邮件信?<br>String tto=request.getParameter("to"); <br>String ttitle=request.getParameter("title"); <br>String tcontent=request.getParameter("content"); <br><br>Properties props=new Properties();//也可用Properties props = System.getProperties(); <br>props.put("mail.smtp.host","smtp.163.net");//存储发送邮件服务器的信?<br>props.put("mail.smtp.auth","true");//同时通过验证 <br>Session s=Session.getInstance(props);//Ҏ(gu)属性新Z个邮件会(x)?<br>s.setDebug(true); <br><br>MimeMessage message=new MimeMessage(s);//由邮件会(x)话新Z个消息对?<br><br>//讄邮g <br>InternetAddress from=new InternetAddress("boy@163.net"); <br>message.setFrom(from);//讄发g?<br>InternetAddress to=new InternetAddress(tto); <br>message.setRecipient(Message.RecipientType.TO,to);//讄收g?q设|其接收cd为TO <br>message.setSubject(ttitle);//讄主题 <br>message.setText(tcontent);//讄信g内容 <br>message.setSentDate(new Date());//讄发信旉 <br><br>//发送邮?<br>message.saveChanges();//存储邮g信息 <br>Transport transport=s.getTransport("smtp"); <br>transport.connect("smtp.163.net","boy","iloveyou");//以smtp方式d邮箱 <br>transport.sendMessage(message,message.getAllRecipients());//发送邮?其中W二个参数是所?<br>//已设好的收g人地址 <br>transport.close(); <br><br>% > <br>< div align="center" > <br>< p >< font color="#FF6600" > 发送成? < /font >< /p > <br>< p >< a href="recmail.jsp" > ȝ看我的信?< /a >< br > <br>< br > <br>< a href="index.htm" > 再发一?< /a > < /p > <br>< /div > <br>< % <br>}catch(MessagingException e){ <br>out.println(e.toString()); <br>} <br>% > <br>< /body > <br>< /html > <br><br>**********************************注意*************************************** <br><br>有好多书上和|上的文章在关键部分都是q样写testmail.jsp?如下: <br><br>String tto=request.getParameter("to"); <br>String ttitle=request.getParameter("title"); <br>String tcontent=request.getParameter("content"); <br>Properties props=new Properties(); <br>props.put("mail.smtp.host","smtp.163.net"); <br>Session s=Session.getInstance(props); <br>MimeMessage message=new MimeMessage(s); <br><br>InternetAddress from=new InternetAddress("boy@163.net"); <br>message.setFrom(from); <br>InternetAddress to=new InternetAddress(tto); <br>message.setRecipient(Message.RecipientType.TO,to); <br><br>message.setSubject(ttitle); <br>message.setText(tcontent); <br>message.setSentDate(new Date()); <br><br>Store store=s.getStore("pop3"); <br>store.connect("pop.163.net","boy","iloveyou");//以pop3的方式登录邮?<br>Transport transport=s.getTransport("smtp"); <br>transport.send(message); <br>store.close(); <br><br>事实?q种方式q不可靠,因ؓ(f)很多?sh)子邮局的smtp服务器要求我们通过验证,所以用q种方式发邮件时,只能发给同类邮箱(即相同smtp的邮?,甚至有时同类邮箱也发不出?以上两种方式我试q很多次,l果证明W一U方式是最可靠? <br><br><br>好了(jin),我相信你应该?x)写最单的Email发送程序了(jin).OK,下一ơ我们将说说怎样写发送HTML格式的邮? </div> <div> </div> <div>5.发送HTML格式的邮?<br><br>所谓HTML格式,是文本格?你的邮g可以用HTML代码~写,发给Ҏ(gu)?Ҏ(gu)收到的将是信息将是超文本,文本比U文本好看多?下以面是在以前例子的基础上修改的E序: <br><br>< %@ page contentType="text/html;charset=GB2312" % > <br>< %request.setCharacterEncoding("gb2312");% > <br>< %@ page import="java.util.*,javax.mail.*"% > <br>< %@ page import="javax.mail.internet.*"% > <br>< html > <br>< head > <br>< meta http-equiv="Content-Type" content="text/html; charset=gb2312" > <br>< title > 发送成?< /title > <br>< /head > <br><br>< body > <br>< % <br>try{ <br>String tto=request.getParameter("to"); <br>String ttitle=request.getParameter("title"); <br>String tcontent=request.getParameter("content"); <br>Properties props=new Properties(); <br>props.put("mail.smtp.host","127.0.0.1"); <br>props.put("mail.smtp.auth","true"); <br>Session s=Session.getInstance(props); <br>s.setDebug(true); <br><br>MimeMessage message=new MimeMessage(s); <br><br>//l消息对象设|发件h/收g?主题/发信旉 <br>InternetAddress from=new InternetAddress("xxf@cafe.com"); <br>message.setFrom(from); <br>InternetAddress to=new InternetAddress(tto); <br>message.setRecipient(Message.RecipientType.TO,to); <br>message.setSubject(ttitle); <br>message.setSentDate(new Date()); <br><br><br>//l消息对象设|内?<br>BodyPart mdp=new MimeBodyPart();//新徏一个存放信件内容的BodyPart对象 <br>mdp.setContent(tcontent,"text/html;charset=gb2312");//lBodyPart对象讄内容和格?~码方式 <br>Multipart mm=new MimeMultipart();//新徏一个MimeMultipart对象用来存放BodyPart?<br>//?事实上可以存攑֤? <br>mm.addBodyPart(mdp);//BodyPart加入到MimeMultipart对象?可以加入多个BodyPart) <br>message.setContent(mm);//把mm作ؓ(f)消息对象的内?<br><br>message.saveChanges(); <br>Transport transport=s.getTransport("smtp"); <br>transport.connect("127.0.0.1","xxf","coffee"); <br>transport.sendMessage(message,message.getAllRecipients()); <br>transport.close(); <br>% > <br>< div align="center" > <br>< p >< font color="#FF6600" > 发送成? < /font >< /p > <br>< p >< a href="recmail.jsp" > ȝ看我的信?< /a >< br > <br>< br > <br>< a href="index.htm" > 再发一?< /a > < /p > <br>< /div > <br>< % <br>}catch(MessagingException e){ <br>out.println(e.toString()); <br>} <br>% > <br>< /body > <br>< /html > <br><br>?撰写邮g的html文g仍然和前?请参考jsp和Java Mail(?)那个一?不需要作M修改. <br><br>怎么?q个E序是不是很单呢?如果q有什么不懂的?请在下面留言.下一ơ我们将要讲一讲怎样发送附? </div> <div> </div> <div>?~写灉|的发送程?<br><br>本小节没加什么新鲜的东西,但是l合?jin)以前的所有内?可以让你灉|地发送你惌发的邮g.看了(jin)本小节之后对你会(x)感觉到非常有? <br><br>更改后的撰写界面E序如下: <br>------------------------------------------------------------------------------------------- <br>< html > <br>< head > <br>< meta http-equiv="Content-Type" content="text/html; charset=gb2312" > <br>< title > 撰写邮g < /title > <br>< /head > <br>< body > <br>< form action="testall.jsp" method="post" name="form1" > <br>< table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black" > <br>< tr bgcolor="#FFFFFF" > <br>< td width="24%" > 收信人地址: < /td > <br>< td width="76%" > < input name="to" type="text" id="to" >< /td > <br>< /tr > <br>< tr bgcolor="#FFFFFF" > <br>< td > 主题: < /td > <br>< td > < input name="title" type="text" id="title" >< /td > <br>< /tr > <br>< tr > <br>< td height="18" colspan="2" bgcolor="#FFFFFF" > 信gcd <br>< select name="emailtype" id="emailtype" > <br>< option value="text/plain" selected > Text < /option > <br>< option value="text/html" > Html < /option > <br>< /select >< /td > <br>< /tr > <br>< tr > <br>< td height="53" colspan="2" bgcolor="#FFFFFF" >< textarea name="content" cols="50" rows="5" id="content" >< /textarea >< /td > <br>< /tr > <br>< tr align="center" > <br>< td colspan="2" bgcolor="#FFFFFF" > 附g1(自定?: <br>< input name="fj1" type="text" id="fj1" > <br>(输入文本信息) < /td > <br>< /tr > <br>< tr align="center" valign="bottom" > <br>< td colspan="2" bgcolor="#FFFFFF" > 附g2(本地): <br>< input name="fj2" type="file" id="fj2" size="10" >< /td > <br>< /tr > <br>< tr align="center" > <br>< td colspan="2" bgcolor="#FFFFFF" > 附g3(q程): <br>< input name="fj3" type="text" id="fj3" value="http://" > <br>(输入URL) < /td > <br>< /tr > <br>< tr align="center" > <br>< td colspan="2" bgcolor="#FFFFFF" > < input type="submit" name="Submit" value="发? > <br>< input type="reset" name="Submit2" value="重置" >< /td > <br>< /tr > <br>< /table > <br>< /form > <br>< /body > <br>< /html > <br><br><br>处理邮g的JSPE序如下: <br>---------------------------------------------------------------------------------------- <br>< %@ page contentType="text/html;charset=GB2312" % > <br>< %request.setCharacterEncoding("gb2312");% > <br>< %@ page import="java.util.*,javax.mail.*"% > <br>< %@ page import="javax.mail.internet.*"% > <br>< %@ page import="javax.activation.*"% >< !--要发送附件必d入该?- > <br>< %@ page import="java.net.*"% >< !--要用到URLc?- > <br>< html > <br>< head > <br>< meta http-equiv="Content-Type" content="text/html; charset=gb2312" > <br>< title > 发送成?< /title > <br>< /head > <br>< body > <br>< % <br>try{ <br>String tto=request.getParameter("to"); <br>String ttitle=request.getParameter("title"); <br>String emailtype=request.getParameter("emailtype");//获取emailcd <br>String tcontent=request.getParameter("content"); <br>String tfj1=request.getParameter("fj1"); <br>String tfj2=request.getParameter("fj2"); <br>String tfj3=request.getParameter("fj3"); <br><br>Properties props=new Properties(); <br>props.put("mail.smtp.host","127.0.0.1"); <br>props.put("mail.smtp.auth","true"); <br>Session s=Session.getInstance(props); <br>s.setDebug(true); <br><br>MimeMessage message=new MimeMessage(s); <br><br>//l消息对象设|发件h/收g?主题/发信旉 <br>InternetAddress from=new InternetAddress("xxf@cafe.com"); <br>message.setFrom(from); <br>InternetAddress to=new InternetAddress(tto); <br>message.setRecipient(Message.RecipientType.TO,to); <br>message.setSubject(ttitle); <br>message.setSentDate(new Date()); <br><br>Multipart mm=new MimeMultipart();//新徏一个MimeMultipart对象用来存放多个BodyPart对象 <br><br>//讄信g文本内容 <br>BodyPart mdp=new MimeBodyPart();//新徏一个存放信件内容的BodyPart对象 <br>mdp.setContent(tcontent,emailtype+";charset=gb2312");//lBodyPart对象讄内容和格?~码方式 <br>mm.addBodyPart(mdp);//含有信件内容的BodyPart加入到MimeMultipart对象?<br><br>//讄信g的附?(自定义附?直接所设文本内容加到自定义文g中作为附件发? <br>mdp=new MimeBodyPart();//新徏一个存N件的BodyPart <br>DataHandler dh=new DataHandler(tfj1,"text/plain;charset=gb2312"); <br>//新徏一个DataHandler对象,q设|其内容和格?~码方式 <br>mdp.setFileName("text.txt");//加上q句作为附件发?否则作Z件的文本内容 <br>mdp.setDataHandler(dh);//lBodyPart对象讄内容为dh <br>mm.addBodyPart(mdp);//含有附件的BodyPart加入到MimeMultipart对象?<br><br>//讄信g的附?(用本C的文件作为附? <br>mdp=new MimeBodyPart(); <br>FileDataSource fds=new FileDataSource(tfj2); <br>dh=new DataHandler(fds); <br>int ddd=tfj2.lastIndexOf("\\"); <br>String fname=tfj2.substring(ddd);//提取文g?<br>String ffname=new String(fname.getBytes("gb2312"),"ISO8859-1");//处理文g名是中文的情?<br>mdp.setFileName(ffname);//可以和原文g名不一?但最好一?<br>mdp.setDataHandler(dh); <br>mm.addBodyPart(mdp); <br><br>//讄信g的附?(用远E文件作为附? <br>mdp=new MimeBodyPart(); <br><br><br>URL urlfj=new URL(tfj3); <br>URLDataSource ur=new URLDataSource(urlfj); <br>//?q里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有?误?,q里U正一? <br>dh=new DataHandler(ur); <br>int ttt=tfj3.lastIndexOf("/"); <br>String urlname=tfj3.substring(ttt); <br>//String urlfname=new String(urlname.getBytes("gb2312"),"ISO8859-1");//不知怎么回事,q里不能处理中文问题 <br>mdp.setFileName(urlname); <br>mdp.setDataHandler(dh); <br>mm.addBodyPart(mdp); <br><br>message.setContent(mm);//把mm作ؓ(f)消息对象的内?<br><br>message.saveChanges(); <br>Transport transport=s.getTransport("smtp"); <br>transport.connect("127.0.0.1","xxf","coffee"); <br>transport.sendMessage(message,message.getAllRecipients()); <br>transport.close(); <br>% > <br>< div align="center" > <br>< p >< font color="#FF6600" > 发送成? < /font >< /p > <br>< p >< a href="recmail.jsp" > ȝ看我的信?< /a >< br > <br>< br > <br>< a href="index.htm" > 再发一?< /a > < /p > <br>< /div > <br>< % <br>}catch(MessagingException e){ <br>out.println(e.toString()); <br>} <br>% > <br>< /body > <br>< /html > <br><br>到目前ؓ(f)?我们基本上已学会(x)?jin)发各种cd的邮件了(jin).</div> q里最加上一些在实践工程中遇到的一些问题:(x)<br>1    发送Email认证。现在很多Email服务器在SMTP发送前需要做用户名密码认证?br>不然?x)抛出javax.mail.AuthenticationFailedExceptionQ?br>解决办法Q?br>final String username = "username";<br>        final String password = "password";<br>        <br>        //使用验证<br>        Session session = Session.getDefaultInstance(props,<br>                new Authenticator() {<br>                    protected javax.mail.PasswordAuthentication getPasswordAuthentication() {<br>                        return new javax.mail.PasswordAuthentication(username,<br>                                password);<br>                    }<br>                });<br><br>把username,passwordҎ(gu)你邮q用户名和密码<br><br>2当要发邮件的对象不单是一个,是很多个的时候:(x)<br>String to[] = request.getParameterValues("check_box");//获取收g人email地址<br>  ArrayList arraylist = new ArrayList();<br>  for(int i=0;i < to.length;i++)<br>     {<br>      arraylist.add(new InternetAddress(to[i]));<br>     }   //收g地址放进队列<br>Message msg = new MimeMessage(s);<br>     msg.setFrom(new InternetAddress(from));//讄发g?br>  msg.setRecipients(Message.RecipientType.TO, (InternetAddress[])arraylist.toArray(new InternetAddress[arraylist.size()]));<br>     msg.setSubject(subject);//讄主题<br>     msg.setSentDate(new Date());//讄发信?br>  BodyPart mdp=new MimeBodyPart();//新徏一个存放信件内容的BodyPart对象<br>msg.setRecipients(Message.RecipientType.TO, (InternetAddress[])arraylist.toArray(new InternetAddress[arraylist.size()]));<br><br>以上是邮件经帔R到的问题Q特此纪?br> <img src ="http://www.tkk7.com/Even/aggbug/120135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Even/" target="_blank">E.ven</a> 2007-05-26 09:38 <a href="http://www.tkk7.com/Even/archive/2007/05/26/120135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zlib --sharedhttp://www.tkk7.com/Even/archive/2007/03/24/106049.htmlE.venE.venSat, 24 Mar 2007 06:00:00 GMThttp://www.tkk7.com/Even/archive/2007/03/24/106049.htmlhttp://www.tkk7.com/Even/comments/106049.htmlhttp://www.tkk7.com/Even/archive/2007/03/24/106049.html#Feedback0http://www.tkk7.com/Even/comments/commentRss/106049.htmlhttp://www.tkk7.com/Even/services/trackbacks/106049.html如果你是64bit的操作系l,h意,在编译libpng的时候(no-config)包的时候,如果遇到undefined reference to `png_mmx_support'Q请使用config包,~译zlib的时候,使用zlib --sharedQ然后在libpng那里使用./configure make; make install q行安装



E.ven 2007-03-24 14:00 发表评论
]]>
How to build JpegV6 in 64 bit linuxhttp://www.tkk7.com/Even/archive/2007/03/24/106032.htmlE.venE.venSat, 24 Mar 2007 03:19:00 GMThttp://www.tkk7.com/Even/archive/2007/03/24/106032.htmlhttp://www.tkk7.com/Even/comments/106032.htmlhttp://www.tkk7.com/Even/archive/2007/03/24/106032.html#Feedback0http://www.tkk7.com/Even/comments/commentRss/106032.htmlhttp://www.tkk7.com/Even/services/trackbacks/106032.htmlHow to build jpegsrc.v6b on 64-bit Linux machines
jpegsrc is no longer maintained and has not been updated since the Clinton administration. This is odd considering how critical this library is to so many applications.

If you are trying to build on a 64-bit Linux machine you will probably get this error during the ./configure step:

checking host system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized
The fix is simple -- just copy '/usr/share/libtool/config.guess' and '/usr/share/libtool/config.sub' to the same directory as the jpeg-6b ./configure script. You can also copy from from /usr/share/automake-1.9/.

cp /usr/share/libtool/config.guess .
cp /usr/share/libtool/config.sub .
./configure --enable-shared --enable-static

One site suggests that you also need tell the jpegsrc build where the 64-bit libdir is located:

make libdir=/usr/lib64
make libdir=/usr/lib64 install
That will change the directory where 'make install' puts the libjpeg library files, but you may not want that if you are installing libjpeg to a custom path (in other words, if you used the --prefix option for configure).



E.ven 2007-03-24 11:19 发表评论
]]>
վ֩ģ壺 ޹˾Ʒһ| ޶aվ߹ۿ| 99Ƶ| ˬִ̼߳| վ߹ۿ| һëƬëƬëƬ| ߹ۿѳ| ɫ͵͵av˵| 99Ƶѹۿ| ˳Ƶ߹ۿƵ | þþþAVר| ɫëƬվ| 쿴ѸӰ| ۺ߳һ| վ| ާžƷ| ɫվwww| Ƶۿ| һۺ߲| þù׾Ʒҹ | 弶ëƬѲ| ޾Ƶ߹ۿ| þþƷһ| þ޹Ʒ| Ʒާѡ벥鶹| ŷպһ| ľavרavëƬ| ѹҹƵ| Ļһþ| һaƵ| պƷӰһ| gvh߹ۿ| ѿwwwƵ| ŷպĸwww777| þһѵ| ޳˸߹ۿ| Ļ| һ| ѸƵ| AVһ| aëƬѸëƬƵ|