﻿<?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-疯狂-随笔分类-apache项目</title><link>http://www.blogjava.net/freeman1984/category/46243.html</link><description>         
        STANDING ON THE SHOULDERS OF GIANTS</description><language>zh-cn</language><lastBuildDate>Mon, 24 Dec 2012 20:15:47 GMT</lastBuildDate><pubDate>Mon, 24 Dec 2012 20:15:47 GMT</pubDate><ttl>60</ttl><item><title>关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和使用</title><link>http://www.blogjava.net/freeman1984/archive/2012/12/24/393402.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Mon, 24 Dec 2012 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2012/12/24/393402.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/393402.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2012/12/24/393402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/393402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/393402.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于tomcat和sessionCookieName和SESSION_PARAMETER_NAME以及disableURLRewriting参数原理和使用&nbsp;&nbsp;<a href='http://www.blogjava.net/freeman1984/archive/2012/12/24/393402.html'>阅读全文</a><img src ="http://www.blogjava.net/freeman1984/aggbug/393402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2012-12-24 15:16 <a href="http://www.blogjava.net/freeman1984/archive/2012/12/24/393402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jmeter 相关参数介绍</title><link>http://www.blogjava.net/freeman1984/archive/2011/12/14/366359.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Wed, 14 Dec 2011 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/12/14/366359.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/366359.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/12/14/366359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/366359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/366359.html</trackback:ping><description><![CDATA[<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">Jmeter</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">测试报表相关参数说明</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"></span></p>
