??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av无码一区二区三区在线播放 ,亚洲成AV人片在WWW,亚洲成熟xxxxx电影http://www.tkk7.com/renyangok/category/13032.htmlzh-cnTue, 27 Feb 2007 10:37:38 GMTTue, 27 Feb 2007 10:37:38 GMT60使用sitemesh建立复合视图http://www.tkk7.com/renyangok/articles/86381.html保尔?/dc:creator>保尔?/author>Fri, 08 Dec 2006 08:10:00 GMThttp://www.tkk7.com/renyangok/articles/86381.htmlhttp://www.tkk7.com/renyangok/comments/86381.htmlhttp://www.tkk7.com/renyangok/articles/86381.html#Feedback0http://www.tkk7.com/renyangok/comments/commentRss/86381.htmlhttp://www.tkk7.com/renyangok/services/trackbacks/86381.htmlhttp://www.huihoo.com/java/sitemesh/index.html

]]>
Jakarta目的commons?/title><link>http://www.tkk7.com/renyangok/articles/74008.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Mon, 09 Oct 2006 03:02:00 GMT</pubDate><guid>http://www.tkk7.com/renyangok/articles/74008.html</guid><wfw:comment>http://www.tkk7.com/renyangok/comments/74008.html</wfw:comment><comments>http://www.tkk7.com/renyangok/articles/74008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/renyangok/comments/commentRss/74008.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/renyangok/services/trackbacks/74008.html</trackback:ping><description><![CDATA[ <h4 class="TextColor1" id="subjcns!F319B9AFFE33A988!201" style="MARGIN-BOTTOM: 0px">commons分ؓ3部分Commons Proper、Commons Sandbox和Commons Dormant<br />Commons ProperQ提供了设计良好可重用的javalgQƈ都经q了q泛、严格的试?br />Commons SandboxQ处于实验、测试阶D늚lg?br />Commons DormantQ处于停滞状态,从Sandbox退出的Q不z跃的组Ӟ谨慎使用? <p>Commons ProperlgQ?/p><ul><li>Attributes—?支持源代码的元数据? </li><li>BeanUtils——提供对 Java 反射和自省API的包装,处理javabean的工兗? </li><li>Betwixt——将JavaBeans与XML怺转换。? </li><li>Chain——对Chain of ResponsibilityQ责任链Q设计模式的实现。多个对象都有Z处理hQ 从而避免请求的发送者和接收者之间的耦合关系。将q些对象q成一条链Qƈ沿着q条链传递请求,直到有一个对象处理它为止? </li><li>CLI——处理命令行的命令的解析? </li><li>Codec——包含一些通用的编码解码算法。包括一些语音编码器Q?Hex, Base64, 以及URL encoder? </li><li>Collections——扩展和增加标准?Java Collection框架? </li><li>Configuration——操作各U格式的配置文g。Properties文g /XML文g /JNDI /JDBC 数据?/System properties /Applet parameters / Servlet parameters </li><li>Daemon——创建类似unix守护U程的java代码Q可以安全地执行一些后台操作,U程不被某个应用E序控制Q而是由操作系l控制 类似windows的serviceQ可以设|一个服务依赖于另一个服务,一个服务关闭前必须先执行另一个服务? </li><li>DBCP——一个数据库q接? </li><li>DbUtils——一个JDBC的工LQ比如可以将ResultSets生成javabean? </li><li>Digester——基于规则的XML文档解析,主要用于XML到Java对象的映? </li><li>Discovery——提供工h定位资源 (包括c? Q通过使用各种模式来映服?引用名称和资源名U? </li><li>EL——JSP 2.0引入的表辑ּ </li><li>Email——处理e-mail </li><li>FileUpload——web应用中的文g上传lg </li><li>HttpClient——用HTTP协议的客L开发框? </li><li>IO——帮助进行IO功能开? </li><li>Jelly——Jelly能够把XML转换成可执行代码,所以Jelly是一个基于XML与Java的脚本和处理引擎?Jelly借鉴了JSP定指标签QVelocity, Cocoon和Xdoclet中的脚本引擎的许多优炏VJelly可以用在命o行,Ant或者Servlet之中? </li><li>Jexl——Jexl是一个表辑ּ语言Q通过借鉴来自于Velocity的经验扩展了JSTL定义的表辑ּ语言? </li><li>JXPath——用XPath语法操作javabean的工兗? </li><li>Lang——提供对java.lang包的扩展。? </li><li>Launcher——跨q_的javaE序的启? </li><li>Logging——提供的是一个日?Log)接口(interface)Q同时兼轻量和不依赖于具体的日志实现工具?它提供给中间?日志工具开发者一个简单的日志操作抽象Q允许程序开发h员用不同的具体日志实现工具。用戯假定已熟悉某U日志实现工L更高U别的细节。JCL提供的接口,对其它一些日志工P包括Log4J, Avalon LogKit, and JDK 1.4{,q行了简单的包装Q此接口更接q于Log4J和LogKit的实? </li><li>Math——Math 是一个轻量的Q自包含的数学和l计lgQ解决了许多非常通用但没有及时出现在Java标准语言中的实践问题. </li><li>Modeler—?支持兼容JMX规范的MBeans开发? </li><li>Net——集合了|络工具和协议工L实现 </li><li>Pool——Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实现? </li><li>Primitives——对java原始cd的支持? </li><li>SCXML——处理SCXML </li><li>Transaction——事务处理,实现了多层次锁、事务集合、事务文件的讉K。? </li><li>Validator——提供了一个简单的Q可扩展的框架来在一个XML文g中定义校验器 (校验Ҏ)和校验规则。支持校验规则的和错误消息的国际化? </li><li>VFS——访问各U文件系l,可以是本地文件、HTTP服务器上的文件、zip中的文g?</li></ul><p>Commons SandboxlgQ?/p><ul><li>Compress——处理压~文件如tar, zip ?bzip2 格式? </li><li>CSV——处理CSV文g </li><li>Exec——安全地处理外部q程 </li><li>Finder——实现类似UNIX find命o的功? </li><li>I18n——处理Y件的I18n功能 </li><li>Id——生成id号功? </li><li>Javaflow——捕捉程序运行状? </li><li>JCI——java~译接口 </li><li>OpenPGP——处理加密方法OpenPGP.  </li><li>Pipeline——处理类似工作队列的道工具 </li><li>Proxy——生成动态代?/li></ul></h4> <h4 class="TextColor1" style="MARGIN-BOTTOM: 0px">Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-org.apache.commons.beanutils.PropertyUtils;<br />copyProperties(a,b);//把相同类型b的属性赋值给a<br />Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-</h4> <h4 class="TextColor1" style="MARGIN-BOTTOM: 0px">转蝲Qorg.apache.commons?/h4> <div class="bblvbjv" id="msgcns!F319B9AFFE33A988!201"> <div>原文误Q?a ><font color="#495828">http://junglesong.yculblog.com/post.976376.html</font></a></div> <div> <font color="#495828"> </font> </div> <div>在org.apache.commons包中提供了的一pd能简化一些编E过E中常见问题的共通函数和c,使程序员能把主要_֊集中?br />构架Q业务实现和优化而不是具体实现及验证上,一a以蔽之,它能使我们避免重复的发明车轮?br /><br />org.apache.commons包的下蝲面?<br /><a ><font color="#5f9ea0">http://jakarta.apache.org/site/downloads/downloads_commons-lang.cgi</font></a><br />其中源码大家可以借鉴一下,我觉得很有参考h|其是有些函数在不用正则表达式下取得的效果?br /><br />取得commons-lang-2.1.jar后加入自己工E的lib目录可以了.如果用户不允怋用commonsQ那末打开其源码把具体函数加入自己的代码也可以Q当焉要尊重h家的知识产权?br /><br />以下代码l过试,试环境(WinXp+Eclipse3.1+JDK1.5+commons-lang-2.1)Q我在有些地方修改了一下?br /><br /><br />Jakarta Commons Cookbook?1—Manipulating Text <p>Commons之字W串操作<br />要利用Jakarta Commons来进行字W串操作,首先需要加载需要用到的?<br />import org.apache.commons.lang.StringUtils;<br />import org.apache.commons.lang.WordUtils;</p><p>以下是StringUtils的各用?br /><strong>1.I字W串?/strong><br />使用函数: StringUtils.isBlank(testString)<br />函数介绍: 当testString为空,长度为零或者仅q白字W?whitespace)l成?q回True;否则q回False<br />例程:<br />    String test = "";<br />    String test2 = "\n\n\t";<br />    String test3 = null;<br />    String test4 = "Test";</p><p>    System.out.println( "test blank? " + StringUtils.isBlank( test ) );<br />    System.out.println( "test2 blank? " + StringUtils.isBlank( test2 ) );<br />    System.out.println( "test3 blank? " + StringUtils.isBlank( test3 ) );<br />    System.out.println( "test4 blank? " + StringUtils.isBlank( test4 ) );<br />输出如下:<br />test blank? true<br />test2 blank? true<br />test3 blank? true<br />test4 blank? False<br />函数StringUtils.isNotBlank(testString)的功能与StringUtils.isBlank(testString)相反.</p><p><br /><strong>2.清除I白字符<br /></strong>使用函数: StringUtils.trimToNull(testString)<br />函数介绍:清除掉testString首尾的空白字W?如果仅testString全由I白字符<br />(whitespace)l成则返回null<br />例程:<br />    String test1 = "\t";<br />    String test2 = "  A  Test  ";<br />    String test3 = null;</p><p>    System.out.println( "test1 trimToNull: " + StringUtils.trimToNull( test1 ) );<br />    System.out.println( "test2 trimToNull: " + StringUtils.trimToNull( test2 ) );<br />    System.out.println( "test3 trimToNull: " + StringUtils.trimToNull( test3 ) );</p><p>输出如下:<br />test1 trimToNull: null<br />test2 trimToNull: A  Test<br />test3 trimToNull: null</p><p>注意Q函数StringUtils.trim(testString)?br />StringUtils.trimToNull(testString)功能cMQ但testStringq白字W?br />(whitespace)l成时返回零长度字符丌Ӏ?/p><p><br /><strong>3.取得字符串的~写</strong><br />使用函数: StringUtils.abbreviate(testString,width)和StringUtils.abbreviate(testString,offsetQwidth)<br />函数介绍:在给定的width内取得testString的羃?当testString的长度小于width则返回原字符?<br />例程:<br />    String test = "This is a test of the abbreviation.";<br />    String test2 = "Test";</p><p>    System.out.println( StringUtils.abbreviate( test, 15 ) );<br />    System.out.println( StringUtils.abbreviate( test, 5,15 ) );<br />    System.out.println( StringUtils.abbreviate( test2, 10 ) );<br />输出如下:<br />This is a te...<br />...is a test...<br />Test</p><p><strong>4.劈分字符?/strong><br />使用函数: StringUtils.split(testString,splitChars,arrayLength)<br />函数介绍:splitChars中可以包含一pd的字W串来劈分testString,q可以设定得<br />到数l的长度.注意讑֮长度arrayLength和劈分字W串间有抵触关系,一般情况下<br />不要讑֮长度.<br />例程:<br />    String input = "A b,c.d|e";<br />    String input2 = "Pharmacy, basketball funky";<br />    </p><p>    String[] array1 = StringUtils.split( input, " ,.|");<br />    String[] array2 = StringUtils.split( input2, " ,", 2 );</p><p><br />    System.out.println( ArrayUtils.toString( array1 ) );<br />    System.out.println( ArrayUtils.toString( array2 ) );<br />输出如下:<br />{A,b,c,d,e}<br />{Pharmacy,basketball funky}</p><p><strong>5.查找嵌套字符?/strong><br />使用函数:StringUtils.substringBetween(testString,header,tail)<br />函数介绍Q在testString中取得header和tail之间的字W串。不存在则返回空<br />例程Q?br />    String htmlContent = "ABC1234ABC4567";<br />    System.out.println(StringUtils.substringBetween(htmlContent, "1234", "4567"));<br />    System.out.println(StringUtils.substringBetween(htmlContent, "12345", "4567"));<br />输出如下Q?br />    ABC<br />    null</p><p><br /><strong>6.去除N换行W?/strong><br />使用函数:StringUtils.chomp(testString)<br />函数介绍:去除testStringN的换行符<br />例程:<br />    String input = "Hello\n";<br />    System.out.println( StringUtils.chomp( input ));<br />    String input2 = "Another test\r\n";<br />    System.out.println( StringUtils.chomp( input2 ));<br />输出如下:<br />    Hello<br />    Another test</p><p><br /><strong>7.重复字符?/strong><br />使用函数:StringUtils.repeat(repeatString,count)<br />函数介绍:得到repeatString重复countơ后的字W串<br />例程:<br />    System.out.println( StringUtils.repeat( "*", 10));<br />    System.out.println( StringUtils.repeat( "China ", 5));<br />输出如下:<br />    **********<br />    China China China China China </p><p>其他函数:StringUtils.center( testString, count,repeatString );<br />函数介绍:把testString插入repeatString重复多次后的字符串中?得到字符?br />的总长为count<br />例程:<br />    System.out.println( StringUtils.center( "China", 11,"*"));<br />输出如下:<br />    ***China***</p><p><br /><strong>8.颠倒字W串</strong><br />使用函数:StringUtils.reverse(testString)<br />函数介绍:得到testString中字W颠倒后的字W串<br />例程:<br />    System.out.println( StringUtils.reverse("ABCDE"));<br />输出如下:<br />    EDCBA</p><p><strong>9.判断字符串内容的cd<br /></strong>函数介绍:<br />StringUtils.isNumeric( testString ) :如果testString全由数字l成q回True<br />StringUtils.isAlpha( testString ) :如果testString全由字母l成q回True<br />StringUtils.isAlphanumeric( testString ) :如果testString全由数字或数字组<br />成返回True<br />StringUtils.isAlphaspace( testString )  :如果testString全由字母或空格组<br />成返回True</p><p>例程:<br />    String state = "Virginia";<br />    System.out.println( "Is state number? " + StringUtils.isNumeric(<br />state ) );<br />    System.out.println( "Is state alpha? " + StringUtils.isAlpha( state )<br />);<br />    System.out.println( "Is state alphanumeric? " +StringUtils.isAlphanumeric( state ) );<br />    System.out.println( "Is state alphaspace? " + StringUtils.isAlphaSpace( state ) );<br />输出如下:<br />    Is state number? false<br />    Is state alpha? true<br />    Is state alphanumeric? true<br />    Is state alphaspace? true</p><p><strong>10.取得某字W串在另一字符串中出现的次?br /></strong>使用函数:StringUtils.countMatches(testString,seqString)<br />函数介绍:取得seqString在testString中出现的ơ数,未发现则q回?br />例程:<br />    System.out.println(StringUtils.countMatches( "Chinese People", "e"<br />));<br />输出:<br />    4</p><p><strong>11.部分截取字符?/strong><br />使用函数:<br />StringUtils.substringBetween(testString,fromString,toString ):取得两字W?br />之间的字W串<br />StringUtils.substringAfter( ):取得指定字符串后的字W串<br />StringUtils.substringBefore( )Q取得指定字W串之前的字W串<br />StringUtils.substringBeforeLast( )Q取得最后一个指定字W串之前的字W串<br />StringUtils.substringAfterLast( )Q取得最后一个指定字W串之后的字W串</p><p>函数介绍Q上面应该都讲明白了吧?br />例程Q?br />    String formatted = " 25 * (30,40) [50,60] | 30";<br />    System.out.print("N0: " + StringUtils.substringBeforeLast( formatted, "*" ) );<br />    System.out.print(", N1: " + StringUtils.substringBetween( formatted, "(", "," ) );<br />    System.out.print(", N2: " + StringUtils.substringBetween( formatted, ",", ")" ) );<br />    System.out.print(", N3: " + StringUtils.substringBetween( formatted, "[", "," ) );<br />    System.out.print(", N4: " + StringUtils.substringBetween( formatted, ",", "]" ) );<br />    System.out.print(", N5: " + StringUtils.substringAfterLast( formatted, "|" ) );<br />输出如下Q?br />    N0:  25 , N1: 30, N2: 40, N3: 50, N4: 40) [50,60, N5:  30</p></div> </div> <img src ="http://www.tkk7.com/renyangok/aggbug/74008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/renyangok/" target="_blank">保尔?/a> 2006-10-09 11:02 <a href="http://www.tkk7.com/renyangok/articles/74008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JfreeChart学习ȝhttp://www.tkk7.com/renyangok/articles/63942.html保尔?/dc:creator>保尔?/author>Wed, 16 Aug 2006 08:53:00 GMThttp://www.tkk7.com/renyangok/articles/63942.htmlhttp://www.tkk7.com/renyangok/comments/63942.htmlhttp://www.tkk7.com/renyangok/articles/63942.html#Feedback0http://www.tkk7.com/renyangok/comments/commentRss/63942.htmlhttp://www.tkk7.com/renyangok/services/trackbacks/63942.html http://www.tkk7.com/ltc603/archive/2006/08/16/63834.html



]]>
利用JavaQPOI dExcel文档&向Excel中插入图?/title><link>http://www.tkk7.com/renyangok/articles/63889.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Wed, 16 Aug 2006 05:52:00 GMT</pubDate><guid>http://www.tkk7.com/renyangok/articles/63889.html</guid><wfw:comment>http://www.tkk7.com/renyangok/comments/63889.html</wfw:comment><comments>http://www.tkk7.com/renyangok/articles/63889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/renyangok/comments/commentRss/63889.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/renyangok/services/trackbacks/63889.html</trackback:ping><description><![CDATA[ <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">一Q?span lang="EN-US">POI</span>?span lang="EN-US"><?xml:namespace prefix = o /?><o:p></o:p></span></span> </strong> </p> <p> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">Jakarta POI</span> </b> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">?span lang="EN-US">apache</span>的子目Q目标是处理<span lang="EN-US">ole2</span>对象。它提供了一l操U?span lang="EN-US">Windows</span>文档?span lang="EN-US">Java API<o:p></o:p></span></span> </b> </p> <p style="BACKGROUND: white 0% 50%; TEXT-INDENT: 21pt; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">目前比较成熟的是<span lang="EN-US">HSSF</span>接口Q处?span lang="EN-US">MS Excel</span>Q?span lang="EN-US">97-2002</span>Q对象。它不象我们仅仅是用<span lang="EN-US">csv</span>生成的没有格式的可以?span lang="EN-US">Excel</span>转换的东西,而是真正?span lang="EN-US">Excel</span>对象Q你可以控制一些属性如<span lang="EN-US">sheet,cell</span>{等?span lang="EN-US"><o:p></o:p></span></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">二.<span lang="EN-US">HSSF</span>概况<span lang="EN-US"><o:p></o:p></span></span> </strong> </p> <p style="BACKGROUND: white 0% 50%; TEXT-INDENT: 21pt; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">HSSF</span> </b> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">?span lang="EN-US">Horrible SpreadSheet Format</span>的羃写,也即“讨厌的电子表格格式”?也许<span lang="EN-US">HSSF</span>的名字有ҎE,本质而言它是一个非怸肃、正规的<span lang="EN-US">API</span>。通过<span lang="EN-US">HSSF</span>Q你可以用纯<span lang="EN-US">Java</span>代码来读取、写入、修?span lang="EN-US">Excel</span>文g?span lang="EN-US"><o:p></o:p></span></span> </b> </p> <p style="BACKGROUND: white 0% 50%; TEXT-INDENT: 21pt; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">HSSF</span> </b> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">取操作提供了两类<span lang="EN-US">API</span>Q?span lang="EN-US">usermodel</span>?span lang="EN-US">eventusermodel</span>Q即“用h型”和“事?span lang="EN-US">-</span>用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多?/span> </b> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <o:p> </o:p> </span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">三.开始编?span lang="EN-US"><o:p></o:p></span></span> </strong> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">1</span> </strong> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">Q?/span> </strong> <strong> <span style="FONT-SIZE: 14pt; FONT-FAMILY: 楷体_GB2312">准备工作<span lang="EN-US" style="COLOR: black"><o:p></o:p></span></span> </strong> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">要求<span lang="EN-US">:JDK 1.4+POI</span>开发包<span lang="EN-US"><o:p></o:p></span></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">可以?/span> </b> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <a target="_blank"> <span style="COLOR: black">http://www.apache.org/dyn/closer.cgi/jakarta/poi/</span> </a> </span> </b> <span id="ltrxbbb" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">最新的<span lang="EN-US">POI</span>工具?span lang="EN-US"><o:p></o:p></span></span> </b> </span> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">2</span> </strong> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">Q?/span> </strong> <span id="bntvlxl" class="tpccontent1"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">EXCEL</span> </b> </span> <span id="phpvhhf" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">l构</span> </b> </span> <span id="dztfhpx" class="tpccontent1"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <o:p> </o:p> </span> </b> </span> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">HSSFWorkbook excell</span> </b> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">文档对象介绍<span lang="EN-US"><br />HSSFSheet excell</span>的表?span lang="EN-US"><br />HSSFRow excell</span>的行<span lang="EN-US"><br />HSSFCell excell</span>的格子单?span lang="EN-US"><br />HSSFFont excell</span>字体<span lang="EN-US"><br />HSSFName </span>名称<span lang="EN-US"><br />HSSFDataFormat </span>日期格式<span lang="EN-US"><br /></span>?span lang="EN-US">poi1.7</span>中才有以?span lang="EN-US">2</span>:<span lang="EN-US"><br />HSSFHeader sheet</span>?span lang="EN-US"><br />HSSFFooter sheet</span>?span lang="EN-US"><br /></span>和这个样?span lang="EN-US"><br />HSSFCellStyle cell</span>样式<span lang="EN-US"><br /></span>辅助操作包括<span lang="EN-US"><br />HSSFDateUtil </span>日期<span lang="EN-US"><br />HSSFPrintSetup </span>打印<span lang="EN-US"><br />HSSFErrorConstants </span>错误信息?/span> </b> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <o:p> </o:p> </span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">3</span> </strong> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">Q具体用法实?/span> </strong> <span id="tvxrljz" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">Q采?/span> </b> </span> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">usermodel</span> </b> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">Q?/span> </b> <span id="lvxtllr" class="tpccontent1"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <o:p> </o:p> </span> </b> </span> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <span id="rvzljtr" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">如何?span lang="EN-US">Excel<o:p></o:p></span></span> </b> </span> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <span id="brnxjhh" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">d<span lang="EN-US">Excel</span>文gӞ首先生成一?span lang="EN-US">POIFSFileSystem</span>对象Q由<span lang="EN-US">POIFSFileSystem</span>对象构造一?span lang="EN-US">HSSFWorkbook</span>Q该<span lang="EN-US">HSSFWorkbook</span>对象׃表了<span lang="EN-US">Excel</span>文档。下面代码读取上面生成的<span lang="EN-US">Excel</span>文g写入的消息字Ԍ </span> </b> </span> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <br /> <span id="xjdzjjx" class="tpccontent1"> <span>try{<br />   POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream("d:/workbook.xls")); <br />   HSSFWorkbook wb = new HSSFWorkbook(fs); <br />   HSSFSheet sheet = wb.getSheetAt(0); <br />   HSSFRow row = sheet.getRow(0); <br />   HSSFCell cell = row.getCell((short) 0); <br />   String msg = cell.getStringCellValue(); <br />   System.out.println(msg);<br />  }catch(Exception e){<br />   e.printStackTrace();<br />  }</span> </span> </span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <span id="rzlpbrx" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">如何?span lang="EN-US">excel</span>Q?span lang="EN-US"><o:p></o:p></span></span> </b> </span> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <span id="fplnxxf" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">?span lang="EN-US">excel</span>的第一个表单第一行的W一个单元格的值写成?span lang="EN-US">a test</span>”?span lang="EN-US"><o:p></o:p></span></span> </b> </span> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">POIFSFileSystem fs =new POIFSFileSystem(new FileInputStream("workbook.xls"));<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>HSSFWorkbook wb = new HSSFWorkbook(fs);<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>HSSFSheet sheet = wb.getSheetAt(0);<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>HSSFRow row = sheet.getRow(0);<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>HSSFCell cell = row.getCell((short)0);<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>cell.setCellValue("a test");<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>// Write the output to a file<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>FileOutputStream fileOut = new FileOutputStream("workbook.xls");<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <span>    </span>wb.write(fileOut);<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; TEXT-INDENT: 28.5pt; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">fileOut.close();<o:p></o:p></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">4</span> </strong> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">Q?/span> </strong> <span id="ttvhtbp" class="tpccontent1"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">可参考文?/span> </b> </span> <span id="fprlpvl" class="tpccontent1"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <o:p> </o:p> </span> </b> </span> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">POI</span> </b> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">主页Q?span lang="EN-US"><a ><span style="COLOR: black">http://jakarta.apache.org/poi/</span></a></span>Q?span lang="EN-US"><o:p></o:p></span></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">初学者如何快速上手?span lang="EN-US">POI HSSF<o:p></o:p></span></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <b> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312"> <a > <span style="COLOR: black">http://jakarta.apache.org/poi/hssf/quick-guide.html</span> </a> </span> </b> <b> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">?span lang="EN-US"><o:p></o:p></span></span> </b> </p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">里面有很多例子代码,可以很方便上手?span lang="EN-US"><o:p></o:p></span></span> <br /> <br />5、中文ؕ码问?br /><br /></strong> //把List expItems,写到EXCEL文g?br />  FileOutputStream fileOut = new FileOutputStream(filePath);<br />  HSSFWorkbook wb = new HSSFWorkbook();// HSSFWorkbook<br />  HSSFSheet sheet = wb.createSheet();// <br /><font style="BACKGROUND-COLOR: #ff1493">  wb.setSheetName(0,“实验项目列表-Q中文测试?HSSFWorkbook.ENCODING_UTF_16);</font><br />  HSSFRow row = sheet.createRow((short) 0);<br />  HSSFCell cell;<br />  Iterator iter = expItems.iterator();<br />  int i = 0;<br />  while (iter.hasNext()) {<br />   cell = row.createCell((short) i);<br /><font style="BACKGROUND-COLOR: #ff1493">   cell.setEncoding(HSSFCell.ENCODING_UTF_16);</font><br />   cell.setCellValue(iter.next().toString());<br />   i++;<br />  }<br />  wb.write(fileOut);<br />  fileOut.close();<br /> }<br /></p> <p style="BACKGROUND: white 0% 50%; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">四.使用心得<span lang="EN-US"><o:p></o:p></span></span> </strong> </p> <p style="BACKGROUND: white 0% 50%; TEXT-INDENT: 21pt; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial"> <strong> <span lang="EN-US" style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">POI HSSF</span> <span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 楷体_GB2312">?span lang="EN-US">usermodel</span>包把<span lang="EN-US">Excel</span>文g映射成我们熟悉的l构Q诸?span lang="EN-US">Workbook</span>?span lang="EN-US">Sheet</span>?span lang="EN-US">Row</span>?span lang="EN-US">Cell</span>{,它把整个l构以一l对象的形式保存在内存之中,便于理解Q操作方便,基本上能够满x们的要求Q所以说q个一个不错的选择?/span> <br />Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br /></strong>前面已经讲过利用POIdExcelQ下面是一个用POI向Excel中插入图片的例子?br /><br /><span id="htfhthh" class="postbody">官方文档Q?<br />Images are part of the drawing support. To add an image just call createPicture() on the drawing patriarch. At the time of writing the following types are supported: <br />PNG <br />JPG <br />DIB <br />It is not currently possible to read existing images and it should be noted that any existing drawings may be erased once you add a image to a sheet. <br /><br />// Create the drawing patriarch. This is the top level container for <br />// all shapes. This will clear out any existing shapes for that sheet. </span><br /><br /><span id="ppjdpft" class="postbody">通过HSSFPatriarchccreatePictureҎ的在指定的wb中的sheet创徏囄,它接受二个参敎ͼW一个是HSSFClientAnchorQ设定图片的大小?br /><br /></span>package com.poi.hssf.test;<br /><br />import java.io.FileOutputStream;<br />import java.io.File;<br />import java.io.ByteArrayOutputStream;<br />import java.io.IOException;<br /><br />import java.awt.image.BufferedImage;<br />import javax.imageio.*;<br /><br />import org.apache.poi.hssf.usermodel.HSSFWorkbook;<br />import org.apache.poi.hssf.usermodel.HSSFSheet;<br />import org.apache.poi.hssf.usermodel.HSSFPatriarch;<br />import org.apache.poi.hssf.usermodel.HSSFClientAnchor;;<br /><br />public class TestPOI { <br /><br />    public static void main(String[] args) { <br />            FileOutputStream fileOut = null; <br />            BufferedImage bufferImg =null; <br />            BufferedImage bufferImg1 = null; <br />            try{ <br />                <br />          //先把读进来的囄攑ֈ一个ByteArrayOutputStream中,以便产生ByteArray <br />          ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); <br />          ByteArrayOutputStream byteArrayOut1 = new ByteArrayOutputStream(); <br />          bufferImg = ImageIO.read(new File("d:/PieChart.jpg")); <br />          bufferImg1 = ImageIO.read(new File("d:/fruitBarChart.jpg")); <br />          ImageIO.write(bufferImg,"jpg",byteArrayOut); <br />          ImageIO.write(bufferImg1,"jpg",byteArrayOut1); <br />          <br />        //创徏一个工作薄 <br />        HSSFWorkbook wb = new HSSFWorkbook(); <br />        HSSFSheet sheet1 = wb.createSheet("new sheet"); <br />        //HSSFRow row = sheet1.createRow(2); <br />        HSSFPatriarch patriarch = sheet1.createDrawingPatriarch(); <br />        HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,512,255,(short) 1,1,(short)10,20); <br />        HSSFClientAnchor anchor1 = new HSSFClientAnchor(0,0,512,255,(short) 2,30,(short)10,60); <br />        anchor1.setAnchorType(2);<br />        //插入囄<br />        patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); <br />        patriarch.createPicture(anchor1 , wb.addPicture(byteArrayOut1.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); <br />        <br />            fileOut = new FileOutputStream("d:/workbook.xls"); <br />            //写入excel文g<br />            wb.write(fileOut); <br />            fileOut.close(); <br />        <br />            }catch(IOException io){ <br />                    io.printStackTrace(); <br />                    System.out.println("io erorr :  "+ io.getMessage()); <br />            } finally <br />            { <br />                if (fileOut != null) <br />                {<br />                           <br />                    try { <br />                              fileOut.close(); <br />                         } <br />                    catch (IOException e)<br />                    { <br />                            // TODO Auto-generated catch block <br />                            e.printStackTrace(); <br />                     } <br />                } <br />            }<br />    }<br />}<br /></p> <img src ="http://www.tkk7.com/renyangok/aggbug/63889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/renyangok/" target="_blank">保尔?/a> 2006-08-16 13:52 <a href="http://www.tkk7.com/renyangok/articles/63889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4J 最佛_践之全能配置文g http://www.tkk7.com/renyangok/articles/63855.html保尔?/dc:creator>保尔?/author>Wed, 16 Aug 2006 03:38:00 GMThttp://www.tkk7.com/renyangok/articles/63855.htmlhttp://www.tkk7.com/renyangok/comments/63855.htmlhttp://www.tkk7.com/renyangok/articles/63855.html#Feedback0http://www.tkk7.com/renyangok/comments/commentRss/63855.htmlhttp://www.tkk7.com/renyangok/services/trackbacks/63855.html
log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE

