﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-E.ven JAVA Home</title><link>http://www.blogjava.net/Even/</link><description>Share</description><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 08:53:51 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 08:53:51 GMT</pubDate><ttl>60</ttl><item><title>web2.0 兼容IE6/IE7/FF的通用方法</title><link>http://www.blogjava.net/Even/archive/2009/04/13/265220.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Mon, 13 Apr 2009 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/Even/archive/2009/04/13/265220.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/265220.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2009/04/13/265220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/265220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/265220.html</trackback:ping><description><![CDATA[一、CSS HACK <br />
以下两种方法几乎能解决现今所有HACK. <br />
<br />
1, !important <br />
<br />
随着IE7对!important的支持, !important 方法现在只针对IE6的HACK.(注意写法.记得该声明位置需要提前.) <br />
&lt;style&gt; <br />
#wrapper <br />
{ <br />
width: 100px!important; /* IE7+FF */ <br />
width: 80px; /* IE6 */ <br />
} <br />
&lt;/style&gt; <br />
<br />
<br />
2, IE6/IE77对FireFox <br />
<br />
*+html 与 *html 是IE特有的标签, firefox 暂不支持.而*+html 又为 IE7特有标签. <br />
&lt;style&gt; <br />
#wrapper <br />
{ <br />
#wrapper { width: 120px; } /* FireFox */ <br />
*html #wrapper { width: 80px;} /* ie6 fixed */ <br />
*+html #wrapper { width: 60px;} /* ie7 fixed, 注意顺序 */ <br />
} <br />
&lt;/style&gt; <br />
<br />
<br />
注意: <br />
*+html 对IE7的HACK 必须保证HTML顶部有如下声明： <br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"　"http://www.w3.org/TR/html4/loose.dtd"&gt; <br />
<br />
二、万能 float 闭合(非常重要!) <br />
<br />
关于 clear float 的原理可参见 [How To Clear Floats Without Structural Markup] <br />
将以下代码加入Global CSS 中,给需要闭合的div加上 class="clearfix" 即可,屡试不爽. <br />
&lt;style&gt; <br />
/* Clear Fix */ <br />
<br />
.clearfix:after <br />
{ <br />
content:"."; <br />
display:block; <br />
height:0; <br />
clear:both; <br />
visibility:hidden; <br />
} <br />
.clearfix <br />
{ <br />
display:inline-block; <br />
} <br />
/* Hide from IE Mac */ <br />
.clearfix {display:block;} <br />
/* End hide from IE Mac */ <br />
/* end of clearfix */ <br />
&lt;/style&gt; <br />
<br />
三、其他兼容技巧(再次啰嗦) <br />
<br />
1, FF下给 div 设置 padding 后会导致 width 和 height 增加, 但IE不会.(可用!important解决) <br />
2, 居中问题. <br />
1).垂直居中.将 line-height 设置为 当前 div 相同的高度, 再通过 vertical-align: middle.( 注意内容不要换行.) <br />
2).水平居中. margin: 0 auto;(当然不是万能) <br />
3, 若需给 a 标签内内容加上 样式, 需要设置 display: block;(常见于导航标签) <br />
4, FF 和 IE 对 BOX 理解的差异导致相差 2px 的还有设为 float的div在ie下 margin加倍等问题. <br />
5, ul 标签在 FF 下面默认有 list-style 和 padding . 最好事先声明, 以避免不必要的麻烦. (常见于导航标签和内容列表) <br />
6, 作为外部 wrapper 的 div 不要定死高度, 最好还加上 overflow: hidden.以达到高度自适应. <br />
7, 关于手形光标. cursor: pointer. 而hand 只适用于 IE. <br />
<br />
1 针对firefox ie6 ie7的css样式 <br />
现在大部分都是用!important来hack，对于ie6和firefox测试可以正常显示， <br />
但是ie7对!important可以正确解释，会导致页面没按要求显示！找到一个针 <br />
对IE7不错的hack方式就是使用&#8220;*+html&#8221;，现在用IE7浏览一下，应该没有问题了。 <br />
现在写一个CSS可以这样： <br />
<br />
#1 { color: #333; } /* Moz */ <br />
* html #1 { color: #666; } /* IE6 */ <br />
*+html #1 { color: #999; } /* IE7 */ <br />
那么在firefox下字体颜色显示为#333，IE6下字体颜色显示为#666，IE7下字体颜色显示为#999。 <br />
<br />
2 css布局中的居中问题 <br />
主要的样式定义如下： <br />
<br />
body {TEXT-ALIGN: center;} <br />
#center { MARGIN-RIGHT: auto; MARGIN-LEFT: auto; } <br />
说明： <br />
首先在父级元素定义TEXT-ALIGN: center;这个的意思就是在父级元素内的内容居中；对于IE这样设定就已经可以了。 <br />
但在mozilla中不能居中。解决办法就是在子元素定义时候设定时再加上&#8220;MARGIN-RIGHT: auto;MARGIN-LEFT: auto; &#8221; <br />
需要说明的是，如果你想用这个方法使整个页面要居中，建议不要套在一个DIV里，你可以依次拆出多个div， <br />
只要在每个拆出的div里定义MARGIN-RIGHT: auto;MARGIN-LEFT: auto; 就可以了。 <br />
<br />
3 盒模型不同解释. <br />
<br />
#box{ width:600px; //for ie6.0- w\idth:500px; //for ff+ie6.0} <br />
#box{ width:600px!important //for ff width:600px; //for ff+ie6.0 width /**/:500px; //for ie6.0-} <br />
<br />
4 浮动ie产生的双倍距离 <br />
<br />
#box{ float:left; width:100px; margin:0 0 0 100px; //这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略} <br />
这里细说一下block,inline两个元素,Block元素的特点是:总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是:和其他元素在同一行上,...不可控制(内嵌元素); <br />
<br />
#box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的的效果 diplay:table; <br />
<br />
5 IE与宽度和高度的问题 <br />
<br />
IE不认得min-这个定义，但实际上它把正常的width和height当作有min的情况来使。这样问题就大了，如果只用宽度和高度， <br />
正常的浏览器里这两个值就不会变，如果只用min-width和min-height的话，IE下面根本等于没有设置宽度和高度。 <br />
比如要设置背景图片，这个宽度是比较重要的。要解决这个问题，可以这样： <br />
#box{ width: 80px; height: 35px;}html&gt;body #box{ width: auto; height: auto; min-width: 80px; min-height: 35px;} <br />
<br />
6 页面的最小宽度 <br />
<br />
min-width是个非常方便的CSS命令，它可以指定元素最小也不能小于某个宽度，这样就能保证排版一直正确。但IE不认得这个， <br />
而它实际上把width当做最小宽度来使。为了让这一命令在IE上也能用，可以把一个&lt;div&gt; 放到 &lt;body&gt; 标签下，然后为div指定一个类： <br />
然后CSS这样设计： <br />
#container{ min-width: 600px; width:expression(document.body.clientWidth &lt; 600? "600px": "auto" );} <br />
第一个min-width是正常的；但第2行的width使用了Javascript，这只有IE才认得，这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。 <br />
<br />
7 清除浮动 <br />
<br />
.hackbox{ display:table; //将对象作为块元素级的表格显示}或者.hackbox{ clear:both;} <br />
或者加入:after（伪对象）,设置在对象后发生的内容，通常和content配合使用，IE不支持此伪对象，非Ie 浏览器支持， <br />
所以并不影响到IE/WIN浏览器。这种的最麻烦的......#box:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden;} <br />
<br />
8 DIV浮动IE文本产生3象素的bug <br />
<br />
左边对象浮动，右边采用外补丁的左边距来定位，右边对象内的文本会离左边有3px的间距. <br />
<br />
#box{ float:left; width:800px;}#left{ float:left; width:50%;}#right{ width:50%;}*html #left{ margin-right:-3px; //这句是关键} <br />
HTML代码&lt;div id="box"&gt; &lt;div id="left"&gt;&lt;/div&gt; &lt;div id="right"&gt;&lt;/div&gt;&lt;/div&gt; <br />
<br />
9 属性选择器(这个不能算是兼容,是隐藏css的一个bug) <br />
<br />
p[id]{}div[id]{} <br />
这个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera作用 <br />
属性选择器和子选择器还是有区别的,子选择器的范围从形式来说缩小了,属性选择器的范围比较大,如p[id]中,所有p标签中有id的都是同样式的. <br />
<br />
10 IE捉迷藏的问题 <br />
<br />
当div应用复杂的时候每个栏中又有一些链接，DIV等这个时候容易发生捉迷藏的问题。 <br />
有些内容显示不出来，当鼠标选择这个区域是发现内容确实在页面。 <br />
解决办法：对#layout使用line-height属性 或者给#layout使用固定高和宽。页面结构尽量简单。 <br />
<br />
11 高度不适应 <br />
<br />
高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节，特别是当内层对象使用 <br />
margin 或paddign 时。 <br />
例： <br />
&lt;div id="box"&gt; <br />
&lt;p&gt;p对象中的内容&lt;/p&gt; <br />
&lt;/div&gt; <br />
CSS：#box {background-color:#eee; } <br />
#box p {margin-top: 20px;margin-bottom: 20px; text-align:center; } <br />
解决方法：在P对象上下各加2个空的div对象CSS代码：.1{height:0px;overflow:hidden;}或者为DIV加上border属性。 
<img src ="http://www.blogjava.net/Even/aggbug/265220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2009-04-13 09:44 <a href="http://www.blogjava.net/Even/archive/2009/04/13/265220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SVN 自动邮件通知 的两种方式以及中文解决方案 （转）</title><link>http://www.blogjava.net/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.blogjava.net/Even/archive/2009/01/21/252198.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/252198.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2009/01/21/252198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/252198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/252198.html</trackback:ping><description><![CDATA[互联网上有很多相关的文章，但是说明的不够明了，我参考这些文章来配置的时候，走了不少弯路。现在将这两种方式整理一下。<br />
<br />
第一种方式 通过svnnotify来发送邮件<br />
<br />
/usr/bin/svnnotify --repos-path "$1" --revision "$2" --to real@admin.net --from real@admin99.net --handler "HTML::ColorDiff" &nbsp;--with-diff --smtp mail.admin99.net --charset zh_CN:GB2312 &nbsp;-g zh_CN --svnlook /usr/local/subversion/bin/svnlook --subject-prefix '[SVN更新]'<br />
<br />
svnnotify有很多参数，可以通过svnnotify --help 或者man svnnotify 查看<br />
<br />
好多文章中在介绍这种方式的时候，没有加上svnlook的绝对路径，我实在是很纳闷，可能是他们的subversiong在安装的时候没有加上 --prefix=/yourpath 参数，把subversion安装在了默认路径，我的subversion是安装在/usr/local/subversion之下的，svnnotify在默认的/usr/bin下找不到svnlook，所以，在邮件通知中无法出现log信息，diff信息等等。加上这个参数之后，问题解决。<br />
<br />
还有更搞笑的是，很多关于这个的文章把 -l 参数当作svn 记录日志文件的参数，寒~~ -_-!! 可能是把svnnotify和commit-email.pl搞混了，在svnnotify中，这个参数是 --language 。<br />
<br />
这种方式还有另外一个问题，中文转码的问题，经过N次尝试之后，log信息中的中文，diff信息中的中文仍然显示的是乱码，最后因为时间紧迫，不得不先放弃这种方式。<br />
<br />
第二种方式 通过commit-email.pl 来发送邮件<br />
<br />
/usr/local/subversion/bin/commit-email.pl "$1" "$2" --from real@admin99.net -h admin99.net &nbsp;-s "[SVN 更新]" --diff y svnhejia@51hejia.com<br />
<br />
默认情况下，在subversion的bin目录下，没有commit-email.pl这个文件，是我从src中copy过来的。<br />
<br />
关于commit-email.pl所能用的参数，可以通过直接执行/usr/local/subversion/bin/commit-email.pl 来查看，当然这个时候是执行不了了，提示错误是参数太少，然后给你列出来一些参数。参数不多。<br />
<br />
--diff y 是表示在邮件中加入diff信息，这个当然是要的<br />
<br />
后面跟的邮件地址，是接收邮件的地址，有人说可以在后面写上N个地址，用空格分开就行，事实上我测试的时候，这种方式根本就收不到邮件了，时间紧迫，不能详细测试。最后不得不在邮件服务器上做了一个组邮件地址。<br />
<br />
关于中文问题，通过在commit-email.pl中更改字符集，基本上可以很完美的解决diff信息中的中文问题。<br />
<br />
但是对于log信息中的中文，至今尚未找到合适的解决办法。<br />
<br />
这个问题的关键应该是在于，svn客户端在提交更新的时候，输入的log信息，使用的是非ascii编码(应该是unicode) ，commit-email.pl(还不缺认问题是不是出在commit-email.pl还是出在svn本身)在处理非ascii编码时，将其转换成了诸如 ?\230?\181?\139?\232?\175?\149?\228?\186?\140 这样的不可读的数字形式。<br />
在互联网上找到一篇文章，是06年写的，提到了一种解决这个的办法，不过我测试下来没有成功，还是贴出来吧，不定谁的就可以成功了<br />
<br />
my @difflines; (行487) 的前面加上：<br />
<br />
for (my $i=0; $i&lt;@body; ++$i){<br />
&nbsp; &nbsp;my @rsa = split( /\?\\/, $body[$i] );<br />
&nbsp; &nbsp;$body[$i] = "";<br />
&nbsp; &nbsp;foreach my $val (@rsa) {<br />
&nbsp; &nbsp; &nbsp; &nbsp;$val =~ /(^[0-9]{3})(.*)/;<br />
&nbsp; &nbsp; &nbsp; &nbsp;if(defined $1 and $1 gt 0){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#print "\n[".$1 . "," . $2."]";<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$body[$i] .= chr($1) . $2;<br />
&nbsp; &nbsp; &nbsp; &nbsp;}<br />
&nbsp; &nbsp; &nbsp; &nbsp;else{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$body[$i] .= $val;<br />
&nbsp; &nbsp; &nbsp; &nbsp;}<br />
&nbsp; &nbsp;}<br />
}<br />
<br />
把之前 push 到 @body 变量的所有内容重新进行处理，发现 ?\ 后面跟三个数字就替换为相应的字符。<!-- Added by RelatedTopic, plugin for Bo-Blog 2.0.0 --> 
<img src ="http://www.blogjava.net/Even/aggbug/252198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2009-01-21 12:47 <a href="http://www.blogjava.net/Even/archive/2009/01/21/252198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 删除文件夹里所有文件</title><link>http://www.blogjava.net/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.blogjava.net/Even/archive/2008/08/25/224234.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/224234.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2008/08/25/224234.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/224234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/224234.html</trackback:ping><description><![CDATA[<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.File;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;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.blogjava.net/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.blogjava.net/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.blogjava.net/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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_80_178_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Test();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">deleted<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">删除文件夹<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">param&nbsp;folderPath&nbsp;文件夹完整绝对路径</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;delFolder(String&nbsp;folderPath)&nbsp;</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.blogjava.net/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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_278_507_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delAllFile(folderPath);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">删除完里面所有内容</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filePath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;folderPath;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filePath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;filePath.toString();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.File&nbsp;myFilePath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.io.File(filePath);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myFilePath.delete();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">删除空文件夹</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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_529_565_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">删除指定文件夹下所有文件<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">param&nbsp;path&nbsp;文件夹完整绝对路径</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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;delAllFile(String&nbsp;path)&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_654_1459_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;flag&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">file.exists())&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_747_778_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flag;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">file.isDirectory())&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_812_843_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flag;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;tempList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;file.list();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;temp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;tempList.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</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.blogjava.net/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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(path.endsWith(File.separator))&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1006_1068_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(path&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1075_1155_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(path&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;File.separator&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;tempList[i]);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(temp.isFile())&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1186_1226_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.delete();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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.blogjava.net/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.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(temp.isDirectory())&nbsp;</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.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1262_1423_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delAllFile(path&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;tempList[i]);</span><span style="color: #008000">//</span><span style="color: #008000">先删除文件夹里面的文件</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delFolder(path&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;tempList[i]);</span><span style="color: #008000">//</span><span style="color: #008000">再删除空文件夹</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;flag;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span>
<img src ="http://www.blogjava.net/Even/aggbug/224234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2008-08-25 18:30 <a href="http://www.blogjava.net/Even/archive/2008/08/25/224234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 缓存</title><link>http://www.blogjava.net/Even/archive/2008/03/22/187851.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Sat, 22 Mar 2008 01:50:00 GMT</pubDate><guid>http://www.blogjava.net/Even/archive/2008/03/22/187851.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/187851.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2008/03/22/187851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/187851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/187851.html</trackback:ping><description><![CDATA[<h3>hibernate缓存 </h3>
<table class="blog-content">
    <tbody>
        <tr>
            <td>
            <p>（一）hibernate数据缓存策略<br />
            &nbsp; 缓存是数据库数据在内存中的临时容器，它包含了库表数据在内存中的拷贝，位于数据库与数据访问层之间。对于查询操作相当频繁的系统（论坛，新闻发布等），良好的缓存机制显得尤为重要。<br />
            &nbsp; ORM在进行数据读取时，首先在缓存中查询，避免了数据库调用的性能开销。<br />
            ORM的数据缓存应包含下面几个层次：<br />
            1）事务级缓存 &nbsp; 2）应用级缓存 &nbsp; 3）分布式缓存<br />
            具体针对Hibernate而言，采用两级缓存策略，其过程描述：<br />
            (1)条件查询的时候，总是发出一条select * from table_name where &#8230;. 这样的SQL语句查询数据库，一次获得所有的数据对象。<br />
            (2) 把获得的所有数据对象根据ID放入到第二级缓存中。<br />
            (3) 当Hibernate根据ID访问数据对象的时候，首先从Session一级缓存中查；查不到，如果配置了二级缓存，那么从二级缓存中查；查不到，再查询数据库，把结果按照ID放入到缓存。<br />
            (4) 删除、更新、增加数据的时候，同时更新缓存。<br />
            1. 一级缓存(session level)－数据库事务级缓存<br />
            &nbsp; 1）根据主键id加载数据时。 Session.load()， Session.iterate()方法<br />
            &nbsp; &nbsp; 2）延迟加载时<br />
            &nbsp; &nbsp; Session内部维护一个数据对象集合，包括了本Session内选取的、操作的数据对象。这称为Session内部缓存，是Hibernate的第一级最快缓存，属于Hibernate的既定行为，不需要进行配置(也没有办法配置 :-)。<br />
            &nbsp; &nbsp; 内部缓存正常情况下由hibernate自动维护，但也可人工干预：<br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1) Session.evict (): 将某个特定对象从内部缓存中清除<br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2)Session.clear(): 清空内部缓存<br />
            2.二级缓存(SessionFactory level)－应用级缓存<br />
            &nbsp; &nbsp; 二级缓存由SessionFactory的所有session实例共享。<br />
            3. 第三方缓存实现<br />
            &nbsp; &nbsp; EHCache, OSCahe<br />
            hibernate批量查询引起的内存溢出问题<br />
            &nbsp; &nbsp; 批量查询基本不适合使用现有的持久层技术来做，如CMP或hibernate，IBatis倒是可以.<br />
            &nbsp; &nbsp; 因为每次调用Session.save()方法时，当前session都会将对象纳入到自身的内部缓存中。内部缓存不同于二级缓存，我们可以在二级缓存的配置中指定其最大容量。<br />
            解决方案：<br />
            1）在批处理情况下，关闭Hibernate缓存，如果关闭Hibernate缓存，那么和直接使用JDBC就没有区别。 <br />
            2） 每隔一段时间清空Session内部缓存<br />
            &nbsp; Session实现了异步write-behind，它允许Hibernate显式地写操作的批处理。 这里，我给出Hibernate如何实现批量插入的方法： 首先，我们设置一个合理的JDBC批处理大小，hibernate.jdbc.batch_size 20。 然后在一定间隔对Session进行flush()和clear()。<br />
            Session session = sessionFactory.openSession(); <br />
            Transaction tx = session.beginTransaction(); <br />
            for ( int i=0; i&lt;100000; i++ ) {<br />
            Customer customer = new Customer(.....); <br />
            session.save(customer); <br />
            if ( i % 20 == 0 ) {<br />
            //flush 插入数据和释放内存: <br />
            session.flush(); session.clear(); } <br />
            } <br />
            tx.commit(); <br />
            session.close();<br />
            &nbsp; 为了优化性能，可执行批量操作。在传统的JDBC编程中，批量操作方式如下，将数个SQL操作批量提交：<br />
            PrepareStatement ps=conn.prepareStatement("insert into users(name) values(?)"); &nbsp; <br />
            for(int i=0;i&lt;100000;i++){<br />
            &nbsp; ps.setString(1, "user"+i);<br />
            &nbsp; ps.addBatch();<br />
            } <br />
            int[] counts=ps.executeBatch<br />
            在Hibernate中，可以设置hibernate.jdbc.batch_size 参数来指定每次提交的sql数量。<br />
            hibernate2和hibernate3数据批量删除机制分析<br />
            1.hibernate2<br />
            &nbsp; &nbsp; Transaction tx=session.beginTransaction();<br />
            &nbsp; &nbsp; session.delete("from users");<br />
            &nbsp; &nbsp; tx.commit();<br />
            &nbsp; 观察日志输出：<br />
            select ... from users<br />
            Hibernate:delete from users where id=?<br />
            Hibernate:delete from users where id=?<br />
            Hibernate:delete from users where id=?<br />
            ...<br />
            &nbsp; &nbsp; hibernate2版本会首先从数据库中查询出所有符合条件的记录，再对此记录循环删除。如果记录量过大，势必引起内存溢出和删除效率问题。ORM为什么要这么做呢？因为ORM为了自动维护内存状态，必须知道用户到底对哪些数据进行了操作。问题的解决方法：<br />
            1）内存消耗<br />
            &nbsp; &nbsp; 批量删除前首先从数据库中查询出所有符合条件的记录，如果数据量过大，就会导致 OutOfMemoryError.<br />
            &nbsp; &nbsp; 可以采用Session .iterate或Query.iterate方法逐条获取记录，再执行delete操作。另外，hibernate2.16后的版本提供了基于游标的数据遍历操作：<br />
            Transaction tx=session.beginTransaction();<br />
            String hql="from users";<br />
            Query query=session.createQrery(hql);<br />
            ScrollableResults sr=query.scroll();<br />
            while(sr.next()){<br />
            TUser user=(TUser)sr.get(0);<br />
            session.delete();<br />
            }<br />
            tx.commit();<br />
            2）循环删除的效率问题<br />
            &nbsp; 由于hibernate在批量删除操作过程中，需要反复调用delete SQL，存在性能问题。我们仍然可以通过调整hibernate.jdbc.batch_size参数来解决。<br />
            2.hibernate3<br />
            &nbsp; hibernate3 HQL中引入了 bulk delete/update操作， 即通过一条独立的sql语句来完成数据的批量操作。<br />
            Transaction tx=session.beginTransaction();<br />
            String hql="delete TUser";<br />
            Query query=session.createQrery(hql);<br />
            int count=query.executeUpdate();<br />
            tx.commit();<br />
            观察日志输出：<br />
            Hibernate:delete from TUser<br />
            <br />
            （二）ibatis数据缓存<br />
            &nbsp; 相对Hibernate 等封装较为严密的ORM 实现而言（因为对数据对象的操作实现<br />
            了较为严密的封装，可以保证其作用范围内的缓存同步，而ibatis 提供的是半封闭<br />
            的封装实现，因此对缓存的操作难以做到完全的自动化同步）。<br />
            &nbsp; ibatis 的缓存机制使用必须特别谨慎。特别是flushOnExecute 的设定（见<br />
            &#8220;ibatis配置&#8221;一节中的相关内容），需要考虑到所有可能引起实际数据与缓存数据<br />
            不符的操作。如本模块中其他Statement对数据的更新，其他模块对数据的更新，甚<br />
            至第三方系统对数据的更新。否则，脏数据的出现将为系统的正常运行造成极大隐患。<br />
            如果不能完全确定数据更新操作的波及范围，建议避免Cache的盲目使用。<br />
            1.iBatis cache设置<br />
            sqlmap-config.xml在&lt;sqlMapConfig&gt;里面加入<br />
            &lt;settings<br />
            &nbsp; cacheModelsEnabled="true"<br />
            &nbsp; enhancementEnabled="true"<br />
            &nbsp; lazyLoadingEnabled="true" /&gt;<br />
            maps.xml在&lt;sqlMap&gt;里面加入<br />
            &lt;cacheModel &nbsp; id="userCache" &nbsp; type="LRU" &nbsp; readonly="true" &nbsp; serialize="false"&gt;<br />
            &nbsp; &nbsp; &lt;flushInterval hours="24"/&gt;<br />
            &nbsp; &nbsp; &lt;flushOnExecute statement="insertTest"/&gt;<br />
            &nbsp; &nbsp; &lt;property name="size" value="1000" /&gt;<br />
            &lt;/cacheModel&gt;<br />
            可以看到，Cache有如下几个比较重要的属性：readOnly，serialize，type<br />
            <br />
            readOnly<br />
            &nbsp; readOnly值的是缓存中的数据对象是否只读。这里的只读并不是意味着数据对象一<br />
            旦放入缓存中就无法再对数据进行修改。而是当数据对象发生变化的时候，如数据对<br />
            象的某个属性发生了变化，则此数据对象就将被从缓存中废除，下次需要重新从数据<br />
            库读取数据，构造新的数据对象。<br />
            serialize<br />
            &nbsp; 如果需要全局的数据缓存，CacheModel的serialize属性必须被设为true。否则数据缓存只对当前Session（可简单理解为当前线程）有效，局部缓存对系统的整体性能提升有限。<br />
            Cache Type:<br />
            &nbsp; 与hibernate类似，ibatis通过缓冲接口的插件式实现，提供了多种Cache的实现机制可供选择：<br />
            1． MEMORY<br />
            2． LRU<br />
            3． FIFO<br />
            4． OSCACHE<br />
            MEMORY类型Cache与WeakReference<br />
            &nbsp; &nbsp; MEMORY 类型的Cache 实现，实际上是通过Java 对象引用进行。ibatis 中，其实现类<br />
            为com.ibatis.db.sqlmap.cache.memory.MemoryCacheController，MemoryCacheController 内部，<br />
            使用一个HashMap来保存当前需要缓存的数据对象的引用。<br />
            LRU型Cache<br />
            &nbsp; &nbsp; 当Cache达到预先设定的最大容量时，ibatis会按照&#8220;最少使用&#8221;原则将使用频率最少<br />
            的对象从缓冲中清除。可配置的参数有：<br />
            flushInterval：指定了多长时间清除缓存，上例中指定每24小时强行清空缓存区的所有内容。<br />
            size<br />
            FIFO型Cache<br />
            先进先出型缓存，最先放入Cache中的数据将被最先废除。<br />
            OSCache<br />
            （三）开源数据缓存策略OSCache<br />
            可以解决的问题：<br />
            1）信息系统中需要处理的基础数据的内容短时间内是不会发生变化的，但是在一个相对长一些的时间里，它却可能是动态增加或者减少的。<br />
            2）统计报表是一个周期性的工作，可能是半个月、一个月或者更长的时间才会需要更新一次，然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件，这些图形内容、文件的生成通常需要消耗很多的系统资源，给系统运行造成很大的负担。<br />
            &nbsp; &nbsp; OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件。OSCache支持对部分页面内容或者对页面级的响应内容进行缓存，编程者可以根据不同的需求、不同的环境选择不同的缓存级别。可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源（需要自己提供适配器）作为缓存区。<br />
            使用步骤：<br />
            1. 下载、解压缩OSCache<br />
            请到OSCache的主页<a href="http://www.opensymphony.com/oscache/download.html" target="_blank">http://www.opensymphony.com/oscache/download.html</a>下载Oscache的最新版本，作者下载的是OSCache的最新稳定版本2.0。<br />
            将下载后的。Zip文件解压缩到c:\oscache（后面的章节中将使用%OSCache_Home%来表示这个目录）目录下<br />
            2. 新建立一个web应用<br />
            3. 将主要组件%OSCache_Home%\oscache.jar放入WEB-INF\lib目录<br />
            4. commons-logging.jar、commons-collections.jar的处理<br />
            &#8226; &nbsp; &nbsp; &nbsp;OSCache组件用Jakarta Commons Logging来处理日志信息，所以需要commons-logging.jar的支持，请将%OSCache_Home%\lib\core\commons-logging.jar放入classpath（通常意味着将这个文件放入WEB-INF\lib目录） <br />
            &#8226; &nbsp; &nbsp; &nbsp;如果使用JDK1.3,请将%OSCache_Home%\lib\core\commons-collections.jar放入classpath，如果使用JDK1.4或者以上版本，则不需要了 <br />
            5. 将oscache.properties、oscache.tld放入WEB-INF\class目录<br />
            &#8226; &nbsp; &nbsp; &nbsp;%OSCache_Home%\oscache.properties包含了对OSCache运行特征值的设置信息 <br />
            &#8226; &nbsp; &nbsp; &nbsp;%OSCache_Home%\oscache.tld包含了OSCache提供的标签库的定义内容 <br />
            6. 修改web.xml文件<br />
            在web.xml文件中增加下面的内容，增加对OSCache提供的taglib的支持：<br />
            &lt;taglib&gt;&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;&lt;taglib-location&gt;/WEB-INF/classes/oscache.tld&lt;/taglib-location&gt;&lt;/taglib&gt; <br />
            7.最简单的cache标签用法<br />
            使用默认的关键字来标识cache内容，超时时间是默认的3600秒<br />
            &lt;cache:cache&gt;&lt;%//自己的JSP代码内容%&gt;&lt;/cache:cache&gt; <br />
            8. 缓存单个文件<br />
            &nbsp; &nbsp; &nbsp; 在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存，主要用于对web应用中的某些动态页面进行缓存，尤其是那些需要生成pdf格式文件/报表、图片文件等的页面，不仅减少了数据库的交互、减少数据库服务器的压力，而且对于减少web服务器的性能消耗有很显著的效果。<br />
            修改web.xml，增加如下内容，确定对/testContent.jsp页面进行缓存。<br />
            &lt;filter&gt; &nbsp; &nbsp; &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;&lt;/filter&gt;&lt;filter-mapping&gt;&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;&lt;!-对/testContent.jsp页面内容进行缓存--&gt; &nbsp; &nbsp; &lt;url-pattern&gt;/testContent.jsp&lt;/url-pattern&gt;&lt;/filter-mapping&gt;<br />
            <br />
            另一篇：<br />
            很多人对二级缓存都不太了解，或者是有错误的认识，我一直想写一篇文章介绍一下hibernate的二级缓存的，今天终于忍不住了。 <br />
            我的经验主要来自hibernate2.1版本，基本原理和3.0、3.1是一样的，请原谅我的顽固不化。<br />
            hibernate的session提供了一级缓存，每个session，对同一个id进行两次load，不会发送两条sql给数据库，但是session关闭的时候，一级缓存就失效了。<br />
            二级缓存是SessionFactory级别的全局缓存，它底下可以使用不同的缓存类库，比如ehcache、oscache等，需要设置hibernate.cache.provider_class，我们这里用ehcache，在2.1中就是 <br />
            hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider <br />
            如果使用查询缓存，加上 <br />
            hibernate.cache.use_query_cache=true<br />
            缓存可以简单的看成一个Map，通过key在缓存里面找value。<br />
            Class的缓存 <br />
            对于一条记录，也就是一个PO来说，是根据ID来找的，缓存的key就是ID，value是POJO。无论list，load还是iterate，只要读出一个对象，都会填充缓存。但是list不会使用缓存，而iterate会先取数据库select id出来，然后一个id一个id的load，如果在缓存里面有，就从缓存取，没有的话就去数据库load。假设是读写缓存，需要设置： <br />
            &lt;cache usage="read-write"/&gt; <br />
            如果你使用的二级缓存实现是ehcache的话，需要配置ehcache.xml <br />
            &lt;cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /&gt; <br />
            其中eternal表示缓存是不是永远不超时，timeToLiveSeconds是缓存中每个元素（这里也就是一个POJO）的超时时间，如果eternal="false"，超过指定的时间，这个元素就被移走了。timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put的元素超过500个时，如果overflowToDisk="true"，就会把缓存中的部分数据保存在硬盘上的临时文件里面。 <br />
            每个需要缓存的class都要这样配置。如果你没有配置，hibernate会在启动的时候警告你，然后使用defaultCache的配置，这样多个class会共享一个配置。 <br />
            当某个ID通过hibernate修改时，hibernate会知道，于是移除缓存。 <br />
            这样大家可能会想，同样的查询条件，第一次先list，第二次再iterate，就可以使用到缓存了。实际上这是很难的，因为你无法判断什么时候是第一次，而且每次查询的条件通常是不一样的，假如数据库里面有100条记录，id从1到100，第一次list的时候出了前50个id，第二次iterate的时候却查询到30至70号id，那么30-50是从缓存里面取的，51到70是从数据库取的，共发送1+20条sql。所以我一直认为iterate没有什么用，总是会有1+N的问题。 <br />
            （题外话：有说法说大型查询用list会把整个结果集装入内存，很慢，而iterate只select id比较好，但是大型查询总是要分页查的，谁也不会真的把整个结果集装进来，假如一页20条的话，iterate共需要执行21条语句，list虽然选择若干字段，比iterate第一条select id语句慢一些，但只有一条语句，不装入整个结果集hibernate还会根据数据库方言做优化，比如使用mysql的limit，整体看来应该还是list快。） <br />
            如果想要对list或者iterate查询的结果缓存，就要用到查询缓存了<br />
            查询缓存 <br />
            首先需要配置hibernate.cache.use_query_cache=true <br />
            如果用ehcache，配置ehcache.xml，注意hibernate3.0以后不是net.sf的包名了 <br />
            &lt;cache name="net.sf.hibernate.cache.StandardQueryCache" <br />
            maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600" <br />
            timeToLiveSeconds="7200" overflowToDisk="true"/&gt; <br />
            &lt;cache name="net.sf.hibernate.cache.UpdateTimestampsCache" <br />
            maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/&gt; <br />
            然后 <br />
            query.setCacheable(true);//激活查询缓存 <br />
            query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion，可选 <br />
            第二行指定要使用的cacheRegion是myCacheRegion，即你可以给每个查询缓存做一个单独的配置，使用setCacheRegion来做这个指定，需要在ehcache.xml里面配置它： <br />
            &lt;cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /&gt; <br />
            如果省略第二行，不设置cacheRegion的话，那么会使用上面提到的标准查询缓存的配置，也就是net.sf.hibernate.cache.StandardQueryCache<br />
            对于查询缓存来说，缓存的key是根据hql生成的sql，再加上参数，分页等信息（可以通过日志输出看到，不过它的输出不是很可读，最好改一下它的代码）。 <br />
            比如hql： <br />
            from Cat c where c.name like ? <br />
            生成大致如下的sql： <br />
            select * from cat c where c.name like ? <br />
            参数是"tiger%"，那么查询缓存的key*大约*是这样的字符串（我是凭记忆写的，并不精确，不过看了也该明白了）： <br />
            select * from cat c where c.name like ? , parameter:tiger% <br />
            这样，保证了同样的查询、同样的参数等条件下具有一样的key。 <br />
            现在说说缓存的value，如果是list方式的话，value在这里并不是整个结果集，而是查询出来的这一串ID。也就是说，不管是list方法还是iterate方法，第一次查询的时候，它们的查询方式很它们平时的方式是一样的，list执行一条sql，iterate执行1+N条，多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候，就都和iterate的行为一样了，根据缓存的key去缓存里面查到了value，value是一串id，然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。 <br />
            可以看出来，查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候，都是既填充查询缓存又填充class缓存的。 <br />
            这里还有一个很容易被忽视的重要问题，即打开查询缓存以后，即使是list方法也可能遇到1+N的问题！相同条件第一次list的时候，因为查询缓存中找不到，不管class缓存是否存在数据，总是发送一条sql语句到数据库获取全部数据，然后填充查询缓存和class缓存。但是第二次执行的时候，问题就来了，如果你的class缓存的超时时间比较短，现在class缓存都超时了，但是查询缓存还在，那么list方法在获取id串以后，将会一个一个去数据库load！因此，class缓存的超时时间一定不能短于查询缓存设置的超时时间！如果还设置了发呆时间的话，保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况，比如class缓存被程序强制evict了，这种情况就请自己注意了。<br />
            另外，如果hql查询包含select字句，那么查询缓存里面的value就是整个结果集了。<br />
            当hibernate更新数据库的时候，它怎么知道更新哪些查询缓存呢？ <br />
            hibernate在一个地方维护每个表的最后更新时间，其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。 <br />
            当通过hibernate更新的时候，hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表，当hibernate查询一个缓存是否存在的时候，如果缓存存在，它还要取出缓存的生成时间和这个缓存所查询的表，然后去查找这些表的最后更新时间，如果有一个表在生成时间后更新过了，那么这个缓存是无效的。 <br />
            可以看出，只要更新过一个表，那么凡是涉及到这个表的查询缓存就失效了，因此查询缓存的命中率可能会比较低。<br />
            Collection缓存 <br />
            需要在hbm的collection里面设置 <br />
            &lt;cache usage="read-write"/&gt; <br />
            假如class是Cat，collection叫children，那么ehcache里面配置 <br />
            &lt;cache name="com.xxx.pojo.Cat.children" <br />
            maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" <br />
            overflowToDisk="true" /&gt; <br />
            Collection的缓存和前面查询缓存的list一样，也是只保持一串id，但它不会因为这个表更新过就失效，一个collection缓存仅在这个collection里面的元素有增删时才失效。 <br />
            这样有一个问题，如果你的collection是根据某个字段排序的，当其中一个元素更新了该字段时，导致顺序改变时，collection缓存里面的顺序没有做更新。<br />
            缓存策略 <br />
            只读缓存（read-only）：没有什么好说的 <br />
            读/写缓存（read-write）:程序可能要的更新数据 <br />
            不严格的读/写缓存（nonstrict-read-write）：需要更新数据，但是两个事务更新同一条记录的可能性很小，性能比读写缓存好 <br />
            事务缓存（transactional）：缓存支持事务，发生异常的时候，缓存也能够回滚，只支持jta环境，这个我没有怎么研究过<br />
            读写缓存和不严格读写缓存在实现上的区别在于，读写缓存更新缓存的时候会把缓存里面的数据换成一个锁，其他事务如果去取相应的缓存数据，发现被锁住了，然后就直接取数据库查询。 <br />
            在hibernate2.1的ehcache实现中，如果锁住部分缓存的事务发生了异常，那么缓存会一直被锁住，直到60秒后超时。 <br />
            不严格读写缓存不锁定缓存中的数据。<br />
            使用二级缓存的前置条件 <br />
            你的hibernate程序对数据库有独占的写访问权，其他的进程更新了数据库，hibernate是不可能知道的。你操作数据库必需直接通过hibernate，如果你调用存储过程，或者自己使用jdbc更新数据库，hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的，但是据说3.1已经解决了这个问题。 <br />
            这个限制相当的棘手，有时候hibernate做批量更新、删除很慢，但是你却不能自己写jdbc来优化，很郁闷吧。 <br />
            SessionFactory也提供了移除缓存的方法，你一定要自己写一些JDBC的话，可以调用这些方法移除缓存，这些方法是： <br />
            void evict(Class persistentClass) <br />
            Evict all entries from the second-level cache. <br />
            void evict(Class persistentClass, Serializable id) <br />
            Evict an entry from the second-level cache. <br />
            void evictCollection(String roleName) <br />
            Evict all entries from the second-level cache. <br />
            void evictCollection(String roleName, Serializable id) <br />
            Evict an entry from the second-level cache. <br />
            void evictQueries() <br />
            Evict any query result sets cached in the default query cache region. <br />
            void evictQueries(String cacheRegion) <br />
            Evict any query result sets cached in the named query cache region. <br />
            不过我不建议这样做，因为这样很难维护。比如你现在用JDBC批量更新了某个表，有3个查询缓存会用到这个表，用evictQueries(String cacheRegion)移除了3个查询缓存，然后用evict(Class persistentClass)移除了class缓存，看上去好像完整了。不过哪天你添加了一个相关查询缓存，可能会忘记更新这里的移除代码。如果你的jdbc代码到处都是，在你添加一个查询缓存的时候，还知道其他什么地方也要做相应的改动吗？<br />
            ----------------------------------------------------<br />
            总结： <br />
            不要想当然的以为缓存一定能提高性能，仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的，不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用，可能会有1+N的问题。不当的使用还可能导致读出脏数据。 <br />
            如果受不了hibernate的诸多限制，那么还是自己在应用程序的层面上做缓存吧。 <br />
            在越高的层面上做缓存，效果就会越好。就好像尽管磁盘有缓存，数据库还是要实现自己的缓存，尽管数据库有缓存，咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么，只能做的比较通用，而高层可以有针对性的实现缓存，所以在更高的级别上做缓存，效果也要好些吧。<br />
            转自：http://blog.ccidnet.com/blog-htm-do-showone-uid-44291-type-blog-itemid-125551.html</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/Even/aggbug/187851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2008-03-22 09:50 <a href="http://www.blogjava.net/Even/archive/2008/03/22/187851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jspsmartupload文件上下传攻略转CSDN</title><link>http://www.blogjava.net/Even/archive/2007/06/12/123527.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Tue, 12 Jun 2007 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/Even/archive/2007/06/12/123527.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/123527.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2007/06/12/123527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/123527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/123527.html</trackback:ping><description><![CDATA[<span class=unnamed3><span class=myp11><font id=zoom><font face=宋体><strong>一、安装篇</strong> <br><br>　　jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件，适于嵌入执行上传下载操作的JSP文件中。该组件有以下几个特点： <br><br>1、使用简单。在JSP文件中仅仅书写三五行JAVA代码就可以搞定文件的上传或下载，方便。 <br><br>2、能全程控制上传。利用jspSmartUpload组件提供的对象及其操作方法，可以获得全部上传文件的信息（包括文件名，大小，类型，扩展名，文件数据等），方便存取。 <br><br>3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件。 <br><br>4、下载灵活。仅写两行代码，就能把Web服务器变成文件服务器。不管文件在Web服务器的目录下或在其它任何目录下，都可以利用jspSmartUpload进行下载。 <br><br>5、能将文件上传到数据库中，也能将数据库中的数据下载下来。</strong>这种功能针对的是MYSQL数据库，因为不具有通用性，所以本文不准备举例介绍这种用法。 <br><br>　　jspSmartUpload组件可以从www.jspsmart.com网站上自由下载，压缩包的名字是jspSmartUpload.zip。下载后，用WinZip或WinRAR将其解压到Tomcat的webapps目录下（本文以Tomcat服务器为例进行介绍）。解压后，将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF，这样一改jspSmartUpload类才能使用。因为Tomcat对文件名大小写敏感，它要求Web应用程序相关的类所在目录为WEB-INF，且必须是大写。接着重新启动Tomcat，这样就可以在JSP文件中使用jspSmartUpload组件了。 <br><br>　　注意，按上述方法安装后，只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件，如果想让Tomcat服务器的所有Web应用程序都能用它，必须做如下工作： <br><br>1．进入命令行状态，将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。 <br><br>2．运行JAR打包命令：jar cvf jspSmartUpload.jar com <br><br>（也可以打开资源管理器，切换到当前目录，用WinZip将com目录下的所有文件压缩成jspSmartUpload.zip，然后将jspSmartUpload.zip换名为jspSmartUpload.jar文件即可。） <br><br>3．将jspSmartUpload.jar拷贝到Tomcat的shared/lib目录下。 <br><br><strong>二、相关类说明篇</strong> <br><br><strong>㈠ File类</strong> <br><br>　　这个类包装了一个上传文件的所有信息。通过它，可以得到上传文件的文件名、文件大小、扩展名、文件数据等信息。 <br><br>　　File类主要提供以下方法： <br><br>1、saveAs作用：将文件换名另存。 <br><br>原型： <br><br>public void saveAs(java.lang.String destFilePathName) <br><br>或 <br><br>public void saveAs(java.lang.String destFilePathName, int optionSaveAs) <br><br>其中，destFilePathName是另存的文件名，optionSaveAs是另存的选项，该选项有三个值，分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL，SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件，SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件，SAVEAS_AUTO则表示让组件决定，当Web应用程序的根目录存在另存文件的目录时，它会选择SAVEAS_VIRTUAL，否则会选择SAVEAS_PHYSICAL。 <br><br>例如，saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘，则另存的文件名实际是c:uploadsample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用程序的根目录是webapps/jspsmartupload，则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用程序根目录下存在upload目录，则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)，否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。 <br><br>建议：对于Web程序的开发来说，最好使用SAVEAS_VIRTUAL，以便移植。 <br><br>2、isMissing <br><br>作用：这个方法用于判断用户是否选择了文件，也即对应的表单项是否有值。选择了文件时，它返回false。未选文件时，它返回true。 <br><br>原型：public boolean isMissing() <br><br>3、getFieldName <br><br>作用：取HTML表单中对应于此上传文件的表单项的名字。 <br><br>原型：public String getFieldName() <br><br>4、getFileName <br><br>作用：取文件名（不含目录信息） <br><br>原型：public String getFileName() <br><br>5、getFilePathName <br><br>作用：取文件全名（带目录） <br><br>原型：public String getFilePathName <br><br>6、getFileExt <br><br>作用：取文件扩展名（后缀） <br><br>原型：public String getFileExt() <br><br>7、getSize <br><br>作用：取文件长度（以字节计） <br><br>原型：public int getSize() <br><br>8、getBinaryData <br><br>作用：取文件数据中指定位移处的一个字节，用于检测文件等处理。 <br><br>原型：public byte getBinaryData(int index)。其中，index表示位移，其值在0到getSize()-1之间。 <br><br><strong>㈡ Files类</strong> <br><br>　　这个类表示所有上传文件的集合，通过它可以得到上传文件的数目、大小等信息。有以下方法： <br><br>1、getCount <br><br>作用：取得上传文件的数目。 <br><br>原型：public int getCount() <br><br>2、getFile <br><br>作用：取得指定位移处的文件对象File（这是com.jspsmart.upload.File，不是java.io.File，注意区分）。 <br><br>原型：public File getFile(int index)。其中，index为指定位移，其值在0到getCount()-1之间。 <br><br>3、getSize <br><br>作用：取得上传文件的总长度，可用于限制一次性上传的数据量大小。 <br><br>原型：public long getSize() <br><br>4、getCollection <br><br>作用：将所有上传文件对象以Collection的形式返回，以便其它应用程序引用，浏览上传文件信息。 <br><br>原型：public Collection getCollection() <br><br>5、getEnumeration <br><br>作用：将所有上传文件对象以Enumeration（枚举）的形式返回，以便其它应用程序浏览上传文件信息。 <br><br>原型：public Enumeration getEnumeration() <br><br><strong>㈢ Request类</strong> <br><br>　　这个类的功能等同于JSP内置的对象request。只所以提供这个类，是因为对于文件上传表单，通过request对象无法获得表单项的值，必须通过jspSmartUpload组件提供的Request对象来获取。该类提供如下方法： <br><br>1、getParameter <br><br>作用：获取指定参数之值。当参数不存在时，返回值为null。 <br><br>原型：public String getParameter(String name)。其中，name为参数的名字。 <br><br>2、getParameterValues <br><br>作用：当一个参数可以有多个值时，用此方法来取其值。它返回的是一个字符串数组。当参数不存在时，返回值为null。 <br><br>原型：public String[] getParameterValues(String name)。其中，name为参数的名字。 <br><br>3、getParameterNames <br><br>作用：取得Request对象中所有参数的名字，用于遍历所有参数。它返回的是一个枚举型的对象。 <br><br>原型：public Enumeration getParameterNames() <br><br><strong>㈣ SmartUpload类</strong>这个类完成上传下载工作。 <br><br><strong>A．上传与下载共用的方法：</strong> <br><br>只有一个：initialize。 <br><br>作用：执行上传下载的初始化工作，必须第一个执行。 <br><br>原型：有多个，主要使用下面这个： <br><br>public final void initialize(javax.servlet.jsp.PageContext pageContext) <br><br>其中，pageContext为JSP页面内置对象（页面上下文）。 <br><br><strong>B．上传文件使用的方法：</strong> <br><br>1、upload <br><br>作用：上传文件数据。对于上传操作，第一步执行initialize方法，第二步就要执行这个方法。 <br><br>原型：public void upload() <br><br>2、save <br><br>作用：将全部上传文件保存到指定目录下，并返回保存的文件个数。 <br><br>原型：public int save(String destPathName) <br><br>和public int save(String destPathName,int option) <br><br>其中，destPathName为文件保存目录，option为保存选项，它有三个值，分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。（同File类的saveAs方法的选项之值类似）SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下，SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下，而SAVE_AUTO则表示由组件自动选择。 <br><br>注：save(destPathName)作用等同于save(destPathName,SAVE_AUTO)。 <br><br>3、getSize <br><br>作用：取上传文件数据的总长度 <br><br>原型：public int getSize() <br><br>4、getFiles <br><br>作用：取全部上传文件，以Files对象形式返回，可以利用Files类的操作方法来获得上传文件的数目等信息。 <br><br>原型：public Files getFiles() <br><br>5、getRequest <br><br>作用：取得Request对象，以便由此对象获得上传表单参数之值。 <br><br>原型：public Request getRequest() <br><br>6、setAllowedFilesList <br><br>作用：设定允许上传带有指定扩展名的文件，当上传过程中有文件名不允许时，组件将抛出异常。 <br><br>原型：public void setAllowedFilesList(String allowedFilesList) <br><br>其中，allowedFilesList为允许上传的文件扩展名列表，各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文件，可以用两个逗号表示。例如：setAllowedFilesList("doc,txt,,")将允许上传带doc和txt扩展名的文件以及没有扩展名的文件。 <br><br>7、setDeniedFilesList <br><br>作用：用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限制，则上传时组件将抛出异常。 <br><br>原型：public void setDeniedFilesList(String deniedFilesList) <br><br>其中，deniedFilesList为禁止上传的文件扩展名列表，各个扩展名之间以逗号分隔。如果想禁止上传那些没有扩展名的文件，可以用两个逗号来表示。例如：setDeniedFilesList("exe,bat,,")将禁止上传带exe和bat扩展名的文件以及没有扩展名的文件。 <br><br>8、setMaxFileSize <br><br>作用：设定每个文件允许上传的最大长度。 <br><br>原型：public void setMaxFileSize(long maxFileSize) <br><br>其中，maxFileSize为为每个文件允许上传的最大长度，当文件超出此长度时，将不被上传。 <br><br>9、setTotalMaxFileSize <br><br>作用：设定允许上传的文件的总长度，用于限制一次性上传的数据量大小。 <br><br>原型：public void setTotalMaxFileSize(long totalMaxFileSize) <br><br>其中，totalMaxFileSize为允许上传的文件的总长度。 <br><br><strong>C．下载文件常用的方法</strong> <br><br>1、setContentDisposition <br><br>作用：将数据追加到MIME文件头的CONTENT-DISPOSITION域。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域，如果用户需要添加额外信息，请用此方法。 <br><br>原型：public void setContentDisposition(String contentDisposition) <br><br>其中，contentDisposition为要添加的数据。如果contentDisposition为null，则组件将自动添加"attachment;"，以表明将下载的文件作为附件，结果是IE浏览器将会提示另存文件，而不是自动打开这个文件（IE浏览器一般根据下载的文件扩展名决定执行什么操作，扩展名为doc的将用word程序打开，扩展名为pdf的将用acrobat程序打开，等等）。 <br><br>2、downloadFile <br><br>作用：下载文件。 <br><br>原型：共有以下三个原型可用，第一个最常用，后两个用于特殊情况下的文件下载（如更改内容类型，更改另存的文件名）。 <br><br>① public void downloadFile(String sourceFilePathName) <br><br>其中，sourceFilePathName为要下载的文件名（带目录的文件全名） <br><br>② public void downloadFile(String sourceFilePathName,String contentType) <br><br>其中，sourceFilePathName为要下载的文件名（带目录的文件全名）,contentType为内容类型（MIME格式的文件类型信息，可被浏览器识别）。 <br><br>③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName) <br><br>其中，sourceFilePathName为要下载的文件名（带目录的文件全名）,contentType为内容类型（MIME格式的文件类型信息，可被浏览器识别）,destFileName为下载后默认的另存文件名。 <br><br><strong>三、文件上传篇</strong> <br><br><strong>㈠ 表单要求</strong> <br><br>对于上传文件的FORM表单，有两个要求： <br><br>1、METHOD应用POST，即METHOD="POST"。 <br><br>2、增加属性：ENCTYPE="multipart/form-data" <br><br>下面是一个用于上传文件的FORM表单的例子： <br><br><ccid_nobr></font>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code bgColor=#e6e6e6>
            <pre><ccid_code>&lt;FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="/jspSmartUpload/upload.jsp"&gt;&lt;INPUT TYPE="FILE" NAME="MYFILE"&gt;&lt;INPUT TYPE="SUBMIT"&gt;&lt;/FORM&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br><br><strong>㈡ 上传的例子</strong> <br><br><strong>1、上传页面upload.html</strong> <br><br>本页面提供表单，让用户选择要上传的文件，点击"上传"按钮执行上传操作。 <br><br>页面源码如下： <br><br><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code bgColor=#e6e6e6>
            <pre><ccid_code>&lt;!-- 文件名：upload.html 作 者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)--&gt;&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;文件上传&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="center"&gt;上传文件选择&lt;/p&gt;&lt;FORM METHOD="POST" ACTION="jsp/do_upload.jsp"ENCTYPE="multipart/form-data"&gt;&lt;input type="hidden" name="TEST" value="good"&gt; &lt;table width="75%" border="1" align="center"&gt; &lt;tr&gt; &lt;td&gt;&lt;div align="center"&gt;1、 &lt;input type="FILE" name="FILE1" size="30"&gt; &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;div align="center"&gt;2、 &lt;input type="FILE" name="FILE2" size="30"&gt; &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;div align="center"&gt;3、 &lt;input type="FILE" name="FILE3" size="30"&gt; &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;div align="center"&gt;4、 &lt;input type="FILE" name="FILE4" size="30"&gt; &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;div align="center"&gt; &lt;input type="submit" name="Submit" value="上传它！"&gt; &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt;&lt;/FORM&gt;&lt;/body&gt;&lt;/html&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br><br><strong>2、上传处理页面do_upload.jsp</strong> <br><br>本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法，在此不赘述了。 <br><br>页面源码如下： <br><br><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code bgColor=#e6e6e6>
            <pre><ccid_code>&lt;%-- 文件名：do_upload.jsp 作 者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)--%&gt;&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,com.jspsmart.upload.*" errorPage="" %&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;文件上传处理页面&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;&lt;/head&gt;&lt;body&gt;&lt;% // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 上传初始化 su.initialize(pageContext); // 设定上传限制 // 1.限制每个上传文件的最大长度。 // su.setMaxFileSize(10000); // 2.限制总上传数据的长度。 // su.setTotalMaxFileSize(20000); // 3.设定允许上传的文件（通过扩展名限制）,仅允许doc,txt文件。 // su.setAllowedFilesList("doc,txt"); // 4.设定禁止上传的文件（通过扩展名限制）,禁止上传带有exe,bat, jsp,htm,html扩展名的文件和没有扩展名的文件。 // su.setDeniedFilesList("exe,bat,jsp,htm,html,,"); // 上传文件 su.upload(); // 将上传文件全部保存到指定目录 int count = su.save("/upload"); out.println(count+"个文件上传成功！&lt;br&gt;"); // 利用Request对象获取参数之值 out.println("TEST="+su.getRequest().getParameter("TEST") +"&lt;BR&gt;&lt;BR&gt;"); // 逐一提取上传文件信息，同时可保存文件。 for (int i=0;i&lt;su.getFiles().getCount();i++) { com.jspsmart.upload.File file = su.getFiles().getFile(i); // 若文件不存在则继续 if (file.isMissing()) continue; // 显示当前文件信息 out.println("&lt;TABLE BORDER=1&gt;"); out.println("&lt;TR&gt;&lt;TD&gt;表单项名（FieldName）&lt;/TD&gt;&lt;TD&gt;" + file.getFieldName() + "&lt;/TD&gt;&lt;/TR&gt;"); out.println("&lt;TR&gt;&lt;TD&gt;文件长度（Size）&lt;/TD&gt;&lt;TD&gt;" + file.getSize() + "&lt;/TD&gt;&lt;/TR&gt;"); out.println("&lt;TR&gt;&lt;TD&gt;文件名（FileName）&lt;/TD&gt;&lt;TD&gt;" + file.getFileName() + "&lt;/TD&gt;&lt;/TR&gt;"); out.println("&lt;TR&gt;&lt;TD&gt;文件扩展名（FileExt）&lt;/TD&gt;&lt;TD&gt;" + file.getFileExt() + "&lt;/TD&gt;&lt;/TR&gt;"); out.println("&lt;TR&gt;&lt;TD&gt;文件全名（FilePathName）&lt;/TD&gt;&lt;TD&gt;" + file.getFilePathName() + "&lt;/TD&gt;&lt;/TR&gt;"); out.println("&lt;/TABLE&gt;&lt;BR&gt;"); // 将文件另存 // file.saveAs("/upload/" + myFile.getFileName()); // 另存到以WEB应用程序的根目录为文件根目录的目录下 // file.saveAs("/upload/" + myFile.getFileName(), su.SAVE_VIRTUAL); // 另存到操作系统的根目录为文件根目录的目录下 // file.saveAs("c:\temp\" + myFile.getFileName(), su.SAVE_PHYSICAL); }%&gt;&lt;/body&gt;&lt;/html&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br><br><strong>四、文件下载篇</strong> <br><br><strong>1、下载链接页面download.html</strong> <br><br>页面源码如下： <br><br><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code bgColor=#e6e6e6>
            <pre><ccid_code>&lt;!-- 文件名：download.html 作 者：纵横软件制作中心雨亦奇(zhsoft88@sohu.com)--&gt;&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;下载&lt;/title&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;&lt;/head&gt;&lt;body&gt;&lt;a href="jsp/do_download.jsp"&gt;点击下载&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br><br><strong>2、下载处理页面do_download.jsp</strong> do_download.jsp展示了如何利用jspSmartUpload组件来下载文件，从下面的源码中就可以看到，下载何其简单。 <br><br>源码如下： <br><br><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code bgColor=#e6e6e6>
            <pre><ccid_code>&lt;%@ page contentType="text/html;charset=gb2312" import="com.jspsmart.upload.*" %&gt;&lt;% // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始化 su.initialize(pageContext); // 设定contentDisposition为null以禁止浏览器自动打开文件， //保证点击链接后是下载文件。若不设定，则下载的文件扩展名为 //doc时，浏览器将自动用word打开它。扩展名为pdf时， //浏览器将用acrobat打开。 su.setContentDisposition(null); // 下载文件 su.downloadFile("/upload/如何赚取我的第一桶金.doc");%&gt;</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br><br><ccid_code>注意，执行下载的页面，在Java脚本范围外（即&lt;% ... %&gt;之外），不要包含HTML代码、空格、回车或换行等字符，有的话将不能正确下载。不信的话，可以在上述源码中%&gt;&lt;%之间加入一个换行符，再下载一下，保证出错。因为它影响了返回给浏览器的数据流，导致解析出错。</ccid_code> <br><br><strong>3、如何下载中文文件</strong> <br><br>jspSmartUpload虽然能下载文件，但对中文支持不足。若下载的文件名中有汉字，则浏览器在提示另存的文件名时，显示的是一堆乱码，很扫人兴。上面的例子就是这样。（这个问题也是众多下载组件所存在的问题，很少有人解决，搜索不到相关资料，可叹！） <br><br>为了给jspSmartUpload组件增加下载中文文件的支持，我对该组件进行了研究，发现对返回给浏览器的另存文件名进行UTF-8编码后，浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理，增加了toUtf8String这个方法，改动部分源码如下： <br><br><ccid_nobr>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td class=code bgColor=#e6e6e6>
            <pre><ccid_code>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) &amp;&amp; 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 &lt; l) { int j = fileinputstream.read(abyte0, 0, i); k += j; m_response.getOutputStream().write(abyte0, 0, j); } fileinputstream.close(); } /** * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名. * 纵横软件制作中心雨亦奇2003.08.01 * @param s 原文件名 * @return 重新编码后的文件名 */ public static String toUtf8String(String s) { StringBuffer sb = new StringBuffer(); for (int i=0;i&lt;s.length();i++) { char c = s.charAt(i); if (c &gt;= 0 &amp;&amp; c &lt;= 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 &lt; b.length; j++) { int k = b[j]; if (k &lt; 0) k += 256; sb.append("%" + Integer.toHexString(k). toUpperCase()); } } } return sb.toString(); }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr><br><br>注意源码中粗体部分，原jspSmartUpload组件对返回的文件未作任何处理，现在做了编码的转换工作，将文件名转换为UTF-8形式的编码形式。UTF-8编码对英文未作任何处理，对中文则需要转换为%XX的形式。toUtf8String方法中，直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码，之后将其转换为%XX的形式。 <br><br>将源码编译后打包成jspSmartUpload.jar，拷贝到Tomcat的shared/lib目录下（可为所有WEB应用程序所共享），然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另，toUtf8String方法也可用于转换含有中文的超级链接，以保证链接的有效，因为有的WEB服务器不支持中文链接。 <br><br>小结：jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件，它使用简单，方便。现在我又为其加上了下载中文名字的文件的支持，真个是如虎添翼，必将赢得更多开发者的青睐。 </font></span></span><br>