<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">采用</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">Jmeter</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">测试工具对</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">web</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">系统作的负载测试，得出的响应报表，数据比较难懂，现作一具体说明。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">以下是在一次具体负载测试中得出的具体数值，测试线程设置情况为：线程数：</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">200</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">，等待时间（</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">ramp-up</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">）：</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">0</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">秒，循环次数为永远，另：</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">线程组</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">&#8212;&#8212;</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">这些元件用于指定运行的线程数和等候周期。每个线程模拟一个用户，而等候周期用于指定创建全部线程的时间。例如，线程数为</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">5</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">，等候时间为</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">10</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">秒，则创建每个线程之间的时间间隔为</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">2</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">秒。循环数定义了线程的运行时间。使用调度器，还可以设置运行的起始时间。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"> <br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">取样器</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">&#8212;&#8212;</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">对于服务器</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">HTTP</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">、</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">FTP</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">或</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">LDAP</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">请求，这些元件是可配置请求。该教程仅侧重于</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">Web Services</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">请求。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"> <br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">监听器</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">&#8212;&#8212;</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">这些元件用于请求数据的后期处理。例如，可以将数据保存到文件或用图表来说明结果。此时</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">JMeter</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">图表并没有提供许多配置选项；然而它是可扩展的，它始终可以添加额外的可视化效果或数据处理模块。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">得出的图形报表和聚合报告如下所示：<br /><br /><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/freeman1984/clip_image002.jpg" width="580" height="332" /><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></span></span></p>
<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">一、图形报表</span></p>
<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"></span></p>
<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">图表底部参数的含义如下：</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">样本数目是总共发送到服务器的请求数。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">最新样本是代表时间的数字</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">,</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">是服务器响应最后一个请求的时间。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">吞吐量是服务器每分钟处理的请求数。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"> <br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">平均值是总运行时间除以发送到服务器的请求数。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"> <br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">中间值是代表时间的数字，有一半的服务器响应时间低于该值而另一半高于该值。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"> <br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">偏离表示服务器响应时间变化、离散程度测量值的大小，或者，换句话说，就是数据的分布。</span></p>
<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">二、</span> <span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">聚合报告</span></p>
<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"></p>
<p style="text-align: left; line-height: 19.5pt; margin: 0cm 0cm 12pt;background: white" align="left"><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">图表含义说明如下：</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />Label</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">：说明是请求类型，如</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">Http</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">，</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">FTP</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">等请求。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />#Samples</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">：也就是图形报表中的样本数目，总共发送到服务器的样本数目。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />Average</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">：也就是图形报表中的平均值，是总运行时间除以发送到服务器的请求数。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />Median</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">：也就是图形报表中的中间值，是代表时间的数字，有一半的服务器响应时间低于该值而另一半高于该值。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />90%line</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">：是指</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">90%</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">请求的响应时间比所得数值还要小。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />Min</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">：是代表时间的数字</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">,</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">是服务器响应的最短时间。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />Max: </span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">是代表时间的数字</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">,</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">是服务器响应的最长时间。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />Error%:</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">请求的错误百分比。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />Throughput:</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">也就是图形报表中的吞吐量，这里是服务器每单位时间处理的请求数，注意查看是秒或是分钟。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br />KB/sec:</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">是每秒钟请求的字节数。</span></p>
<p style="text-align: left; line-height: 19.5pt;background: white" align="left"><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">三、</span> <span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">使用分析</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt"><br /></span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">在测试过程中，平均响应时间是我们性能测试的一个重要衡量指标，但是在测试中，特别是在聚合报告中，得出的</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">90%Line,</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">我这里参考《《</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">LoadRunner </span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">没有告诉你的》之一</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">&#8212;&#8212;</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">描述性统计与性能结果分析》，我认为</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">90%Line</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">等同于该文作者提出的</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">90%</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">响应时间</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">,</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">这个数值对我们性能测试分析也很有参考价值。</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">90%</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">响应时间是说在发送的请求中，</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">90%</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">的用户响应时间都比得到的数值上要短，同时说明，一个系统在应用时，</span><span style="font-family: Arial; color: #6d6d6d; font-size: 9pt">90%</span><span style="font-family: 宋体; color: #6d6d6d; font-size: 9pt">的用户响应时间都能达到这个数值，那么就为系统性能分析提供了很好的参考价值。</span></p>
<p>&nbsp;转自：百度文库</p><img src ="http://www.blogjava.net/freeman1984/aggbug/366359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-12-14 17:30 <a href="http://www.blogjava.net/freeman1984/archive/2011/12/14/366359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache性能测试工具ab</title><link>http://www.blogjava.net/freeman1984/archive/2011/12/13/366235.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 13 Dec 2011 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/12/13/366235.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/366235.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/12/13/366235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/366235.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/366235.html</trackback:ping><description><![CDATA[Apache自带的测试工具ab(apache benchmark)在apache的bin目录下。<br />使用格式： ./ab [options] [http://]hostname[:port]/path<br />参数说明：<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -n requests&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Number of requests to perform<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">//在测试会话中所执行的请求个数。默认时，仅执行一个请求</font><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -c concurrency Number of multiple requests to make<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">//一次产生的请求个数。默认是一次一个。</font><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -t timelimit&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Seconds to max. wait for responses<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">//测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时，没有时间限制。<br /></font>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -p postfile&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> File containing data to POST<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">//包含了需要POST的数据的文件.</font><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -T content-type Content-type header for POSTing<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">//POST数据所使用的Content-type头信息。</font><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -v verbosity&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> How much troubleshooting info to print<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">//设置显示信息的详细程度 - 4或更大值会显示头信息， 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。<br /></font>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -w&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Print out results in HTML tables<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">//以HTML表的格式输出结果。默认时，它是白色背景的两列宽度的一张表。<br /></font>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -i&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Use HEAD instead of GET<br />&nbsp;<wbr>&nbsp;<wbr> <font color="#ff0000">// 执行HEAD请求，而不是GET。</font><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -x attributes&nbsp;<wbr>&nbsp;<wbr> String to insert as table attributes<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -y attributes&nbsp;<wbr>&nbsp;<wbr> String to insert as tr attributes<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -z attributes&nbsp;<wbr>&nbsp;<wbr> String to insert as td or th attributes<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -C attribute&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Add cookie, eg. 'Apache=1234. (repeatable)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //<font color="#ff0000">-C cookie-name=value 对请求附加一个Cookie:行。其典型形式是name=value的一个参数对。此参数可以重复。</font><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -H attribute&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Add Arbitrary header line, eg. 'Accept-Encoding: gzip'<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Inserted after all normal header lines. (repeatable)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -A attribute&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Add Basic WWW Authentication, the attributes<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> are a colon separated username and password.<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -P attribute&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Add Basic Proxy Authentication, the attributes<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> are a colon separated username and password.<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //<font color="#ff0000">-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开，并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码)，此字符串都会被发送。</font><br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -X proxy:port&nbsp;<wbr>&nbsp;<wbr> Proxyserver and port number to use<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -V&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Print version number and exit<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -k&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Use HTTP KeepAlive feature<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -d&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Do not show percentiles served table.<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -S&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Do not show confidence estimators and warnings.<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -g filename&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Output collected data to gnuplot format file.<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -e filename&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Output CSV file with percentages served<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> -h&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Display usage information (this message)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //-attributes 设置 属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外，对命令行参数、服务器的响应头和其他外部输入的解析也很简单，这可能会有不良后果。它没有完整地实现HTTP/1.x; 仅接受某些'预想'的响应格式。 strstr(3)的频繁使用可能会带来性能问题，即, 你可能是在测试ab而不是服务器的性能。 
<p>参数很多,一般我们用 -c 和 -n 参数就可以了. 例如:</p>
<p>./ab -c 1000 -n 1000 <a href="http://10.88.15.77/test.php"><font color="#0000ff">http://10.88.15.77/test.php</font></a></p>
<p>这个表示同时处理1000个请求并运行1000次index.php文件.<br />#ab -c 1000 -n 1000 <a href="http://10.88.15.77/test.php"><font color="#0000ff">http://10.88.15.77/test.php</font></a></p>
<p><br /><font color="#0000ff">Benchmarking 10.88.15.77 (be patient)</font></p>
<p>Completed 100 requests<br />Completed 200 requests<br />Completed 300 requests<br />Completed 400 requests<br />Completed 500 requests<br />Completed 600 requests<br />Completed 700 requests<br />Completed 800 requests<br />Completed 900 requests<br />Finished 1000 requests</p>
<p><br />Server Software:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Apache/2.2.8<br /><font color="#ff0000">//平台apache 版本2.2.8<br /></font>Server Hostname:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 10.88.15.77<br /><font color="#ff0000">//服务器主机名<br /></font>Server Port:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 80<br /><font color="#ff0000">//服务器端口</font></p>
<p>Document Path:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> /test.php</p>
<p><font color="#ff0000">//测试的页面文档</font><br />Document Length:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1018 bytes<br /><font color="#ff0000">//文档大小</font></p>
<p>Concurrency Level:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1000<br /><font color="#ff0000">//并发数<br /></font>Time taken for tests:&nbsp;<wbr>&nbsp;<wbr> 8.188731 seconds<br /><font color="#ff0000">//整个测试持续的时间</font><br />Complete requests:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1000<br /><font color="#ff0000">//完成的请求数量</font><br />Failed requests:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0<br /><font color="#ff0000">//失败的请求数量</font><br />Write errors:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0<br /><br />Total transferred:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1361581 bytes<br /><font color="#ff0000">//整个场景中的网络传输量</font><br />HTML transferred:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1055666 bytes<br /><font color="#ff0000">//整个场景中的HTML内容传输量<br /></font>Requests per second:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 122.12 [#/sec] (mean)<br /><font color="#ff0000">//<span style="color: red">大家最关心的指标之一，相当于</span> <span style="color: red">LR</span> <span style="color: red">中的</span> <strong><span style="color: red">每秒事务数</span></strong> <span style="color: red">，后面括号中的</span> <span style="color: red">mean</span> <span style="color: red">表示这是一个平均值</span></font><br />Time per request:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 8188.731 [ms] (mean)<br /><font color="#ff0000">//<span style="color: red">大家最关心的指标之二，相当于</span> <span style="color: red">LR</span> <span style="color: red">中的</span> <strong><span style="color: red">平均事务响应时间</span></strong> <span style="color: red">，后面括号中的</span> <span style="color: red">mean</span> <span style="color: red">表示这是一个平均值</span></font><br />Time per request:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 8.189 [ms] (mean, across all concurrent requests)<br /><font color="#ff0000">//每个请求实际运行时间的平均值</font><br />Transfer rate:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 162.30 [Kbytes/sec] received<br /><font color="#ff0000">//<span style="color: red">平均每秒网络上的流量，可以帮助排除是否存在网络流量过大导致响应时间延长的问题</span></font></p>
<p>Connection Times (ms)<br />&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> min mean[+/-sd] median&nbsp;<wbr>&nbsp;<wbr> max<br />Connect:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4 646 1078.7&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 89&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 3291<br />Processing:&nbsp;<wbr>&nbsp;<wbr> 165 992 493.1&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 938&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4712<br />Waiting:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 118 934 480.6&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 882&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 4554<br />Total:&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 813 1638 1338.9&nbsp;<wbr>&nbsp;<wbr> 1093&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 7785<br /><font color="#ff0000">//<span style="color: red">网络上消耗的时间的分解，各项数据的具体算法还不是很清楚</span></font></p>
<p>Percentage of the requests served within a certain time (ms)<br />50%&nbsp;<wbr>&nbsp;<wbr> 1093<br />66%&nbsp;<wbr>&nbsp;<wbr> 1247<br />75%&nbsp;<wbr>&nbsp;<wbr> 1373<br />80%&nbsp;<wbr>&nbsp;<wbr> 1493<br />90%&nbsp;<wbr>&nbsp;<wbr> 4061<br />95%&nbsp;<wbr>&nbsp;<wbr> 4398<br />98%&nbsp;<wbr>&nbsp;<wbr> 5608<br />99%&nbsp;<wbr>&nbsp;<wbr> 7368<br />100%&nbsp;<wbr>&nbsp;<wbr> 7785 (longest request)<br /><font color="#ff0000">//整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间，其中50％的用户响应时间小于1093 毫秒，60％ 的用户响应时间小于1247 毫秒，最大的响应时间小于7785 毫秒</font></p>
<p><font color="#ff0000">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 由于对于并发请求，cpu实际上并不是同时处理的，而是按照每个请求获得的时间片逐个轮转处理的，所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数<br />转自：<a href="http://blog.sina.com.cn/s/blog_3c9872d00100dbox.html">http://blog.sina.com.cn/s/blog_3c9872d00100dbox.html</a></font></p><img src ="http://www.blogjava.net/freeman1984/aggbug/366235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-12-13 14:36 <a href="http://www.blogjava.net/freeman1984/archive/2011/12/13/366235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xmlrpc介绍和使用</title><link>http://www.blogjava.net/freeman1984/archive/2011/11/11/363526.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 11 Nov 2011 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/11/11/363526.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/363526.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/11/11/363526.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/363526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/363526.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: xmlrpc介绍，并模拟blogjava的xml-rpc api写个例子。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/freeman1984/archive/2011/11/11/363526.html'>阅读全文</a><img src ="http://www.blogjava.net/freeman1984/aggbug/363526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-11-11 14:58 <a href="http://www.blogjava.net/freeman1984/archive/2011/11/11/363526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Directory index forbidden by Options directive问题</title><link>http://www.blogjava.net/freeman1984/archive/2011/11/01/362421.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 01 Nov 2011 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/11/01/362421.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/362421.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/11/01/362421.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/362421.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/362421.html</trackback:ping><description><![CDATA[<div>方法1： 在mod_jk.conf中配置JkMountCopy All ，这样所有虚拟主机都公用了mod_jk的配置<br />方法2：在虚拟主机中配置JkMountCopy On 例如：<br /><br />&lt;VirtualHost *:80&gt;<br />&nbsp;&nbsp;&nbsp; #JkMountCopy On<br />&nbsp;&nbsp; ...</div><img src ="http://www.blogjava.net/freeman1984/aggbug/362421.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-11-01 10:09 <a href="http://www.blogjava.net/freeman1984/archive/2011/11/01/362421.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache的Order Allow,Deny 详解(转)</title><link>http://www.blogjava.net/freeman1984/archive/2011/10/31/362372.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Mon, 31 Oct 2011 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/10/31/362372.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/362372.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/10/31/362372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/362372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/362372.html</trackback:ping><description><![CDATA[<div>Allow和Deny可以用于apache的conf文件或者.htaccess文件中（配合Directory, Location, Files等），用来控制目录和文件的访问授权。</div>
<div>
<div>
<p>所以，最常用的是：<br />Order Deny,Allow<br />Allow from All</p>
<p>注意&#8220;Deny,Allow&#8221;中间只有一个逗号，也只能有一个逗号，有空格都会出错；单词的大小写不限。上面设定的含义是先设定&#8220;先检查禁止设定，没有禁止的全部允许&#8221;，而第二句没有Deny，也就是没有禁止访问的设定，直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置，开放所有内容的访问权。</p>
<p>按照上面的解释，下面的设定是无条件禁止访问：<br />Order Allow,Deny<br />Deny from All</p>
<p>如果要禁止部分内容的访问，其他的全部开放：<br />Order Deny,Allow<br />Deny from ip1 ip2<br />或者<br />Order Allow,Deny<br />Allow from all<br />Deny from ip1 ip2</p>
<p>apache会按照order决定最后使用哪一条规则，比如上面的第二种方式，虽然第二句allow允许了访问，但由于在order中allow不是最后规则，因此还需要看有没有deny规则，于是到了第三句，符合ip1和ip2的访问就被禁止了。注意，order决定的&#8220;最后&#8221;规则非常重要，下面是两个错误的例子和改正方式：</p>
<p>Order Deny,Allow<br />Allow from all<br />Deny from domain.org<br />错误：想禁止来自domain.org的访问，但是deny不是最后规则，apache在处理到第二句allow的时候就已经匹配成功，根本就不会去看第三句。<br />解决方法：Order Allow,Deny，后面两句不动，即可。</p>
<p>Order Allow,Deny<br />Allow from ip1<br />Deny from all<br />错误：想只允许来自ip1的访问，但是，虽然第二句中设定了allow规则，由于order中deny在后，所以会以第三句deny为准，而第三句的范围中又明显包含了ip1（all include ip1），所以所有的访问都被禁止了。<br />解决方法一：直接去掉第三句。<br />解决方法二：<br />Order Deny,Allow<br />Deny from all<br />Allow from ip1</p>
<p>&nbsp;</p>
<p>下面是测试过的例子：<br />--------------------------------<br />Order deny,allow<br />allow from all<br />deny from 219.204.253.8<br />#全部都可以通行<br />-------------------------------<br />Order deny,allow<br />deny from 219.204.253.8<br />allow from all<br />#全部都可以通行<br />-------------------------------<br />Order allow,deny<br />deny from 219.204.253.8<br />allow from all<br />#只有219.204.253.8不能通行<br />-------------------------------<br />Order allow,deny<br />allow from all<br />deny from 219.204.253.8<br />#只有219.204.253.8不能通行<br />-------------------------------<br />-------------------------------<br />Order allow,deny<br />deny from all<br />allow from 219.204.253.8<br />#全部都不能通行 <br />-------------------------------<br />Order allow,deny<br />allow from 219.204.253.8<br />deny from all<br />#全部都不能通行 <br />-------------------------------<br />Order deny,allow<br />allow from 219.204.253.8<br />deny from all<br />#只允许219.204.253.8通行 <br />-------------------------------<br />Order deny,allow<br />deny from all<br />allow from 219.204.253.8<br />#只允许219.204.253.8通行 <br />-------------------------------<br />--------------------------------<br />Order deny,allow<br />#全部都可以通行（默认的）<br />-------------------------------<br />Order allow,deny<br />#全部都不能通行（默认的）<br />-------------------------------<br />Order allow,deny<br />deny from all<br />#全部都不能通行<br />-------------------------------<br />Order deny,allow<br />deny from all<br />#全部都不能通行<br />-------------------------------<br />对于上面两种情况，如果换成allow from all，则全部都可以通行！<br />-------------------------------<br />Order deny,allow<br />deny from 219.204.253.8<br />#只有219.204.253.8不能通行<br />-------------------------------<br />Order allow,deny<br />deny from 219.204.253.8<br />#全部都不能通行<br />-------------------------------<br />Order allow,deny<br />allow from 219.204.253.8<br />#只允许219.204.253.8通行<br />-------------------------------<br />Order deny,allow<br />allow from 219.204.253.8<br />#全部都可以通行<br />-------------------------------<br />-------------------------------<br />order deny,allow<br />allow from 218.20.253.2<br />deny from 218.20<br />#代表拒绝218.20开头的IP，但允许218.20.253.2通过；而其它非218.20开头的IP也都允许通过。<br />-------------------------------<br />order allow,deny<br />allow from 218.20.253.2<br />deny from 218.20<br />#和上面的差不多，只是掉换的order语句中的allow、deny先后顺序，但最终结果表示全部都拒绝！</p></div>
<div>form:http://hi.baidu.com/enjoypain/blog/item/f48c7aecdba298d12f2e21ac.html</div>
<div>
<p>前段时间做了个Apache的HTTP代理服务器，其中的order allow，deny这部分弄的不太懂，于是上网找资料看，谁知道越看越糊涂，其中有些难以分辨对错甚至是误导。就像破解windows系统密码的一些文章那样，很多都是人云亦云的，并没有经过测试。废话少说，先把我经过测试后分析总结出来的结论show出来，相信这对大家的理解非常有帮助。<br />转自：<a href="http://hi.baidu.com/amenmen/blog/item/3145921fdf498f11314e154b.html">http://hi.baidu.com/amenmen/blog/item/3145921fdf498f11314e154b.html</a></p></div></div><img src ="http://www.blogjava.net/freeman1984/aggbug/362372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-10-31 14:23 <a href="http://www.blogjava.net/freeman1984/archive/2011/10/31/362372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsessionid 问题分析</title><link>http://www.blogjava.net/freeman1984/archive/2011/09/02/357833.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 02 Sep 2011 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/09/02/357833.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/357833.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/09/02/357833.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/357833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/357833.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JSESSIONID 问题分析&nbsp;&nbsp;<a href='http://www.blogjava.net/freeman1984/archive/2011/09/02/357833.html'>阅读全文</a><img src ="http://www.blogjava.net/freeman1984/aggbug/357833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-09-02 16:33 <a href="http://www.blogjava.net/freeman1984/archive/2011/09/02/357833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux php5 apache2 安装步骤</title><link>http://www.blogjava.net/freeman1984/archive/2011/06/10/352043.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 10 Jun 2011 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/06/10/352043.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/352043.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/06/10/352043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/352043.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/352043.html</trackback:ping><description><![CDATA[<p>相关软件：<br />apache:httpd-2.2.19.tar.gz<br />php:php-5.2.17.tar.gz<br /><br /><strong>首先安装apache：<br /></strong>将&nbsp;zxvf httpd-2.2.19.tar.gz放到=/usr/local/src下<br />#tar zxvf httpd-2.2.19.tar.gz<br />#cd httpd-2.2.19<br />#./configure --prefix=/usr/local/apache2219 --enable-module=so&nbsp; (--prefix=/usr/local/apache2219 是apache最终的安装目录)<br />#make<br />#make install<br /><br />安<strong>装php</strong>：aix下可能需要安装libxml2 见<a href="http://www.blogjava.net/freeman1984/archive/2011/06/14/352271.html">http://www.blogjava.net/freeman1984/archive/2011/06/14/352271.html</a>，在编译的时候如果报错：<br />configure: error: xml2-config not found.<br />就加上--with-libxml-dir=/XIV1/qkydb/libxml<br /><br />将&nbsp;zxvf php-5.2.17.tar.gz放到=/usr/local/src下<br />#tar zxvf php-5.2.17.tar.gz<br />#cd php-5.2.17<br />#./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2219/bin/apxs （--prefix=/usr/local/php是php最终的安装目录 ）<br />#make<br />#make install<br /></p>
<p><strong>配置<br /></strong>(1)复制PHP.INI文件到正确位置<br />在PHP解压的目录下运行<br />#cp php.ini-dist /usr/local/php/lib/php.ini<br />(2)编辑apache配置文件httpd.conf<br />#vi /usr/local/apache2219/conf/httpd.conf<br />要改的有如下几处:<br />一般都在<br />#AddType application/x-tar .tgz<br />下加一行<br />AddType application/x-httpd-php .php<br />还有找到<br />DirectoryIndex index.html index.html.var<br />在后面加 index.php 让它把index.php做为默认页<br />再找<br />#ServerName<br />把#去掉,后面的IP改成你的IP.<br />找到<br />DocumentRoot "/usr/local/apache2219/htdocs"<br />把/usr/local/apache2/htdocs改为你存放网页文件的路径</p>
<p>比如我是放在/myweb目录下,所以我以后上传PHP文件就放在/myweb目录下,然后用IP访问,就能看到首页了<br />差不多就这些了,至于apache2其它优化,请看<br />http://www.phpv.net/<br />里的apache配置那一分类.<br />保存httpd.conf文件.</p>
<p>写个index.php<br />内容：<br />&lt;?php<br />phpinfo();<br />?&gt;<br /><br /><strong>启动apache<br /></strong>/usr/local/apache2219/bin/apachectl start<br /><br />访问：<br /><a href="http://ip/">http://ip/</a><br /></p><img src ="http://www.blogjava.net/freeman1984/aggbug/352043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-06-10 14:37 <a href="http://www.blogjava.net/freeman1984/archive/2011/06/10/352043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Commons  Configuration简介</title><link>http://www.blogjava.net/freeman1984/archive/2011/06/09/351984.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Thu, 09 Jun 2011 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/06/09/351984.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/351984.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/06/09/351984.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/351984.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/351984.html</trackback:ping><description><![CDATA[使用Commons&nbsp; Configuration可以很好的管理我们的配置文件的读写，官网：<a href="http://commons.apache.org/configuration/">http://commons.apache.org/configuration/</a><br />它支持对配置文件的读取，保存，运行期加载，操作非常方便。下面简单的一下代码示例一下，具体的其他操作文档可以去官方找到：<br />需要用到commons-lang,commons-collections,commons-logging,log4j jar包<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_18_1506_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_1506_Open_Text.style.display='none'; Codehighlighter1_18_1506_Closed_Image.style.display='inline'; Codehighlighter1_18_1506_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_18_1506_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_18_1506_Closed_Text.style.display='none'; Codehighlighter1_18_1506_Open_Image.style.display='inline'; Codehighlighter1_18_1506_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_18_1506_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_18_1506_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_115_186_Open_Image" onclick="this.style.display='none'; Codehighlighter1_115_186_Open_Text.style.display='none'; Codehighlighter1_115_186_Closed_Image.style.display='inline'; Codehighlighter1_115_186_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_115_186_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_115_186_Closed_Text.style.display='none'; Codehighlighter1_115_186_Open_Image.style.display='inline'; Codehighlighter1_115_186_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif">&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;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ConfigurationException,&nbsp;InterruptedException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_115_186_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_115_186_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlLoadTest();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileLoadTest();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saveTest();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runtimeReload();<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">xml文件</span><span style="color: #008000"><br /><img id="Codehighlighter1_260_478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_260_478_Open_Text.style.display='none'; Codehighlighter1_260_478_Closed_Image.style.display='inline'; Codehighlighter1_260_478_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_260_478_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_260_478_Closed_Text.style.display='none'; Codehighlighter1_260_478_Open_Image.style.display='inline'; Codehighlighter1_260_478_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&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;xmlLoadTest()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ConfigurationException</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_260_478_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_260_478_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test1.xml</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLConfiguration&nbsp;config&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XMLConfiguration(Test.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getResource(file));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(config.getString(</span><span style="color: #000000">"</span><span style="color: #000000">conf.url</span><span style="color: #000000">"</span><span style="color: #000000">));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(config.getDouble(</span><span style="color: #000000">"</span><span style="color: #000000">conf.money</span><span style="color: #000000">"</span><span style="color: #000000">));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">properties文件</span><span style="color: #008000"><br /><img id="Codehighlighter1_564_744_Open_Image" onclick="this.style.display='none'; Codehighlighter1_564_744_Open_Text.style.display='none'; Codehighlighter1_564_744_Closed_Image.style.display='inline'; Codehighlighter1_564_744_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_564_744_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_564_744_Closed_Text.style.display='none'; Codehighlighter1_564_744_Open_Image.style.display='inline'; Codehighlighter1_564_744_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;fileLoadTest()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ConfigurationException&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_564_744_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_564_744_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test2.properties</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertiesConfiguration&nbsp;config&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PropertiesConfiguration(Test.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getResource(file));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(config.getString(</span><span style="color: #000000">"</span><span style="color: #000000">url</span><span style="color: #000000">"</span><span style="color: #000000">));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">保存到文件</span><span style="color: #008000"><br /><img id="Codehighlighter1_815_1062_Open_Image" onclick="this.style.display='none'; Codehighlighter1_815_1062_Open_Text.style.display='none'; Codehighlighter1_815_1062_Closed_Image.style.display='inline'; Codehighlighter1_815_1062_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_815_1062_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_815_1062_Closed_Text.style.display='none'; Codehighlighter1_815_1062_Open_Image.style.display='inline'; Codehighlighter1_815_1062_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&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;saveTest()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ConfigurationException</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_815_1062_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_815_1062_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test2.properties</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertiesConfiguration&nbsp;config&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PropertiesConfiguration(Test.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getResource(file));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置自动保存&nbsp;或显示调用&nbsp;config.save();</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.setProperty(</span><span style="color: #000000">"</span><span style="color: #000000">colors.background</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">#000000</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.setAutoSave(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">运行期参数修改加载</span><span style="color: #008000"><br /><img id="Codehighlighter1_1164_1504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1164_1504_Open_Text.style.display='none'; Codehighlighter1_1164_1504_Closed_Image.style.display='inline'; Codehighlighter1_1164_1504_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1164_1504_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1164_1504_Closed_Text.style.display='none'; Codehighlighter1_1164_1504_Open_Image.style.display='inline'; Codehighlighter1_1164_1504_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="color: #000000">&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;runtimeReload()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ConfigurationException,&nbsp;InterruptedException</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1164_1504_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1164_1504_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test2.properties</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertiesConfiguration&nbsp;config&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PropertiesConfiguration(Test.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getResource(file));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.setReloadingStrategy(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileChangedReloadingStrategy());<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(config.getString(</span><span style="color: #000000">"</span><span style="color: #000000">url</span><span style="color: #000000">"</span><span style="color: #000000">));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">10000</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">在休眠期间，手动修改文件里面的url值后观察日志情况</span><span style="color: #008000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(config.getString(</span><span style="color: #000000">"</span><span style="color: #000000">url</span><span style="color: #000000">"</span><span style="color: #000000">));<br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div><br />Configuration 的参数可能来自下面的资源：&nbsp;<br /><span style="color: #3366ff">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">Properties files&nbsp;XML documents，Property list files (.plist)，JNDI，JDBC Datasource，System properties，&nbsp;Applet parameters，Servlet parameters</span> <br /><img src ="http://www.blogjava.net/freeman1984/aggbug/351984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-06-09 14:56 <a href="http://www.blogjava.net/freeman1984/archive/2011/06/09/351984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对Lucene PhraseQuery的slop的理解(转载)</title><link>http://www.blogjava.net/freeman1984/archive/2011/02/25/345116.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 25 Feb 2011 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/02/25/345116.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/345116.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/02/25/345116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/345116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/345116.html</trackback:ping><description><![CDATA[文章来自：http://myzhangjl.blog.sohu.com/95911870.html<br />
这几天看Lucene,看到检索那块,被PhraseQuery折腾了一阵,那本《Lucene In Action》里的代码版本太旧了，也不知是翻译的问题还是我的理解问题，总之在看PhraseQuery的设置slop时费了半天劲，不过，总算是搞明白了，发个帖子来分享一下：
<p><font size="3">&nbsp;&nbsp;&nbsp; 所谓PhraseQuery，就是通过短语来检索，比如我想查&#8220;big car&#8221;这个短语，那么如果待匹配的document的指定项里包含了"big car"这个短语，这个document就算匹配成功。可如果待匹配的句子里包含的是&#8220;big black car&#8221;，那么就无法匹配成功了，如果也想让这个匹配，就需要设定slop，先给出slop的概念：slop是指两个项的位置之间允许的最大间隔距离，下面我举例来解释：</font></p>
<p><font size="3">&nbsp;&nbsp; 我的待匹配的句子是：<strong><em>the quick brown fox jumped over the lazy dog.</em></strong></font></p>
<p><font size="3">&nbsp; &nbsp;<strong>例1：</strong> 如果我想用&#8220;<em><strong>quick fox</strong></em>&#8221;来匹配出上面的句子，我发现原句里是<em><strong>quick [brown] fox</strong></em>，就是说和我的&#8220;<em><strong>quick fox</strong></em>&#8221;中间相差了一个单词的距离，所以，我这里把slop设为1，表示<strong><em>quick</em></strong>和<em><strong>fox</strong></em>这两项之间最大可以允许有一个单词的间隔，这样所有&#8220;<em><strong>quick [***] fox</strong></em>&#8221;就都可以被匹配出来了。</font></p>
<p><font size="3">&nbsp;&nbsp;<strong> 例2：</strong>如果我想用&#8220;<em><strong>fox quick</strong></em>&#8221;来匹配出上面的句子，这也是可以的，不过比例1要麻烦，我们需要看把&#8220;<em><strong>fox quick</strong></em>&#8221;怎么移动能形成&#8220;<em><strong>quick [***] fox</strong></em>&#8221;，如下表所示，把<strong><em>fox</em></strong>向右移动3次即可：</font></p>
<div align="center">
<table border="1" align="center">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;</td>
            <td>fox</td>
            <td>quick</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>1</td>
            <td>&nbsp;&nbsp;</td>
            <td>fox|quick</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>2</td>
            <td>&nbsp;&nbsp;</td>
            <td>quick</td>
            <td>fox</td>
            <td>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>3</td>
            <td>&nbsp;&nbsp;</td>
            <td>quick</td>
            <td>&nbsp;&nbsp;</td>
            <td>fox</td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;&nbsp;&nbsp;<font size="3"> <strong>例3：</strong>如果我想用&#8220;<strong><em>lazy jumped quick</em></strong>&#8221;该如何匹配上面的句子呢？这个比例2还要麻烦，我们要考虑3个单词，不管多少个单词，slop表示的是间隔的最大距离，详细起见，我们分别来看每种组合：(<font size="2">我的待匹配的句子是：<strong><em>the quick brown fox jumped over the lazy dog.</em></strong></font>)</font></p>