log4j.addivity.org.apache=true


###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n


#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis



########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000


########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


]]>
Zjava使用FCKeditorhttp://www.tkk7.com/renyangok/articles/58573.html保尔?/dc:creator>保尔?/author>Mon, 17 Jul 2006 07:20:00 GMThttp://www.tkk7.com/renyangok/articles/58573.htmlhttp://www.tkk7.com/renyangok/comments/58573.htmlhttp://www.tkk7.com/renyangok/articles/58573.html#Feedback0http://www.tkk7.com/renyangok/comments/commentRss/58573.htmlhttp://www.tkk7.com/renyangok/services/trackbacks/58573.html

1.下蝲
FCKeditor.java 2.3 (FCKeditot for java)
FCKeditor 2.2 (FCKeditor基本文g)

2.建立目:tomcat/webapps/FCKeditor

3.FCKeditor.java 2.3解压后,把其中的web目录下的WEB-INF目录copy到FCKeditor?里面有commons-fileupload.jar, FCKeditor-2.3.jar,web.xml{几个文?, 把其中的src目录下的FCKeditor.tld文gcopy到FCKeitor/WEB-INF/?


4.修改web.xml:
把SimpleUploader中的配置属性enabled定义为true(开启文件上传功能)
d标签定义:
<taglib>
<taglib-uri>/FCKeditor</taglib-uri>
<taglib-location>/WEB-INF/FCKeditor.tld</taglib-location>
</taglib>

5.解压FCKeditor2.2后,把目?editor和fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四个文gcopy?FCKeditor?
删除目录/editor/_source,
删除/editor/filemanager/browser/default/connectors/下的所有文?
删除/editor/filemanager/upload/下的所有文?
删除/editor/lang/下的除了fcklanguagemanager.js, en.js, zh.js, zh-cn.js四个文g的所有文?

6.打开/FCKeditor/fckconfig.js
修改 FCKConfig.DefaultLanguage = 'zh-cn' ;
把FCKConfig.LinkBrowserURL{的值替换成以下内容Q?
FCKConfig.LinkBrowserURL =
    FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/jsp/connector" ;

FCKConfig.ImageBrowserURL =
    FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Image&Connector=connectors/jsp/connector" ;

FCKConfig.FlashBrowserURL =
    FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Flash&Connector=connectors/jsp/connector" ;

FCKConfig.LinkUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=File' ;
FCKConfig.FlashUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Flash' ;
FCKConfig.ImageUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Image' ;

7.d文g /FCKeditor/test.jsp:
<%@ page language="java" import="com.fredck.FCKeditor.*" %>
<%@ taglib uri="/FCKeditor" prefix="FCK" %>
<script type="text/javascript" src="/FCKeditor/fckeditor.js"></script>

<%--
三种Ҏ调用FCKeditor
1.FCKeditor自定义标{?(必须加头文g <%@ taglib uri="/FCKeditor" prefix="FCK" %> )
2.script脚本语言调用 (必须引用 脚本文g <script type="text/javascript" src="/FCKeditor/fckeditor.js"></script> )
3.FCKeditor API 调用 (必须加头文g <%@ page language="java" import="com.fredck.FCKeditor.*" %> )
--%>
<%--
<form action="show.jsp" method="post" target="_blank">
<FCK:editor id="content" basePath="/FCKeditor/" width="700" height="500" skinPath="/FCKeditor/editor/skins/silver/"
   toolbarSet = "Default" >
input
</FCK:editor>
<input type="submit" value="Submit">
</form>
--%>

<form action="show.jsp" method="post" target="_blank">
<table border="0" width="700"><tr><td>
<textarea id="content" name="content" style="WIDTH: 100%; HEIGHT: 400px">input</textarea>
<script type="text/javascript">
var oFCKeditor = new FCKeditor('content') ;
oFCKeditor.BasePath = "/FCKeditor/" ;
oFCKeditor.Height = 400;
oFCKeditor.ToolbarSet = "Default" ;
oFCKeditor.ReplaceTextarea();
</script>
<input type="submit" value="Submit">
</td></tr></table>
</form>

<%--
<form action="show.jsp" method="post" target="_blank">
<%
FCKeditor oFCKeditor ;
oFCKeditor = new FCKeditor( request, "content" ) ;
oFCKeditor.setBasePath( "/FCKeditor/" ) ;
oFCKeditor.setValue( "input" );
out.println( oFCKeditor.create() ) ;
%>
<br>
<input type="submit" value="Submit">
</form>
--%>


d文g/FCKeditor/show.jsp:
<%
String content = request.getParameter("content");
out.print(content);
%>

8.览 http://localhost:8080/FCKeditor/test.jsp
ok!

9.上传遇到错误: internal server error 500,
直接引用servlet(com.fredck.FCKeditor.connector.ConnectorServlet)也遇到错? "Provider org.apache.xalan.processor.TransformerFactoryImpl not found",
拯xalan.jar到lib目录可以了



]]>
laoer说天乙社?/title><link>http://www.tkk7.com/renyangok/articles/58092.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 14 Jul 2006 00:47:00 GMT</pubDate><guid>http://www.tkk7.com/renyangok/articles/58092.html</guid><wfw:comment>http://www.tkk7.com/renyangok/comments/58092.html</wfw:comment><comments>http://www.tkk7.com/renyangok/articles/58092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/renyangok/comments/commentRss/58092.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/renyangok/services/trackbacks/58092.html</trackback:ping><description><![CDATA[ <p>  <br />做一个好的社坛一直是我的理想QBBS-CS?.0到现在的5.0用了2q时_5.0在技术上、性能上都已经基本E_Q届此想对BBS-CS的开发思想、技术做一个说明?</p> <p>?000q的时候,我的个h|站“爱情工作室”就是用我自己的写的论坛,当时是用PHPQ功能上比较单,主要是ؓ了网站用,后来我想把社坛单独拿出来Qƈ且爱情工作室|站也只剩下了社一部分Q所以就开始用PHP按照|易C֌l构写了BBS-CS PHP 1.0的版本,后来q个版本一直没有更斎ͼ但JSP版BBS-CS 1.0?.0的数据结构都是从PHP版本发展来的Q?000q底我开始用JAVAQ?001q就写了BBS-CS1.0Q后来出?.0Q?.0?.0的安装都不是很方便,q且SQL都是在JSP中,l构不好Q?002q我写了BBS-CS3.0Q此时数据库操作已经用JavaBean来封装,但是3.0的性能非常不好Q?003q初我写?.0Q?.0的结构已l发生了完全的变化,主要是适应多种数据库和数据库访问均衡处理,性能大大增强Qƈ且BBS-CS定名为“天乙社区”,今年下半q我写了5.0Q?.0采用了Struts的框Ӟ国际化内核,同时支持集群q行Q全文检索等{?</p> <p>有h可能会拿BBS-CS和Jive来比较,觉得BBS-CS是小儿科Q但我想BBS-CS的设计模式虽然没有Jive那么复杂Q但是在国际化、实用性、性能{方面ƈ不差?</p> <p>一、数据库设计 <br />BBS-CS?.0开始,数据库结构发生了Ҏ的变化,主要是对数据表作了负载均衡的处理Q即一个功能不是用一张表Q而是使用多张同样l构的表Q比如存攑ָ子的表有20张,q样做的目的是ؓ了将数据库的查询压力分散C同表中,其实道理很简单,如果一张表中存?00万条记录Q和100张表Q每个表存放1万条记录Q查询效率是完全不一L。具体程序中Q比如一个版区的帖子往那个表中插,是由法来实现的Q算法会保证某个版区的帖子只会往某一个表中插入?</p> <p>二、分处?<br />BBS-CS4.0?.0都是支持多数据库的,现在支持的数据库有Mysql、Oracle和SQL ServerQ在分页处理上确实要׃些功夫,以前我看q很多关于分늚技术资料,处理分页的方法主要是有几个:1、用JDBC的本w特性,数据全部取出,然后Ҏ늠Q每记录数Q对查询出的数据集的数据滚动Q这个方法比较简单、通用Q但是性能极差Q如果一个百万的数据表Q将耗费巨大的系l资源,甚至宕机Q?、和W一U比较类|但不是查出所有数据,只查出数据的主键Q对主键滚动Q然后根据主键再ơ查扄对应的数据,产生集合Q这U方法也是EJB中实体Bean查询数据的方法,但依然存在性能问题Q因为数据过多的时候主键数据集也很大,而来用主键插找数据的是后又进行了多次数据库的执行操作Q性能降低。在多种分页Ҏ比较之后QBBS-CSq是军_采用数据自nҎ的SQL语句来进行分,比如Mysql使用limitQOracle使用rownumQSQL Server使用TopQ分늱是一个抽象类Q每U数据库的分实现方法都ȝ承这个抽象类Q然后用一个工厂方法根据系l配|文件来产生分页cȝ实例Q采用这L分页ҎQ能都达到最佳的分页查询效率?</p> <p>三、系l配|文?<br />BBS-CS5.0的系l配|文件用了一个XML文gQ在4.0的时候,pȝ的配|文件是采用properties文g来解冻I后来我觉得properties的文件还是有很大的局限性,比如Q不方便q行有数据库l构的数据进行配|,后来觉得XML文g是一个绝佳的ҎQ难怪现在很多品的配置文g都是XML?)Q对于XML文g的解析,BBS-CS采用了jdomQjdom是java+domQ详l资?a >http://www.jdom.org</a>Q,一个很方便的处理XML的Y件包Q在BBS-CSU对jdom的运用也不复杂,主要是用来解析bbscs.xmlq个配置文g。系l解析bbscs.xml文g后,这些系l信息保存在静态变量中Q以供系l其他程序随时调用?</p> <p>四、国际化与资源文?<br />JAVA本n是国际化的内部采用了Unicode的编码格式,而Struts的框Ӟ更方便了国际化的应用QStruts会根据浏览器的LocaleQ自动调取相应的properties资源文gQ在BBS-CS是定义的app.peoperties文gQBBS-CS只定义了中文的资源包Q即app_zh_CN.properties文gQ当然只要将q个文g译成日文、韩文等{其他国家文字,卛_实现BBS-CS多语a览。当然只有浏览多语言是不行,数据的保存也必须是通用的格式,BBS-CS采用了UTF-8的编码格式的保存数据Q以解决多语a的问题,关于Unicode、UTF-8~码格式的资料、原理大家可以在|上查找资料Q我在这里不多做讲解了?</p> <p>五、编码问?<br />在(四)中讲了国际化问题Q但是如果不作处理,对中文显C处理都会有问题Q要对app_zh_CN.propertieq行native2ascii的{换,q个命o是在jdk/bin下的Q之后我们要做一个Servlet的过滤器Q对所有的request对象q行~码的{换,com.laoer.bbscs.servlet.EncodingFilter是BBS-CS的过滤器Q它对request的编码格式进行了处理Q定义ؓ了UTF-8的编码格式。以前网上在看到q的一些文章上_采用Servletqo器会有性能的下降,在我使用的感觉上来说Q问题倒不是很大?</p> <p>六、集与Session处理 <br />BBS-CS5.0设计的时候考虑C集群的应用,因ؓ随着pȝ讉K量和数据的不断增长,单台服务器是很难支撑的,所以要求系l能够用多台服务器来q行Q跨服务器的Session是一个很大的问题Q大安知道Session是生存与一个应用中的,跨应用,Session必然不能׃nQ现在JSP容器Q包括Weblogic、Resin、Tomcat都可以进行集应用,但是配制h可能比较复杂Q所以BBS-CS实现了自q集群q用Ҏ。实现的原理比较单,主要是涉及了|络~程Q在JAVA中,对象只要implements了java.io.Serializableq个接口Q即可实C行化Q便可以在网l中传输QBBS-CS是把需要在|络中传输的Session对象q行串行化,在多个服务器之间q行通讯Q以辑ֈ服务器之间的Session同步Q同时对于几台服务器的访问是负蝲均衡的?<br />Session实现QBBS-CS在单服务器配制下是采用了应用的SessionQ而在机群方式下,是徏立了自己的Session列表QSession是一个静态的HashTableQ每个用户在登陆的时候会产生一个随机的sidQ这个sid是HashTable的keyQ而value则是一个HasMapQ保存需要的对象。系l在q行期间会根据配|文件的Session时旉定时对超时的Sessionq行清理?</p> <p>七、静态变量与U程q用 <br />Z减少Ҏ据库的访问,pȝ很多地方使用了静态变量来储存数据Q比如,版区列表和信息是pȝ需要频J访问的Q如果每ơ都从数据库中读取,消耗是很大的,BBS-CS采用的方法是Q一ơ性将数据库读出,攑֜一个静态的列表里(HashTableQ,以后再访问则从静态列表中取,而不是从数据库中取,如果版区信息发生变化Q只要刷新这个静态变量就行了?<br />通常在B/Sl构下,pȝ的定时操作是比较困难的,因ؓB/Sl构的Y件是览器事仉动的模型Q而不是服务器事g驱动Q在Unix/Linux下,通常是写一个脚本,然后用Crontab来跑Q在win下可能就要用VB/VC/Delphi来写一个定时程序了。BBS-CS必须要做到跨品台和通用性,而线E和Sevlet提供很好的方法,一个web应用Q可以在启动的时候按序的执行ServletE序Q在web.xml文g中定义)Q在Servlet中就可以启动一个线E,q个U程定时执行、休眠,便可以达到定时运行程序的目的Q在BBS-CS中,清除时Session、游客等{都是采用了U程定时执行的方式?/p> <img src ="http://www.tkk7.com/renyangok/aggbug/58092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/renyangok/" target="_blank">保尔?/a> 2006-07-14 08:47 <a href="http://www.tkk7.com/renyangok/articles/58092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[未读]单的用lucene搜烦的应用程?/title><link>http://www.tkk7.com/renyangok/articles/58089.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 14 Jul 2006 00:45:00 GMT</pubDate><guid>http://www.tkk7.com/renyangok/articles/58089.html</guid><wfw:comment>http://www.tkk7.com/renyangok/comments/58089.html</wfw:comment><comments>http://www.tkk7.com/renyangok/articles/58089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/renyangok/comments/commentRss/58089.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/renyangok/services/trackbacks/58089.html</trackback:ping><description><![CDATA[ <p>假设我们的电脑的目录中含有很多文本文档,我们需要查扑֓些文档含有某个关键词。ؓ了实现这U功能,我们首先利用 Lucene 对这个目录中的文档徏立烦引,然后在徏立好的烦引中搜烦我们所要查扄文档。通过q个例子读者会对如何利?Lucene 构徏自己的搜索应用程序有个比较清楚的认识?</p> <p>建立索引 </p> <p>ZҎ档进行烦引,Lucene 提供了五个基的类Q他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我们分别介l一下这五个cȝ用途: </p> <p>Document </p> <p>Document 是用来描q文档的Q这里的文档可以指一?HTML 面Q一电子邮Ӟ或者是一个文本文件。一?Document 对象由多?Field 对象l成的。可以把一?Document 对象惌成数据库中的一个记录,而每?Field 对象是记录的一个字Dc?</p> <p>Field </p> <p>Field 对象是用来描qC个文档的某个属性的Q比如一电子邮件的标题和内容可以用两个 Field 对象分别描述?</p> <p>Analyzer </p> <p>? 一个文档被索引之前Q首先需要对文档内容q行分词处理Q这部分工作是?Analyzer 来做的。Analyzer cL一个抽象类Q它有多个实现。针对不同的语言和应用需要选择适合?Analyzer。Analyzer 把分词后的内容交l? IndexWriter 来徏立烦引?</p> <p>IndexWriter </p> <p>IndexWriter ?Lucene 用来创徏索引的一个核心的c,他的作用是把一个个?Document 对象加到索引中来?</p> <p>Directory </p> <p>q个cM表了 Lucene 的烦引的存储的位|,q是一个抽象类Q它目前有两个实玎ͼW一个是 FSDirectoryQ它表示一个存储在文gpȝ中的索引的位|。第二个?RAMDirectoryQ它表示一个存储在内存当中的烦引的位置?</p> <p>熟悉了徏立烦引所需要的q些cdQ我们就开始对某个目录下面的文本文件徏立烦引了Q清?l出了对某个目录下的文本文g建立索引的源代码?</p> <p> <br />清单 1. Ҏ本文件徏立烦?</p> <p>package TestLucene; </p> <p>import java.io.File; <br />import java.io.FileReader; <br />import java.io.Reader; <br />import java.util.Date; </p> <p>import org.apache.lucene.analysis.Analyzer; <br />import org.apache.lucene.analysis.standard.StandardAnalyzer; <br />import org.apache.lucene.document.Document; <br />import org.apache.lucene.document.Field; <br />import org.apache.lucene.index.IndexWriter; </p> <p> <br />/** <br />* This class demonstrate the process of creating index with Lucene <br />* for text files <br />*/ <br />public class TxtFileIndexer { <br />public static void main(String[] args) throws Exception{ <br />//indexDir is the directory that hosts Lucene's index files <br />File indexDir = new File("D:\\luceneIndex"); <br />//dataDir is the directory that hosts the text files that to be indexed <br />File dataDir = new File("D:\\luceneData"); <br />Analyzer luceneAnalyzer = new StandardAnalyzer(); <br />File[] dataFiles = dataDir.listFiles(); <br />IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true); <br />long startTime = new Date().getTime(); <br />for(int i = 0; i < dataFiles.length; i++){ <br />if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){ <br />System.out.println( <br />"Indexing file " + dataFiles[i].getCanonicalPath()); <br />Document document = new Document(); <br />Reader txtReader = new FileReader(dataFiles[i]); <br />document.add( <br />Field.Text("path",dataFiles[i].getCanonicalPath())); <br />document.add(Field.Text("contents",txtReader)); <br />indexWriter.addDocument(document); <br />} <br />} <br />indexWriter.optimize(); <br />indexWriter.close(); <br />long endTime = new Date().getTime(); </p> <p>System.out.println("It takes " + (endTime - startTime) <br />+ " milliseconds to create index for <br />the files in directory " <br />+ dataDir.getPath()); <br />} <br />} </p> <p>? 清单1中,我们注意到类 IndexWriter 的构造函数需要三个参敎ͼW一个参数指定了所创徏的烦引要存放的位|,他可以是一?File 对象Q也可以是一?FSDirectory 对象或?RAMDirectory 对象。第二个参数指定?Analyzer cȝ一个实玎ͼ也就是指定这个烦引是用哪个分词器Ҏ挡内容进行分词。第三个参数是一个布型的变量,如果?true 的话׃表创Z个新的烦引,?false 的话׃表在原来索引的基上进行操作。接着E序遍历了目录下面的所有文本文档,qؓ每一个文本文档创Z一?Document 对象。然后把文本文档的两个属性:路径和内容加入到了两?Field 对象中,接着在把q两?Field 对象加入?Document 对象中,最后把q个文档?IndexWriter cȝ add Ҏ加入到烦引中厅R这h们便完成了烦引的创徏。接下来我们q入在徏立好的烦引上q行搜烦的部分?</p> <p> </p> <p>搜烦文档 </p> <p>? 用Luceneq行搜烦像建立索引一样也是非常方便的。在上面一部分中,我们已经Z个目录下的文本文档徏立好了烦引,现在我们p在这个烦引上q行? 索以扑ֈ包含某个关键词或短语的文档。Lucene提供了几个基的类来完成这个过E,它们分别是呢IndexSearcher, Term, Query, TermQuery, Hits. 下面我们分别介绍q几个类的功能?</p> <p>Query </p> <p>q是一个抽象类Q他有多个实玎ͼ比如TermQuery, BooleanQuery, PrefixQuery. q个cȝ目的是把用户输入的查询字W串装成Lucene能够识别的Query?</p> <p>Term </p> <p>Term 是搜索的基本单位Q一个Term对象有两个Stringcd的域l成。生成一个Term对象可以有如下一条语句来完成QTerm term = new Term(“fieldName?”queryWord?; 其中W一个参C表了要在文档的哪一个Field上进行查找,W二个参C表了要查询的关键词?</p> <p>TermQuery </p> <p>TermQuery 是抽象类Query的一个子c,它同时也是Lucene支持的最为基本的一个查询类。生成一个TermQuery对象由如下语句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName?”queryWord?); 它的构造函数只接受一个参敎ͼ那就是一个Term对象?</p> <p>IndexSearcher </p> <p>IndexSearcher是用来在建立好的索引上进行搜索的。它只能以只ȝ方式打开一个烦引,所以可以有多个IndexSearcher的实例在一个烦引上q行操作?</p> <p>Hits </p> <p>Hits是用来保存搜索的l果的?</p> <p>介绍完这些搜索所必须的类之后Q我们就开始在之前所建立的烦引上q行搜烦了,清单2l出了完成搜索功能所需要的代码?</p> <p> <br />清单2 Q在建立好的索引上进行搜?</p> <p>package TestLucene; </p> <p>import java.io.File; </p> <p>import org.apache.lucene.document.Document; <br />import org.apache.lucene.index.Term; <br />import org.apache.lucene.search.Hits; <br />import org.apache.lucene.search.IndexSearcher; <br />import org.apache.lucene.search.TermQuery; <br />import org.apache.lucene.store.FSDirectory; </p> <p>/** <br />* This class is used to demonstrate the <br />* process of searching on an existing <br />* Lucene index <br />* <br />*/ <br />public class TxtFileSearcher { <br />public static void main(String[] args) throws Exception{ <br />String queryStr = "lucene"; <br />//This is the directory that hosts the Lucene index <br />File indexDir = new File("D:\\luceneIndex"); <br />FSDirectory directory = FSDirectory.getDirectory(indexDir,false); <br />IndexSearcher searcher = new IndexSearcher(directory); <br />if(!indexDir.exists()){ <br />System.out.println("The Lucene index is not exist"); <br />return; <br />} <br />Term term = new Term("contents",queryStr.toLowerCase()); <br />TermQuery luceneQuery = new TermQuery(term); <br />Hits hits = searcher.search(luceneQuery); <br />for(int i = 0; i < hits.length(); i++){ <br />Document document = hits.doc(i); <br />System.out.println("File: " + document.get("path")); <br />} <br />} <br />} </p> <p>? 清单2中,cIndexSearcher的构造函数接受一个类型ؓDirectory的对象,Directory是一个抽象类Q它目前有两个子c: FSDirctory和RAMDirectory. 我们的程序中传入了一个FSDirctory对象作ؓ其参敎ͼ代表了一个存储在盘上的索引的位|。构造函数执行完成后Q代表了q个 IndexSearcher以只ȝ方式打开了一个烦引。然后我们程序构造了一个Term对象Q通过q个Term对象Q我们指定了要在文档的内容中搜烦? 含关键词”lucene”的文档。接着利用q个Term对象构造出TermQuery对象q把q个TermQuery对象传入? IndexSearcher的searchҎ中进行查询,q回的结果保存在Hits对象中。最后我们用了一个@环语句把搜烦到的文档的\径都打印了出 来。好了,我们的搜索应用程序已l开发完毕,怎么P利用Lucene开发搜索应用程序是不是很简单?<br /> <br /></p> <img src ="http://www.tkk7.com/renyangok/aggbug/58089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/renyangok/" target="_blank">保尔?/a> 2006-07-14 08:45 <a href="http://www.tkk7.com/renyangok/articles/58089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZJava的全文烦引引擎LuceneQ未读)http://www.tkk7.com/renyangok/articles/54346.html保尔?/dc:creator>保尔?/author>Wed, 21 Jun 2006 12:22:00 GMThttp://www.tkk7.com/renyangok/articles/54346.htmlhttp://www.tkk7.com/renyangok/comments/54346.htmlhttp://www.tkk7.com/renyangok/articles/54346.html#Feedback0http://www.tkk7.com/renyangok/comments/commentRss/54346.htmlhttp://www.tkk7.com/renyangok/services/trackbacks/54346.html参考R东的《在应用中加入全文检索功?——基于Java的全文烦引引擎Lucene介?

Ҏ 切词 索引 存储 用?
Field.Text(String name, String value) Yes Yes Yes 切分词烦引ƈ存储Q比如:标题Q内容字D?
Field.Text(String name, Reader value) Yes Yes No 切分词烦引不存储Q比如:META信息Q?
不用于返回显C,但需要进行检索内?
Field.Keyword(String name, String value) No Yes Yes 不切分烦引ƈ存储Q比如:日期字段
Field.UnIndexed(String name, String value) No No Yes 不烦引,只存储,比如Q文件\?
Field.UnStored(String name, String value) Yes Yes No 只全文烦引,不存?

好好看看q篇文章Q很不错?

----------------------------------------------------------------------------------------
Q李宇翻译,来自Lucene的帮助文档)