<img src ="http://www.blogjava.net/Even/aggbug/123527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2007-06-12 09:45 <a href="http://www.blogjava.net/Even/archive/2007/06/12/123527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java RMI的简单例子</title><link>http://www.blogjava.net/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.blogjava.net/Even/archive/2007/05/26/120137.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/120137.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2007/05/26/120137.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/120137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/120137.html</trackback:ping><description><![CDATA[<span id=ArticleContent1_ArticleContent1_lblContent>&nbsp;
<p>现在虽然我们很少用到RMI进行编程，但是做为Java一个最早的分布式解决方案，我们还是有了解的必要，从例子开始吧（虽然是几年前的了）！</p>
<p>远程接口RmiHelloRemoteIntfc .java</p>
<p>import java.rmi.*;</p>
<p>public interface RmiHelloRemoteIntfc extends Remote<br>{<br>&nbsp;&nbsp; String helloRemoteObj(String client) throws RemoteException;<br>}</p>
<p>远程接口的实现类RmiHelloRemoteObj.java</p>
<p>import java.rmi.server.*;<br>import java.rmi.*;</p>
<p>public class RmiHelloRemoteObj extends UnicastRemoteObject implements RmiHelloRemoteIntfc<br>{</p>
<p>&nbsp; public RmiHelloRemoteObj() throws RemoteException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; super();<br>&nbsp; }</p>
<p>&nbsp; public String helloRemoteObj(String client) throws RemoteException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; return "Hello World"+client;<br>&nbsp; }</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>&nbsp; public RmiHelloServer()<br>&nbsp; {<br>&nbsp; }<br>&nbsp; public static void main(String[] args)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; //创建并安装安全管理器<br>&nbsp;&nbsp;&nbsp; if(System.getSecurityManager()==null)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.setSecurityManager(new RMISecurityManager());<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建远程对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RmiHelloRemoteObj ttt=new RmiHelloRemoteObj();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //启动注册表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LocateRegistry.createRegistry(2222);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //奖名称绑定到对象<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Naming.rebind("//Fangm:2222/helloObj",ttt);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("RMI服务器正在运行。。。。。。");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp; }<br>}</p>
<p>服务器端的权限文件RmiHelloServer.policy</p>
<p>grant codeBase<br>"file:/e:/download/rmitest/"<br>{<br>&nbsp;permission java.net.SocketPermission <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "*:1000-9999","accept,connect,listen,resolve";<br>};</p>
<p>&nbsp;</p>
<p>现在就看看Client端是如何连接服务器和进行远程方法的调用的吧<br></p>
<p>import java.rmi.*;<br>import java.rmi.server.*;</p>
<p>public class RmiHelloClient<br>{</p>
<p>&nbsp; public RmiHelloClient()<br>&nbsp; {<br>&nbsp; }<br>&nbsp; public static void main(String[] args)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; //创建并安装安全管理器<br>&nbsp;&nbsp;&nbsp; if(System.getSecurityManager()==null)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.setSecurityManager(new RMISecurityManager());<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RmiHelloRemoteIntfc c1=(RmiHelloRemoteIntfc)Naming.lookup("rmi://Fangm:2222/helloObj");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(c1.helloRemoteObj("Everyone"));<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch(Exception e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; System.exit(0);</p>
<p>&nbsp;</p>
<p>&nbsp; }<br>}</p>
<p>Client端的权限文件RmiHelloClient.policy</p>
<p>grant codeBase<br>"file:/e:/download/rmitest/"<br>{<br>&nbsp; permission java.net.SocketPermission <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "*:1000-9999","accept,connect,listen,resolve";<br>};</p>
<p>好了，一个最简单的RMI例子就安无了，对了还少了最重要的一步，那就是编译和运行呢？我们就来了个Bat或Cmd的批处理来进行吧，</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 在另一个窗口启动服务器，请稍后。。。<br>start java&nbsp; -Djava.security.policy=RmiHelloServer.policy RmiHelloServer</p>
<p>echo 运行客户程序。。。<br>java -Djava.security.policy=RmiHelloClient.policy RmiHelloClient<br><br>这个文件很简单吧！包你一试就通，虽然简单，不过对于初学者来说，还是很不错的哦！</p>
</span>
<img src ="http://www.blogjava.net/Even/aggbug/120137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2007-05-26 09:41 <a href="http://www.blogjava.net/Even/archive/2007/05/26/120137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java读出配置文件的方法</title><link>http://www.blogjava.net/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.blogjava.net/Even/archive/2007/05/26/120136.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/120136.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2007/05/26/120136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/120136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/120136.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在现实工作中，我们常常需要保存一些系统配置信息，大家一般都会选择配置文件来完成，本文根据笔者工作中用到的读取配置文件的方法小小总结一下，主要叙述的是spring读取配置文件的方法。
<div><strong>一.读取xml配置文件</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">&nbsp;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">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;HelloBean&nbsp;</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>&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;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>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;String&nbsp;getHelloWorld()&nbsp;</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>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;helloWorld;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</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>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setHelloWorld(String&nbsp;helloWorld)&nbsp;</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>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.helloWorld&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;helloWorld;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</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">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans.dtd"&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="helloBean"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="chb.demo.vo.HelloBean"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="helloWorld"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Hello!chb!</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</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>&nbsp;</p>
<p>(三)读取xml文件</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&nbsp;context&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;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>&nbsp;HelloBean&nbsp;helloBean&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(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>&nbsp;System.out.println(helloBean.getHelloWorld());<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
</div>
<div>&nbsp;&nbsp;2.利用FileSystemResource读取
<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">&nbsp;Resource&nbsp;rs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;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>&nbsp;&nbsp;BeanFactory&nbsp;factory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;XmlBeanFactory(rs);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;HelloBean&nbsp;helloBean&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(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>&nbsp;&nbsp;System.out.println(helloBean.getHelloWorld());<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
</div>
<div>&nbsp;值得注意的是：利用FileSystemResource，则配置文件必须放在project直接目录下，或者写明绝对路径，否则就会抛出找不到文件的异常</div>
</blockquote>
<div><strong>二.读取properties配置文件</strong></div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div>这里介绍两种技术：利用spring读取properties 文件和利用java.util.Properties读取</div>
<div></div>
<div>(一)利用spring读取properties 文件</div>
<div></div>
<div>我们还利用上面的HelloBean.java文件，构造如下beanConfig.properties文件:</div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div>helloBean.class=chb.demo.vo.HelloBean<br>helloBean.helloWorld=Hello!chb!</div>
</blockquote>
<div>属性文件中的"helloBean"名称即是Bean的别名设定，.class用于指定类来源。</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">&nbsp;&nbsp;BeanDefinitionRegistry&nbsp;reg&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DefaultListableBeanFactory();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;PropertiesBeanDefinitionReader&nbsp;reader&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;PropertiesBeanDefinitionReader(reg);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;reader.loadBeanDefinitions(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;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>&nbsp;&nbsp;BeanFactory&nbsp;factory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(BeanFactory)reg;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;HelloBean&nbsp;helloBean&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(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>&nbsp;&nbsp;System.out.println(helloBean.getHelloWorld());</span></div>
</div>
</div>
<div></div>
<div>(二)利用java.util.Properties读取属性文件</div>
<div></div>
<div>比如，我们构造一个ipConfig.properties来保存服务器ip地址和端口，如：</div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div>
<div>ip=192.168.0.1<br>port=8080</div>
</div>
</blockquote>
<div>则，我们可以用如下程序来获得服务器配置信息：</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">&nbsp;&nbsp;InputStream&nbsp;inputStream&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</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>&nbsp;&nbsp;Properties&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;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>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;</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>&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;e1)&nbsp;</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>&nbsp;&nbsp;&nbsp;e1.printStackTrace();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</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>本文只介绍了一些简单操作，不当之处希望大家多多指教</div>
</blockquote>&nbsp;<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1516911</p>
<img src ="http://www.blogjava.net/Even/aggbug/120136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2007-05-26 09:40 <a href="http://www.blogjava.net/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.blogjava.net/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.blogjava.net/Even/archive/2007/05/26/120135.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/120135.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2007/05/26/120135.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/120135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/120135.html</trackback:ping><description><![CDATA[<p>昨天写一个JavaMail的程序，发现原来自己忘记了那么多呢，现在补上资料，方便以后回忆。<br><br></p>
<div>1.介绍: <br><br>Java Mail API的开发是SUN为Java开发者提供公用API框架的持续努力的良好例证。提倡公用框架，反对受限于供应商的解决方案，充分预示着一个日益开放的开发环境的建立。 <br>　　Java Mail API的结构本身证明了它的开发者的基本目标之一--软件开发的工作量应该取决于应用程序本身的复杂程度以及开发者所要求的控制程度。换句话说，Java Mail API尽可能地保持简单。乍看起来，JavaMail API所拥有的类总数以及类之间的关系可能让人误解为要花费漫长的学习时间。实际上，一旦正式开始使用，你就会发现该API不失为在应用程序中加入健壮的邮件/通讯支持的简单工具。 <br><br>2.安装: <br><br>安装前要确保你的机子上安装得有标准版的JDK和Web服务器,并且已配置好,有关它们的安装方法,请参考其它文章(网上到处都有). <br><br>(1).安装JavaMail API。现在最常用的 JavaMail API 版本是1.3. <br>　　要使用 JavaMail 1.3 API，请下载 JavaMail 1.3 实现，解开Javamail-1_3.zip 文件，并将 mail.jar 文件添加到 CLASSPATH 中。除了核心类，随版本 1.3 实现一起提供的还有 SMTP、IMAP4 和 POP3 供应商。 <br>　　 <br>(2).JavaBeans Activation Framework(1.0.2版) 的安装 <br>JavaMail API 的所有版本都需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理。功能似乎不多，但目前许多浏览器和邮件工具中都能找到这种基本的 MIME 型支持。下载完框架后，解开 jaf1_0_2.zip 文件，并将 activation.jar 文件添加到 CLASSPATH 中。 <br>　　 <br><br>注: 如果您使用的JDK是J2EE，就没有什么特定的事非要用基本 JavaMail API来做不可；J2EE 的类就能处理了,因为它本身就包含有JavaMail API和JAF,您只需要确将 j2ee.jar 文件添加到您的CLASSPATH 中并已全部设置好。 </div>
<div>&nbsp;</div>
<div><br>3.JavaMail的常用类介绍 <br><br>事先说明: <br><br>没用过JavaMail的人可能看不懂这些介绍,不过不要紧,后面的文章有具体的实例,到时也可倒回来查看这些类的用法. <br><br><br>(1) javax.mail.Properties类 <br>　　JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host"，属性值就是发送邮件的主机. <br><br>用法: <br>　Properties props = new Properties (); <br>　　　props.put("mail.smtp.host", "smtp.163.com");//可以换上你的smtp主机名。 <br><br><br>(2) javax.mail.Session类 <br>　　这个Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session但是可以有任意多的session。 在这个例子中, Session对象需要知道用来处理邮件的SMTP 服务器。 <br><br>用法: <br>　　 Session sendMailSession; <br>　　 sendMailSession = Session.getInstance(props, null); <br><br><br>(3) javax.mail.Transport类 <br>　　邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能：Transport 和Store. Transport 是用来发送信息的，而Store用来收信。对于这的教程我们只需要用到Transport对象。 <br><br>用法： <br>Transport transport; <br>　 transport = sendMailSession.getTransport("smtp"); <br><br>　　用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议，如"smtp"。这将为我们省了很多时间。因为JavaMail以境内置了很多协议的实现方法。 <br><br>　注意: JavaMail并不是绝对支持每一个协议，目前支持IMAP、 SMTP和 POP3. <br><br><br>(4) javax.mail.MimeMessage类 <br>　　Message对象将存储我们实际发送的电子邮件信息，Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。 <br><br>　　用法： <br>Message newMessage = new MimeMessage(sendMailSession); <br><br><br>(5) javax.mail.InternetAddress类 <br>一旦您创建了 Session 和 Message，并将内容填入消息后，就可以用Address确定信件地址了。和 Message 一样，Address 也是个抽象类。您用的是Javax.mail.internet.InternetAddress 类. <br><br>用法: <br>InternetAddress from=new InternetAddress("xxf@cafe.com"); <br><br><br>(6) javax.mail.Store类 <br>Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。 <br><br>用法: <br>Store store=s.getSorte("pop3");//s为一个邮件会话 <br>store.connect(popserver,username,password);//通过你提供的pop地址,用户名和密码登录你的邮箱 <br><br><br>(7) javax.mail.Folder类 <br>Folder类用于分级组织邮件，并提供照Javax.mail.Message格式访问email的能力。 <br><br>用法: <br>Folder folder=store.getFolder("INBOX"); <br>folder.open(Folder.READ_ONLY); <br><br><br>(8) javax.mail.Internet.MimeMultpart <br>一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法.由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象. <br><br>用法: <br>MimeMultipart multipart=new MimeMultipart(); <br><br>注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart(BodyPart类在下面紧接着要介绍)对象.消息可以有很多部分,一个BodyPart可以代表一个部分. <br><br><br>(9) javax.mail.Internet.MimeBodyPart类 <br><br>MimeBodyPart是BodyPart具体用于mimeMessage的一个子类. <br>MimeBodyPart对象代表一个MimeMessage对象内容的一部分.每个MimeBodyPart被认为有两部分: <br>⊙一个MIME类型 <br>⊙匹配这个类型的内容 <br><br>用法: <br>MimeBodyPart mdp=new MimeBodyPart(); <br>String text="Hello JavaMail!"; <br>mdp.setContent(text,"text/plain");//定义MIME类型为text/plain,并设置MimeBodyPart的内容. <br><br><br>(10) javax.activation.DataHandler类(包含在JAF中) <br>JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分.除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的.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.FileDataSource类(包含在JAF中) <br>一个FileDataSource对象可以表示本地文件和服务器可以直接访问的资源.一个本地文件可以通过创建一个新的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.URLDataSource类(包含在JAF中) <br>远程资源,URL不会指向它们,由一个URLDataSource对象表示.一个远程资源可以通过创建一个新mimeBodyPart对象附在一个mimeMessage对象上(同FileDataSource差不多). <br><br>用法: <br>与FileDataSource唯一不同的是数据源的设置: <br>URLDataSource uds=new URLDataSource( <a href="http://www.cnjsp.com/logo.gif"><u><font color=#0000ff>http://www.cnjsp.com/logo.gif</font></u></a> ); </div>
<div>&nbsp;</div>
<div><br>4.试着编写第一个发送程序 <br><br>在前面我们已对JavaMail作了一些介绍,下面我们可试着写自己的程序了. <br><br>首先,我们先写一个撰写邮件的html程序index.htm,如下: <br>------------------------------------------------------------------------------------------- <br>&lt; html &gt; <br>&lt; head &gt; <br>&lt; meta http-equiv="Content-Type" content="text/html; charset=gb2312" &gt; <br>&lt; title &gt; 撰写邮件 &lt; /title &gt; <br>&lt; /head &gt; <br><br>&lt; body &gt; <br>&lt; form name="form1" method="post" action="testmail.jsp" &gt; <br>&lt; table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black" &gt; <br>&lt; tr bgcolor="#FFFFFF" &gt; <br>&lt; td width="24%" &gt; 收信人地址: &lt; /td &gt; <br>&lt; td width="76%" &gt; <br>&lt; input name="to" type="text" id="to" &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr bgcolor="#FFFFFF" &gt; <br>&lt; td &gt; 主题: &lt; /td &gt; <br>&lt; td &gt; <br>&lt; input name="title" type="text" id="title" &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr &gt; <br>&lt; td height="107" colspan="2" bgcolor="#FFFFFF" &gt; <br>&lt; textarea name="content" cols="50" rows="5" id="content" &gt;&lt; /textarea &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr align="center" &gt; <br>&lt; td colspan="2" bgcolor="#FFFFFF" &gt; <br>&lt; input type="submit" name="Submit" value="发送" &gt; <br>&lt; input type="reset" name="Submit2" value="重置" &gt; <br>&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; /table &gt; <br>&lt; /form &gt; <br>&lt; /body &gt; <br>&lt; /html &gt; <br><br><br>接着,我们再写一个处理程序testmail.jsp,如下: <br>----------------------------------------------------------------------------------------- <br>&lt; %@ page contentType="text/html;charset=GB2312" % &gt; <br>&lt; %request.setCharacterEncoding("gb2312");% &gt;&lt; !--中文处理代码-- &gt; <br><br>&lt; !--引入要用到的类库-- &gt; <br>&lt; %@ page import="java.util.*,javax.mail.*"% &gt; <br>&lt; %@ page import="javax.mail.internet.*"% &gt; <br><br>&lt; html &gt; <br>&lt; head &gt; <br>&lt; meta http-equiv="Content-Type" content="text/html; charset=gb2312" &gt; <br>&lt; title &gt; 发送成功 &lt; /title &gt; <br>&lt; /head &gt; <br><br>&lt; body &gt; <br>&lt; % <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);//根据属性新建一个邮件会话 <br>s.setDebug(true); <br><br>MimeMessage message=new MimeMessage(s);//由邮件会话新建一个消息对象 <br><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);//设置收件人,并设置其接收类型为TO <br>message.setSubject(ttitle);//设置主题 <br>message.setText(tcontent);//设置信件内容 <br>message.setSentDate(new Date());//设置发信时间 <br><br>//发送邮件 <br>message.saveChanges();//存储邮件信息 <br>Transport transport=s.getTransport("smtp"); <br>transport.connect("smtp.163.net","boy","iloveyou");//以smtp方式登录邮箱 <br>transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有 <br>//已设好的收件人地址 <br>transport.close(); <br><br>% &gt; <br>&lt; div align="center" &gt; <br>&lt; p &gt;&lt; font color="#FF6600" &gt; 发送成功! &lt; /font &gt;&lt; /p &gt; <br>&lt; p &gt;&lt; a href="recmail.jsp" &gt; 去看看我的信箱 &lt; /a &gt;&lt; br &gt; <br>&lt; br &gt; <br>&lt; a href="index.htm" &gt; 再发一封 &lt; /a &gt; &lt; /p &gt; <br>&lt; /div &gt; <br>&lt; % <br>}catch(MessagingException e){ <br>out.println(e.toString()); <br>} <br>% &gt; <br>&lt; /body &gt; <br>&lt; /html &gt; <br><br>**********************************注意*************************************** <br><br>有好多书上和网上的文章在关键部分都是这样写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>事实上,这种方式并不可靠,因为很多电子邮局的smtp服务器要求我们通过验证,所以用这种方式发邮件时,只能发给同类邮箱(即相同smtp的邮箱),甚至有时同类邮箱也发不出去.以上两种方式我试过很多次,结果证明第一种方式是最可靠的. <br><br><br>好了,我相信你应该会写最简单的Email发送程序了.OK,下一次我们将说说怎样写发送HTML格式的邮件. </div>
<div>&nbsp;</div>
<div>5.发送HTML格式的邮件 <br><br>所谓HTML格式,就是超文本格式.你的邮件可以用HTML代码编写,发给对方后,对方收到的将是信息将是超文本,超文本比纯文本好看多了.下以面是在以前例子的基础上修改的程序: <br><br>&lt; %@ page contentType="text/html;charset=GB2312" % &gt; <br>&lt; %request.setCharacterEncoding("gb2312");% &gt; <br>&lt; %@ page import="java.util.*,javax.mail.*"% &gt; <br>&lt; %@ page import="javax.mail.internet.*"% &gt; <br>&lt; html &gt; <br>&lt; head &gt; <br>&lt; meta http-equiv="Content-Type" content="text/html; charset=gb2312" &gt; <br>&lt; title &gt; 发送成功 &lt; /title &gt; <br>&lt; /head &gt; <br><br>&lt; body &gt; <br>&lt; % <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>//给消息对象设置发件人/收件人/主题/发信时间 <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>//给消息对象设置内容 <br>BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象 <br>mdp.setContent(tcontent,"text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式 <br>Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放BodyPart对 <br>//象(事实上可以存放多个) <br>mm.addBodyPart(mdp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart) <br>message.setContent(mm);//把mm作为消息对象的内容 <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>% &gt; <br>&lt; div align="center" &gt; <br>&lt; p &gt;&lt; font color="#FF6600" &gt; 发送成功! &lt; /font &gt;&lt; /p &gt; <br>&lt; p &gt;&lt; a href="recmail.jsp" &gt; 去看看我的信箱 &lt; /a &gt;&lt; br &gt; <br>&lt; br &gt; <br>&lt; a href="index.htm" &gt; 再发一封 &lt; /a &gt; &lt; /p &gt; <br>&lt; /div &gt; <br>&lt; % <br>}catch(MessagingException e){ <br>out.println(e.toString()); <br>} <br>% &gt; <br>&lt; /body &gt; <br>&lt; /html &gt; <br><br>注:撰写邮件的html文件仍然和前面(请参考jsp和Java Mail(三))那个一样,不需要作任何修改. <br><br>怎么样,这个程序是不是很简单呢?如果还有什么不懂的话,请在下面留言.下一次我们将要讲一讲怎样发送附件. </div>
<div>&nbsp;</div>
<div>七.编写灵活的发送程序 <br><br>本小节没加什么新鲜的东西,但是综合了以前的所有内容,可以让你灵活地发送你想要发的邮件.看了本小节之后对你会感觉到非常有用. <br><br>更改后的撰写界面程序如下: <br>------------------------------------------------------------------------------------------- <br>&lt; html &gt; <br>&lt; head &gt; <br>&lt; meta http-equiv="Content-Type" content="text/html; charset=gb2312" &gt; <br>&lt; title &gt; 撰写邮件 &lt; /title &gt; <br>&lt; /head &gt; <br>&lt; body &gt; <br>&lt; form action="testall.jsp" method="post" name="form1" &gt; <br>&lt; table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black" &gt; <br>&lt; tr bgcolor="#FFFFFF" &gt; <br>&lt; td width="24%" &gt; 收信人地址: &lt; /td &gt; <br>&lt; td width="76%" &gt; &lt; input name="to" type="text" id="to" &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr bgcolor="#FFFFFF" &gt; <br>&lt; td &gt; 主题: &lt; /td &gt; <br>&lt; td &gt; &lt; input name="title" type="text" id="title" &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr &gt; <br>&lt; td height="18" colspan="2" bgcolor="#FFFFFF" &gt; 信件类型 <br>&lt; select name="emailtype" id="emailtype" &gt; <br>&lt; option value="text/plain" selected &gt; Text &lt; /option &gt; <br>&lt; option value="text/html" &gt; Html &lt; /option &gt; <br>&lt; /select &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr &gt; <br>&lt; td height="53" colspan="2" bgcolor="#FFFFFF" &gt;&lt; textarea name="content" cols="50" rows="5" id="content" &gt;&lt; /textarea &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr align="center" &gt; <br>&lt; td colspan="2" bgcolor="#FFFFFF" &gt; 附件1(自定义): <br>&lt; input name="fj1" type="text" id="fj1" &gt; <br>(输入文本信息) &lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr align="center" valign="bottom" &gt; <br>&lt; td colspan="2" bgcolor="#FFFFFF" &gt; 附件2(本地): <br>&lt; input name="fj2" type="file" id="fj2" size="10" &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr align="center" &gt; <br>&lt; td colspan="2" bgcolor="#FFFFFF" &gt; 附件3(远程): <br>&lt; input name="fj3" type="text" id="fj3" value="http://" &gt; <br>(输入URL) &lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; tr align="center" &gt; <br>&lt; td colspan="2" bgcolor="#FFFFFF" &gt; &lt; input type="submit" name="Submit" value="发送" &gt; <br>&lt; input type="reset" name="Submit2" value="重置" &gt;&lt; /td &gt; <br>&lt; /tr &gt; <br>&lt; /table &gt; <br>&lt; /form &gt; <br>&lt; /body &gt; <br>&lt; /html &gt; <br><br><br>处理邮件的JSP程序如下: <br>---------------------------------------------------------------------------------------- <br>&lt; %@ page contentType="text/html;charset=GB2312" % &gt; <br>&lt; %request.setCharacterEncoding("gb2312");% &gt; <br>&lt; %@ page import="java.util.*,javax.mail.*"% &gt; <br>&lt; %@ page import="javax.mail.internet.*"% &gt; <br>&lt; %@ page import="javax.activation.*"% &gt;&lt; !--要发送附件必须引入该库-- &gt; <br>&lt; %@ page import="java.net.*"% &gt;&lt; !--要用到URL类-- &gt; <br>&lt; html &gt; <br>&lt; head &gt; <br>&lt; meta http-equiv="Content-Type" content="text/html; charset=gb2312" &gt; <br>&lt; title &gt; 发送成功 &lt; /title &gt; <br>&lt; /head &gt; <br>&lt; body &gt; <br>&lt; % <br>try{ <br>String tto=request.getParameter("to"); <br>String ttitle=request.getParameter("title"); <br>String emailtype=request.getParameter("emailtype");//获取email类型 <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>//给消息对象设置发件人/收件人/主题/发信时间 <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>//设置信件文本内容 <br>BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象 <br>mdp.setContent(tcontent,emailtype+";charset=gb2312");//给BodyPart对象设置内容和格式/编码方式 <br>mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中 <br><br>//设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送) <br>mdp=new MimeBodyPart();//新建一个存放附件的BodyPart <br>DataHandler dh=new DataHandler(tfj1,"text/plain;charset=gb2312"); <br>//新建一个DataHandler对象,并设置其内容和格式/编码方式 <br>mdp.setFileName("text.txt");//加上这句将作为附件发送,否则将作为信件的文本内容 <br>mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh <br>mm.addBodyPart(mdp);//将含有附件的BodyPart加入到MimeMultipart对象中 <br><br>//设置信件的附件2(用本地上的文件作为附件) <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);//提取文件名 <br>String ffname=new String(fname.getBytes("gb2312"),"ISO8859-1");//处理文件名是中文的情况 <br>mdp.setFileName(ffname);//可以和原文件名不一致,但最好一样 <br>mdp.setDataHandler(dh); <br>mm.addBodyPart(mdp); <br><br>//设置信件的附件3(用远程文件作为附件) <br>mdp=new MimeBodyPart(); <br><br><br>URL urlfj=new URL(tfj3); <br>URLDataSource ur=new URLDataSource(urlfj); <br>//注:这里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有误(请谅解),这里纠正一下. <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");//不知怎么回事,这里不能处理中文问题 <br>mdp.setFileName(urlname); <br>mdp.setDataHandler(dh); <br>mm.addBodyPart(mdp); <br><br>message.setContent(mm);//把mm作为消息对象的内容 <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>% &gt; <br>&lt; div align="center" &gt; <br>&lt; p &gt;&lt; font color="#FF6600" &gt; 发送成功! &lt; /font &gt;&lt; /p &gt; <br>&lt; p &gt;&lt; a href="recmail.jsp" &gt; 去看看我的信箱 &lt; /a &gt;&lt; br &gt; <br>&lt; br &gt; <br>&lt; a href="index.htm" &gt; 再发一封 &lt; /a &gt; &lt; /p &gt; <br>&lt; /div &gt; <br>&lt; % <br>}catch(MessagingException e){ <br>out.println(e.toString()); <br>} <br>% &gt; <br>&lt; /body &gt; <br>&lt; /html &gt; <br><br>到目前为止,我们基本上已学会了发各种类型的邮件了.</div>
这里最加上一些在实践工程中遇到的一些问题：<br>1&nbsp;&nbsp;&nbsp; 发送Email认证。现在很多Email服务器在SMTP发送前需要做用户名密码认证。<br>不然会抛出javax.mail.AuthenticationFailedException，<br>解决办法：<br>final String username = "username";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final String password = "password";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用验证<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session session = Session.getDefaultInstance(props,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Authenticator() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected javax.mail.PasswordAuthentication getPasswordAuthentication() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new javax.mail.PasswordAuthentication(username,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br><br>把username,password改成你邮箱的用户名和密码<br><br>2当要发邮件的对象不单是一个，是很多个的时候：<br>String to[] = request.getParameterValues("check_box");//获取收件人email地址<br>&nbsp;&nbsp;ArrayList arraylist = new ArrayList();<br>&nbsp;&nbsp;for(int i=0;i &lt; to.length;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;arraylist.add(new InternetAddress(to[i]));<br>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; //收件地址放进队列<br>Message msg = new MimeMessage(s);<br>&nbsp;&nbsp;&nbsp;&nbsp; msg.setFrom(new InternetAddress(from));//设置发件人<br>&nbsp;&nbsp;msg.setRecipients(Message.RecipientType.TO, (InternetAddress[])arraylist.toArray(new InternetAddress[arraylist.size()]));<br>&nbsp;&nbsp;&nbsp;&nbsp; msg.setSubject(subject);//设置主题<br>&nbsp;&nbsp;&nbsp;&nbsp; msg.setSentDate(new Date());//设置发信时<br>&nbsp;&nbsp;BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象<br>msg.setRecipients(Message.RecipientType.TO, (InternetAddress[])arraylist.toArray(new InternetAddress[arraylist.size()]));<br><br>以上是邮件经常遇到的问题，特此纪录<br>
<img src ="http://www.blogjava.net/Even/aggbug/120135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2007-05-26 09:38 <a href="http://www.blogjava.net/Even/archive/2007/05/26/120135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zlib --shared</title><link>http://www.blogjava.net/Even/archive/2007/03/24/106049.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Sat, 24 Mar 2007 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/Even/archive/2007/03/24/106049.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/106049.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2007/03/24/106049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/106049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/106049.html</trackback:ping><description><![CDATA[
		<p>如果你是64bit的操作系统，请注意，在编译libpng的时候（no-config)包的时候，如果遇到undefined reference to `png_mmx_support'，请使用config包，编译zlib的时候，使用zlib --shared，然后在libpng那里使用./configure make; make install 进行安装</p>
<img src ="http://www.blogjava.net/Even/aggbug/106049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2007-03-24 14:00 <a href="http://www.blogjava.net/Even/archive/2007/03/24/106049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to build JpegV6 in 64 bit linux</title><link>http://www.blogjava.net/Even/archive/2007/03/24/106032.html</link><dc:creator>E.ven</dc:creator><author>E.ven</author><pubDate>Sat, 24 Mar 2007 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/Even/archive/2007/03/24/106032.html</guid><wfw:comment>http://www.blogjava.net/Even/comments/106032.html</wfw:comment><comments>http://www.blogjava.net/Even/archive/2007/03/24/106032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Even/comments/commentRss/106032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Even/services/trackbacks/106032.html</trackback:ping><description><![CDATA[
		<p>How to build jpegsrc.v6b on 64-bit Linux machines <br />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. </p>
		<p>If you are trying to build on a 64-bit Linux machine you will probably get this error during the ./configure step: </p>
		<p>checking host system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized<br />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/. </p>
		<p>cp /usr/share/libtool/config.guess .<br />cp /usr/share/libtool/config.sub .<br />./configure --enable-shared --enable-static</p>
		<p>One site suggests that you also need tell the jpegsrc build where the 64-bit libdir is located: </p>
		<p>make libdir=/usr/lib64<br />make libdir=/usr/lib64 install<br />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). </p>
		<!-- -->
<img src ="http://www.blogjava.net/Even/aggbug/106032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Even/" target="_blank">E.ven</a> 2007-03-24 11:19 <a href="http://www.blogjava.net/Even/archive/2007/03/24/106032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>