<ul>
    <li><font size="3"><strong><em>lazy jumped:</em></strong>原句是<strong><em>jumped [over] [the] lazy</em></strong>，就是说它们两个之间间隔了2个词,如下所示：需要把<em><strong>lazy</strong></em>向右移动4位</font></li>
</ul>
<p>&nbsp;</p>
<table border="1" align="center">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;</td>
            <td>lazy</td>
            <td>jumped</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>1</td>
            <td>&nbsp;&nbsp;</td>
            <td>lazy|jumped</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>2</td>
            <td>&nbsp;&nbsp;</td>
            <td>jumped</td>
            <td>lazy</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>3</td>
            <td>&nbsp;&nbsp;</td>
            <td>jumped</td>
            <td>&nbsp;&nbsp;</td>
            <td>lazy</td>
            <td>&nbsp;&nbsp;</td>
        </tr>
        <tr>
            <td>4</td>
            <td>&nbsp;&nbsp;</td>
            <td>jumped</td>
            <td>&nbsp;&nbsp;</td>
            <td></td>
            <td>&nbsp;lazy&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<ul>
    <li>&nbsp; <font size="3"><strong><em>lazy jumped&nbsp;quick：</em></strong>我们主要看<em><strong>lazy</strong></em>和<strong><em>quick</em></strong>，但是由于<em><strong>jumped</strong></em>是在中间，所以移动的时候还是要把<strong><em>jumped</em></strong>考虑在内，原句里<em><strong>lazy</strong></em>和<strong><em>quick</em></strong>的关系是：<strong><em>quick [brown] [fox] [jumped] [over] [the] lazy ，quick lazy</em></strong>中间间隔了5个词，所以如下图所示，把lazy向右移动8次</font></li>
</ul>
<div align="center">
<table border="1" align="center">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;lazy</td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>quick</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td></td>
        </tr>
        <tr>
            <td>
            <p align="center">1</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">lazy|jumped</p>
            </td>
            <td>
            <p align="center">quick</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="center">2</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>
            <p align="center">lazy|quick</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="center">&nbsp;3&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>
            <p align="center">quick</p>
            </td>
            <td>
            <p align="center">&nbsp;lazy&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="center">4</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>
            <p align="center">quick</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">lazy&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="center">&nbsp;5&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>
            <p align="center">quick</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">lazy&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="center">6</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>
            <p align="center">quick</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">lazy&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="center">7</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>
            <p align="center">quick</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;&nbsp;</p>
            </td>
            <td>
            <p align="center">lazy&nbsp;</p>
            </td>
            <td>
            <p align="center">&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td>
            <p align="center">8</p>
            </td>
            <td>&nbsp;&nbsp;</td>
            <td>
            <p align="center">jumped</p>
            </td>
            <td>
            <p align="center">quick</p>
            </td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>&nbsp;&nbsp;</td>
            <td>lazy&nbsp;</td>
        </tr>
    </tbody>
</table>
</div>
<p>&nbsp;</p>
<ul>
    <li>&nbsp;<font size="3">最后是<strong><em>jumped qucik</em></strong>，这里不详细画表格了，大家可以自己试试，应该是把jumped向右移动4次。</font></li>