l论

Lucene提供了方便您创徏自徏查询的APIQ也通过QueryParser提供了强大的查询语言?

本文讲述Lucene的查询语句解析器支持的语法,Lucene的查询语句解析器是用JavaCC工具生成的词法解析器Q它查询字串解析ؓLucene Query对象?

 

 


(TermQ?

一条搜索语句被拆分Z些项QtermQ和操作W(operatorQ。项有两U类型:单独和短语?

单独就是一个单独的单词Q例?test" Q?"hello"?

短语是一l被双引号包围的单词Q例?hello dolly"?

多个可以用布尔操作W连接v来Ş成复杂的查询语句Q接下来您就会看刎ͼ?

注意QAnalyzer建立索引时用的解析器和解析单独和短语时的解析器相同,因此选择一个不会受查询语句q扰的Analyzer非常重要?

 

 


域(FieldQ?

Lucene支持域。您可以指定在某一个域中搜索,或者就使用默认域。域名及默认域是具体索引器实现决定的?

您可以这h索域Q域?":"+搜烦的项名?

举个例子Q假设某一个Lucene索引包含两个域,title和textQtext是默认域。如果您x找标题ؓ"The Right Way"且含?don't go this way"的文章,您可以输入:

title:"The Right Way" AND text:go

或?

title:"Do it right" AND right

因ؓtext是默认域Q所以这个域名可以不行?

注意Q域名只对紧接于其后的项生效Q所?

title:Do it right

只有"Do"属于title域?it"?right"仍将在默认域中搜索(q里是text域)?

 

 


修饰符QTerm ModifiersQ?

Lucene支持修饰符以支持更宽范围的搜烦选项?

用通配W搜?

Lucene支持单个与多个字W的通配搜烦?

使用W号"?"表示单个L字符的通配?

使用W号"*"表示多个L字符的通配?

单个L字符匚w的是所有可能单个字W。例如,搜烦"text或?test"Q可以这P

te?t

多个L字符匚w的是0个及更多个可能字W。例如,搜烦test, tests 或?testerQ可以这P

test*

您也可以在字W窜中间使用多个L字符通配W?

te*t

注意Q您不能在搜索的开始?或?W号?

 

 


模糊查询

Lucene支持ZLevenshtein Distance与Edit Distance法的模p搜索。要使用模糊搜烦只需要在单独的最后加上符?~"。例如搜索拼写类g"roam"的项q样写:

roam~

q次搜烦找到Ş如foam和roams的单词?

注意Q用模p查询将自动得到增量因子Qboost factorQؓ0.2的搜索结?

 

 


邻近搜烦(Proximity Searches)

Luceneq支持查扄隔一定距ȝ单词。邻q搜索是在短语最后加上符?~"。例如在文档中搜索相?0个单词的"apache"?jakarta"Q这样写Q?

"jakarta apache"~10

 

 


Boosting a Term

Lucene provides the relevance level of matching documents based on the terms found. To boost a term use the caret, "^", symbol with a boost factor (a number) at the end of the term you are searching. The higher the boost factor, the more relevant the term will be.

Lucene可以讄在搜索时匚w的怼度。在的最后加上符?^"紧接一个数字(增量|Q表C搜索时的相似度。增量D高,搜烦到的相兛_好?

Boosting allows you to control the relevance of a document by boosting its term. For example, if you are searching for jakarta apache and you want the term "jakarta" to be more relevant boost it using the ^ symbol along with the boost factor next to the term. You would type:

通过增量一个项可以控制搜烦文档时的相关度。例如如果您要搜索jakarta apacheQ同时您惌"jakarta"的相兛_更加好,那么在其后加?^"W号和增量|也就是您输入Q?

 

jakarta^4 apache

This will make documents with the term jakarta appear more relevant. You can also boost Phrase Terms as in the example:

q将使得生成的doucment可能与jakarta相关度高。您也可以增量短语,象以下这个例子一P

"jakarta apache"^4 "jakarta lucene"

By default, the boost factor is 1. Although, the boost factor must be positive, it can be less than 1 (i.e. .2)

默认情况下,增量值是1。增量g可以于1Q例?.2Q,但必L有效的?

 

 

 

 


布尔操作W?

布尔操作W可项通过逻辑操作q接h。Lucene支持AND, "+", OR, NOT ?"-"q些操作W。(注意Q布操作符必须全部大写Q?

OR

OR操作W是默认的连接操作符。这意味着如果两个之间没有布操作符Q就是用OR操作W。OR操作W连接两个项Q意味着查找含有L的文档。这与集合ƈq算相同。符号||可以代替W号OR?

搜烦含有"jakarta apache" 或?"jakarta"的文档,可以使用q样的查询:

"jakarta apache" jakarta

或?

"jakarta apache" OR jakarta

 

 


AND

AND操作W匹配的是两同时出现的文档。这个与集合交操作相{。符?amp;&可以代替W号AND?

搜烦同时含有"jakarta apache" ?"jakarta lucene"的文档,使用查询Q?

"jakarta apache" AND "jakarta lucene"

 

 


+

"+"操作W或者称为存在操作符Q要求符?+"后的必d文档相应的域中存在?

搜烦必须含有"jakarta"Q可能含?lucene"的文档,使用查询Q?

+jakarta apache

 

 


NOT

NOT操作W排除那些含有NOTW号后面的文档。这和集合的差运相同。符P可以代替W号NOT?

搜烦含有"jakarta apache"Q但是不含有"jakarta lucene"的文档,使用查询Q?

"jakarta apache" NOT "jakarta lucene"

注意QNOT操作W不能单独与用构成查询。例如,以下的查询查不到Ml果Q?

NOT "jakarta apache"

 

 


-

"-"操作W或者禁止操作符排除含有"-"后面的相似项的文档?

搜烦含有"jakarta apache"Q但不是"jakarta lucene"Q用查询:

"jakarta apache" -"jakarta lucene"

 

 

 

 


分组QGroupingQ?

Lucene支持使用圆括hl合字句形成子查询。这对于x制查询布逻辑的h十分有用?

搜烦含有"jakarta"或?apache"Q同时含?website"的文档,使用查询Q?

(jakarta OR apache) AND website

q样消除了歧义Q保证website必须存在Qjakarta和apache中之一也存在?

 

 


转义Ҏ字符QEscaping Special CharactersQ?

Lucene支持转义Ҏ字符Q因为特D字W是查询语法用到的。现在,Ҏ字符包括

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

转义Ҏ字符只需在字W前加上W号\,例如搜烦(1+1):2Q用查?

\(1\+1\)\:2


---------------------------------------
索引文g格式

本文定义了LuceneQ版?.3Q用到的索引文g的格式?

Jakarta Lucene是用Java写成的,同时有很多团体正在默默的用其他的E序语言来改写它。如果这些新的版本想和Jakarta Lucene兼容Q就需要一个与具体语言无关的Lucene索引文g格式。本文正是试图提供一个完整的与语a无关的Jakarta Lucene 1.3索引文g格式的规格定义?

随着Lucene不断发展Q本文也应该更新。不同语a写成的Lucene实现版本应当力遵守文g格式Q也必须产生本文的新版本?

本文同时提供兼容性批注,描述文g格式上与前一版本不同的地斏V?

 

 


定义

Lucene中最基础的概忉|索引QindexQ,文档QdocumentQ,域(fieldQ和(termQ?

索引包含了一个文档的序列?

· 文档是一些域的序列?

· 域是一些项的序列?

· 就是一个字丌Ӏ?

存在于不同域中的同一个字串被认ؓ是不同的V因此项实际是用一对字串表C的Q第一个字串是域名Q第二个是域中的字串?

倒排索引

Z使得Z的搜烦更有效率Q烦引中Ҏ静态存储的。Lucene的烦引属于烦引方式中的倒排索引Q因为对于一个项q种索引可以列出包含它的文档。这刚好是文档与自然联pȝ倒置?

 

 


域的cd

Lucene中,域的文本可能以逐字的非倒排的方式存储在索引中。而倒排q的域称索引q了。域也可能同时被存储和被索引?

域的文本可能被分解许多项目而被索引Q或者就被用作一个项目而被索引。大多数的域是被分解q的Q但是有些时候某些标识符域被当做一个项目烦引是很有用的?

 

 


D(SegmentQ?

Lucene索引可能由多个子索引l成Q这些子索引成ؓDc每一D都是完整独立的索引Q能被搜索。烦引是q样作成的:

1. 为新加入的文档创建新Dc?

2. 合ƈ已经存在的段?

搜烦旉要涉及到多个D和/或者多个烦引,每一个烦引又可能׃些段l成?

 

 


文档PDocument NumberQ?

内部的来_Lucene用一个整形(intergerQ的文档h指示文档。第一个被加入到烦引中的文档就?P序加入的文档将得到一个由前一个号码递增而来的号码?

注意文档h可能改变的,所以在Lucene外部存储q些L时必d心。特别的Q号码的改变的情况如下:

· 只有D内的号码是相同的,不同D之间不同,因而在一个比D广泛的上下文环境中使用q些LӞ必L变它们。标准的技术是Ҏ每一D号码多ؓ每一D分 配一个段受将D内文档可{换到D外Ӟ加上D号。将某段外的文档可{换到D内ӞҎ每段中可能的转换后号码范围来判断文档属于那一D,q减调这一D늚 D号。例如有两个?个文档的D合qӞ那么W一D늚D号是0Q第二段D号5。第二段中的W三个文档,在段外的L是8?

· 文档删除后,q箋的号码就出现了间断。这可以通过合ƈ索引来解冻ID合q时删除的文档相应也删掉了,新合q而成的段q没有号码间断?

 

 

 

 


l论

索引D늻护着以下的信息:

· 域集合。包含了索引中用到的所有的域?

· 域值存储表。每一个文档都含有一个“属性-值”对的列表,属性即为域名。这个列表用来存储文档的一些附加信息,如标题,url或者访问数据库的一个ID。在搜烦时存储域的集合可以被q回。这个表以文档号标识?

· 字典。这个字典含有所有文档的所有域中用过的的,同时含有使用q它的文档的文档P以及指向使用频数信息和位|信息的指针?

· wC息。对于项字典中的每个,q些信息包含含有q个的文档的LQ以及每个文档中使用的次数?

· 位|信息。对于项字典中的每个,都存有在每个文档中出现的各个位置?

· Normalization factors. For each field in each document, a value is stored that is multiplied into the score for hits on that field. 标准化因子。对于文档中的每一个域Q存有一个|用来以后乘以q个q个域的命中敎ͼhitsQ?

· 被删除的文档信息。这是一个可选文Ӟ用来表明那些文档已经删除了?

接下来的各部分部分详l描q这些信息?

 

 


文g的命名(File NamingQ?

同属于一个段的文件拥有相同的文g名,不同的扩展名。扩展名׃下讨论的各种文g格式定?

一般来_一个烦引存放一个目录,其所有段都存攑֜q个目录里,管我们不要求您q样做?

 

 


基本数据cdQPrimitive TypesQ?

Byte

最基本的数据类型就是字节(byteQ?位)。文件就是按字节序讉K的。其它的一些数据类型也定义为字节的序列Q文件的格式h字节意义上的独立性?

 

 


UInt32

32位无W号整数Q由四个字节l成Q高位优先?

UInt32 --> <Byte>4

 

 


Uint64

64位无W号整数Q由八字节组成,高位优先?

UInt64 --> <Byte>8

 

 


VInt

可变长的正整数类型,每字节的最高位表明q剩多少字节。每字节的低七位表明整数的倹{因此单字节的g0?27Q两字节g128?6,383Q等{?

VInt ~码CZ

Value
First byte
Second byte
Third byte

0
00000000

 

1
00000001

 

2
00000010

 

...

 


127
01111111

 

128
10000000
00000001


129
10000001
00000001


130
10000010
00000001


...

 


16,383
11111111
01111111


16,384
10000000
10000000
00000001

16,385
10000001
10000000
00000001

...

 

 

q种~码提供了一U在高效率解码时压羃数据的方法?

 

 


Chars

Lucene输出UNICODE字符序列Q用标准UTF-8~码?

 

 


String

Lucene输出由VINT和字W串l成的字ԌVINT表示字串长,字符串紧接其后?

String --> VInt, Chars

 

 

 

 


索引包含的文ӞPer-Index FilesQ?

q部分介l每个烦引包含的文g?

Segments文g

索引中活动的D存储在Segments文g中。每个烦引只能含有一个这L文gQ名?segments".q个文g依次列出每个D늚名字和每个段的大?

Segments --> SegCount, <SegName, SegSize>SegCount

SegCount, SegSize --> UInt32

SegName --> String

SegName表示该segment的名字,同时作ؓ索引其他文g的前~?

SegSize是段索引中含有的文档数?

 

 


Lock文g

有一些文件用来表C另一个进E在使用索引?

· 如果存在"commit.lock"文gQ表C有q程在写"segments"文g和删除无用的D늃引文Ӟ或者表C有q程在读"segments"文g 和打开某些D늚文g。在一个进E在d"segments"文gD信息后Q还没来得及打开所有该D늚文g前,q个Lock文g可以防止另一个进E删除这? 文g?

· 如果存在"index.lock"文gQ表C有q程在向索引中加入文档,或者是从烦引中删除文档。这个文仉止很多文件同时修改一个烦引?

 

 


Deleteable文g

名ؓ"deletetable"的文件包含了索引不再使用的文件的名字Q这些文件可能ƈ没有被实际的删除。这U情况只存在与Win32q_下,因ؓWin32下文件仍打开时ƈ不能删除?

Deleteable --> DelableCount, <DelableName>DelableCount

DelableCount --> UInt32

DelableName --> String

 

 

 

 


D包含的文gQPer-Segment FilesQ?

剩下的文件是每段中包含的文gQ因此由后缀来区分?

域(FieldQ?


域集合信息(Field InfoQ?

所有域名都存储在这个文件的域集合信息中Q这个文件以后缀.fnml尾?

FieldInfos (.fnm) --> FieldsCount, <FieldName, FieldBits>FieldsCount

FieldsCount --> VInt

FieldName --> String

FieldBits --> Byte

目前情况下,FieldBits只有使用低位Q对于已索引的域gؓ1Q对未烦引的域gؓ0?

文g中的域根据它们的ơ序~号。因此域0是文件中的第一个域Q域1是接下来的,{等。这个和文档L~号方式相同?


域值存储表QStored FieldsQ?

域值存储表使用两个文g表示Q?

1. 域烦引(.fdx文gQ?

如下Q对于每个文档这个文件包含指向域值的指针Q?

FieldIndex (.fdx) --> <FieldValuesPosition>SegSize

FieldValuesPosition --> Uint64

FieldValuesPosition 指示的是某一文档的某域的域值在域值文件中的位|。因为域值文件含有定长的数据信息Q因而很Ҏ随机讉K。在域值文件中Q文档n的域g息就存在n*8? |处QThe position of document n's field data is the Uint64 at n*8 in this file.Q?

2. 域|.fdt文gQ?

如下Q每个文档的域g息包含:

FieldData (.fdt) --> <DocFieldData>SegSize

DocFieldData --> FieldCount, <FieldNum, Bits, Value>FieldCount

FieldCount --> VInt

FieldNum --> VInt

Bits --> Byte

Value --> String

目前情况下,Bits只有低位被用,gؓ1表示域名被分解过Qgؓ0表示未分解过?

 

 


字典(Term DictionaryQ?

字典用以下两个文g表示Q?

1. 信息(.tis文gQ?

TermInfoFile (.tis)--> TermCount, TermInfos

TermCount --> UInt32

TermInfos --> <TermInfo>TermCount

TermInfo --> <Term, DocFreq, FreqDelta, ProxDelta>

Term --> <PrefixLength, Suffix, FieldNum>

Suffix --> String

PrefixLength, DocFreq, FreqDelta, ProxDelta
--> VInt

信息按Ҏ序。项信息排序时先按项所属的域的文字序排序Q然后按照项的字串的文字序排序?

的字前~往往是共同的Q与字的后缀l成字。PrefixLength变量是表示与前一相同的前缀的字数。因此,如果前一个项的字?bone"Q后一个是"boy"的话QPrefixLengthgؓ2QSuffixgؓ"y"?

FieldNum指明了项属于的域P而域名存储在.fdt文g中?

DocFreg表示的是含有该项的文档的数量?

FreqDelta指明了项所属TermFreq变量?frq文g中的位置。详l的_是指相对于前一个项的数据的位置偏移量(或者是0Q表C文件中W一个项Q?

ProxDelta指明了项所属的TermPosition变量?prx文g中的位置。详l的_是指相对于前一个项的数据的位置偏移量(或者是0Q表C文件中W一个项Q?

2. 信息烦引(.tii文gQ?

每个信息烦引文件包?tis文g中的128个条目,依照条目?tis文g中的序。这栯计是Z一ơ将索引信息d内存能,然后使用它来随机的访?tis文g?

q个文g的结构和.tis文g非常cMQ只在每个条目记录上增加了一个变量IndexDelta?

TermInfoIndex (.tii)--> IndexTermCount, TermIndices

IndexTermCount --> UInt32

TermIndices --> <TermInfo, IndexDelta>IndexTermCount

IndexDelta --> VInt

IndexDelta表示该项的TermInfo变量值在.tis文g中的位置。详l的Ԍ是指相对于前一个条目的偏移量(或者是0Q对于文件中W一个项Q?

 

 


w敎ͼFrequenciesQ?

.frq文g包含每一的文档的列表,q有该项在对应文档中出现的频数?

FreqFile (.frq) --> <TermFreqs>TermCount

TermFreqs --> <TermFreq>DocFreq

TermFreq --> DocDelta, Freq?

DocDelta,Freq --> VInt

TermFreqs序列按照Ҏ排序Q依据于.tis文g中的,即项是隐含存在的Q?

TermFreq元组按照文档号升序排列?

DocDelta 军_了文档号和频数。详l的_DocDelta/2表示相对于前一文档L偏移量(或者是0Q表C是TermFreqs里面的第一)。当 DocDelta是奇数时表示在该文档中频Cؓ1Q当DocDelta是偶数时Q另一个VIntQFreqQ就表示在该文档中出现的频数?

例如Q假设某一在文档7中出Cơ,在文?1中出C3ơ,在TermFreqs中就存在如下的VInts序列Q?

15, 22, 3

 

 


位|(PositionQ?

.prx文g包含了某文档中某出现的位置信息的列表?

ProxFile (.prx) --> <TermPositions>TermCount

TermPositions --> <Positions>DocFreq

Positions --> <PositionDelta>Freq

PositionDelta --> VInt

TermPositions按照Ҏ排序Q依据于.tis文g中的,即项是隐含存在的Q?

Positions元组按照文档号升序排列?

PositionDelta是相对于前一个出C|的偏移位置Q或者ؓ0Q表C是第一ơ在q个文档中出玎ͼ?

例如Q假设某一在某文档第4出玎ͼ在另一个文档中W?和W?出玎ͼ存在如下的VInt序列Q?

4, 5, 4

 

 


标准化因子(Normalization FactorQ?

.nrm文g包含了每个文档的标准化因子,标准化因子用来以后乘以这个这个域的命中数?

Norms (.nrm) --> <Byte>SegSize

每个字节记录一个QҎ。位0-2包含?位的数部分Q位3-8包含?位的指数部分?

按如下规则可这些字节{换ؓIEEE标准单精度QҎQ?

1. 如果该字节是0Q就是Q?Q?

2. 否则Q设|新点数的标志位ؓ0Q?

3. 字节中的指数加?8后作为新的QҎ的指敎ͼ

4. 字节中的尾数映到新QҎ数的高3位;q且

5. 讄新QҎ数的低21位ؓ0?

 

 


被删除的文档QDeleted DocumentQ?

.del文g是可选的Q只有在某段中存在删除操作后才存在:

Deletions (.del) --> ByteCount,BitCount,Bits

ByteSize,BitCount --> Uint32

Bits --> <Byte>ByteCount

ByteCount表示的是Bits列表中Byte的数量。典型的Q它{于QSegSize/8Q?1?

BitCount表示Bits列表中多个已经被设|过了?

Bits列表包含了一些位QbitQ,序表示一个文档。当对应于文档号的位被设|了Q就标志着q个文档已经被删除了。位的顺序是从低到高。因此,如果Bits包含两个字节Q?x00?x02Q那么表C文?已经删除了?

 

 

 

 


局限性(LimitationsQ?

在以上的文g格式中,好几处都有限刉和文档的最大个Cؓ32位数的极限,xq于40ѝ今天看来,q不会造成问题Q但是,长远的看Q可能造成问题。因此,q些极限应该或者换为UInt64cd的|或者更好的Q换为VIntcd的|VInt值没有上限)?

有两处地方的代码要求必须是定长的|他们是:

1. FieldValuesPosition变量Q存储于域烦引文件中Q?fdx文gQ。它已经是一个UInt64型,所以不会有问题?

2. TermCount变量Q存储于信息文件中Q?tis文gQ。这是最后输出到文g中的Q但是最先被dQ因此是存储于文件的最前端 。烦引代码先在这里写入一?|然后在其他文件输出完毕后覆盖q个倹{所以无论它存储在什么地方,它都必须是一个定长的|它应该被变成UInt64 型?

除此之外Q所有的UInt值都可以换成VInt型以L限制?/p>

]]>
SmartUpload上传下蝲及文件名和文件内容中文问?/title><link>http://www.tkk7.com/renyangok/articles/51362.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Thu, 08 Jun 2006 07:17:00 GMT</pubDate><guid>http://www.tkk7.com/renyangok/articles/51362.html</guid><wfw:comment>http://www.tkk7.com/renyangok/comments/51362.html</wfw:comment><comments>http://www.tkk7.com/renyangok/articles/51362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/renyangok/comments/commentRss/51362.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/renyangok/services/trackbacks/51362.html</trackback:ping><description><![CDATA[ <p>Q共两篇文章Q以Q-Q分隔)<br />一、安装篇 </p> <p>  jspSmartUpload是由<a >www.jspsmart.com</a>|站开发的一个可免费使用的全功能的文件上传下载组Ӟ适于嵌入执行上传下蝲操作的JSP文g中。该lg有以下几个特点: </p> <p>1、用简单。在JSP文g中仅仅书写三五行JAVA代码可以搞定文件的上传或下载,方便?</p> <p>2、能全程控制上传。利用jspSmartUploadlg提供的对象及其操作方法,可以获得全部上传文g的信息(包括文g名,大小Q类型,扩展名,文g数据{)Q方便存取?</p> <p>3、能对上传的文g在大、类型等斚w做出限制。如此可以o掉不W合要求的文件?</p> <p>4、下载灵zR仅写两行代码,p把Web服务器变成文件服务器。不文件在Web服务器的目录下或在其它Q何目录下Q都可以利用jspSmartUploadq行下蝲?</p> <p>5、能文件上传到数据库中Q也能将数据库中的数据下载下来。这U功能针对的是MYSQL数据库,因ؓ不具有通用性,所以本文不准备举例介绍q种用法?</p> <p>  jspSmartUploadlg可以?a >www.jspsmart.com</a>|站上自׃载,压羃包的名字是jspSmartUpload.zip。下载后Q用WinZip或WinRAR其解压到Tomcat的webapps目录下(本文以Tomcat服务器ؓ例进行介l)。解压后Q将webapps/jspsmartupload目录下的子目录Web-inf名字改ؓ全大写的WEB-INFQ这样一改jspSmartUploadcL能用。因为TomcatҎ件名大小写敏感,它要求Web应用E序相关的类所在目录ؓWEB-INFQ且必须是大写。接着重新启动TomcatQ这样就可以在JSP文g中用jspSmartUploadlg了?</p> <p>  注意Q按上述Ҏ安装后,只有webapps/jspsmartupload目录下的E序可以使用jspSmartUploadlgQ如果想让Tomcat服务器的所有Web应用E序都能用它Q必d如下工作Q?</p> <p>1Q进入命令行状态,目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下?</p> <p>2Q运行JAR打包命oQjar cvf jspSmartUpload.jar com </p> <p>Q也可以打开资源理器,切换到当前目录,用WinZipcom目录下的所有文件压~成jspSmartUpload.zipQ然后将jspSmartUpload.zip换名为jspSmartUpload.jar文g卛_。) </p> <p>3Q将jspSmartUpload.jar拯到Tomcat的shared/lib目录下?</p> <p>二、相关类说明?</p> <p>?Filec?</p> <p>  q个cd装了一个上传文件的所有信息。通过它,可以得到上传文g的文件名、文件大、扩展名、文件数据等信息?</p> <p>  FilecM要提供以下方法: </p> <p>1、saveAs作用Q将文g换名另存?</p> <p>原型Q?</p> <p>public void saveAs(java.lang.String destFilePathName) </p> <p>?</p> <p>public void saveAs(java.lang.String destFilePathName, int optionSaveAs) </p> <p>其中QdestFilePathName是另存的文g名,optionSaveAs是另存的选项Q该选项有三个|分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUALQSAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系l的根目录ؓ文g根目录另存文ӞSAVEAS_VIRTUAL表明以Web应用E序的根目录为文件根目录另存文gQSAVEAS_AUTO则表Clg军_Q当Web应用E序的根目录存在另存文g的目录时Q它会选择SAVEAS_VIRTUALQ否则会选择SAVEAS_PHYSICAL?</p> <p>例如QsaveAs("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文g名实际是c:\upload\sample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用E序的根目录是webapps/jspsmartuploadQ则另存的文件名实际是webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip",SAVEAS_AUTO)执行时若Web应用E序根目录下存在upload目录Q则其效果同saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)Q否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)?</p> <p>Q对于WebE序的开发来_最好用SAVEAS_VIRTUALQ以便移植?</p> <p>2、isMissing </p> <p>作用Q这个方法用于判断用h否选择了文Ӟ也即对应的表单项是否有倹{选择了文件时Q它q回false。未选文件时Q它q回true?</p> <p>原型Qpublic boolean isMissing() </p> <p>3、getFieldName </p> <p>作用Q取HTML表单中对应于此上传文件的表单的名字?</p> <p>原型Qpublic String getFieldName() </p> <p>4、getFileName </p> <p>作用Q取文g名(不含目录信息Q?</p> <p>原型Qpublic String getFileName() </p> <p>5、getFilePathName </p> <p>作用Q取文g全名Q带目录Q?</p> <p>原型Qpublic String getFilePathName </p> <p>6、getFileExt </p> <p>作用Q取文g扩展名(后缀Q?</p> <p>原型Qpublic String getFileExt() </p> <p>7、getSize </p> <p>作用Q取文g长度Q以字节计) </p> <p>原型Qpublic int getSize() </p> <p>8、getBinaryData </p> <p>作用Q取文g数据中指定位Ud的一个字节,用于文件等处理?</p> <p>原型Qpublic byte getBinaryData(int index)。其中,index表示位移Q其值在0到getSize()-1之间?</p> <p>?Filesc?</p> <p>  q个c表C所有上传文件的集合Q通过它可以得C传文件的数目、大等信息。有以下ҎQ?</p> <p>1、getCount </p> <p>作用Q取得上传文件的数目?</p> <p>原型Qpublic int getCount() </p> <p>2、getFile </p> <p>作用Q取得指定位Ud的文件对象FileQ这是com.jspsmart.upload.FileQ不是java.io.FileQ注意区分)?</p> <p>原型Qpublic File getFile(int index)。其中,index为指定位U,其值在0到getCount()-1之间?</p> <p>3、getSize </p> <p>作用Q取得上传文件的总长度,可用于限制一ơ性上传的数据量大?</p> <p>原型Qpublic long getSize() </p> <p>4、getCollection </p> <p>作用Q将所有上传文件对象以Collection的Ş式返回,以便其它应用E序引用Q浏览上传文件信息?</p> <p>原型Qpublic Collection getCollection() </p> <p>5、getEnumeration </p> <p>作用Q将所有上传文件对象以EnumerationQ枚举)的Ş式返回,以便其它应用E序览上传文g信息?</p> <p>原型Qpublic Enumeration getEnumeration() </p> <p>?Requestc?</p> <p>  q个cȝ功能{同于JSP内置的对象request。只所以提供这个类Q是因ؓ对于文g上传表单Q通过request对象无法获得表单的|必须通过jspSmartUploadlg提供的Request对象来获取。该cL供如下方法: </p> <p>1、getParameter </p> <p>作用Q获取指定参C倹{当参数不存在时Q返回gؓnull?</p> <p>原型Qpublic String getParameter(String name)。其中,name为参数的名字?</p> <p>2、getParameterValues </p> <p>作用Q当一个参数可以有多个值时Q用此方法来取其倹{它q回的是一个字W串数组。当参数不存在时Q返回gؓnull?</p> <p>原型Qpublic String[] getParameterValues(String name)。其中,name为参数的名字?</p> <p>3、getParameterNames </p> <p>作用Q取得Request对象中所有参数的名字Q用于遍历所有参数。它q回的是一个枚丑֞的对象?</p> <p>原型Qpublic Enumeration getParameterNames() </p> <p>?SmartUploadc这个类完成上传下蝲工作?</p> <p>AQ上传与下蝲q的方法: </p> <p>只有一个:initialize?</p> <p>作用Q执行上传下载的初始化工作,必须W一个执行?</p> <p>原型Q有多个Q主要用下面这个: </p> <p>public final void initialize(javax.servlet.jsp.PageContext pageContext) </p> <p>其中QpageContext为JSP面内置对象Q页面上下文Q?</p> <p>BQ上传文件用的ҎQ?</p> <p>1、upload </p> <p>作用Q上传文件数据。对于上传操作,W一步执行initializeҎQ第二步p执行q个Ҏ?</p> <p>原型Qpublic void upload() </p> <p>2、save </p> <p>作用Q将全部上传文g保存到指定目录下Qƈq回保存的文件个数?</p> <p>原型Qpublic int save(String destPathName) </p> <p>和public int save(String destPathName,int option) </p> <p>其中QdestPathName为文件保存目录,optionZ存选项Q它有三个|分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。(同FilecȝsaveAsҎ的选项之值类|SAVE_PHYSICAL指示lg文件保存到以操作系l根目录为文件根目录的目录下QSAVE_VIRTUAL指示lg文件保存到以Web应用E序根目录ؓ文g根目录的目录下,而SAVE_AUTO则表C由lg自动选择?</p> <p>注:save(destPathName)作用{同于save(destPathName,SAVE_AUTO)?</p> <p>3、getSize </p> <p>作用Q取上传文g数据的总长?</p> <p>原型Qpublic int getSize() </p> <p>4、getFiles </p> <p>作用Q取全部上传文gQ以Files对象形式q回Q可以利用Filescȝ操作Ҏ来获得上传文件的数目{信息?</p> <p>原型Qpublic Files getFiles() </p> <p>5、getRequest </p> <p>作用Q取得Request对象Q以便由此对象获得上传表单参C倹{?</p> <p>原型Qpublic Request getRequest() </p> <p>6、setAllowedFilesList </p> <p>作用Q设定允怸传带有指定扩展名的文Ӟ当上传过E中有文件名不允许时Q组件将抛出异常?</p> <p>原型Qpublic void setAllowedFilesList(String allowedFilesList) </p> <p>其中QallowedFilesList为允怸传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文gQ可以用两个逗号表示。例如:setAllowedFilesList("doc,txt,,")允怸传带doc和txt扩展名的文g以及没有扩展名的文g?</p> <p>7、setDeniedFilesList </p> <p>作用Q用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限Ӟ则上传时lg抛出异常?</p> <p>原型Qpublic void setDeniedFilesList(String deniedFilesList) </p> <p>其中QdeniedFilesList为禁止上传的文g扩展名列表,各个扩展名之间以逗号分隔。如果想止上传那些没有扩展名的文gQ可以用两个逗号来表C。例如:setDeniedFilesList("exe,bat,,")禁止上传带exe和bat扩展名的文g以及没有扩展名的文g?</p> <p>8、setMaxFileSize </p> <p>作用Q设定每个文件允怸传的最大长度?</p> <p>原型Qpublic void setMaxFileSize(long maxFileSize) </p> <p>其中QmaxFileSizeZؓ每个文g允许上传的最大长度,当文件超出此长度Ӟ不被上传?</p> <p>9、setTotalMaxFileSize </p> <p>作用Q设定允怸传的文g的总长度,用于限制一ơ性上传的数据量大?</p> <p>原型Qpublic void setTotalMaxFileSize(long totalMaxFileSize) </p> <p>其中QtotalMaxFileSize为允怸传的文g的总长度?</p> <p>CQ下载文件常用的Ҏ </p> <p>1、setContentDisposition </p> <p>作用Q将数据q加到MIME文g头的CONTENT-DISPOSITION域。jspSmartUploadlg会在q回下蝲的信息时自动填写MIME文g头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,L此方法?</p> <p>原型Qpublic void setContentDisposition(String contentDisposition) </p> <p>其中QcontentDispositiond的数据。如果contentDisposition为nullQ则lg自动添?attachment;"Q以表明下载的文g作ؓ附gQ结果是IE览器将会提C另存文Ӟ而不是自动打开q个文gQIE览器一般根据下载的文g扩展名决定执行什么操作,扩展名ؓdoc的将用wordE序打开Q扩展名为pdf的将用acrobatE序打开Q等{)?</p> <p>2、downloadFile </p> <p>作用Q下载文件?</p> <p>原型Q共有以下三个原型可用,W一个最常用Q后两个用于Ҏ情况下的文g下蝲Q如更改内容cdQ更改另存的文g名)?</p> <p>?public void downloadFile(String sourceFilePathName) </p> <p>其中QsourceFilePathName下蝲的文件名Q带目录的文件全名) </p> <p>?public void downloadFile(String sourceFilePathName,String contentType) </p> <p>其中QsourceFilePathName下蝲的文件名Q带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被览器识别)?</p> <p>?public void downloadFile(String sourceFilePathName,String contentType,String destFileName) </p> <p>其中QsourceFilePathName下蝲的文件名Q带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被览器识别),destFileNameZ载后默认的另存文件名?</p> <p>三、文件上传篇 </p> <p>?表单要求 </p> <p>对于上传文g的FORM表单Q有两个要求Q?</p> <p>1、METHOD应用POSTQ即METHOD="POST"?</p> <p>2、增加属性:ENCTYPE="multipart/form-data" </p> <p>下面是一个用于上传文件的FORM表单的例子: </p> <p><FORM METHOD="POST" ENCTYPE="multipart/form-data" <br />ACTION="/jspSmartUpload/upload.jsp"><br /><INPUT TYPE="FILE" NAME="MYFILE"><br /><INPUT TYPE="SUBMIT"><br /></FORM> </p> <p> <br />?上传的例?</p> <p>1、上传页面upload.html </p> <p>本页面提供表单,让用户选择要上传的文gQ点?上传"按钮执行上传操作?</p> <p>面源码如下Q?</p> <p><!--<br />    文g名:upload.html<br /> 作?者:U|软g制作中心雨亦?<a href="mailto:zhsoft88@sohu.com">zhsoft88@sohu.com</a>)<br />--><br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><html><br /><head><br /><title>文g上传</title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /></head></p> <p><body><br /><p>&nbsp;</p><br /><p align="center">上传文g选择</p><br /><FORM METHOD="POST" ACTION="jsp/do_upload.jsp"<br />ENCTYPE="multipart/form-data"><br /><input type="hidden" name="TEST" value="good"><br />  <table width="75%" border="1" align="center"><br />    <tr> <br />      <td><div align="center">1?<br />          <input type="FILE" name="FILE1" size="30"><br />        </div></td><br />    </tr><br />    <tr> <br />      <td><div align="center">2?<br />          <input type="FILE" name="FILE2" size="30"><br />        </div></td><br />    </tr><br />    <tr> <br />      <td><div align="center">3?<br />          <input type="FILE" name="FILE3" size="30"><br />        </div></td><br />    </tr><br />    <tr> <br />      <td><div align="center">4?<br />          <input type="FILE" name="FILE4" size="30"><br />        </div></td><br />    </tr><br />    <tr> <br />      <td><div align="center"><br />          <input type="submit" name="Submit" value="上传它!"><br />        </div></td><br />    </tr><br />  </table><br /></FORM><br /></body><br /></html> </p> <p> <br />2、上传处理页面do_upload.jsp </p> <p>本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法Q在此不赘述了?</p> <p>面源码如下Q?</p> <p><%--<br /> 文g名:do_upload.jsp<br /> 作?者:U|软g制作中心雨亦?<a href="mailto:zhsoft88@sohu.com">zhsoft88@sohu.com</a>)<br />--%><br /><%@ page contentType="text/html; charset=gb2312" language="java" <br />import="java.util.*,com.jspsmart.upload.*" errorPage="" %><br /><html><br /><head><br /><title>文g上传处理面</title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /></head></p> <p><body><br /><%<br /> // 新徏一个SmartUpload对象<br /> SmartUpload su = new SmartUpload();<br /> // 上传初始?br /> su.initialize(pageContext);<br /> // 讑֮上传限制<br /> // 1.限制每个上传文g的最大长度?br /> // su.setMaxFileSize(10000);<br /> // 2.限制M传数据的长度?br /> // su.setTotalMaxFileSize(20000);<br /> // 3.讑֮允许上传的文Ӟ通过扩展名限Ӟ,仅允许doc,txt文g?br /> // su.setAllowedFilesList("doc,txt");<br /> // 4.讑֮止上传的文Ӟ通过扩展名限Ӟ,止上传带有exe,bat,<br /> jsp,htm,html扩展名的文g和没有扩展名的文件?br /> // su.setDeniedFilesList("exe,bat,jsp,htm,html,,");<br /> // 上传文g<br /> su.upload();<br /> // 上传文件全部保存到指定目录<br /> int count = su.save("/upload");<br /> out.println(count+"个文件上传成功!<br>");<br /> <br /> // 利用Request对象获取参数之?br /> out.println("TEST="+su.getRequest().getParameter("TEST")<br /> +"<BR><BR>");</p> <p> // 逐一提取上传文g信息Q同时可保存文g?br /> for (int i=0;i<su.getFiles().getCount();i++)<br /> {<br />  com.jspsmart.upload.File file = su.getFiles().getFile(i);<br />  <br />  // 若文件不存在则l?br />  if (file.isMissing()) continue;</p> <p>  // 昄当前文g信息<br />  out.println("<TABLE BORDER=1>");<br />  out.println("<TR><TD>表单名QFieldNameQ?lt;/TD><TD>"<br />  + file.getFieldName() + "</TD></TR>");<br />  out.println("<TR><TD>文g长度QSizeQ?lt;/TD><TD>" + <br />  file.getSize() + "</TD></TR>");<br />  out.println("<TR><TD>文g名(FileNameQ?lt;/TD><TD>" <br />  + file.getFileName() + "</TD></TR>");<br />  out.println("<TR><TD>文g扩展名(FileExtQ?lt;/TD><TD>" <br />  + file.getFileExt() + "</TD></TR>");<br />  out.println("<TR><TD>文g全名QFilePathNameQ?lt;/TD><TD>"<br />  + file.getFilePathName() + "</TD></TR>");<br />  out.println("</TABLE><BR>");</p> <p>  // 文件另?br />  // file.saveAs("/upload/" + myFile.getFileName());<br />  // 另存CWEB应用E序的根目录为文件根目录的目录下<br />  // file.saveAs("/upload/" + myFile.getFileName(), <br />  su.SAVE_VIRTUAL);<br />  // 另存到操作系l的根目录ؓ文g根目录的目录?br />  // file.saveAs("c:\\temp\\" + myFile.getFileName(), <br />  su.SAVE_PHYSICAL);</p> <p> }<br />%><br /></body><br /></html> </p> <p> <br />四、文件下载篇 </p> <p>1、下载链接页面download.html </p> <p>面源码如下Q?</p> <p><!--<br />  文g名:download.html<br /> 作?者:U|软g制作中心雨亦?<a href="mailto:zhsoft88@sohu.com">zhsoft88@sohu.com</a>)<br />--><br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><html><br /><head><br /><title>下蝲</title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /></head><br /><body><br /><a href="jsp/do_download.jsp">点击下蝲</a><br /></body><br /></html> </p> <p> <br />2、下载处理页面do_download.jsp do_download.jsp展示了如何利用jspSmartUploadlg来下载文Ӟ从下面的源码中就可以看到Q下载何其简单?</p> <p>源码如下Q?</p> <p><%@ page contentType="text/html;charset=gb2312" <br />import="com.jspsmart.upload.*" %><%<br />  // 新徏一个SmartUpload对象<br /> SmartUpload su = new SmartUpload();<br />  // 初始?br /> su.initialize(pageContext);<br />  // 讑֮contentDisposition为null以禁止浏览器自动打开文gQ?br />  //保证点击链接后是下蝲文g。若不设定,则下载的文g扩展名ؓ<br />  //docӞ览器将自动用word打开它。扩展名为pdfӞ<br />  //览器将用acrobat打开?br /> su.setContentDisposition(null);<br />  // 下蝲文g<br /> su.downloadFile("/upload/如何赚取我的W一桉.doc");<br />%> </p> <p> <br />注意Q执行下载的面Q在Java脚本范围外(?lt;% ... %>之外Q,不要包含HTML代码、空根{回车或换行{字W,有的话将不能正确下蝲。不信的话,可以在上q源码中%><%之间加入一个换行符Q再下蝲一下,保证出错。因为它影响了返回给览器的数据,D解析出错?</p> <p>3、如何下载中文文?</p> <p>jspSmartUpload虽然能下载文Ӟ但对中文支持不。若下蝲的文件名中有汉字Q则览器在提示另存的文件名Ӟ昄的是一堆ؕ码,很扫人兴。上面的例子是q样。(q个问题也是众多下蝲lg所存在的问题,很少有h解决Q搜索不到相兌料,可叹Q) </p> <p>ZljspSmartUploadlg增加下蝲中文文g的支持,我对该组件进行了研究Q发现对q回l浏览器的另存文件名q行UTF-8~码后,览器便能正显CZ文名字了。这是一个o人高兴的发现。于是我对jspSmartUploadlg的SmartUploadcd了升U处理,增加了toUtf8Stringq个ҎQ改动部分源码如下: </p> <p>public void downloadFile(String s, String s1, String s2, int i)<br /> throws ServletException, IOException, SmartUploadException<br />    {<br /> if(s == null)<br />     throw new IllegalArgumentException("File '" + s +<br />     "' not found (1040).");<br /> if(s.equals(""))<br />     throw new IllegalArgumentException("File '" + s +<br />     "' not found (1040).");<br /> if(!isVirtual(s) && m_denyPhysicalPath)<br />     throw new SecurityException("Physical path is<br />     denied (1035).");<br /> if(isVirtual(s))<br />     s = m_application.getRealPath(s);<br /> java.io.File file = new java.io.File(s);<br /> FileInputStream fileinputstream = new FileInputStream(file);<br /> long l = file.length();<br /> boolean flag = false;<br /> int k = 0;<br /> byte abyte0[] = new byte[i];<br /> if(s1 == null)<br />     m_response.setContentType("application/x-msdownload");<br /> else<br /> if(s1.length() == 0)<br />     m_response.setContentType("application/x-msdownload");<br /> else<br />     m_response.setContentType(s1);<br /> m_response.setContentLength((int)l);<br /> m_contentDisposition = m_contentDisposition != null ?<br /> m_contentDisposition : "attachment;";<br /> if(s2 == null)<br />     m_response.setHeader("Content-Disposition", <br />     m_contentDisposition + " filename=" + <br />     toUtf8String(getFileName(s)));<br /> else<br /> if(s2.length() == 0)<br />     m_response.setHeader("Content-Disposition", <br />     m_contentDisposition);<br /> else<br />     m_response.setHeader("Content-Disposition", <br />     m_contentDisposition + " filename=" + toUtf8String(s2));<br /> while((long)k < l)<br /> {<br />     int j = fileinputstream.read(abyte0, 0, i);<br />     k += j;<br />     m_response.getOutputStream().write(abyte0, 0, j);<br /> }<br /> fileinputstream.close();<br />    }</p> <p>    /**<br />     * 文件名中的汉字转ؓUTF8~码的串,以便下蝲时能正确昄另存的文件名.<br />     * U|软g制作中心雨亦?003.08.01<br />     * @param s 原文件名<br />     * @return 重新~码后的文g?br />     */<br />    public static String toUtf8String(String s) {<br /> StringBuffer sb = new StringBuffer();<br /> for (int i=0;i<s.length();i++) {<br />     char c = s.charAt(i);<br />     if (c >= 0 && c <= 255) {<br />  sb.append(c);<br />     } else {<br />  byte[] b;<br />  try {<br />      b = Character.toString(c).getBytes("utf-8");<br />  } catch (Exception ex) {<br />      System.out.println(ex);<br />      b = new byte[0];<br />  }<br />  for (int j = 0; j < b.length; j++) {<br />      int k = b[j];<br />      if (k < 0) k += 256;<br />      sb.append("%" + Integer.toHexString(k).<br />      toUpperCase());<br />  }<br />     }<br /> }<br /> return sb.toString();<br />    } </p> <p> <br />注意源码中粗体部分,原jspSmartUploadlg对返回的文g未作M处理Q现在做了编码的转换工作Q将文g名{换ؓUTF-8形式的编码Ş式。UTF-8~码对英文未作Q何处理,对中文则需要{换ؓ%XX的Ş式。toUtf8StringҎ中,直接利用Java语言提供的编码{换方法获得汉字字W的UTF-8~码Q之后将其{换ؓ%XX的Ş式?</p> <p>源码编译后打包成jspSmartUpload.jarQ拷贝到Tomcat的shared/lib目录下(可ؓ所有WEB应用E序所׃nQ,然后重启Tomcat服务器就可以正常下蝲含有中文名字的文件了。另QtoUtf8StringҎ也可用于转换含有中文的超U链接,以保证链接的有效Q因为有的WEB服务器不支持中文链接?</p> <p>结QjspSmartUploadlg是应用JSPq行B/SE序开发过E中l常使用的上传下载组Ӟ它用简单,方便。现在我又ؓ其加上了下蝲中文名字的文件的支持Q真个是如虎ȝQ必赢得更多开发者的青睐?</p> <p>---------------------------------------------------------------------------------------------------------------------------</p> <p>题目Q彻底解决中文名文g下蝲和下载文件内容ؕ码问?/p> <p>之前,写过一个Download.jsp文g,可以解决下蝲文gq问题(诸如:DOC,XSL文g{等).<br />后来发现,遇到中文名的文g的时?文g下蝲会报错~~~~<br />今天,通过改写原Download.jsp文g已经d解决了这个问题~<br />现在,把一整套的文件上传下载的Ҏl脓出来~~~以便大家借鉴!~!~!~!~!  <br />作?古埃及法?br />-----------------------------------------------------<br />试环境:WEBLOGIC 8.1,WIN XP SP4,IE 6.0 <br />-----------------------------------------------------<br />文g上传: <br />-----------------------------------------<br />准备工作:导入著名的SmartUpload.jarlg?br />upload.jsp文g<br />-----------------------------------------------------<br /><%@ page contentType="text/html; charset=gb2312" %><br /><%<br /> request.setCharacterEncoding("gb2312"); // q句话很重要Q否则遇C文就出错~<br />%><br /><HTML><HEAD><TITLE>上传</TITLE><br /><META content="text/html; charset=gb2312" http-equiv=Content-Type><br /></HEAD><br /><BODY leftMargin=0 topMargin=0><br /><table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#DEE7EF"><br />  <tr><br />    <td align="center"> <br />      <FORM action="upload_ok.jsp" method=post name="Upload" enctype="multipart/form-data"><br />        <br><br />        误入附件文件的所在\?lt;FONT color=red> * </FONT>为必填项?lt;br><br />        <br><br />        <TABLE width="317" border=0 cellPadding=0><br />          <TBODY><br />            <TR> <br />              <TD align=right vAlign=center nowrap>附g路径Q?lt;/TD><br />              <TD><input type="file" name="file" style="border: 1px #FFFFFF solid;background:#efefef" > <FONT color=red>*</FONT></TD><br />            </TR><br />            <TR align="center"> <br />              <TD height=60 colspan="2" vAlign=center nowrap> <INPUT style="height:22px" name=B1 type=submit value=" ??" ><br /><INPUT style="height:22px" name=B2 type=reset value=" ??" > <br />              </TD><br />            </TR><br />          </TBODY><br />        </TABLE><br />      </FORM> <br /></td><br />  </tr><br /></table><br /></BODY></HTML><br />-----------------------------------------------------<br />upload_ok.jsp文g<br />-----------------------------------------------------<br /><%@ page contentType="text/html;charset=gb2312" %><br /><%@ page import="com.jspsmart.upload.*" %><br /><HTML><HEAD><TITLE>上传成功!</TITLE><br /><META content="text/html; charset=gb2312" http-equiv=Content-Type><br /></HEAD><br /><BODY leftMargin=0 topMargin=0><br /><jsp:useBean id="mySmartUpload" scope="page" class="com.jspsmart.upload.SmartUpload" /><br /><table width="80%"  border="0" cellpadding="0" cellspacing="0" bgcolor="#DEE7EF"><br />  <tr><br />    <td align="center"> <br /><% <br /> int count=0;<br /> String fileName = null;<br /> mySmartUpload.initialize(pageContext); <br /> mySmartUpload.upload();<br /> com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0);<br /> if (!myFile.isMissing()) {<br />  //String ext=myFile.getFileExt();//得到后缀   <br />  fileName = myFile.getFileName();<br />            myFile.saveAs("/files/" + fileName);//你要存放文g所在文件夹的相对\?br />     out.println("文g:<b>"+fileName+"</b>上传成功!<br>文g大小:" + myFile.getSize() + "kb<BR>");<br />     }<br />%><br /></BODY></HTML><br />---------------------------------------------------</p> <p>文g下蝲: <br />-----------------------------------------<br />文g的超q接写法范例:<br /><% String fname ="中文试.xsl"; //假设你的文g名是:中文试.xsl<br />%><br /><A target="_blank" href="Download.jsp?filename=<%=fname%>">??lt;/A><br />文g的超q接写法范例-2 重新用utf-8Ҏ件名~码:<br /><%@ page contentType="text/html;charset=gb2312" session="true"%><br /><%  String name=java.net.URLEncoder.encode("世界文化.doc","UTF-8"));%>  <a href="c:\<%=name%>">世界文化.doc</a></p> <p>Download.jsp文g<br />---------------------------------------------------<br /><%<br />  java.io.BufferedInputStream bis=null;<br />  java.io.BufferedOutputStream  bos=null;<br />try{<br /> String filename=request.getParameter("filename");<br />             filename=new String(filename.getBytes("iso8859-1"),"gb2312");<br /> response.setContentType("application/x-msdownload");<br /> response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));<br /> bis =new java.io.BufferedInputStream(new java.io.FileInputStream(config.getServletContext().getRealPath("files/" + filename)));<br /> bos=new java.io.BufferedOutputStream(response.getOutputStream()); <br /> byte[] buff = new byte[2048];<br /> int bytesRead;<br /> while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {<br />  bos.write(buff,0,bytesRead);<br /> }<br />}<br />catch(Exception e){<br /> e.printStackTrace();<br />}<br />finally {<br /> if (bis != null)bis.close();<br /> if (bos != null)bos.close();<br />}<br />%> </p> <p> </p> <img src ="http://www.tkk7.com/renyangok/aggbug/51362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/renyangok/" target="_blank">保尔?/a> 2006-06-08 15:17 <a href="http://www.tkk7.com/renyangok/articles/51362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://wwwfac286.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://aidannis.com" target="_blank">˾Ʒþ޸岻</a>| <a href="http://shaiyahx.com" target="_blank">˳վþ99ȹ</a>| <a href="http://714747.com" target="_blank">޾ƷƵ </a>| <a href="http://rimcn.com" target="_blank">лGAYƬվWWW</a>| <a href="http://rseav.com" target="_blank">뾫Ʒþþþ</a>| <a href="http://626632.com" target="_blank">91Ƶѹۿ</a>| <a href="http://aa77cc.com" target="_blank">Hվ߹ۿ</a>| <a href="http://bentuxinli.com" target="_blank">Ҹ߳Ƶ</a>| <a href="http://ldcatv.com" target="_blank">þþƷ</a>| <a href="http://22nee.com" target="_blank">Ѹþ</a>| <a href="http://guhey.com" target="_blank">޾ƷѹۿƵ</a>| <a href="http://yhanalati.com" target="_blank">ٸaëƬ</a>| <a href="http://805ios.com" target="_blank">޲Ļ</a>| <a href="http://tianmao920.com" target="_blank">ŮѾƷëƬ</a>| <a href="http://caicpa.com" target="_blank">պһ</a>| <a href="http://wogool.com" target="_blank">޹ۺ</a>| <a href="http://fense1.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://lyaa17.com" target="_blank">òѸƵ</a>| <a href="http://1314c.com" target="_blank">ҹڵ</a>| <a href="http://zhnetbar.com" target="_blank">gvС߹ۿ</a>| <a href="http://5656ys.com" target="_blank">jizzjizzձٸ</a>| <a href="http://xxxxcccc.com" target="_blank">պ߹ۿƵ</a>| <a href="http://kypbuy.com" target="_blank">3344߿Ƭ</a>| <a href="http://074g8.com" target="_blank">޹ģƷһ</a>| <a href="http://116603a.com" target="_blank">AVһۿ</a>| <a href="http://bet06966.com" target="_blank">ѾƷAVƬ߹ۿ</a>| <a href="http://6123fa.com" target="_blank">츾þþƷ</a>| <a href="http://www84847.com" target="_blank">ĻþƷƵ</a>| <a href="http://52xingai.com" target="_blank">ɫͼƵ߹ۿ</a>| <a href="http://438266.com" target="_blank">þþƷվ</a>| <a href="http://vv848.com" target="_blank">һ</a>| <a href="http://1000hu.com" target="_blank">ý߹ۿƵѹۿ </a>| <a href="http://sxgzjssb.com" target="_blank">aav鶹 </a>| <a href="http://0827fang.com" target="_blank">ҹþþƷ</a>| <a href="http://siminglighting.com" target="_blank">ŷ޾Ʒ</a>| <a href="http://zjj100.com" target="_blank">Ļվѹۿ</a>| <a href="http://bjbanjia01.com" target="_blank">aѹۿþav</a>| <a href="http://xixidhw.com" target="_blank">޾Ʒ͵Բ</a>| <a href="http://www-554949.com" target="_blank">Ʒվ</a>| <a href="http://wbkk88.com" target="_blank">ɫͼУ԰ɫ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>