</ul>
<p><font size="3">&nbsp;&nbsp; 综合以上3种情况，所以我们需要把slop设为8才令&#8220;<font size="3"><strong><em>lazy jumped&nbsp;quick</em></strong></font>&#8221;可以匹配到原句。</font></p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/345116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-02-25 13:51 <a href="http://www.blogjava.net/freeman1984/archive/2011/02/25/345116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用apache pdfbox读取pdf 实例</title><link>http://www.blogjava.net/freeman1984/archive/2011/02/24/345064.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Thu, 24 Feb 2011 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/02/24/345064.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/345064.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/02/24/345064.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/345064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/345064.html</trackback:ping><description><![CDATA[<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_56_592_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_592_Open_Text.style.display='none'; Codehighlighter1_56_592_Closed_Image.style.display='inline'; Codehighlighter1_56_592_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_56_592_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_56_592_Closed_Text.style.display='none'; Codehighlighter1_56_592_Open_Image.style.display='inline'; Codehighlighter1_56_592_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_56_592_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_56_592_Open_Text"><span style="color: #000000">{<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;inputStream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedInputStream(<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(</span><span style="color: #000000">"</span><span style="color: #000000">d:\\work\\lt.pdf</span><span style="color: #000000">"</span><span style="color: #000000">)));<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;PDDocument&nbsp;pdfDocument&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;PDDocument.load(inputStream);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;StringWriter&nbsp;writer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringWriter();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;PDFTextStripper&nbsp;stripper&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PDFTextStripper();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;stripper.writeText(pdfDocument,&nbsp;writer);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;contents&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;writer.getBuffer().toString();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</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">contents);<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;PDDocumentInformation&nbsp;documentInformation&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pdfDocument.getDocumentInformation();<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</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">documentInformation.getTitle());<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />}</span></div>
需要jar包：<br />
pdfbox-1.4.0.jar<br />
fontbox-1.4.0.jar
<img src ="http://www.blogjava.net/freeman1984/aggbug/345064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-02-24 14:55 <a href="http://www.blogjava.net/freeman1984/archive/2011/02/24/345064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat中限制ip访问</title><link>http://www.blogjava.net/freeman1984/archive/2011/02/15/344326.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 15 Feb 2011 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/02/15/344326.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/344326.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/02/15/344326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/344326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/344326.html</trackback:ping><description><![CDATA[<div>Original URL: <a title="Tomcat中限制ip访问" href="http://www.miotour.com/2010/04/27/tomcat%e4%b8%ad%e9%99%90%e5%88%b6ip%e8%ae%bf%e9%97%ae/">http://www.miotour.com/2010/04/27/tomcat%e4%b8%ad%e9%99%90%e5%88%b6ip%e8%ae%bf%e9%97%ae/</a></div>
<div>Tomcat中限制ip访问是非常简单的，只需要编辑server.xml文件即可</div>
<br />
<div>vi server.xml</div>
<br />
<div>找到context区域，如</div>
<br />
<div>&lt;context path=&#8221;/joseph&#8221;&nbsp;<wbr> reloadable=&#8221;true&#8221; docBase=&#8221;/var/www/joseph&#8221;&gt;</div>
<br />
<div>&lt;value className=&#8221;org.apache.catalina.values.RemoteAddrValue&#8221; allow=&#8221;&#8221; deny=&#8221;127.0.0.1&#8243; /&gt;</div>
<br />
<div>&lt;/context&gt;</div>
<br />
<div>说明：只限制127.0.0.1访问</div>
<br />
<div>如要限制192.168.1.0-192.168.5.255和192.168.10.0-192.168.15.255</div>
<br />
<div>deny=&#8221;192.168.[1-5].*,192.168.[10-15].*&#8221;</div>
<img src ="http://www.blogjava.net/freeman1984/aggbug/344326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-02-15 11:07 <a href="http://www.blogjava.net/freeman1984/archive/2011/02/15/344326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jkmount不转发部分</title><link>http://www.blogjava.net/freeman1984/archive/2011/02/15/344325.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 15 Feb 2011 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/02/15/344325.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/344325.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/02/15/344325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/344325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/344325.html</trackback:ping><description><![CDATA[<div>Original URL: <a title="jkmount不转发部分请求" href="http://www.miotour.com/2009/11/30/jkmount%e4%b8%8d%e8%bd%ac%e5%8f%91%e9%83%a8%e5%88%86%e8%af%b7%e6%b1%82/">http://www.miotour.com/2009/11/30/jkmount%e4%b8%8d%e8%bd%ac%e5%8f%91%e9%83%a8%e5%88%86%e8%af%b7%e6%b1%82/</a></div>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">第一种情形：部分静态页面需要apache处理，不转发给后端的tomcat<br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount &nbsp;<wbr>/* &nbsp;<wbr> &nbsp;<wbr>router&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>###默认将所有请求转发给tomcat处理<br />
</span><span style="color: #ff0000">JKUnmount</span> <span style="color: #ff0000">/*.php &nbsp;<wbr> router&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>###php请求不交给tomcat处理<br />
JKUnmount /*.htm &nbsp;<wbr> router&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>###htm请求不交给tomcat处理<br />
JKUnmount /*.html &nbsp;<wbr>router</span> <span style="color: #ff0000">###html请求不交给tomcat处理</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JKUnmount &nbsp;<wbr> &nbsp;<wbr> /css/* &nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr> router&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>###css请求不交给tomcat处理<br />
JKUnmount &nbsp;<wbr> &nbsp;<wbr> /js/* &nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr> router&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> ###js请求不交给tomcat处理</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JKUnmount &nbsp;<wbr>/image/* &nbsp;<wbr> router&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>###image请求不交给tomcat</span><span style="color: #ff0000">处理</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">&nbsp;<wbr></p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">第二种情形：将所有请求转发到后端tomcat之后，将不同路径定位给不同的tomcat</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /* &nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr> router</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /login/* &nbsp;<wbr> &nbsp;<wbr> tomcat1</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /shop/* &nbsp;<wbr> &nbsp;<wbr> tomcat2</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">JkMount /buy/* &nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr> tomcat3</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">&nbsp;<wbr></p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">注意，这种情形下，必须要有这样的处理：</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">worker.list=router,jkstatus,tomcat1,tomcat2,tomcat3</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">如果是第一种情形，tomcat1,tomcat2,tomcat3是不需要写在上面这个地方的</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">而是写在下面：</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><span style="color: #ff0000">worker.router.balance_workers=tomcat1,tomcat2,tomcat3</span><br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">实际使用中，应该是上述两种情形相结合使用的较多，将静态内容交给apache处理，然后将动态内容分布到不同的服务器上。<br />
</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"></p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">&nbsp;</p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px"><wbr></p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">&nbsp;<wbr></p>
<p style="padding-bottom: 5px; line-height: 1.5; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: 宋体; color: #114246; font-size: 14px; padding-top: 5px">JkMount把匹配的转发到指定服务器.<br />
JkUnMount把匹配的不转发到指定服务器.<br />
<strong>JkUnMount选项的级别高于JkMount</strong>.<br />
单独有JkMount规则有效,但<strong>单独有JkUnMount无效</strong>,JkUnMount与JkMount要成对出现.<br />
</p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/344325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-02-15 10:53 <a href="http://www.blogjava.net/freeman1984/archive/2011/02/15/344325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache 集群tomcat配置参数说明</title><link>http://www.blogjava.net/freeman1984/archive/2011/02/15/344322.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 15 Feb 2011 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/02/15/344322.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/344322.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/02/15/344322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/344322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/344322.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">Tomcat 集群配置<br />
打开Server.xml，shutdown, ajp, http这三个端口就不多说了，解开下面注释<br />
&lt;Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"&gt; <br />
jvmRoute的值要根据apache的配置，不能冲突。<br />
接着是最重要的一点，tomcat默认集群配置（&lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/&gt;）时，配置的细节实际上被省略了，对于大多数应用而言，使用默认配置已经足够，完整的默认配置应该是这样： </p>
<p style="text-indent: 2em">Xml代码 [url=http://tyler-zhou.javaeye.com/blog/507158]</a></p>
<br />
&lt;!--同步异步模式由channelSendOptions参数控制，默认值是8，为异步模式，4是同步模式。在异步模式下，可以通过加上拷贝确认（Acknowledge）来提高可靠性，此时channelSendOptions设为10。--&gt;&nbsp;&nbsp; <br />
&lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"&nbsp;&nbsp;channelSendOptions="6"&gt;&nbsp;&nbsp; <br />
&lt;!---session 拷贝方式 BackupManager 只拷贝部署当前应用的服务器，DeltaManager 拷贝方式all to all--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;Manager className="org.apache.catalina.ha.session.BackupManager"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;expireSessionsOnShutdown="false"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;notifyListenersOnReplication="true"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;mapSendOptions="6"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;!--&nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;Manager className="org.apache.catalina.ha.session.DeltaManager"&nbsp;&nbsp; <br />
&nbsp; &nbsp; expireSessionsOnShutdown="false"&nbsp;&nbsp; <br />
&nbsp; &nbsp; notifyListenersOnReplication="true"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; --&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;!--Channel负责对tomcat集群的IO层进行配置--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;Channel className="org.apache.catalina.tribes.group.GroupChannel"&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;!--Membership用于发现集群中的其他节点，这里的address用的是组播地址（Multicast address，了解更多组播地址详情请参见http://zyycaesar.javaeye.com/admin/blogs/296501），使用同一个组播地址和端口的多个节点同属一个子集群，因此通过自定义组播地址和端口就可将一个大的tomcat集群分成多个子集群--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;Membership className="org.apache.catalina.tribes.membership.McastService"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;address="228.0.0.4"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;port="45564"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;frequency="500"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;dropTime="3000"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;!--Receiver用于各个节点接收其他节点发送的数据，在默认配置下tomcat会从4000-4100间依次选取一个可用的端口进行接收，自定义配置时，如果多个tomcat节点在一台物理服务器上注意要使用不同的端口--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;address="auto"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;port="5001"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;selectorTimeout="100"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;maxThreads="6"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;!--Sender用于向其他节点发送数据，具体实现通过Transport配置，PooledParallelSender是从tcp连接池中获取连接，可以实现并行发送，即集群中的多个节点可以同时向其他所有节点发送数据而互不影响--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter"&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/Sender&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;!---Interceptor有点类似下面将要解释的Valve，起到一个阀门的作用，在数据到达目的节点前进行检测或其他操作，如TcpFailureDetector用于检测在数据的传输过程中是否发生了tcp错误。---&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;/Channel&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;!--Valve用于在节点向客户端响应前进行检测或进行某些操作，ReplicationValve就是用于用于检测当前的响应是否涉及Session数据的更新，如果是则启动Session拷贝操作，filter用于过滤请求，如客户端对图片，css，js的请求就不会涉及Session，因此不需检测，默认状态下不进行过滤，监测所有的响应.JvmRouteBinderValve会在前端的Apache mod_jk发生错误时保证同一客户端的请求发送到集群的同一个节点--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;Valve className="org.apache.catalina.ha.tcp.ReplicationValve"&nbsp;&nbsp; <br />
&nbsp; &nbsp; filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;!--Deployer用于集群的farm功能，监控应用中文件的更新，以保证集群中所有节点应用的一致性，如某个用户上传文件到集群中某个节点的应用程序目录下，Deployer会监测到这一操作并把这一文件拷贝到集群中其他节点相同应用的对应目录下以保持所有应用的一致。这是一个相当强大的功能，不过很遗憾，tomcat集群目前并不能做到这一点，开发人员正在努力实现它，这里的配置只是预留了一个接口--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;tempDir="/tmp/war-temp/"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;deployDir="/tmp/war-deploy/"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;watchDir="/tmp/war-listen/"&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;watchEnabled="false"/&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;!--Listener用于跟踪集群中节点发出和收到的数据，也有点类似Valve的功能。--&gt;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &lt;ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&lt;/Cluster&gt;&nbsp;&nbsp;<br />
最后在Web.xml里面加上&lt;distributable/&gt;，官方文档没有这个，但我觉得还是应该加上，因为按照标准的tomcat启动，当Host对象被创建时，一个Cluster对象（默认配置下是SimpleTcpCluster）也同时被关联到这个Host对象。当某个应用在web.xml中设置了distributable时，Tomcat将为此应用的上下文环境创建一个DeltaManager。SimpleTcpCluster启动membership服务和Replication服务。<br />
<br />
---<br />
<p>extra/httpd-mpm.conf 模块 &nbsp;</p>
<p>上边一样的就不贴了，主要是下边的配置，因为我用了<span style="font-family: Arial, 宋体, sans-serif; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px">mod_security</span>模块，所以要做一些配置，这里不做解释了，写的很详细，我比较喜欢在配置文件里把容易忘记的地方写上文档。毕竟这东西配完了就不再动了，很容易忘记</p>
<p># WinNT MPM</p>
<p># ThreadsPerChild: constant number of worker threads in the server process</p>
<p># MaxRequestsPerChild: maximum &nbsp;number of requests a server process serves</p>
<p>#注意：ThreadLimit指令应当放在ThreadsPerChild之前，否则ThreadsPerChild指令生效后ThreadLimit会失效，而导致不必要的错误 ThreadLimit必须大于等于ThreadsPerChild</p>
<p>#对于mpm_winnt，ThreadLimit的默认值是1920；对于其他MPM这个值是64</p>
<p>#ThreadLimit 这个指令设置了每个子进程可配置的线程数ThreadsPerChild上限。任何在重启期间对这个指令的改变都将被忽略，但对ThreadsPerChild的修改却会生效。</p>
<p>#ThreadLimit 使用这个指令时要特别当心。如果将ThreadLimit设置成一个高出ThreadsPerChild实际需要很多的值，将会有过多的共享内存被分配。</p>
<p>#如果将ThreadLimit和ThreadsPerChild设置成超过系统的处理能力，Apache可能无法启动，或者系统将变得不稳定。该指令的值应当和ThreadsPerChild大致保持一致</p>
<p>#ThreadsPerChild 每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。</p>
<p>&lt;IfModule mpm_winnt_module&gt;</p>
<p>&nbsp;&nbsp; &nbsp;ThreadLimit &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2000</p>
<p>&nbsp;&nbsp; &nbsp;ThreadsPerChild &nbsp; &nbsp; &nbsp; &nbsp;2000</p>
<p>&nbsp;&nbsp; &nbsp;MaxRequestsPerChild &nbsp; &nbsp;2000</p>
<p>&lt;/IfModule&gt;</p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/344322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-02-15 10:37 <a href="http://www.blogjava.net/freeman1984/archive/2011/02/15/344322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>stuts2 返回xml</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 17 Sep 2010 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/332278.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/332278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/332278.html</trackback:ping><description><![CDATA[<h3><a href="/blog/505775">关于Struts2 返回XML的问题</a></h3>
<div class="blog_content"><br />
1. Action其实是一个POJO,所以我们可以直接把Action生成一个XML.只要把Result Type设为xslt就可以了: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
里面包含了Action的所有属性,还有Locale等信息. 可以在浏览器里输入http://localhost:8080/XXX/XXX/XmlModel.action来看. <br />
<br />
2. 为了定制自己想要的XML,我们可以输入参数来输出自己想要的Action的某个属性(属性可以是一个List). <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=&#8221;exposedValue&#8221;&gt;modelList&lt;/param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
<br />
3. 如果有多于一个属性呢.加个大括号围起来 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=&#8221;exposedValue&#8221;&gt;{modelList, type}&lt;/param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
<br />
4. 以上三个方法都是由Action 来控制生成格式.那么对于我们这种控制欲很强的人来说并不满足,最好是由我们自己来定义生成样子.那么这时我们就要做的就是在属性里生成一个 org.w3c.dom.Document属性.注意:不要用org.dom4j.Document类.要不会出现转化错误,死得很惨. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="exposedValue"&gt;xmlDoc&lt;/param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
上面的xmlDoc就是 Action里的org.w3c.dom.Document类型. <br />
<br />
5. 我只会用并且非要用org.dom4j.Document类怎么办? 那就在最后转化成 org.w3c.dom.Document: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="#"><img alt="复制代码" src="http://www.blogjava.net/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">import</span><span>&nbsp;java.io.ByteArrayInputStream;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.xml.parsers.DocumentBuilderFactory;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.xml.parsers.ParserConfigurationException;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.xml.sax.SAXException;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;XmlUtil&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;XmlUtil()&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;org.w3c.dom.Document&nbsp;XmlString2W3cDom(String&nbsp;xml)&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SAXException,&nbsp;IOException,&nbsp;ParserConfigurationException&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;byteArray&nbsp;=&nbsp;xml.getBytes(</span><span class="string">"UTF-8"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream&nbsp;baos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ByteArrayInputStream(byteArray);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocumentBuilderFactory&nbsp;factory&nbsp;=&nbsp;DocumentBuilderFactory.newInstance();&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.Document&nbsp;doc&nbsp;=&nbsp;factory.newDocumentBuilder().parse(baos);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;doc;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;org.dom4j.Document&nbsp;W3c2Dom4j(org.w3c.dom.Document&nbsp;doc)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(doc&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(</span><span class="keyword">null</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.io.DOMReader&nbsp;xmlReader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;org.dom4j.io.DOMReader();&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(xmlReader.read(doc));&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" class="java" name="code"> import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
public class XmlUtil {
private XmlUtil() {
}
public static org.w3c.dom.Document XmlString2W3cDom(String xml)
throws SAXException, IOException, ParserConfigurationException {
byte[] byteArray = xml.getBytes("UTF-8");
ByteArrayInputStream baos = new ByteArrayInputStream(byteArray);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
org.w3c.dom.Document doc = factory.newDocumentBuilder().parse(baos);
return doc;
}
public static org.dom4j.Document W3c2Dom4j(org.w3c.dom.Document doc) {
if (doc == null) {
return (null);
}
org.dom4j.io.DOMReader xmlReader = new org.dom4j.io.DOMReader();
return (xmlReader.read(doc));
}
}
</pre>
<br />
Action里加上一句: xmlDoc = Xmlutil.XmlString2W3cDom(dom4jDoc.asXML()); <br />
上面的xmlDoc就是 Action里的org.w3c.dom.Document类型. <br />
<br />
6. 用org.dom4j.dom.DOMDocumentFactory()来建立 Document.而不要用DocumentHelper.createDocument()来产生.最后直接cast一下. <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.blogjava.net/freeman1984/admin/EditPosts.aspx?opt=1#"></a>&nbsp;</div>
<span><span class="keyword">public</span><span>&nbsp;String&nbsp;execute()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;UnsupportedEncodingException,&nbsp;ParserConfigurationException,&nbsp;SAXException,&nbsp;IOException&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></div>
<ol class="dp-j">
    <li><span>&nbsp;&nbsp;InfoCpuService&nbsp;cpuSvc&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;cpuSvc&nbsp;=&nbsp;(InfoCpuService)&nbsp;ServiceLocator.getInstance().getService(InfoCpuService.</span><span class="keyword">class</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;modelList&nbsp;=&nbsp;cpuSvc.getModels(prodBrand);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;log.info(ReflectionToStringBuilder.toString(</span><span class="keyword">this</span><span>));&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;org.dom4j.Document&nbsp;dom4jDoc&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;org.dom4j.dom.DOMDocumentFactory().createDocument();&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;=&nbsp;dom4jDoc.addElement(</span><span class="string">"root"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;root.addAttribute(</span><span class="string">"prodType"</span><span>,&nbsp;</span><span class="string">"CPU"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">for</span><span>&nbsp;(Object&nbsp;o&nbsp;:&nbsp;modelList)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;root.addElement(</span><span class="string">"model"</span><span>).addAttribute(</span><span class="string">"name"</span><span>,&nbsp;(String)&nbsp;o);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">//xmlDoc&nbsp;=&nbsp;XmlUtil.XmlString2W3cDom(doc.asXML());&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;xmlDoc&nbsp;=&nbsp;(Document)&nbsp;dom4jDoc;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;HttpServletResponse&nbsp;response&nbsp;=&nbsp;ServletActionContext.getResponse();&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;response.setContentType(</span><span class="string">"text/xml;charset=UTF-8"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;response.setHeader(</span><span class="string">"Cache-Control"</span><span>,&nbsp;</span><span class="string">"no-cache"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;</span><span class="keyword">return</span><span>&nbsp;SUCCESS;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" class="java" name="code">    public String execute() throws UnsupportedEncodingException, ParserConfigurationException, SAXException, IOException {
InfoCpuService cpuSvc = null;
cpuSvc = (InfoCpuService) ServiceLocator.getInstance().getService(InfoCpuService.class);
modelList = cpuSvc.getModels(prodBrand);
log.info(ReflectionToStringBuilder.toString(this));
org.dom4j.Document dom4jDoc = new org.dom4j.dom.DOMDocumentFactory().createDocument();
Element root = dom4jDoc.addElement("root");
root.addAttribute("prodType", "CPU");
for (Object o : modelList) {
root.addElement("model").addAttribute("name", (String) o);
}
//xmlDoc = XmlUtil.XmlString2W3cDom(doc.asXML());
xmlDoc = (Document) dom4jDoc;
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/xml;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
return SUCCESS;
}
</pre>
<br />
其中三句代码是为了防止生成中文乱码 <br />
&nbsp;&nbsp; HttpServletResponse response = ServletActionContext.getResponse(); <br />
&nbsp;&nbsp; response.setContentType("text/xml;charset=UTF-8"); <br />
&nbsp;&nbsp; response.setHeader("Cache-Control", "no-cache"); <br />
<br />
7. 在action中返回类型最好设置为import org.w3c.dom.Document; <br />
<div class="dp-highlighter">
<div class="bar"><span><span class="keyword">private</span><span>&nbsp;Document&nbsp;retXML;&nbsp;&nbsp;</span></span></div>
</div>
<pre style="display: none" class="java" name="code">private Document retXML;
</pre>
<br />
配置格式为： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.blogjava.net/freeman1984/admin/EditPosts.aspx?opt=1#"></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;action&nbsp;name=</span><span class="string">"XmlModel"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"com.XmlModelAction"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&nbsp;name=</span><span class="string">"success"</span><span>&nbsp;type=</span><span class="string">"xslt"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#8221;exposedValue&#8221;&gt;retXML&lt;/param&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/result&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;/action&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
转自：http://skyful.javaeye.com/blog/505775
<img src ="http://www.blogjava.net/freeman1984/aggbug/332278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-17 11:13 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat user</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/17/332276.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 17 Sep 2010 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/17/332276.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/332276.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/17/332276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/332276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/332276.html</trackback:ping><description><![CDATA[<strong>Tomcat的配置</strong> <br />
<br />
　　Tomcat的主要配置文件有3个，分别是Tomcat-users.xml、web.xml和server.xml。它先前的版本采用了和Apache一样的conf文本文件。这样的文本文件对于初学者是一种很大的挑战。但现在它采用了比较通用的XML文件格式，这是一种向着开放性、标准性的转变。下面分别对3个文件进行说明。 <br />
<br />
<strong>配置Tomcat-users.xml</strong> <br />
<br />
　　该文件包含了所有Tomcat服务器的注册用户，其中有role（角色）、user（用户）两种信息。下面列举出这个XML文件的部分内容。 <br />
<br />
<table border="1" cellspacing="0" bordercolorlight="#000000" bordercolordark="#ffffff" cellpadding="2" width="540" align="center">
    <tbody>
        <tr>
            <td bgcolor="#e6e6e6">
            <pre>&lt;?xml version='1.0' encoding='utf-8'?&gt;
            &lt;Tomcat-users&gt;
            &lt;role rolename="Tomcat"/&gt;
            &lt;user username="Tomcat" password="Tomcat" roles="Tomcat,admin"/&gt;
            &lt;/Tomcat-users&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
　　1.role参数 <br />
<br />
　　Tomcat中保存了一些用户权限，也就是角色，比如admin、Tomcat等。用户还可以自定义，通过""来注册一个角色。它只有rolename一个属性,通过这个属性可以把用户的权限进行分配。 <br />
<br />
　　2.User参数 <br />
<br />
这个数据项中包含了诸如用户名、用户密码、用户权限、用户说明等数据属性。通过下面的这个例子讲解。 <br />
<br />
<table border="1" cellspacing="0" bordercolorlight="#000000" bordercolordark="#ffffff" cellpadding="2" width="540" align="center">
    <tbody>
        <tr>
            <td bgcolor="#e6e6e6">
            <pre>&lt;user username="wudi" password="wudi" fullName="test"
            roles="admin,manager,role1,Tomcat"/&gt;</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
　　这个语句建立了一个用户，用户名是"wudi"，密码也是"wudi"。这个用户的全称是"test"。"wudi"这个用户拥有的权限是admin、manager、role1、Tomcat。这些用户权限是Tomcat系统默认的。在这里有一些需要声明，Tomcat的系统管理员必须有admin的用户权限,否则无法登陆Tomcat的管理界面。 <br />
<img src ="http://www.blogjava.net/freeman1984/aggbug/332276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-17 11:11 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/17/332276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Harmony</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/04/331049.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sat, 04 Sep 2010 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/04/331049.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/331049.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/04/331049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/331049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/331049.html</trackback:ping><description><![CDATA[<blockquote>
<p>Apache Harmony 是 2005 年 5 月宣布的开放源码 Java SE 实现，本文是由 5 部分组成的 <a href="http://www.ibm.com/developerworks/cn/java/j-harmony/"><em>进入 Harmony 世界</em> </a>系列文章的第一篇，这个系列主要介绍 Apache Harmony 项目的内部实现，最新发展现状和开源 Java 开发的模式，并鼓励和欢迎大家参与到 Harmony 的社区中来。本文是 5 个系列的第一篇，概括介绍了 Harmony 项目的背景，技术架构，社区运作和未来的方向。</p>
<p>本文是 5 个系列的第一篇，概括介绍了 Harmony 项目的背景，技术架构，社区运作和未来的方向。</p>
</blockquote>
<p><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--></p>
<p><a name="N10097"><span class="atitle">Apache Harmony 的背景</span></a></p>
<p>Apache Harmony 的提案在 2005 年 5 月被 Apache 软件基金会（ASF）接受，并且按照 ASF 惯例成为一个孵化器（incubator）项目。</p>
<p>Harmony 为自己定了两个目标，首先是开发出一个独立并且与现有 JDK 兼容的 Java SE 5 实现，并且以 Apache 软件许可证 2.0 版发行；其次是建立一个开放的模块化运行时架构，包括虚拟机和类库之间及其内部的模块化，并通过这个平台，允许社区在此基础上自由定制自己的 Java 实现，或者对某个模块单独进行创新。</p>
<p>Apache Harmony 项目的成立以及它的这两个目标具有很大的现实意义。首先，由于商业JDK的流行性，它们几乎成为事实上的标准，所以 Harmony 必须与它们保持高度的兼容，才能够使应用程序的迁移成本最低，也就相对容易被用户所接受；其次，Harmony 存在的重要意义之一就在于这是一个属于开源社区的 Java 平台，在这个平台上，社区可以自由的移植和创新，而一个开放的模块化的架构，将为移植和创新带来最大的便利性；最后，Apache 软件许可证是一个对商业公司和开源社区都比较友好的开源许可证，因此 Harmony 可以给最大范围的开发人员和用户带来便利。本文和本系列后续文章将详细介绍 Harmony 在兼容性和模块化方面的努力，以及这些目标带来的价值。</p>
<p>也许正是基于以上一些原因，Harmony 项目成立仅仅一年多一点的时间，就得到了广泛的支持和关注，并且得以飞速发展。目前，Apache Harmony 已经拥有了一个活跃的开发社区，并且接受了来自公司，学校和个人的多次捐赠。IBM 在 developerWorks 上提供了一个 Java 虚拟机环境的免费下载，以支持 Harmony 项目的开发，还多次捐赠了核心类库的实现和测试代码，在 IBM 英国 Hursley 软件开发实验室和中国软件开发中心各有一个开发团队积极参与 Harmony 项目。此外 Harmony 项目还接受了三个 Java 虚拟机实现的捐赠，另外还有一个开源 Java 虚拟机 SableVM 正在积极的与 Harmony 社区合作以实现与 Harmony 类库的集成。Java SE 实现难度最大的是其规模庞大的类库，而最近的类库 API 覆盖率统计表明，Harmony 的 J2SE 1.4.2 类库 API 的覆盖率已经超过 80%，Java SE 5 的覆盖率已经达到 79% 以上。目前经不完全测试，在 Harmony 上已经可以良好运行 Eclipse、JEdit、Ant 等流行的 Java 工具，并且可以部分运行 Tomcat 和 Geronimo 等企业应用。</p>
<p><br />
<br />
<br />
&nbsp;</p>
<p><a name="N100A9"><span class="atitle">技术架构</span></a></p>
<p>如前所述，Apache Harmony 非常注重模块化，从图一中，可以对 Apache Harmony 的总体架构有一个初步的感觉。与所有其他 Java SE 实现类似的是，Harmony 从大体上可以分为三个层次，最下层是操作系统，中间是 Java 虚拟机，最上层是 Java 类库。而 Harmony 的特点在于:</p>
<ul>
    <li>虚拟机和类库内部被高度模块化，在 Harmony 中，类库在功能和 Java Package 的基础上被分成 31 个模块，而虚拟机也被分成即时编译器， 内存管理， 线程管理，Java 本地接口等等模块。每个模块都有一定的接口定义，从而有可能单独被替换成不同的实现。
    <li>操作系统层次与虚拟机层次之间的接口由 Port Layer 定义。Port Layer 封装了不同的操作系统的差异，为虚拟机和类库的本地代码提供了一套统一的 API 访问底层系统调用。
    <li>虚拟机与类库之间的接口除了 Java 规范定义的 JNI，JVMITI 之外，加入了一层虚拟机接口，主要由内核类（Kernel Class）和本地代码 VMI 组成，实现了虚拟机接口的虚拟机实现都可以使用 Harmony 的类库实现，并且可以被 Harmony 提供的同一个 Java 启动程序启动。 </li>
</ul>
<p><br />
<a name="N100C0"><strong>图一 Apache Harmony 技术架构鸟瞰图</strong></a><br />
<img height="292" alt="图一 Apache Harmony 技术架构鸟瞰图" src="http://www.ibm.com/developerworks/cn/java/j-lo-harmony1/images/image002.jpg" width="553" border="0" /> <br />
</p>
<p>本节将分别对 Port Layer，VMI 和 Java 统一启动程序作进一步的介绍。</p>
<p><a name="N100D3"><span class="smalltitle">Apache Harmony Port Layer</span></a></p>
<p>Apache Harmony 在操作系统与虚拟机之间定义了一个 Port Layer，Port Layer 是由一个标准 C 的库（Port Library）来实现得，Port Library 与操作系统交互，为虚拟机和类库的本地代码提供了一个平台无关的标准 C 语言 API 访问系统调用。诸如文件 I/O，网络 I/O， 内存操作，信号处理，以及错误处理等等功能，都被纳入 Port Library 的范围。</p>
<p>通过使用 Port Library， 所有（目前还没有做到，但这是设计目标）与操作系统平台相关的内容被封装在一个库里面，虚拟机和类库的其他部分都可以尽可能以平台无关的方式实现出来。这样一来，将 Java SE 的庞大类库和虚拟机代码移植到其他操作系统的工作就可以被快速的开发出来，从而大大提高了可移植性和程序的可维护性。</p>
<p>在 Apache 软件基金会资助的开源项目中，有一个类似的平台无关库叫做 Apache Portable Runtime（APR）， 这个项目是从 Apache Http Server 等项目的开发过程中提炼和分离出来的，目前已经比较成熟，它与 Harmony 的 Port Layer 的目标有类似之处，但是也有明显的不同，从而使得目前 APR 还不适合作为 Java 虚拟机和类库的平台无关库实现。在本系列后续文章中会有单独的文章详细介绍 Harmony Port Library 的设计特点，并与 APR 进行比较。</p>
<p><a name="N100E2"><span class="smalltitle">Apache Harmony 虚拟机接口</span></a></p>
<p>Apache Harmony 虚拟机接口定义了类库和虚拟机之间的接口，Java 规范已经定义了一些虚拟机的 API，比如 Java 本地接口（JNI）， Java 虚拟机工具接口（JVMTI）等，但是 Java 规范并没有定义类库和虚拟机之间的接口。Harmony 为了模块化和可移植性的要求，定义了虚拟机接口（VMI），只要是实现了该接口的虚拟机就是 Harmony 兼容虚拟机，从而可以与 Harmony 的类库实现互操作，并且可以与 Harmony 提供的 Java 启动程序协作。</p>
<p>Apache Harmony 虚拟机接口分为三个部分，一部分是 Java 语言接口，由 23 个内核类（Kernel Class）组成，另一部分是 C 语言接口，由 10 个函数组成，最后一部分就是标准 JNI。</p>
<ul>
    <li>内核类的提出是因为少数核心的公共类是与虚拟机密切相关（VM-specific）的，它们都是属于 java.lang，java.lang.ref，java.lang.reflect 和 java.security 等几个核心的包，比如说 java.lang.ClassLoader， java.lang.ref.WeakReference 等。随着 Java 版本的升级，核心类的数量也可能会增加。Harmony 的类库实现为大多数核心类定义了实现模板。VM 的开发人员可以从零开始实现这些核心类，也可以在 Harmony 提供的模板基础上开始开发。
    <li>虚拟机接口还定义了 VM 必须实现的 10 个 C 函数，用来访问虚拟机和类库共享的数据结构和接口，比如说访问操作系统抽象库（Port Library），虚拟机本地存储空间等。
    <li>虚拟机的最后一部分就是标准 JNI，它在这里的主要用途是允许从 Java 类库的本地链接库中创建 Java 对象。 </li>
</ul>
<p>应该说虚拟机接口是一个相对宽松的接口，它并不要求对虚拟机和类库特殊的耦合，对垃圾收集，同步和对象的数据结构等等也没有特殊的规定。另外一个著名的开源 Java SE 类库 GNU Classpath 也有类似的虚拟机接口，本系列后续文章将详细介绍 Harmony VMI，并且与 GNU Classpath 比较。</p>
<p><a name="N100FD"><span class="smalltitle">Apache Harmony 启动程序</span></a></p>
<p>Apache Harmony 提供了一个启动程序，也就是通常我们用来运行 Java 程序的 java 和 javaw 命令的实现，这个启动程序是个多目标的启动器，可以根据命令行参数启动不同的虚拟机，也可以支持虚拟机特有的选项，如属性文件或命令行参数等。这一切都是基于虚拟机接口，Port Library 和标准 JNI 实现的。 </p>
<p>在进一步介绍启动程序之前，需要先介绍一下 Harmony Development Kit（HDK）和 Harmony JRE 的目录结构，请参考图二。HDK 是一个完整的开发包，不仅仅包括 Harmony 用户所需的所有内容，也提供 Harmony 开发人员所有的静态链接库和头文件，使得他们可以在此基础上对其中任何一部分进行修改和重新构建。</p>
<ul>
    <li>&lt;hdkbase&gt;/jdk/jre， 这个目录包含了标准的 JRE 结构，如 bin 和 lib 目录等。
    <li>&lt;hdkbase&gt;/jdk/include，这个目录包含了标准的 JDK 头文件，如 jni.h 等。
    <li>&lt;hdkbase&gt;/include， 这个目录包含了 Harmony 独有的并且被多个模块共享的头文件
    <li>&lt;hdkbase&gt;/lib， 这个目录包含了编译 Harmony 本地代码所需的静态链接库文件，如在 Windows 平台，就包含了 .lib 文件，而在 Linux 平台，则包含了 .a 文件。 </li>
</ul>
<p>对于启动程序来说，需要特别注意的是 &lt;hdkbase&gt;/jdk/jre/bin 目录，在这里可以包含多个虚拟机实现，每一个实现应该被放在该目录的一个子路径里（比如 vm1， vm2 等），缺省的虚拟机实现在 &lt;hdkbase&gt;/jdk/jre/bin/default 目录，如果不指定特定参数，该虚拟机会被启动程序使用。一般来讲，每个虚拟机实现应该包含虚拟机实现文件和资源文件，尤其是必须有三个部分的虚拟机接口的实现。</p>
<p><br />
<a name="N1011D"><strong>图二 HDK 目录结构</strong></a><br />
<img height="293" alt="图二 HDK 目录结构" src="http://www.ibm.com/developerworks/cn/java/j-lo-harmony1/images/image004.jpg" width="440" border="0" /> <br />
</p>
<p>在调用启动程序的时候，有两个参数被用来指定启动哪一个虚拟机实现，-vmdir 用来指定虚拟机所在的子目录，-vm 用来指定实现了JNI接口的动态链接库，比如要使用 IBM 提供的 VME，而 VME 放在 vm1 目录下的话，启动程序的命令行就应该像:</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">		java -vmdir:vm1 -vm :clearvm.dll &#8230;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>Harmony 的启动程序在启动时将执行以下任务：</p>
<ul>
    <li>生成一个 Port Library 实例并且装载它
    <li>装载虚拟机本地动态链接库
    <li>初始化内核类
    <li>调用 JNI_CreateJavaVM（&#8230;）， main（&#8230;）， JarRunner 等 </li>
</ul>
<p><a name="N1014B"><span class="smalltitle">Apache Harmony 类库的模块化</span></a></p>
<p>Apache Harmony 将类库分成易于管理的模块，这样做的目的是</p>
<ul>
    <li>使 Java 类库的开发工作易于管理，开源社区的参与者可以集中开发他擅长的模块
    <li>方便模块装配， 用户可以自由选择模块提供者，可以自由替换或者升级任一模块
    <li>使法律方面的风险易于管理，如果开发人员以前接触过其他 Java SE 实现的代码，他也可以参与以前未接触过的模块开发。
    <li>方便代码捐献 </li>
</ul>
<p>类库的模块实际上是由一组实现相关的功能的 Java 类和本地程序组成的，目前它们按照包的级别来划分，也就是说不会有两个属于同一个 Java package 的类出现在两个不同的模块里（内核类所在的包除外，但也仅在内核类模块和另一个类库模块中出现）。这些模块可以包含私有的内部实现，但是必须导出 Java API 参考文档规定标准 API，也可以导出 Harmony 独有的 API，但是这些 API 并不鼓励用户使用，只是供其他模块调用的。</p>
<p>模块的鉴别方法是: 首先根据 Java 规范，确定各 Java 包之间的依赖关系；然后寻找弱耦合的部分，将本身内聚的包组织在一起，最后在社区讨论哪部分类库应该可以拆开独立成一个模块。目前 Harmony 将 Java SE 5 规定的类库分成了三十一个模块，在 Java 升级之后，模块的数量可能会增加。目前这三十一个模块包括:</p>
<ul>
    <li>ACCESSIBILITY
    <li>ANNOTATION
    <li>APPLET
    <li>ARCHIVE
    <li>AUTH
    <li>AWT
    <li>BEANS
    <li>CONCURRENT
    <li>CRYPTO
    <li>IMAGEIO
    <li>INSTRUMENT
    <li>JMX
    <li>JNDI
    <li>LANG-MANAGEMENT
    <li>LOGGING
    <li>LUNI （lang， util， net， io）
    <li>MATH
    <li>NIO-CHANNELS
    <li>NIO-CHARSET
    <li>ORB
    <li>PREFS
    <li>PRINT
    <li>REGEX
    <li>RMI
    <li>SECURITY
    <li>SOUND
    <li>SQL
    <li>SWING
    <li>TEXT
    <li>X-NET
    <li>XML </li>
</ul>
<p>在 Harmony 的代码资源库中，每个模块的源文件都保存在自己的各自的路径中，如果使用 Eclipse 做开发工具，每个模块就可以看作一个单独的工程项目。特别需要注意的是，按照 jar 文件的规范，在每个模块都有一个 META-INF/manifest.mf 文件，在这个文件中定义了该模块的 OSGI 元数据，其中最重要的就是该模块导入导出的 Java package。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">Manifest-Version: 1.0
            Bundle-ManifestVersion: 2
            Bundle-Name: Harmony NIO
            Bundle-SymbolicName: org.apache.harmony.nio
            Bundle-Version: 1.0.0
            Bundle-ClassPath: .
            Eclipse-JREBundle: true
            Import-Package: java.io，
            java.lang，
            java.lang.ref，
            java.lang.reflect，
            java.net，
            java.nio.charset，
            java.security，
            java.util，
            org.apache.harmony.kernel.vm，
            org.apache.harmony.luni.net，
            org.apache.harmony.luni.platform，
            org.apache.harmony.luni.util，
            tests.support;hy_usage=test;resolution:=optional，
            tests.util;hy_usage=test;resolution:=optional
            Export-Package: java.nio，
            java.nio.channels，
            java.nio.channels.spi，
            org.apache.harmony.nio
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>在编译之后，每一个模块将被打包成一个 jar 文件，如果该模块有本地代码，则该模块的本地代码被编译成一个单独的动态链接库文件。如图二所示，hyluni.dll 就是 LUNI（lang， util， net， io）模块的本地二进制代码库，而在 &lt;hdkbase&gt;/jdk/jre/lib/boot 目录中，对应 LUNI 模块的则有一个 luni.jar。</p>
<p><br />
<br />
<br />
&nbsp;</p>
<p><a name="N101D8"><span class="atitle">Apache Harmony 的开发方法</span></a></p>
<p>近年来，开源软件相关的知识产权问题越来越受到关注。为了保证对知识产权的尊重，保持 Harmony 代码的纯洁性和原创性，除了 Apache 软件基金会原有的通用规则之外，Harmony 开发社区花了很大的精力来定义 Harmony 接受代码捐赠和接受项目参与者的规则。</p>
<p>Harmony 要求每个开发人员在参与代码捐赠之前，必须完成一个问卷调查，问卷的主要内容是关于该开发人员以前是否接触过其他 Java SE 实现，如果他接触过其他专有代码的某一部分，他就不能参与 Harmony 相应模块的代码工作（但也有一些特殊的例外情况）。同时，任何现有代码的捐赠必须提供代码的"血统"信息。</p>
<p>知识产权之外的另一个重要问题就是兼容性。Harmony 的目标产生一个 Java SE 5 兼容的实现，它不仅仅要完全遵循 Java API 参考定义的 Java SE 规范，Java 语言规范以及 Java 虚拟机规范；同时还必须保证与现有 Java SE 参考实现的兼容性，为此，Harmony 采用了测试驱动开发模式，以单元测试用例来保证 Harmony 的行为和参考实现一致。最重要的是，Harmony 正在试图申请 Java SE 5 JCK 兼容性测试的许可证，因为只有被 JCK 认证过，Harmony 才能正式被称为 Java 兼容的实现。</p>
<p>除了单元测试之外，Harmony 还会通过一些已有的成熟的 Java 程序来作为黑盒测试的应用，测试 Harmony 是否已经可以支持这些应用。目前 Harmony 可以运行 Eclipse，Tomcat，JEdit 等 Java 程序。Harmony 提供了一个工具，鼓励 Java 程序作者将他们的程序运行在 Harmony 上，并且通过这个工具将运行结果反馈给 Harmony 开发社区。</p>
<p>总的来说，Harmony 采用以下几种方式来衡量开发进度：</p>
<ul>
    <li>粗粒度层次上，可以衡量一个模块是否已经开发。
    <li>使用工具比较 Harmony 和参考实现兼容性，比如使用 JAPI 检测 Harmony 的 API 覆盖率。
    <li>使用工具检查测试覆盖率，检查 Harmony 的各种行为是否得到充分的测试。
    <li>支持成熟的 Java 应用程序列表。
    <li>将来的目标是通过 JCK 测试。 </li>
</ul>
<p>本系列后续文章将进一步介绍 Harmony 开发中的最佳实践。</p>
<p><br />
<br />
<a name="N10202"><span class="atitle">Apache Harmony 未来的发展方向</span></a></p>
<p>Harmony 的一个重要目标是类库的模块化。Harmony 将进一步采用 OSGi 运行时框架技术，根据模块元数据描述，自动装载模块。并且还将努力实现以下目标：</p>
<ul>
    <li>允许同时装载同一模块的不同版本。
    <li>通过模块的 MANIFEST.MF 元数据文件控制其所包含的 Java package 的可见性。
    <li>Java 类和相应的本地代码的启动/停止/卸载等生命周期管理。 </li>
</ul>
<p><br />
<a name="N10217"><span class="atitle">你能为 Harmony 做些什么</span></a></p>
<p>目前 Harmony 已经建立了一个相当活跃的开发社区，并且非常欢迎更多的人参与进来，包括参与 Harmony 的开发，移植 Harmony 到其他平台（目前 Harmony 只有 IA32 的 Windows 和 Linux 版本），撰写文档，在 Harmony 上运行成熟的 Java 应用检查其实现的覆盖率和兼容性等等。除此之外，同样重要的是，你还可以参与远未成熟的 Harmony 用户社区，试用 Harmony，参与 Harmony 的讨论，等等。Harmony 是一个属于所有人的 Java 平台。<br />
</p>
<p><a name="N10220"><span class="atitle">总结</span></a></p>
<ul>
    <li>Harmony 的目标是一个完全兼容的开源的 JSE 实现
    <li>Harmony 投入巨大的努力保证知识产权的纯洁性
    <li>Harmony 社区的目标是创建一个一流的模块化的运行时环境
    <li>Harmony 在过去的一年中取得了巨大的成就
    <li>Harmony 欢迎任何有兴趣的开发者 </li>
</ul>
<p>&nbsp;</p>
<p>转载自 ibm dw http://www.ibm.com/developerworks/cn/java/j-lo-harmony1/</p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/331049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-04 18:13 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/04/331049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache Regexp</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/04/331048.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sat, 04 Sep 2010 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/04/331048.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/331048.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/04/331048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/331048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/331048.html</trackback:ping><description><![CDATA[&nbsp; Regexp是一个学习这种表达式的好工具。<br />
Regexp是一个由100%纯java正则式处理包，是Jonathan Locke捐给Apache软件基金会的。 他最初开发这个软件是在1996年， 它包括完整的Javadoc文档，以及一个简单的Applet来做可视化调试和兼容性测试.<br />
<br />
2)RE类regexp包中非常重要的一个类，它是一个高效的、轻量级的正则式计算器/匹配器的类，RE是regular expression的缩写。正则式是能够进行复杂的字符串匹配的模板，而且当一个字符串能匹配某个模板时，你可 以抽取出那些匹配的部分，这在进行文本解析时非常有用。下面讨论一下正则式的语法。<br />
　　为了编译一个正则式，你需要简单地以模板为参数构造一个RE匹配器对象来完成，然后就可调用任一个 RE.match方法来对一个字符串进行匹配检查，如果匹配成功/失败，则返回真/假值。例如：<br />
<br />
RE r = new RE("a*b");<br />
boolean matched = r.match("aaaab");<br />
<br />
　　RE.getParen可以取回匹配的字符序列，或者匹配的字符序列的某一部分（如果模板中有相应的括号的 话），以及它们的位置、长度等属性。如：<br />
<br />
RE r = new RE("(a*)b"); // Compile expression<br />
boolean matched = r.match("xaaaab"); // Match against "xaaaab"<br />
<br />
String wholeExpr = r.getParen(0); // wholeExpr will be 'aaaab'<br />
String insideParens = r.getParen(1); // insideParens will be 'aaaa'<br />
<br />
int startWholeExpr = r.getParenStart(0); // startWholeExpr will be index 1<br />
int endWholeExpr = r.getParenEnd(0); // endWholeExpr will be index 6<br />
int lenWholeExpr = r.getParenLength(0); // lenWholeExpr will be 5<br />
<br />
int startInside = r.getParenStart(1); // startInside will be index 1<br />
int endInside = r.getParenEnd(1); // endInside will be index 5<br />
int lenInside = r.getParenLength(1); // lenInside will be 4<br />
<br />
<br />
　　RE支持正则式的后向引用，如：<br />
<br />
([0-9]+)=\1<br />
匹配 n=n (象 0=0 or 2=2)这样的字符串<br />
<br />
3)RE支持的正则式的语法如下：<br />
字符<br />
unicodeChar&nbsp;&nbsp;Matches any identical unicode character <br />
\&nbsp;&nbsp;Used to quote a meta-character (like '*') <br />
\\&nbsp;&nbsp;Matches a single '\' character <br />
\0nnn&nbsp;&nbsp;Matches a given octal character <br />
\xhh&nbsp;&nbsp;Matches a given 8-bit hexadecimal character <br />
\\uhhhh&nbsp;&nbsp;Matches a given 16-bit hexadecimal character <br />
\t&nbsp;&nbsp;Matches an ASCII tab character <br />
\n&nbsp;&nbsp;Matches an ASCII newline character <br />
\r&nbsp;&nbsp;Matches an ASCII return character <br />
\f&nbsp;&nbsp;Matches an ASCII form feed character <br />
<br />
字符集<br />
[abc]&nbsp;&nbsp;简单字符集 <br />
[a-zA-Z]&nbsp;&nbsp;带区间的 字符集 <br />
[^abc]&nbsp;&nbsp;字符集的否定 <br />
<br />
标准POSIX 字符集<br />
[:alnum:]&nbsp;&nbsp;Alphanumeric characters. <br />
[:alpha:]&nbsp;&nbsp;Alphabetic characters. <br />
[:blank:]&nbsp;&nbsp;Space and tab characters. <br />
[:cntrl:]&nbsp;&nbsp;Control characters. <br />
[:digit:]&nbsp;&nbsp;Numeric characters. <br />
[:graph:]&nbsp;&nbsp;Characters that are printable and are also visible.(A space is printable, but not visible, while an `a' is both.) <br />
[:lower:]&nbsp;&nbsp;Lower-case alphabetic characters. <br />
[:print:]&nbsp;&nbsp;Printable characters (characters that are not control characters.) <br />
[:punct:]&nbsp;&nbsp;Punctuation characters (characters that are not letter,digits, control characters, or space characters). <br />
[:space:]&nbsp;&nbsp;Space characters (such as space, tab, and formfeed, to name a few). <br />
[:upper:]&nbsp;&nbsp;Upper-case alphabetic characters. <br />
[:xdigit:]&nbsp;&nbsp;Characters that are hexadecimal digits. <br />
<br />
非标准的 POSIX样式的字符集<br />
[:javastart:]&nbsp;&nbsp;Start of a Java identifier <br />
[:javapart:]&nbsp;&nbsp;Part of a Java identifier <br />
<br />
预定义的字符集<br />
.&nbsp;&nbsp;Matches any character other than newline <br />
\w&nbsp;&nbsp;Matches a "word" character (alphanumeric plus "_") <br />
\W&nbsp;&nbsp;Matches a non-word character <br />
\s&nbsp;&nbsp;Matches a whitespace character <br />
\S&nbsp;&nbsp;Matches a non-whitespace character <br />
\d&nbsp;&nbsp;Matches a digit character <br />
\D&nbsp;&nbsp;Matches a non-digit character <br />
<br />
边界匹配符<br />
^&nbsp;&nbsp;Matches only at the beginning of a line <br />
$&nbsp;&nbsp;Matches only at the end of a line <br />
\b&nbsp;&nbsp;Matches only at a word boundary <br />
\B&nbsp;&nbsp;Matches only at a non-word boundary <br />
<br />
贪婪匹配限定符<br />
A*&nbsp;&nbsp;Matches A 0 or more times (greedy) <br />
A+&nbsp;&nbsp;Matches A 1 or more times (greedy) <br />
A?&nbsp;&nbsp;Matches A 1 or 0 times (greedy) <br />
A{n}&nbsp;&nbsp;Matches A exactly n times (greedy) <br />
A{n,}&nbsp;&nbsp;Matches A at least n times (greedy) <br />
<br />
非贪婪匹配限定符 <br />
A*?&nbsp;&nbsp;Matches A 0 or more times (reluctant) <br />
A+?&nbsp;&nbsp;Matches A 1 or more times (reluctant) <br />
A??&nbsp;&nbsp;Matches A 0 or 1 times (reluctant) <br />
<br />
逻辑运算符<br />
AB&nbsp;&nbsp;Matches A followed by B <br />
A|B&nbsp;&nbsp;Matches either A or B <br />
(A)&nbsp;&nbsp;Used for subexpression grouping <br />
(?:A)&nbsp;&nbsp;Used for subexpression clustering (just like grouping but no backrefs) <br />
<br />
后向引用符<br />
\1&nbsp;&nbsp;Backreference to 1st parenthesized subexpression <br />
\2&nbsp;&nbsp;Backreference to 2nd parenthesized subexpression <br />
\3&nbsp;&nbsp;Backreference to 3rd parenthesized subexpression <br />
\4&nbsp;&nbsp;Backreference to 4th parenthesized subexpression <br />
\5&nbsp;&nbsp;Backreference to 5th parenthesized subexpression <br />
\6&nbsp;&nbsp;Backreference to 6th parenthesized subexpression <br />
\7&nbsp;&nbsp;Backreference to 7th parenthesized subexpression <br />
\8&nbsp;&nbsp;Backreference to 8th parenthesized subexpression <br />
\9&nbsp;&nbsp;Backreference to 9th parenthesized subexpression <br />
<br />
<br />
RE运行的程序先经过RECompiler类的编译. 由于效率的原因，RE匹配器没有包括正则式的编译类. 实际上， 如果要预编译1个或多个正则式，可以通过命令行运行'recompile'类,如<br />
<br />
java org.apache.regexp.recompile a*b<br />
则产生类似下面的编译输出（最后一行不是）：<br />
<br />
// Pre-compiled regular expression "a*b"<br />
char[] re1Instructions =<br />
{<br />
0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041,<br />
0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047,<br />
0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000,<br />
0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000,<br />
0x0000,<br />
};<br />
REProgram re1 = new REProgram(re1Instructions);<br />
RE r = new RE(re1);<br />
<br />
　　通过利用预编译的req来构建RE匹配器对象，可以避免运行时进行编译的成本。 如果需要动态的构造正 则式，则可以创建单独一个RECompiler对象，并利用它来编译每个正则式。注意，RE 和 RECompiler 都不是 threadsafe的（出于效率的原因）, 因此当多线程运行时，你需要为每个线程分别创建编译器和匹配器。<br />
<br />
<br />
3、例程<br />
<br />
1)regexp包中带有一个applet写的小程序，运行如下:<br />
java org.apache.regexp.REDemo<br />
运行后：<br />
<img height="384" alt="" src="http://www.blogjava.net/images/blogjava_net/freeman1984/reg.JPG" width="683" border="0" /><br />
2)Jeffer Hunter写了一个例程，可以下载。<br />
3)regexp自带的测试例程，也很有参考价值。它把所有正则式及相关的字符串以及结果都放在一个单独的文件 里，在$REGEXPHOME/docs/RETest.txt中。当然，这个例程的运行也要在$REGEXPHOME目录下。<br />
cd $REGEXPHOME<br />
java org.apache.regexp.RETest 
<img src ="http://www.blogjava.net/freeman1984/aggbug/331048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-04 17:57 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/04/331048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache commons简介</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/04/331028.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sat, 04 Sep 2010 03:57:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/04/331028.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/331028.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/04/331028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/331028.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/331028.html</trackback:ping><description><![CDATA[<strong>作者Blog：</strong><a id="ArticleContent1_ArticleContent1_AuthorBlogLink" href="http://blog.csdn.net/sswt/" target="_blank">http://blog.csdn.net/sswt/</a><br />
<span id="ArticleContent1_ArticleContent1_lblContent">&nbsp;
<p><font face="Arial">Apache&nbsp;Commons是一个非常有用的工具包，解决各种实际的通用问题，下面是一个简述表，详细信息访问</font><a href="http://jakarta.apache.org/commons/index.html" target="_blank"><font face="Arial">http://jakarta.apache.org/commons/index.html</font></a> </p>
<p><font face="Arial"><strong>BeanUtils</strong><br />
Commons-BeanUtils&nbsp;提供对&nbsp;Java&nbsp;反射和自省API的包装</font> </p>
<p><font face="Arial"><strong>Betwixt</strong><br />
Betwixt提供将&nbsp;JavaBean&nbsp;映射至&nbsp;XML&nbsp;文档，以及相反映射的服务.</font> </p>
<p><font face="Arial"><strong>Chain</strong><br />
Chain&nbsp;提供实现组织复杂的处理流程的&#8220;责任链模式&#8221;.</font> </p>
<p><font face="Arial"><strong>CLI</strong><br />
CLI&nbsp;提供针对命令行参数，选项，选项组，强制选项等的简单API.</font> </p>
<p><font face="Arial"><strong>Codec</strong><br />
Codec&nbsp;包含一些通用的编码解码算法。包括一些语音编码器，&nbsp;Hex,&nbsp;Base64,&nbsp;以及URL&nbsp;encoder.</font> </p>
<p><font face="Arial"><strong>Collections</strong><br />
Commons-Collections&nbsp;提供一个类包来扩展和增加标准的&nbsp;Java&nbsp;Collection框架</font> </p>
<p><font face="Arial"><strong>Configuration</strong><br />
Commons-Configuration&nbsp;工具对各种各式的配置和参考文件提供读取帮助.</font> </p>
<p><font face="Arial"><strong>Daemon</strong><br />
一种&nbsp;unix-daemon-like&nbsp;java&nbsp;代码的替代机制</font> </p>
<p><font face="Arial"><strong>DBCP</strong><br />
Commons-DBCP&nbsp;提供数据库连接池服务</font> </p>
<p><font face="Arial"><strong>DbUtils</strong><br />
DbUtils&nbsp;是一个&nbsp;JDBC&nbsp;helper&nbsp;类库，完成数据库任务的简单的资源清除代码.</font> </p>
<p><font face="Arial"><strong>Digester</strong><br />
Commons-Digester&nbsp;是一个&nbsp;XML-Java对象的映射工具，用于解析&nbsp;XML配置文件.</font> </p>
<p><font face="Arial"><strong>Discovery</strong><br />
Commons-Discovery&nbsp;提供工具来定位资源&nbsp;(包括类)&nbsp;，通过使用各种模式来映射服务/引用名称和资源名称。.</font> </p>
<p><font face="Arial"><strong>EL</strong><br />
Commons-EL&nbsp;提供在JSP2.0规范中定义的EL表达式的解释器.</font> </p>
<p><font face="Arial"><strong>FileUpload</strong><br />
FileUpload&nbsp;使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力</font> </p>
<p><font face="Arial"><strong>HttpClient</strong><br />
Commons-HttpClient&nbsp;提供了可以工作于HTTP协议客户端的一个框架.</font> </p>
<p><font face="Arial"><strong>IO</strong><br />
IO&nbsp;是一个&nbsp;I/O&nbsp;工具集</font> </p>
<p><font face="Arial"><strong>Jelly</strong><br />
Jelly是一个基于&nbsp;XML&nbsp;的脚本和处理引擎。&nbsp;Jelly&nbsp;借鉴了&nbsp;JSP&nbsp;定指标签，Velocity,&nbsp;Cocoon和Xdoclet中的脚本引擎的许多优点。Jelly&nbsp;可以用在命令行，&nbsp;Ant&nbsp;或者&nbsp;Servlet之中。</font> </p>
<p><font face="Arial"><strong>Jexl</strong><br />
Jexl是一个表达式语言，通过借鉴来自于Velocity的经验扩展了JSTL定义的表达式语言。.</font> </p>
<p><font face="Arial"><strong>JXPath</strong><br />
Commons-JXPath&nbsp;提供了使用Xpath语法操纵符合Java类命名规范的&nbsp;JavaBeans的工具。也支持&nbsp;maps,&nbsp;DOM&nbsp;和其他对象模型。.</font> </p>
<p><font face="Arial"><strong>Lang</strong><br />
Commons-Lang&nbsp;提供了许多许多通用的工具类集，提供了一些java.lang中类的扩展功能</font> </p>
<p><font face="Arial"><strong>Latka</strong><br />
Commons-Latka&nbsp;是一个HTTP&nbsp;功能测试包，用于自动化的QA,验收和衰减测试.</font> </p>
<p><font face="Arial"><strong>Launcher</strong><br />
Launcher&nbsp;组件是一个交叉平台的Java&nbsp;应用载入器。&nbsp;Commons-launcher&nbsp;消除了需要批处理或者Shell脚本来载入Java&nbsp;类。.原始的&nbsp;Java&nbsp;类来自于Jakarta&nbsp;Tomcat&nbsp;4.0&nbsp;项目</font> </p>
<p><font face="Arial"><strong>Logging</strong><br />
Commons-Logging&nbsp;是一个各种&nbsp;logging&nbsp;API实现的包裹类.</font> </p>
<p><font face="Arial"><strong>Math</strong><br />
Math&nbsp;是一个轻量的，自包含的数学和统计组件，解决了许多非常通用但没有及时出现在Java标准语言中的实践问题.</font> </p>
<p><font face="Arial"><strong>Modeler</strong><br />
Commons-Modeler&nbsp;提供了建模兼容JMX规范的&nbsp;Mbean的机制.</font> </p>
<p><font face="Arial"><strong>Net</strong><br />
Net&nbsp;是一个网络工具集，基于&nbsp;NetComponents&nbsp;代码，包括&nbsp;FTP&nbsp;客户端等等。</font> </p>
<p><font face="Arial"><strong>Pool</strong><br />
Commons-Pool&nbsp;提供了通用对象池接口，一个用于创建模块化对象池的工具包，以及通常的对象池实现.</font> </p>
<p><font face="Arial"><strong>Primitives</strong><br />
Commons-Primitives提供了一个更小，更快和更易使用的对Java基本类型的支持。当前主要是针对基本类型的&nbsp;collection。.</font> </p>
<p><font face="Arial"><strong>Validator</strong><br />
The&nbsp;commons-validator提供了一个简单的，可扩展的框架来在一个XML文件中定义校验器&nbsp;(校验方法)和校验规则。支持校验规则的和错误消息的国际化。</font> </span></p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/331028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-04 11:57 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/04/331028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache discovery</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/04/331019.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Sat, 04 Sep 2010 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/04/331019.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/331019.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/04/331019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/331019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/331019.html</trackback:ping><description><![CDATA[<p>转载：http://terrencexu.javaeye.com/blog/715982<br />
<br />
</p>
<p>Discovery组件被用以查找可插拔接口的实现实例，它提供了一种通用的实例化这些实现的方式，而且可以管理单例（工厂）的生命周期。本质上来讲，就是定位那些实现了给定Java接口的类，并实例化。除此之外，Discovery还可以用以在给定的classpath中查找并加载资源文件。</p>
<p>&nbsp;</p>
<p>Discovery组件在查找所有的实现类的时候需要预先将允许被查找的实现类配置到默认的配置文件中，默认的配置文件为：</p>
<p>/META-INF/services/&lt;YOUR Interface whole name including pkg name&gt;， Discovery将依次加载该文件中配置的允许加载的实现类。</p>
<p>&nbsp;</p>
<p>下面将举例说明：</p>
<p>首先定义一个Interface：Action</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com.javaeye.terrencexu.discovery; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;Action&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com.javaeye.terrencexu.discovery;
public interface Action {
public String getName();
}
</pre>
<p>&nbsp;</p>
<p>然后在不同的包里分别实现Action接口，如下(请注意包名)</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com.javaeye.terrencexu.discovery.impl; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;com.javaeye.terrencexu.discovery.Action; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;CreateAction&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Action&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"Create&nbsp;Action"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com.javaeye.terrencexu.discovery.impl;
import com.javaeye.terrencexu.discovery.Action;
public class CreateAction implements Action {
@Override
public String getName() {
return "Create Action";
}
}
</pre>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com.javaeye.terrencexu.discovery.impl; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;com.javaeye.terrencexu.discovery.Action; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DeleteAction&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Action&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"Delete&nbsp;Action"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com.javaeye.terrencexu.discovery.impl;
import com.javaeye.terrencexu.discovery.Action;
public class DeleteAction implements Action {
@Override
public String getName() {
return "Delete Action";
}
}
</pre>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com.javaeye.terrencexu.discovery.impl2; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;com.javaeye.terrencexu.discovery.Action; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;AddAction&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Action&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"Add&nbsp;Action"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com.javaeye.terrencexu.discovery.impl2;
import com.javaeye.terrencexu.discovery.Action;
public class AddAction implements Action {
@Override
public String getName() {
return "Add Action";
}
}
</pre>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com.javaeye.terrencexu.discovery.impl2; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;com.javaeye.terrencexu.discovery.Action; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;RemoveAction&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Action&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">"Remove&nbsp;Action"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com.javaeye.terrencexu.discovery.impl2;
import com.javaeye.terrencexu.discovery.Action;
public class RemoveAction implements Action {
@Override
public String getName() {
return "Remove Action";
}
}
</pre>
<p>&nbsp;</p>
<p>接下来将定义配置文件，按序定义允许被加载的实现类，该文件默认存在位置为/META-INF/services/，文件名为com.javaeye.terrencexu.discovery.Action，文件内容如下：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>#&nbsp;Display&nbsp;in&nbsp;order &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>com.javaeye.terrencexu.discovery.impl.CreateAction &nbsp;&nbsp;</span></li>
    <li><span>com.javaeye.terrencexu.discovery.impl.DeleteAction &nbsp;&nbsp;</span></li>
    <li><span>com.javaeye.terrencexu.discovery.impl2.AddAction&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"># Display in order
com.javaeye.terrencexu.discovery.impl.CreateAction
com.javaeye.terrencexu.discovery.impl.DeleteAction
com.javaeye.terrencexu.discovery.impl2.AddAction</pre>
<p>&nbsp;</p>
<p>这样所有的准备材料就都已经齐全了，接下来可以验证一把了，如下：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;&nbsp;CreateAction/DeleteAction/AddAction&nbsp;have&nbsp;been&nbsp;defined&nbsp;in&nbsp;/META-INF/services/com.javaeye.terrencexu.discovery.Action </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*&nbsp;&nbsp;And&nbsp;the&nbsp;order&nbsp;is&nbsp;CreateAction&nbsp;&gt;&nbsp;DeleteAction&nbsp;&gt;&nbsp;AddAction </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="annotation">@SuppressWarnings</span><span>(</span><span class="string">"unchecked"</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testGetAllProviders()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;expectedResults&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;String[]&nbsp;{</span><span class="string">"Create&nbsp;Action"</span><span>,&nbsp;</span><span class="string">"Delete&nbsp;Action"</span><span>,&nbsp;</span><span class="string">"Add&nbsp;Action"</span><span>}; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;Enumeration&lt;Action&gt;&nbsp;enu&nbsp;=&nbsp;Service.providers(Action.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;</span><span class="number">0</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(enu.hasMoreElements())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;action&nbsp;=&nbsp;enu.nextElement(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue(</span><span class="string">"The&nbsp;action&nbsp;name&nbsp;should&nbsp;be&nbsp;\""</span><span>&nbsp;+&nbsp;expectedResults[count]&nbsp;+&nbsp;</span><span class="string">"\",&nbsp;but&nbsp;actually&nbsp;is&nbsp;\""</span><span>&nbsp;+&nbsp;action.getName()&nbsp;+&nbsp;</span><span class="string">"\""</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action.getName().equals(expectedResults[count])); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;++; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(count,&nbsp;expectedResults.length); &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> /**
*  CreateAction/DeleteAction/AddAction have been defined in /META-INF/services/com.javaeye.terrencexu.discovery.Action
*
*  And the order is CreateAction &gt; DeleteAction &gt; AddAction
*/
@SuppressWarnings("unchecked")
public void testGetAllProviders() {
String[] expectedResults = new String[] {"Create Action", "Delete Action", "Add Action"};
Enumeration&lt;Action&gt; enu = Service.providers(Action.class);
int count = 0;
while (enu.hasMoreElements()) {
Action action = enu.nextElement();
assertTrue("The action name should be \"" + expectedResults[count] + "\", but actually is \"" + action.getName() + "\"",
action.getName().equals(expectedResults[count]));
count ++;
}
assertEquals(count, expectedResults.length);
}</pre>
<p>&nbsp;</p>
<p>可以发现，因为RemoveAction没有被配置到service文件中，所以将不会被加载，另外一点儿就是，配置文件中的定义顺序即加载顺序。</p>
<p>&nbsp;</p>
<p>除此之外，Discovery提供了singleton模式加载唯一实现，并且该实现将被缓存在cache中，除非通过显示的调用release()方法释放缓存，否则所有之后的调用，都将返回初次调用加载的Action。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testFindCreateAction()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Load&nbsp;provider&nbsp;com.javaeye.terrencexu.discovery.impl.CreateAction </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;createAction&nbsp;=&nbsp;(Action)&nbsp;DiscoverSingleton.find(Action.</span><span class="keyword">class</span><span>,&nbsp;CreateAction.</span><span class="keyword">class</span><span>.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span class="string">"Create&nbsp;Action"</span><span>,&nbsp;createAction.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiscoverSingleton.release(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public void testFindCreateAction() {
try {
// Load provider com.javaeye.terrencexu.discovery.impl.CreateAction
Action createAction = (Action) DiscoverSingleton.find(Action.class, CreateAction.class.getName());
assertEquals("Create Action", createAction.getName());
} finally {
DiscoverSingleton.release();
}
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>还有一点需要说明的是，如果定义了默认的service文件，无论通过singleton模式加载的实现类有没有被配置在service文件中，都将默认加载配置中文中的第一个Action，比如上文中的CreateAction。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testFindDeleteActionInConfig()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Load&nbsp;provider&nbsp;com.javaeye.terrencexu.discovery.impl.CreateAction </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;deleteAction&nbsp;=&nbsp;(Action)&nbsp;DiscoverSingleton.find(Action.</span><span class="keyword">class</span><span>,&nbsp;DeleteAction.</span><span class="keyword">class</span><span>.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;As&nbsp;the&nbsp;default&nbsp;configuration&nbsp;file&nbsp;defines&nbsp;the&nbsp;CreateAction&nbsp;as&nbsp;the&nbsp;first&nbsp;element,&nbsp;so&nbsp;you&nbsp;will&nbsp;always&nbsp;get&nbsp;the&nbsp;CreateAction&nbsp;as&nbsp;singleton.&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span class="string">"Create&nbsp;Action"</span><span>,&nbsp;deleteAction.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiscoverSingleton.release(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public void testFindDeleteActionInConfig() {
try {
// Load provider com.javaeye.terrencexu.discovery.impl.CreateAction
Action deleteAction = (Action) DiscoverSingleton.find(Action.class, DeleteAction.class.getName());
// As the default configuration file defines the CreateAction as the first element, so you will always get the CreateAction as singleton.
assertEquals("Create Action", deleteAction.getName());
} finally {
DiscoverSingleton.release();
}
}</pre>
<p>&nbsp;</p>
<p>那么如果必须使用service文件，又想通过singleton模式加载某特定的实现类该怎么办呢？可以通过传递Properties到DiscoverSingleton中去改变它的行为，如下：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testFindDeleteActionWithProperty()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;props&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Properties(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.setProperty(Action.</span><span class="keyword">class</span><span>.getName(),&nbsp;DeleteAction.</span><span class="keyword">class</span><span>.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Load&nbsp;provider&nbsp;com.javaeye.terrencexu.discovery.impl.CreateAction </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;deleteAction&nbsp;=&nbsp;(Action)&nbsp;DiscoverSingleton.find(Action.</span><span class="keyword">class</span><span>,&nbsp;props); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span class="string">"Delete&nbsp;Action"</span><span>,&nbsp;deleteAction.getName()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DiscoverSingleton.release(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public void testFindDeleteActionWithProperty() {
try {
Properties props = new Properties();
props.setProperty(Action.class.getName(), DeleteAction.class.getName());
// Load provider com.javaeye.terrencexu.discovery.impl.CreateAction
Action deleteAction = (Action) DiscoverSingleton.find(Action.class, props);
assertEquals("Delete Action", deleteAction.getName());
} finally {
DiscoverSingleton.release();
}
}</pre>
<p>&nbsp;</p>
<p>除了加载类之外，很多情况下我们还想加载资源文件，比如在你的classpath下有一个配置文件为/conf/testResource，下面我们通过Discovery去加载该资源文件：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://terrencexu.javaeye.com/blog/715982#"><img alt="复制代码" src="http://terrencexu.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;testFindResources()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;ClassLoaders&nbsp;loaders&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ClassLoaders(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader&nbsp;cl&nbsp;=&nbsp;getClass().getClassLoader(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(cl&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loaders.put(getClass().getClassLoader(),&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loaders.put(JDKHooks.getJDKHooks().getSystemClassLoader(),&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;=&nbsp;</span><span class="string">"conf/testResource"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;DiscoverResources&nbsp;discovery&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;DiscoverResources(loaders); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;ResourceIterator&nbsp;iter&nbsp;=&nbsp;discovery.findResources(name); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(iter.hasNext())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource&nbsp;resource&nbsp;=&nbsp;iter.nextResource(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;=&nbsp;resource.getResource(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(url); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public void testFindResources() {
ClassLoaders loaders = new ClassLoaders();
ClassLoader cl = getClass().getClassLoader();
if(cl != null) {
loaders.put(getClass().getClassLoader(), true);
} else {
loaders.put(JDKHooks.getJDKHooks().getSystemClassLoader(), true);
}
String name = "conf/testResource";
DiscoverResources discovery = new DiscoverResources(loaders);
ResourceIterator iter = discovery.findResources(name);
while(iter.hasNext()) {
Resource resource = iter.nextResource();
URL url = resource.getResource();
System.out.println(url);
}
}</pre>
<p>&nbsp;</p>
<p>Discovery还有其他一些功能这里就不在详细的一一赘述了，可以参考<a href="http://commons.apache.org/discovery/index.html">http://commons.apache.org/discovery/index.html</a>进一步详细了解。</p>
<p>&nbsp;</p>
<p>下图是我的例子的目录结构，仅供参考：</p>
<p><br />
<img alt="" src="http://dl.javaeye.com/upload/attachment/279914/e14b6776-876c-3f57-96a1-1d656879f157.png" /></p>
<p>然后附件中有source code，仅供参考。</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/331019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-04 11:34 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/04/331019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>