<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feeds.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feeds.feedsky.com/csdn.net/baggio785" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feeds.feedsky.com/csdn.net/baggio785" type="application/rss+xml"></fs:self_link><lastBuildDate>Sat, 12 May 2007 03:08:00 GMT</lastBuildDate><title>baggio785的专栏</title><link>http://blog.csdn.net/baggio785</link><language>zh-cn</language><copyright>Copyright &amp;copy; baggio785</copyright><pubDate>Tue, 22 May 2012 16:48:41 GMT</pubDate><image><url>http://static.blog.csdn.net/images/logo.gif</url><link>http://blog.csdn.net</link></image><item><title>[原]SOUNDEX函数介绍-007</title><link>http://blog.csdn.net/baggio785/article/details/1605661</link><description>&lt;p&gt;在ORACLE中，SOUNDEX&amp;nbsp;函数返回字符串参数的语音表示形式，对于比较一些读音相同，但是拼写不同的单词非常有用。&lt;/p&gt;
&lt;p&gt;SOUNDEX函数的语法为：SOUNDEX(string)&lt;/p&gt;
&lt;p&gt;计算语音的算法如下：&lt;/p&gt;
&lt;p&gt;1&amp;nbsp; 保留字符串首字母，但删除a、e、h、i、o、w、y。&lt;/p&gt;
&lt;p&gt;2&amp;nbsp; 将下表中的数字赋给相对应的字母&lt;/p&gt;
&lt;p&gt;1） 1：b、f、p、v&lt;/p&gt;
&lt;p&gt;2） 2：c、g、k、q、s、x、z&lt;/p&gt;
&lt;p&gt;3） 3：d、t&lt;/p&gt;
&lt;p&gt;4） 4：l&lt;/p&gt;
&lt;p&gt;5） 5：m、n&lt;/p&gt;
&lt;p&gt;6） 6：r&lt;/p&gt;
&lt;p&gt;3&amp;nbsp; 如果字符串中存在拥有相同数字的2个以上（包含2个）的字母在一起（例如b和f），或者只有h或w，则删除其他的，只保留1个&lt;/p&gt;
&lt;p&gt;4&amp;nbsp; 只返回前4个字节，不够用0填充&lt;/p&gt;
&lt;p&gt;例子：&lt;/p&gt;
&lt;p&gt;soundex('two'),soundex('too'),soundex('to')，他们的结果都是T000&lt;/p&gt;
&lt;p&gt;soundex('cap'),soundex('cup')，他们的结果都是C100&lt;/p&gt;
&lt;p&gt;soundex('house'),soundex('horse')，他们的结果都分别是H200，H620&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2007-5-12 11:08:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1605661&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：7740 评论：1 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1605661#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Sat, 12 May 2007 11:08:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1605661</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1605661</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094749/1063817</fs:itemid></item><item><title>[原]TIMESTAMP数据类型-007</title><link>http://blog.csdn.net/baggio785/article/details/1598530</link><description>&lt;p&gt;以下代码的运行环境：oracle9.2,pl/sql developer&lt;/p&gt;
&lt;p&gt;一、TIMESTAMP&lt;/p&gt;
&lt;p&gt;TIMESTAMP数据类型，是DATE的扩展，可以存储年、月、日、小时、分钟、秒，同时还可以存储秒的小数部分。&lt;/p&gt;
&lt;p&gt;语法为：TIMESTAMP [(fractional_seconds_precision)]&lt;/p&gt;
&lt;p&gt;fractional_seconds_precision为可选项，指定秒的小数部分的精度，取值范围为0-9，默认值为6。&lt;/p&gt;
&lt;p&gt;示例代码：&lt;/p&gt;
&lt;p&gt;declare&lt;br /&gt;&amp;nbsp;v_inteval timestamp(7);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;v_inteval := TIMESTAMP'2007-05-05 23:34:45.1234567';&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;dbms_output.put_line(v_inteval);&lt;br /&gt;end;&lt;/p&gt;
&lt;p&gt;结果为：05-5月 -07 11.34.45.1234567 下午。&lt;/p&gt;
&lt;p&gt;说明：如果精度为5,则结果为05-5月 -07 11.34.45.12346 下午；如果精度为8，则结果为05-5月 -07 11.34.45.12345670 下午。&lt;/p&gt;
&lt;p&gt;二、TIMESTAMP WITH TIME ZONE&lt;/p&gt;
&lt;p&gt;TIMESTAMP WITH TIME ZONE数据类型是可以指定时区的TIMESTAMP。时区的偏移是指本地时间和格林尼治（UTC）时间之间的差异（小时和分钟）。&lt;/p&gt;
&lt;p&gt;语法为：TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE&lt;/p&gt;
&lt;p&gt;fractional_seconds_precision为可选项，指定秒的小数部分的精度，取值范围为0-9，默认值为6。&lt;/p&gt;
&lt;p&gt;如果2个TIMESTAMP WITH TIME ZONE，相对于UTC代表相同的时间，则认为这2个TIMESTAMP WITH TIME ZONE是相等的，而不管这2个TIMESTAMP WITH TIME ZONE所代表的具体时间，例如：TIMESTAMP '1999-04-15 8:00:00 -8:00'和TIMESTAMP '1999-04-15 11:00:00 -5:00'是相等的，虽然他们分别表示当地的8点和11点，其中-8:00以及-5:00，表示相对UTC的偏移量。&lt;/p&gt;
&lt;p&gt;在上例中，也可以将偏移量替换成时区地区（TRZ，time zone region），例如，上例中的TIMESTAMP '1999-04-15 8:00:00 -8:00'，与TIMESTAMP '1999-04-15 8:00:00 US/Pacific'是相等的。&lt;/p&gt;
&lt;p&gt;为了削除因为夏令时引起的时间歧义，同时使用TRZ，以及和TRZ相对应的TRD来确保返回正确的时间，例如：TIMESTAMP '1999-10-29 01:30:00 US/Pacific PDT'。如果没有使用TZD元素，并且ORACLE的ERROR_ON_OVERLAP_TIME session参数设置为TRUE，则ORACLE会返回错误。如果ERROR_ON_OVERLAP_TIME session参数设置为FALSE，则ORACLE认为该TIMESTAMP WITH TIME ZONE为标准时间。&lt;/p&gt;
&lt;p&gt;代码一：&lt;/p&gt;
&lt;p&gt;declare&lt;br /&gt;&amp;nbsp;v_inteval timestamp(7) with time zone;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;v_inteval := TIMESTAMP'2007-05-05 23:34:45.1234567';&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;dbms_output.put_line(v_inteval);&lt;br /&gt;end;&lt;/p&gt;
&lt;p&gt;结果为：05-5月 -07 11.34.45.123456700 下午 +08:00。&lt;/p&gt;
&lt;p&gt;说明：该结果与（一）中的代码结果相比，多了一个时区偏移量+08:00，说明该时间为北京时间。&lt;/p&gt;
&lt;p&gt;代码二：&lt;/p&gt;
&lt;p&gt;declare&lt;br /&gt;&amp;nbsp;v_inteval_1 timestamp(3) with time zone;&lt;br /&gt;&amp;nbsp; v_inteval_2 timestamp(3) with time zone;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;v_inteval_1 := TIMESTAMP'1999-04-15 8:00:00 -8:00'; &lt;br /&gt;&amp;nbsp; v_inteval_2 := TIMESTAMP'1999-04-15 11:00:00 -5:00';&lt;br /&gt;&amp;nbsp; if(v_inteval_1=v_inteval_2)&amp;nbsp; then&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;dbms_output.put_line('v_inteval_1=v_inteval_2');&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp;dbms_output.put_line('v_inteval_1!=v_inteval_2');&lt;br /&gt;&amp;nbsp; end if;&lt;br /&gt;end;&lt;/p&gt;
&lt;p&gt;结果为：v_inteval_1=v_inteval_2。&lt;/p&gt;
&lt;p&gt;三、TIMESTAMP WITH&amp;nbsp; LOCAL TIME ZONE&lt;/p&gt;
&lt;p&gt;TIMESTAMP WITH LOCAL TIME ZONE数据类型也是可以指定时区的TIMESTAMP，和TIMESTAMP WITH TIME ZONE不同的是，他存储的是数据库的时区，时区偏移量并不存储。当用户提交数据，ORACLE返回的是用户的本地所在的时区。时区的偏移是指本地时间和格林尼治（UTC）时间之间的差异（小时和分钟）。TIMESTAMP WITH LOCAL TIME ZONE主要用于CS二层系统应用。&lt;/p&gt;
&lt;p&gt;语法：TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2007-5-6 23:51:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1598530&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：8153 评论：0 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1598530#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Sun, 06 May 2007 23:51:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1598530</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1598530</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094748/1063817</fs:itemid></item><item><title>[原]INTERVAL数据类型-007</title><link>http://blog.csdn.net/baggio785/article/details/1597636</link><description>&lt;p&gt;INTERVAL数据类型用来存储两个时间戳之间的时间间隔。 可以指定years and months，或者days,hours,minuts,seconds之间的间隔。&lt;/p&gt;
&lt;p&gt;oracle支持两种INTEVAL类型，它们分别是YEAR TO MONTH和DAY TO SECOND。每个类型都包含leading field和trailing field。主参数定义要被计算的date或者time，副参数定义最小增长量。&lt;/p&gt;
&lt;p&gt;下面根据实例来介绍YEAR TO MONTH和DAY TO SECOND。&lt;/p&gt;
&lt;p&gt;一、INTERVAL YEAR TO MONTH&lt;/p&gt;
&lt;p&gt;声明INTERVAL YEAR TO MONTH的语法是：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements39.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;p&gt;1 'INTEGER[-INTEGER],为leading field以及可选的trailing field指定具体的数值。同时month即trailing field的取值范围是0到11。&lt;/p&gt;
&lt;p&gt;2 percision，即精度，是对leading field的数值的最大长度的限制。取值范围为0-9，默认值是2。&lt;/p&gt;
&lt;p&gt;代码一：&lt;/p&gt;
&lt;p&gt;declare&lt;br /&gt;&amp;nbsp;v_inteval INTERVAL YEAR(3) TO MONTH;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;v_inteval := INTERVAL '123-2' YEAR TO MONTH;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;dbms_output.put_line(v_inteval);&lt;br /&gt;end;&lt;/p&gt;
&lt;p&gt;结果为：+123-02。&lt;/p&gt;
&lt;p&gt;说明：表示123年2个月。在这个例子中，必须指定YEAR，即leading field的精度(percision),因为默认值为2，如果将声明部分修改为&amp;nbsp; v_inteval INTERVAL YEAR TO MONTH;会提示精度太小错误。另外，需要注意的是，声明部分需要标注精度，但是赋值部分，即v_inteval := INTERVAL '123-2' YEAR TO MONTH;不需要标注精度，如果标注，会提示语法错误。在本例中，如果精度修改为4，则结果为+0123-02。&lt;/p&gt;
&lt;p&gt;代码二：&lt;/p&gt;
&lt;p&gt;select INTEVAL '1234' YEAR(4) from dual;&lt;/p&gt;
&lt;p&gt;结果为：+1234-00。&lt;/p&gt;
&lt;p&gt;说明：表示1234年0个月。因为INTEVAL类型之一，INTERVAL YEAR TO MONTH，声明时YEAR(leading field)和MONTH(trailing field)必须同时存在，否则会提示错误信息。所以，如果我们单独引用YEAR或者MONTH时，代码二的例子无法编译通过，只能通过sql语句。&lt;/p&gt;
&lt;p&gt;类似的例子还有：&lt;/p&gt;
&lt;p&gt;select INTERVAL '345' MONTH(3) from dual;&lt;/p&gt;
&lt;p&gt;结果为：+28-09。&lt;/p&gt;
&lt;p&gt;二、INTERVAL DAY TO SECOND&lt;/p&gt;
&lt;p&gt;声明INTERVAL DAY TO SECOND的语法是：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements64.gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;p&gt;1 INTEGER指定days的数值，数值不能超过leading_percision。&lt;/p&gt;
&lt;p&gt;2 time_expr指定格式为HH[:MI[:SS[.n]]]or MI[:SS[.n]] or SS[.n]的时间，n是second的小数部分，n的长度不能大于fractional_seconds_precision，并受限于fractional_seconds_precision的位数。如果leading field为day，则可以选择integer time_expr的模式。&lt;/p&gt;
&lt;p&gt;3 leading_precision为leading_field的精度，取值范围为0-9，默认值为2。&lt;/p&gt;
&lt;p&gt;4 fractional_seconds_precision为秒的精度取值范围1-9，默认值为6。&lt;/p&gt;
&lt;p&gt;5 HOUR的取值范围为0-23，MINUTE的取值范围为0-59，MINUTE的取值范围为0-59.999999999。&lt;/p&gt;
&lt;p&gt;代码一：&lt;/p&gt;
&lt;p&gt;declare&lt;br /&gt;&amp;nbsp;v_inteval INTERVAL DAY(7) TO SECOND(5);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;v_inteval := INTERVAL '4 5:12:10.222' DAY TO SECOND;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;dbms_output.put_line(v_inteval);&lt;br /&gt;end;&lt;/p&gt;
&lt;p&gt;结果为：++0000004 05:12:10.22200。&lt;/p&gt;
&lt;p&gt;说明：表示4天5小时12分10.222秒。在这个例子中，DAY以及SECOND的精度都是可选的，类似INTERVAL YEAR TO MONTH，声明部分需要标注精度，但是赋值部分，不需要标注精度，如果标注，会提示语法错误。&lt;/p&gt;
&lt;p&gt;代码二：&lt;/p&gt;
&lt;p&gt;select INTERVAL '4 5:12' DAY TO MINUTE from dual;&lt;/p&gt;
&lt;p&gt;结果为：+04 05:12:00。&lt;/p&gt;
&lt;p&gt;说明：表示4天5小时12分0秒。因为INTEVAL类型之一，INTERVAL DAY TO SECOND，声明时DAY和SECOND必须同时存在，否则会提示错误信息。所以，如果我们单独引用YEAR或者MONTH时，代码二的例子无法编译通过，只能通过sql语句。&lt;/p&gt;
&lt;p&gt;类似的例子还有：&lt;/p&gt;
&lt;p&gt;select INTERVAL '400 5' DAY(3) TO HOUR from dual;&lt;br /&gt;select INTERVAL '400' DAY(3) from dual;&lt;br /&gt;select INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) from dual;&lt;br /&gt;select INTERVAL '11:20' HOUR TO MINUTE from dual;&lt;br /&gt;select INTERVAL '10' HOUR from dual;&lt;br /&gt;select INTERVAL '10:22' MINUTE TO SECOND from dual;&lt;br /&gt;select INTERVAL '10' MINUTE from dual;&lt;br /&gt;select INTERVAL '120' HOUR(3) from dual;&lt;br /&gt;select INTERVAL '30.12345' SECOND(2,4) from dual;(注意，该结果为+00 00:00:30.1235，如果精度为1,3,则结果为+0 00:00:30.123，如果精度为3,7，则结果为+000 00:00:30.1234500)&amp;nbsp;&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2007-5-6 0:23:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1597636&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：7943 评论：0 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1597636#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Sun, 06 May 2007 00:23:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1597636</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1597636</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094747/1063817</fs:itemid></item><item><title>[转]用 Lucene 加速 Web 搜索应用程序的开发</title><link>http://blog.csdn.net/baggio785/article/details/1215172</link><description>&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#author&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;周 登朋&lt;/font&gt;&lt;/a&gt; (&lt;a href=&quot;mailto:zhoudengpeng@yahoo.com.cn?subject=用 Lucene 加速 Web 搜索应用程序的开发&amp;amp;cc=htc@us.ibm.com&quot;&gt;&lt;font color=&quot;#5c81a7&quot;&gt;zhoudengpeng@yahoo.com.cn&lt;/font&gt;&lt;/a&gt;), 软件工程师, 上海交通大学&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;2006 年 9 月 06 日&amp;nbsp;&lt;/p&gt;
&lt;p&gt;在本篇文章中，你会学习到如何利用 Lucene 实现高级搜索功能以及如何利用 Lucene 来创建 Web 搜索应用程序。通过这些学习，你就可以利用 Lucene 来创建自己的搜索应用程序。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N1005E&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;架构概览&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;通常一个 Web 搜索引擎的架构分为前端和后端两部分，就像&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure1&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图一&lt;/font&gt;&lt;/a&gt;中所示。在前端流程中，用户在搜索引擎提供的界面中输入要搜索的关键词，这里提到的用户界面一般是一个带有输入框的 Web 页面，然后应用程序将搜索的关键词解析成搜索引擎可以理解的形式，并在索引文件上进行搜索操作。在排序后，搜索引擎返回搜索结果给用户。在后端流程中，网络爬虫或者机器人从因特网上获取 Web 页面，然后索引子系统解析这些 Web 页面并存入索引文件中。如果你想利用 Lucene 来创建一个 Web 搜索应用程序，那么它的架构也和上面所描述的类似，就如&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure1&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图一&lt;/font&gt;&lt;/a&gt;中所示。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure1&quot;&gt;&lt;strong&gt;Figure 1. Web 搜索引擎架构&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;380&quot; alt=&quot;Web搜索引擎架构&quot; width=&quot;449&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure1.gif&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N1007F&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;利用 Lucene 实现高级搜索&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lucene 支持多种形式的高级搜索，我们在这一部分中会进行探讨，然后我会使用 Lucene 的 API 来演示如何实现这些高级搜索功能。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N10088&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;布尔操作符&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大多数的搜索引擎都会提供布尔操作符让用户可以组合查询，典型的布尔操作符有 AND, OR, NOT。Lucene 支持 5 种布尔操作符，分别是 AND, OR, NOT, 加(+), 减(-)。接下来我会讲述每个操作符的用法。 &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;OR&lt;/strong&gt;: 如果你要搜索含有字符 A 或者 B 的文档，那么就需要使用 OR 操作符。需要记住的是，如果你只是简单的用空格将两个关键词分割开，其实在搜索的时候搜索引擎会自动在两个关键词之间加上 OR 操作符。例如，&amp;ldquo;Java OR Lucene&amp;rdquo; 和 &amp;ldquo;Java Lucene&amp;rdquo; 都是搜索含有 Java 或者含有 Lucene 的文档。 &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;AND&lt;/strong&gt;: 如果你需要搜索包含一个以上关键词的文档，那么就需要使用 AND 操作符。例如，&amp;ldquo;Java AND Lucene&amp;rdquo; 返回所有既包含 Java 又包含 Lucene 的文档。 &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;NOT&lt;/strong&gt;: Not 操作符使得包含紧跟在 NOT 后面的关键词的文档不会被返回。例如，如果你想搜索所有含有 Java 但不含有 Lucene 的文档，你可以使用查询语句 &amp;ldquo;Java NOT Lucene&amp;rdquo;。但是你不能只对一个搜索词使用这个操作符，比如，查询语句 &amp;ldquo;NOT Java&amp;rdquo; 不会返回任何结果。 &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;加号（+）&lt;/strong&gt;: 这个操作符的作用和 AND 差不多，但它只对紧跟着它的一个搜索词起作用。例如，如果你想搜索一定包含 Java，但不一定包含 Lucene 的文档，就可以使用查询语句&amp;ldquo;+Java Lucene&amp;rdquo;。 &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;减号（-）&lt;/strong&gt;: 这个操作符的功能和 NOT 一样，查询语句 &amp;ldquo;Java -Lucene&amp;rdquo; 返回所有包含 Java 但不包含 Lucene 的文档。 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来我们看一下如何利用 Lucene 提供的 API 来实现布尔查询。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing1&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单1&lt;/font&gt;&lt;/a&gt; 显示了如果利用布尔操作符进行查询的过程。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing1&quot;&gt;&lt;strong&gt;清单1：使用布尔操作符&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;Test&amp;nbsp;boolean&amp;nbsp;operator&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_90_680_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_90_680_Open_Text').style.display='none'; document.getElementById('_90_680_Closed_Image').style.display='inline'; document.getElementById('_90_680_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_90_680_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_90_680_Closed_Text').style.display='none'; document.getElementById('_90_680_Open_Image').style.display='inline'; document.getElementById('_90_680_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;testOperator(String&amp;nbsp;indexDirectory)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Exception&lt;/span&gt;&lt;span id=&quot;_90_680_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_90_680_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;dir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FSDirectory.getDirectory(indexDirectory,&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexSearcher&amp;nbsp;indexSearcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexSearcher(dir);&lt;br /&gt;&lt;img id=&quot;_242_352_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_242_352_Open_Text').style.display='none'; document.getElementById('_242_352_Closed_Image').style.display='inline'; document.getElementById('_242_352_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_242_352_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_242_352_Closed_Text').style.display='none'; document.getElementById('_242_352_Open_Image').style.display='inline'; document.getElementById('_242_352_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[]&amp;nbsp;searchWords&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_242_352_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_242_352_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;Java&amp;nbsp;AND&amp;nbsp;Lucene&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;Java&amp;nbsp;NOT&amp;nbsp;Lucene&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;Java&amp;nbsp;OR&amp;nbsp;Lucene&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+Java&amp;nbsp;+Lucene&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+Java&amp;nbsp;-Lucene&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Analyzer&amp;nbsp;language&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;StandardAnalyzer();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&amp;nbsp;query;&lt;br /&gt;&lt;img id=&quot;_464_678_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_464_678_Open_Text').style.display='none'; document.getElementById('_464_678_Closed_Image').style.display='inline'; document.getElementById('_464_678_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_464_678_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_464_678_Closed_Text').style.display='none'; document.getElementById('_464_678_Open_Image').style.display='inline'; document.getElementById('_464_678_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchWords.length;&amp;nbsp;i&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&lt;/span&gt;&lt;span id=&quot;_464_678_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_464_678_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;QueryParser.parse(searchWords[i],&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;language);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hits&amp;nbsp;results&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexSearcher.search(query);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(results.length()&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;search&amp;nbsp;results&amp;nbsp;for&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchWords[i]);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N100BE&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;域搜索(Field Search)&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lucene 支持域搜索，你可以指定一次查询是在哪些域(Field)上进行。例如，如果索引的文档包含两个域，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;Title&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;Content&lt;/font&gt;&lt;/code&gt;，你就可以使用查询 &amp;ldquo;Title: Lucene AND Content: Java&amp;rdquo; 来返回所有在 Title 域上包含 Lucene 并且在 Content 域上包含 Java 的文档。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing2&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单 2&lt;/font&gt;&lt;/a&gt; 显示了如何利用 Lucene 的 API 来实现域搜索。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing2&quot;&gt;&lt;strong&gt;清单2：实现域搜索&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;Test&amp;nbsp;field&amp;nbsp;search&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_87_524_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_87_524_Open_Text').style.display='none'; document.getElementById('_87_524_Closed_Image').style.display='inline'; document.getElementById('_87_524_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_87_524_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_87_524_Closed_Text').style.display='none'; document.getElementById('_87_524_Open_Image').style.display='inline'; document.getElementById('_87_524_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;testFieldSearch(String&amp;nbsp;indexDirectory)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Exception&lt;/span&gt;&lt;span id=&quot;_87_524_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_87_524_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;dir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FSDirectory.getDirectory(indexDirectory,&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexSearcher&amp;nbsp;indexSearcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexSearcher(dir);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;searchWords&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;title:Lucene&amp;nbsp;AND&amp;nbsp;content:Java&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Analyzer&amp;nbsp;language&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;StandardAnalyzer();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;QueryParser.parse(searchWords,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;language);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hits&amp;nbsp;results&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexSearcher.search(query);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(results.length()&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;search&amp;nbsp;results&amp;nbsp;for&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchWords);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N100DD&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;通配符搜索(Wildcard Search)&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lucene 支持两种通配符：问号（？）和星号（*）。你可以使用问号（？）来进行单字符的通配符查询，或者利用星号（*）进行多字符的通配符查询。例如，如果你想搜索 tiny 或者 tony，你就可以使用查询语句 &amp;ldquo;t?ny&amp;rdquo;；如果你想查询 Teach, Teacher 和 Teaching，你就可以使用查询语句 &amp;ldquo;Teach*&amp;rdquo;。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing3&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单3&lt;/font&gt;&lt;/a&gt; 显示了通配符查询的过程。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing3&quot;&gt;&lt;strong&gt;清单3：进行通配符查询&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;Test&amp;nbsp;wildcard&amp;nbsp;search&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_92_547_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_92_547_Open_Text').style.display='none'; document.getElementById('_92_547_Closed_Image').style.display='inline'; document.getElementById('_92_547_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_92_547_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_92_547_Closed_Text').style.display='none'; document.getElementById('_92_547_Open_Image').style.display='inline'; document.getElementById('_92_547_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;testWildcardSearch(String&amp;nbsp;indexDirectory)&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Exception&lt;/span&gt;&lt;span id=&quot;_92_547_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_92_547_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;dir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FSDirectory.getDirectory(indexDirectory,&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexSearcher&amp;nbsp;indexSearcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexSearcher(dir);&lt;br /&gt;&lt;img id=&quot;_244_267_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_244_267_Open_Text').style.display='none'; document.getElementById('_244_267_Closed_Image').style.display='inline'; document.getElementById('_244_267_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_244_267_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_244_267_Closed_Text').style.display='none'; document.getElementById('_244_267_Open_Image').style.display='inline'; document.getElementById('_244_267_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[]&amp;nbsp;searchWords&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_244_267_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_244_267_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;tex*&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;tex?&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;?ex*&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&amp;nbsp;query;&lt;br /&gt;&lt;img id=&quot;_332_545_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_332_545_Open_Text').style.display='none'; document.getElementById('_332_545_Closed_Image').style.display='inline'; document.getElementById('_332_545_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_332_545_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_332_545_Closed_Text').style.display='none'; document.getElementById('_332_545_Open_Image').style.display='inline'; document.getElementById('_332_545_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchWords.length;&amp;nbsp;i&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&lt;/span&gt;&lt;span id=&quot;_332_545_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_332_545_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;WildcardQuery(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Term(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,searchWords[i]));&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hits&amp;nbsp;results&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexSearcher.search(query);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(results.length()&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;search&amp;nbsp;results&amp;nbsp;for&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchWords[i]);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N100F4&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;模糊查询&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lucene 提供的模糊查询基于编辑距离算法(Edit distance algorithm)。你可以在搜索词的尾部加上字符 ~ 来进行模糊查询。例如，查询语句 &amp;ldquo;think~&amp;rdquo; 返回所有包含和 think 类似的关键词的文档。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing4&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单 4&lt;/font&gt;&lt;/a&gt; 显示了如果利用 Lucene 的 API 进行模糊查询的代码。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing4&quot;&gt;&lt;strong&gt;清单4：实现模糊查询&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;Test&amp;nbsp;fuzzy&amp;nbsp;search&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_86_531_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_86_531_Open_Text').style.display='none'; document.getElementById('_86_531_Closed_Image').style.display='inline'; document.getElementById('_86_531_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_86_531_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_86_531_Closed_Text').style.display='none'; document.getElementById('_86_531_Open_Image').style.display='inline'; document.getElementById('_86_531_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;testFuzzySearch(String&amp;nbsp;indexDirectory)&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Exception&lt;/span&gt;&lt;span id=&quot;_86_531_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_86_531_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;dir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FSDirectory.getDirectory(indexDirectory,&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexSearcher&amp;nbsp;indexSearcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexSearcher(dir);&lt;br /&gt;&lt;img id=&quot;_238_254_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_238_254_Open_Text').style.display='none'; document.getElementById('_238_254_Closed_Image').style.display='inline'; document.getElementById('_238_254_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_238_254_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_238_254_Closed_Text').style.display='none'; document.getElementById('_238_254_Open_Image').style.display='inline'; document.getElementById('_238_254_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[]&amp;nbsp;searchWords&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_238_254_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_238_254_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;funny&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&amp;nbsp;query;&lt;br /&gt;&lt;img id=&quot;_319_529_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_319_529_Open_Text').style.display='none'; document.getElementById('_319_529_Closed_Image').style.display='inline'; document.getElementById('_319_529_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_319_529_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_319_529_Closed_Text').style.display='none'; document.getElementById('_319_529_Open_Image').style.display='inline'; document.getElementById('_319_529_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchWords.length;&amp;nbsp;i&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&lt;/span&gt;&lt;span id=&quot;_319_529_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_319_529_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FuzzyQuery(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Term(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,searchWords[i]));&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hits&amp;nbsp;results&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexSearcher.search(query);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(results.length()&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;search&amp;nbsp;results&amp;nbsp;for&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchWords[i]);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N1010B&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;范围搜索(Range Search)&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;范围搜索匹配某个域上的值在一定范围的文档。例如，查询 &amp;ldquo;age:[18 TO 35]&amp;rdquo; 返回所有 age 域上的值在 18 到 35 之间的文档。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing5&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单5&lt;/font&gt;&lt;/a&gt;显示了利用 Lucene 的 API 进行返回搜索的过程。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing5&quot;&gt;&lt;strong&gt;清单5：测试范围搜索&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;Test&amp;nbsp;range&amp;nbsp;search&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_86_485_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_86_485_Open_Text').style.display='none'; document.getElementById('_86_485_Closed_Image').style.display='inline'; document.getElementById('_86_485_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_86_485_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_86_485_Closed_Text').style.display='none'; document.getElementById('_86_485_Open_Image').style.display='inline'; document.getElementById('_86_485_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;testRangeSearch(String&amp;nbsp;indexDirectory)&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Exception&lt;/span&gt;&lt;span id=&quot;_86_485_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_86_485_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;dir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FSDirectory.getDirectory(indexDirectory,&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexSearcher&amp;nbsp;indexSearcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexSearcher(dir);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Term&amp;nbsp;begin&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Term(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;birthDay&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;20000101&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Term&amp;nbsp;end&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Term(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;birthDay&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;20060606&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;RangeQuery(begin,end,&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hits&amp;nbsp;results&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexSearcher.search(query);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(results.length()&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;search&amp;nbsp;results&amp;nbsp;is&amp;nbsp;returned&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N10122&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;在 Web 应用程序中集成 Lucene&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;接下来我们开发一个 Web 应用程序利用 Lucene 来检索存放在文件服务器上的 HTML 文档。在开始之前，需要准备如下环境：&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Eclipse 集成开发环境 &lt;/li&gt;
    &lt;li&gt;Tomcat 5.0 &lt;/li&gt;
    &lt;li&gt;Lucene Library &lt;/li&gt;
    &lt;li&gt;JDK 1.5 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个例子使用 Eclipse 进行 Web 应用程序的开发，最终这个 Web 应用程序跑在 Tomcat 5.0 上面。在准备好开发所必需的环境之后，我们接下来进行 Web 应用程序的开发。 &lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N1013D&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;1、创建一个动态 Web 项目&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;在 Eclipse 里面，选择 &lt;strong&gt;File &amp;gt; New &amp;gt; Project&lt;/strong&gt;，然后再弹出的窗口中选择&lt;strong&gt;动态 Web 项目&lt;/strong&gt;，如&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure2&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图二&lt;/font&gt;&lt;/a&gt;所示。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure2&quot;&gt;&lt;strong&gt;图二：创建动态Web项目&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;473&quot; alt=&quot;创建动态Web项目&quot; width=&quot;496&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure2.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
    &lt;li&gt;在创建好动态 Web 项目之后，你会看到创建好的项目的结构，如&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure3&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图三&lt;/font&gt;&lt;/a&gt;所示，项目的名称为 sample.dw.paper.lucene。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure3&quot;&gt;&lt;strong&gt;图三：动态 Web 项目的结构&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;338&quot; alt=&quot;动态 Web 项目的结构&quot; width=&quot;329&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure3.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N1017C&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;2. 设计 Web 项目的架构&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在我们的设计中，把该系统分成如下四个子系统：&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;用户接口&lt;/strong&gt;: 这个子系统提供用户界面使用户可以向 Web 应用程序服务器提交搜索请求，然后搜索结果通过用户接口来显示出来。我们用一个名为 search.jsp 的页面来实现该子系统。 &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;请求管理器&lt;/strong&gt;: 这个子系统管理从客户端发送过来的搜索请求并把搜索请求分发到搜索子系统中。最后搜索结果从搜索子系统返回并最终发送到用户接口子系统。我们使用一个 Servlet 来实现这个子系统。 &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;搜索子系统&lt;/strong&gt;: 这个子系统负责在索引文件上进行搜索并把搜索结构传递给请求管理器。我们使用 Lucene 提供的 API 来实现该子系统。 &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;索引子系统&lt;/strong&gt;: 这个子系统用来为 HTML 页面来创建索引。我们使用 Lucene 的 API 以及 Lucene 提供的一个 HTML 解析器来创建该子系统。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure4&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图4&lt;/font&gt;&lt;/a&gt; 显示了我们设计的详细信息，我们将用户接口子系统放到 webContent 目录下面。你会看到一个名为 search.jsp 的页面在这个文件夹里面。请求管理子系统在包 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;sample.dw.paper.lucene.servlet&lt;/font&gt;&lt;/code&gt; 下面，类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchController&lt;/font&gt;&lt;/code&gt; 负责功能的实现。搜索子系统放在包 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;sample.dw.paper.lucene.search&lt;/font&gt;&lt;/code&gt; 当中，它包含了两个类，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchManager&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchResultBean&lt;/font&gt;&lt;/code&gt;，第一个类用来实现搜索功能，第二个类用来描述搜索结果的结构。索引子系统放在包 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;sample.dw.paper.lucene.index&lt;/font&gt;&lt;/code&gt; 当中。类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;IndexManager&lt;/font&gt;&lt;/code&gt; 负责为 HTML 文件创建索引。该子系统利用包 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;sample.dw.paper.lucene.util&lt;/font&gt;&lt;/code&gt; 里面的类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HTMLDocParser&lt;/font&gt;&lt;/code&gt; 提供的方法 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;getTitle&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;getContent&lt;/font&gt;&lt;/code&gt; 来对 HTML 页面进行解析。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure4&quot;&gt;&lt;strong&gt;图四：项目的架构设计&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;324&quot; alt=&quot;项目的架构设计&quot; width=&quot;384&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure4.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N101DE&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;3. 子系统的实现&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在分析了系统的架构设计之后，我们接下来看系统实现的详细信息。 &lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;用户接口&lt;/strong&gt;: 这个子系统有一个名为 search.jsp 的 JSP 文件来实现，这个 JSP 页面包含两个部分。第一部分提供了一个用户接口去向 Web 应用程序服务器提交搜索请求，如&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure5&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图5&lt;/font&gt;&lt;/a&gt;所示。注意到这里的搜索请求发送到了一个名为 SearchController 的 Servlet 上面。Servlet 的名字和具体实现的类的对应关系在 web.xml 里面指定。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure5&quot;&gt;&lt;strong&gt;图5：向Web服务器提交搜索请求&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;207&quot; alt=&quot;向Web服务器提交搜索请求&quot; width=&quot;532&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure5.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;这个JSP的第二部分负责显示搜索结果给用户，如&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure6&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图6&lt;/font&gt;&lt;/a&gt;所示： &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure6&quot;&gt;&lt;strong&gt;图6：显示搜索结果&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;360&quot; alt=&quot;显示搜索结果&quot; width=&quot;572&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure6.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
    &lt;li&gt;&lt;strong&gt;请求管理器&lt;/strong&gt;: 一个名为 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchController&lt;/font&gt;&lt;/code&gt; 的 servlet 用来实现该子系统。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing6&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单６&lt;/font&gt;&lt;/a&gt;给出了这个类的源代码。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing6&quot;&gt;&lt;strong&gt;清单６：请求管理器的实现&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;sample.dw.paper.lucene.servlet;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.IOException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.util.List;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;javax.servlet.RequestDispatcher;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;javax.servlet.ServletException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;javax.servlet.http.HttpServlet;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;javax.servlet.http.HttpServletRequest;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;javax.servlet.http.HttpServletResponse;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;sample.dw.paper.lucene.search.SearchManager;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_358_467_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_358_467_Open_Text').style.display='none'; document.getElementById('_358_467_Closed_Image').style.display='inline'; document.getElementById('_358_467_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_358_467_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_358_467_Closed_Text').style.display='none'; document.getElementById('_358_467_Open_Image').style.display='inline'; document.getElementById('_358_467_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span id=&quot;_358_467_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;/**&amp;nbsp;*/&lt;/span&gt;&lt;span id=&quot;_358_467_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;*&amp;nbsp;This&amp;nbsp;servlet&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;deal&amp;nbsp;with&amp;nbsp;the&amp;nbsp;search&amp;nbsp;request&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;*&amp;nbsp;and&amp;nbsp;return&amp;nbsp;the&amp;nbsp;search&amp;nbsp;results&amp;nbsp;to&amp;nbsp;the&amp;nbsp;client&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_518_1306_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_518_1306_Open_Text').style.display='none'; document.getElementById('_518_1306_Closed_Image').style.display='inline'; document.getElementById('_518_1306_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_518_1306_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_518_1306_Closed_Text').style.display='none'; document.getElementById('_518_1306_Open_Image').style.display='inline'; document.getElementById('_518_1306_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;SearchController&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;extends&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;HttpServlet&lt;/span&gt;&lt;span id=&quot;_518_1306_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_518_1306_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;final&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;serialVersionUID&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;1L&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;doPost(HttpServletRequest&amp;nbsp;request,&amp;nbsp;HttpServletResponse&amp;nbsp;response)&lt;br /&gt;&lt;img id=&quot;_714_1123_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_714_1123_Open_Text').style.display='none'; document.getElementById('_714_1123_Closed_Image').style.display='inline'; document.getElementById('_714_1123_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_714_1123_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_714_1123_Closed_Text').style.display='none'; document.getElementById('_714_1123_Open_Image').style.display='inline'; document.getElementById('_714_1123_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IOException,&amp;nbsp;ServletException&lt;/span&gt;&lt;span id=&quot;_714_1123_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_714_1123_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;searchWord&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;request.getParameter(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;searchWord&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SearchManager&amp;nbsp;searchManager&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;SearchManager(searchWord);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;searchResult&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;searchResult&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchManager.search();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RequestDispatcher&amp;nbsp;dispatcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;request.getRequestDispatcher(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;search.jsp&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;request.setAttribute(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;searchResult&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,searchResult);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dispatcher.forward(request,&amp;nbsp;response);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;doGet(HttpServletRequest&amp;nbsp;request,&amp;nbsp;HttpServletResponse&amp;nbsp;response)&lt;br /&gt;&lt;img id=&quot;_1263_1304_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1263_1304_Open_Text').style.display='none'; document.getElementById('_1263_1304_Closed_Image').style.display='inline'; document.getElementById('_1263_1304_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1263_1304_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1263_1304_Closed_Text').style.display='none'; document.getElementById('_1263_1304_Open_Image').style.display='inline'; document.getElementById('_1263_1304_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IOException,&amp;nbsp;ServletException&lt;/span&gt;&lt;span id=&quot;_1263_1304_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1263_1304_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doPost(request,&amp;nbsp;response);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing6&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单6&lt;/font&gt;&lt;/a&gt;中，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;doPost&lt;/font&gt;&lt;/code&gt; 方法从客户端获取搜索词并创建类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchManager&lt;/font&gt;&lt;/code&gt; 的一个实例，其中类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchManager&lt;/font&gt;&lt;/code&gt; 在搜索子系统中进行了定义。然后，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchManager&lt;/font&gt;&lt;/code&gt; 的方法 search 会被调用。最后搜索结果被返回到客户端。 &lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
    &lt;li&gt;&lt;strong&gt;搜索子系统&lt;/strong&gt;: 在这个子系统中，我们定义了两个类：&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchManager&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchResultBean&lt;/font&gt;&lt;/code&gt;。第一个类用来实现搜索功能，第二个类是个JavaBean，用来描述搜索结果的结构。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing7&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单7&lt;/font&gt;&lt;/a&gt;给出了类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchManager&lt;/font&gt;&lt;/code&gt; 的源代码。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing7&quot;&gt;&lt;strong&gt;清单7：搜索功能的实现&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;sample.dw.paper.lucene.search;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.IOException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.util.ArrayList;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.util.List;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.analysis.Analyzer;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.analysis.standard.StandardAnalyzer;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.queryParser.ParseException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.queryParser.QueryParser;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.search.Hits;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.search.IndexSearcher;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.search.Query;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;sample.dw.paper.lucene.index.IndexManager;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_504_589_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_504_589_Open_Text').style.display='none'; document.getElementById('_504_589_Closed_Image').style.display='inline'; document.getElementById('_504_589_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_504_589_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_504_589_Closed_Text').style.display='none'; document.getElementById('_504_589_Open_Image').style.display='inline'; document.getElementById('_504_589_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span id=&quot;_504_589_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;/**&amp;nbsp;*/&lt;/span&gt;&lt;span id=&quot;_504_589_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;*&amp;nbsp;This&amp;nbsp;class&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;search&amp;nbsp;the&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;*&amp;nbsp;Lucene&amp;nbsp;index&amp;nbsp;and&amp;nbsp;return&amp;nbsp;search&amp;nbsp;results&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_618_2388_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_618_2388_Open_Text').style.display='none'; document.getElementById('_618_2388_Closed_Image').style.display='inline'; document.getElementById('_618_2388_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_618_2388_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_618_2388_Closed_Text').style.display='none'; document.getElementById('_618_2388_Open_Image').style.display='inline'; document.getElementById('_618_2388_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;SearchManager&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_618_2388_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_618_2388_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;searchWord;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexManager&amp;nbsp;indexManager;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Analyzer&amp;nbsp;analyzer;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img id=&quot;_781_930_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_781_930_Open_Text').style.display='none'; document.getElementById('_781_930_Closed_Image').style.display='inline'; document.getElementById('_781_930_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_781_930_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_781_930_Closed_Text').style.display='none'; document.getElementById('_781_930_Open_Image').style.display='inline'; document.getElementById('_781_930_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;SearchManager(String&amp;nbsp;searchWord)&lt;/span&gt;&lt;span id=&quot;_781_930_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_781_930_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.searchWord&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;searchWord;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.indexManager&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexManager();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.analyzer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;StandardAnalyzer();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img id=&quot;_941_968_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_941_968_Open_Text').style.display='none'; document.getElementById('_941_968_Closed_Image').style.display='inline'; document.getElementById('_941_968_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_941_968_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_941_968_Closed_Text').style.display='none'; document.getElementById('_941_968_Open_Image').style.display='inline'; document.getElementById('_941_968_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_941_968_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;/**&amp;nbsp;*/&lt;/span&gt;&lt;span id=&quot;_941_968_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;do&amp;nbsp;search&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_994_2386_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_994_2386_Open_Text').style.display='none'; document.getElementById('_994_2386_Closed_Image').style.display='inline'; document.getElementById('_994_2386_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_994_2386_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_994_2386_Closed_Text').style.display='none'; document.getElementById('_994_2386_Open_Image').style.display='inline'; document.getElementById('_994_2386_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;List&amp;nbsp;search()&lt;/span&gt;&lt;span id=&quot;_994_2386_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_994_2386_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;nbsp;searchResult&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;ArrayList();&lt;br /&gt;&lt;img id=&quot;_1089_1323_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1089_1323_Open_Text').style.display='none'; document.getElementById('_1089_1323_Closed_Image').style.display='inline'; document.getElementById('_1089_1323_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1089_1323_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1089_1323_Closed_Text').style.display='none'; document.getElementById('_1089_1323_Open_Image').style.display='inline'; document.getElementById('_1089_1323_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexManager.ifIndexExist())&lt;/span&gt;&lt;span id=&quot;_1089_1323_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1089_1323_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_1103_1217_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1103_1217_Open_Text').style.display='none'; document.getElementById('_1103_1217_Closed_Image').style.display='inline'; document.getElementById('_1103_1217_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1103_1217_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1103_1217_Closed_Text').style.display='none'; document.getElementById('_1103_1217_Open_Image').style.display='inline'; document.getElementById('_1103_1217_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1103_1217_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1103_1217_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_1156_1207_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1156_1207_Open_Text').style.display='none'; document.getElementById('_1156_1207_Closed_Image').style.display='inline'; document.getElementById('_1156_1207_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1156_1207_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1156_1207_Closed_Text').style.display='none'; document.getElementById('_1156_1207_Open_Image').style.display='inline'; document.getElementById('_1156_1207_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexManager.createIndex())&lt;/span&gt;&lt;span id=&quot;_1156_1207_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1156_1207_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchResult;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_1241_1313_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1241_1313_Open_Text').style.display='none'; document.getElementById('_1241_1313_Closed_Image').style.display='inline'; document.getElementById('_1241_1313_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1241_1313_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1241_1313_Closed_Text').style.display='none'; document.getElementById('_1241_1313_Open_Image').style.display='inline'; document.getElementById('_1241_1313_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(IOException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1241_1313_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1241_1313_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchResult;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexSearcher&amp;nbsp;indexSearcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_1387_1472_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1387_1472_Open_Text').style.display='none'; document.getElementById('_1387_1472_Closed_Image').style.display='inline'; document.getElementById('_1387_1472_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1387_1472_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1387_1472_Closed_Text').style.display='none'; document.getElementById('_1387_1472_Open_Image').style.display='inline'; document.getElementById('_1387_1472_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span id=&quot;_1387_1472_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1387_1472_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;indexSearcher&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexSearcher(indexManager.getIndexDir());&lt;br /&gt;&lt;img id=&quot;_1495_1540_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1495_1540_Open_Text').style.display='none'; document.getElementById('_1495_1540_Closed_Image').style.display='inline'; document.getElementById('_1495_1540_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1495_1540_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1495_1540_Closed_Text').style.display='none'; document.getElementById('_1495_1540_Open_Image').style.display='inline'; document.getElementById('_1495_1540_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(IOException&amp;nbsp;ioe)&lt;/span&gt;&lt;span id=&quot;_1495_1540_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1495_1540_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ioe.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueryParser&amp;nbsp;queryParser&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;QueryParser(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,analyzer);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Query&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img id=&quot;_1654_1715_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1654_1715_Open_Text').style.display='none'; document.getElementById('_1654_1715_Closed_Image').style.display='inline'; document.getElementById('_1654_1715_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1654_1715_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1654_1715_Closed_Text').style.display='none'; document.getElementById('_1654_1715_Open_Image').style.display='inline'; document.getElementById('_1654_1715_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1654_1715_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1654_1715_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;queryParser.parse(searchWord);&lt;br /&gt;&lt;img id=&quot;_1742_1783_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1742_1783_Open_Text').style.display='none'; document.getElementById('_1742_1783_Closed_Image').style.display='inline'; document.getElementById('_1742_1783_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1742_1783_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1742_1783_Closed_Text').style.display='none'; document.getElementById('_1742_1783_Open_Image').style.display='inline'; document.getElementById('_1742_1783_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(ParseException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1742_1783_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1742_1783_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_1835_2351_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1835_2351_Open_Text').style.display='none'; document.getElementById('_1835_2351_Closed_Image').style.display='inline'; document.getElementById('_1835_2351_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1835_2351_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1835_2351_Closed_Text').style.display='none'; document.getElementById('_1835_2351_Open_Image').style.display='inline'; document.getElementById('_1835_2351_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;query&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexSearcher)&lt;/span&gt;&lt;span id=&quot;_1835_2351_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1835_2351_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img id=&quot;_1856_2266_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1856_2266_Open_Text').style.display='none'; document.getElementById('_1856_2266_Closed_Image').style.display='inline'; document.getElementById('_1856_2266_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1856_2266_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1856_2266_Closed_Text').style.display='none'; document.getElementById('_1856_2266_Open_Image').style.display='inline'; document.getElementById('_1856_2266_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1856_2266_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1856_2266_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hits&amp;nbsp;hits&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;indexSearcher.search(query);&lt;br /&gt;&lt;img id=&quot;_1970_2252_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1970_2252_Open_Text').style.display='none'; document.getElementById('_1970_2252_Closed_Image').style.display='inline'; document.getElementById('_1970_2252_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1970_2252_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1970_2252_Closed_Text').style.display='none'; document.getElementById('_1970_2252_Open_Image').style.display='inline'; document.getElementById('_1970_2252_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;hits.length();&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&lt;/span&gt;&lt;span id=&quot;_1970_2252_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1970_2252_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SearchResultBean&amp;nbsp;resultBean&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;SearchResultBean();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultBean.setHtmlPath(hits.doc(i).get(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;));&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resultBean.setHtmlTitle(hits.doc(i).get(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;));&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;searchResult.add(resultBean);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_2290_2341_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2290_2341_Open_Text').style.display='none'; document.getElementById('_2290_2341_Closed_Image').style.display='inline'; document.getElementById('_2290_2341_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2290_2341_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2290_2341_Closed_Text').style.display='none'; document.getElementById('_2290_2341_Open_Image').style.display='inline'; document.getElementById('_2290_2341_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(IOException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_2290_2341_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2290_2341_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;searchResult;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;在&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing7&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单7&lt;/font&gt;&lt;/a&gt;中，注意到在这个类里面有三个私有属性。第一个是 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;searchWord&lt;/font&gt;&lt;/code&gt;，代表了来自客户端的搜索词。第二个是 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;indexManager&lt;/font&gt;&lt;/code&gt;，代表了在索引子系统中定义的类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;IndexManager&lt;/font&gt;&lt;/code&gt; 的一个实例。第三个是 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;analyzer&lt;/font&gt;&lt;/code&gt;，代表了用来解析搜索词的解析器。现在我们把注意力放在方法 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;search&lt;/font&gt;&lt;/code&gt; 上面。这个方法首先检查索引文件是否已经存在，如果已经存在，那么就在已经存在的索引上进行检索，如果不存在，那么首先调用类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;IndexManager&lt;/font&gt;&lt;/code&gt; 提供的方法来创建索引，然后在新创建的索引上进行检索。搜索结果返回后，这个方法从搜索结果中提取出需要的属性并为每个搜索结果生成类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchResultBean&lt;/font&gt;&lt;/code&gt; 的一个实例。最后这些 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchResultBean&lt;/font&gt;&lt;/code&gt; 的实例被放到一个列表里面并返回给请求管理器。&lt;/p&gt;
&lt;p&gt;在类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;SearchResultBean&lt;/font&gt;&lt;/code&gt; 中，含有两个属性，分别是 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;htmlPath&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;htmlTitle&lt;/font&gt;&lt;/code&gt;，以及这个两个属性的 get 和 set 方法。这也意味着我们的搜索结果包含两个属性：&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;htmlPath&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;htmlTitle&lt;/font&gt;&lt;/code&gt;，其中 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;htmlPath&lt;/font&gt;&lt;/code&gt; 代表了 HTML 文件的路径，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;htmlTitle&lt;/font&gt;&lt;/code&gt; 代表了 HTML 文件的标题。 &lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
    &lt;li&gt;&lt;strong&gt;索引子系统&lt;/strong&gt;: 类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;IndexManager&lt;/font&gt;&lt;/code&gt; 用来实现这个子系统。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing8&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单8&lt;/font&gt;&lt;/a&gt; 给出了这个类的源代码。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing8&quot;&gt;&lt;strong&gt;清单8：索引子系统的实现&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;sample.dw.paper.lucene.index;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.File;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.IOException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.Reader;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.analysis.Analyzer;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.analysis.standard.StandardAnalyzer;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.document.Document;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.document.Field;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.index.IndexWriter;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.store.Directory;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.store.FSDirectory;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;sample.dw.paper.lucene.util.HTMLDocParser;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_484_549_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_484_549_Open_Text').style.display='none'; document.getElementById('_484_549_Closed_Image').style.display='inline'; document.getElementById('_484_549_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_484_549_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_484_549_Closed_Text').style.display='none'; document.getElementById('_484_549_Open_Image').style.display='inline'; document.getElementById('_484_549_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span id=&quot;_484_549_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;/**&amp;nbsp;*/&lt;/span&gt;&lt;span id=&quot;_484_549_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;*&amp;nbsp;This&amp;nbsp;class&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;create&amp;nbsp;an&amp;nbsp;index&amp;nbsp;for&amp;nbsp;HTML&amp;nbsp;files&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;*&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_577_2785_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_577_2785_Open_Text').style.display='none'; document.getElementById('_577_2785_Closed_Image').style.display='inline'; document.getElementById('_577_2785_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_577_2785_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_577_2785_Closed_Text').style.display='none'; document.getElementById('_577_2785_Open_Image').style.display='inline'; document.getElementById('_577_2785_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexManager&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_577_2785_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_577_2785_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;the&amp;nbsp;directory&amp;nbsp;that&amp;nbsp;stores&amp;nbsp;HTML&amp;nbsp;files&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;final&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;dataDir&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;c:/dataDir&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;the&amp;nbsp;directory&amp;nbsp;that&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;store&amp;nbsp;a&amp;nbsp;Lucene&amp;nbsp;index&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;final&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;indexDir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;c:/indexDir&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_790_820_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_790_820_Open_Text').style.display='none'; document.getElementById('_790_820_Closed_Image').style.display='inline'; document.getElementById('_790_820_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_790_820_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_790_820_Closed_Text').style.display='none'; document.getElementById('_790_820_Open_Image').style.display='inline'; document.getElementById('_790_820_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_790_820_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;/**&amp;nbsp;*/&lt;/span&gt;&lt;span id=&quot;_790_820_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;create&amp;nbsp;index&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_873_1631_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_873_1631_Open_Text').style.display='none'; document.getElementById('_873_1631_Closed_Image').style.display='inline'; document.getElementById('_873_1631_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_873_1631_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_873_1631_Closed_Text').style.display='none'; document.getElementById('_873_1631_Open_Image').style.display='inline'; document.getElementById('_873_1631_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;boolean&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;createIndex()&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;throws&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IOException&lt;/span&gt;&lt;span id=&quot;_873_1631_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_873_1631_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_909_945_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_909_945_Open_Text').style.display='none'; document.getElementById('_909_945_Closed_Image').style.display='inline'; document.getElementById('_909_945_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_909_945_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_909_945_Closed_Text').style.display='none'; document.getElementById('_909_945_Open_Image').style.display='inline'; document.getElementById('_909_945_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;ifIndexExist())&lt;/span&gt;&lt;span id=&quot;_909_945_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_909_945_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File&amp;nbsp;dir&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;File(dataDir);&lt;br /&gt;&lt;img id=&quot;_1010_1046_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1010_1046_Open_Text').style.display='none'; document.getElementById('_1010_1046_Closed_Image').style.display='inline'; document.getElementById('_1010_1046_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1010_1046_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1010_1046_Closed_Text').style.display='none'; document.getElementById('_1010_1046_Open_Image').style.display='inline'; document.getElementById('_1010_1046_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;dir.exists())&lt;/span&gt;&lt;span id=&quot;_1010_1046_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1010_1046_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File[]&amp;nbsp;htmls&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;dir.listFiles();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Directory&amp;nbsp;fsDirectory&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FSDirectory.getDirectory(indexDir,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Analyzer&amp;nbsp;&amp;nbsp;analyzer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;StandardAnalyzer();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IndexWriter&amp;nbsp;indexWriter&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;IndexWriter(fsDirectory,&amp;nbsp;analyzer,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;);&lt;br /&gt;&lt;img id=&quot;_1343_1542_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1343_1542_Open_Text').style.display='none'; document.getElementById('_1343_1542_Closed_Image').style.display='inline'; document.getElementById('_1343_1542_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1343_1542_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1343_1542_Closed_Text').style.display='none'; document.getElementById('_1343_1542_Open_Image').style.display='inline'; document.getElementById('_1343_1542_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmls.length;&amp;nbsp;i&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&lt;/span&gt;&lt;span id=&quot;_1343_1542_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1343_1542_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;htmlPath&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmls[i].getAbsolutePath();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_1475_1532_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1475_1532_Open_Text').style.display='none'; document.getElementById('_1475_1532_Closed_Image').style.display='inline'; document.getElementById('_1475_1532_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1475_1532_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1475_1532_Closed_Text').style.display='none'; document.getElementById('_1475_1532_Open_Image').style.display='inline'; document.getElementById('_1475_1532_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(htmlPath.endsWith(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.html&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlPath.endsWith(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.htm&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;))&lt;/span&gt;&lt;span id=&quot;_1475_1532_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1475_1532_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addDocument(htmlPath,&amp;nbsp;indexWriter);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;indexWriter.optimize();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;indexWriter.close();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_1638_1692_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1638_1692_Open_Text').style.display='none'; document.getElementById('_1638_1692_Closed_Image').style.display='inline'; document.getElementById('_1638_1692_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1638_1692_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1638_1692_Closed_Text').style.display='none'; document.getElementById('_1638_1692_Open_Image').style.display='inline'; document.getElementById('_1638_1692_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1638_1692_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;/**&amp;nbsp;*/&lt;/span&gt;&lt;span id=&quot;_1638_1692_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Add&amp;nbsp;one&amp;nbsp;document&amp;nbsp;to&amp;nbsp;the&amp;nbsp;Lucene&amp;nbsp;index&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_1763_2378_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1763_2378_Open_Text').style.display='none'; document.getElementById('_1763_2378_Closed_Image').style.display='inline'; document.getElementById('_1763_2378_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1763_2378_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1763_2378_Closed_Text').style.display='none'; document.getElementById('_1763_2378_Open_Image').style.display='inline'; document.getElementById('_1763_2378_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;addDocument(String&amp;nbsp;htmlPath,&amp;nbsp;IndexWriter&amp;nbsp;indexWriter)&lt;/span&gt;&lt;span id=&quot;_1763_2378_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1763_2378_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HTMLDocParser&amp;nbsp;htmlParser&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;HTMLDocParser(htmlPath);&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;path&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlParser.getPath();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;title&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlParser.getTitle();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Reader&amp;nbsp;content&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlParser.getContent();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Document&amp;nbsp;document&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Document();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.add(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Field(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,path,Field.Store.YES,Field.Index.NO));&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.add(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Field(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,title,Field.Store.YES,Field.Index.TOKENIZED));&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.add(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Field(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;content&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;,content));&lt;br /&gt;&lt;img id=&quot;_2246_2301_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2246_2301_Open_Text').style.display='none'; document.getElementById('_2246_2301_Closed_Image').style.display='inline'; document.getElementById('_2246_2301_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2246_2301_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2246_2301_Closed_Text').style.display='none'; document.getElementById('_2246_2301_Open_Image').style.display='inline'; document.getElementById('_2246_2301_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_2246_2301_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2246_2301_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;indexWriter.addDocument(document);&lt;br /&gt;&lt;img id=&quot;_2325_2372_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2325_2372_Open_Text').style.display='none'; document.getElementById('_2325_2372_Closed_Image').style.display='inline'; document.getElementById('_2325_2372_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2325_2372_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2325_2372_Closed_Text').style.display='none'; document.getElementById('_2325_2372_Open_Image').style.display='inline'; document.getElementById('_2325_2372_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(IOException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_2325_2372_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2325_2372_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_2385_2436_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2385_2436_Open_Text').style.display='none'; document.getElementById('_2385_2436_Closed_Image').style.display='inline'; document.getElementById('_2385_2436_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2385_2436_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2385_2436_Closed_Text').style.display='none'; document.getElementById('_2385_2436_Open_Image').style.display='inline'; document.getElementById('_2385_2436_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_2385_2436_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;/**&amp;nbsp;*/&lt;/span&gt;&lt;span id=&quot;_2385_2436_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;/**&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;judge&amp;nbsp;if&amp;nbsp;the&amp;nbsp;index&amp;nbsp;exists&amp;nbsp;already&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #008000&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_2471_2644_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2471_2644_Open_Text').style.display='none'; document.getElementById('_2471_2644_Closed_Image').style.display='inline'; document.getElementById('_2471_2644_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2471_2644_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2471_2644_Closed_Text').style.display='none'; document.getElementById('_2471_2644_Open_Image').style.display='inline'; document.getElementById('_2471_2644_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;boolean&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;ifIndexExist()&lt;/span&gt;&lt;span id=&quot;_2471_2644_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2471_2644_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File&amp;nbsp;directory&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;File(indexDir);&lt;br /&gt;&lt;img id=&quot;_2562_2597_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2562_2597_Open_Text').style.display='none'; document.getElementById('_2562_2597_Closed_Image').style.display='inline'; document.getElementById('_2562_2597_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2562_2597_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2562_2597_Closed_Text').style.display='none'; document.getElementById('_2562_2597_Open_Image').style.display='inline'; document.getElementById('_2562_2597_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;directory.listFiles().length)&lt;/span&gt;&lt;span id=&quot;_2562_2597_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2562_2597_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img id=&quot;_2602_2638_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2602_2638_Open_Text').style.display='none'; document.getElementById('_2602_2638_Closed_Image').style.display='inline'; document.getElementById('_2602_2638_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2602_2638_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2602_2638_Closed_Text').style.display='none'; document.getElementById('_2602_2638_Open_Image').style.display='inline'; document.getElementById('_2602_2638_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;else&lt;/span&gt;&lt;span id=&quot;_2602_2638_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2602_2638_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_2677_2712_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2677_2712_Open_Text').style.display='none'; document.getElementById('_2677_2712_Closed_Image').style.display='inline'; document.getElementById('_2677_2712_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2677_2712_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2677_2712_Closed_Text').style.display='none'; document.getElementById('_2677_2712_Open_Image').style.display='inline'; document.getElementById('_2677_2712_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;getDataDir()&lt;/span&gt;&lt;span id=&quot;_2677_2712_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2677_2712_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.dataDir;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_2746_2782_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2746_2782_Open_Text').style.display='none'; document.getElementById('_2746_2782_Closed_Image').style.display='inline'; document.getElementById('_2746_2782_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_2746_2782_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_2746_2782_Closed_Text').style.display='none'; document.getElementById('_2746_2782_Open_Image').style.display='inline'; document.getElementById('_2746_2782_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;getIndexDir()&lt;/span&gt;&lt;span id=&quot;_2746_2782_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_2746_2782_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.indexDir;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;这个类包含两个私有属性，分别是 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;dataDir&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;indexDir&lt;/font&gt;&lt;/code&gt;。&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;dataDir&lt;/font&gt;&lt;/code&gt; 代表存放等待进行索引的 HTML 页面的路径，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;indexDir&lt;/font&gt;&lt;/code&gt; 代表了存放 Lucene 索引文件的路径。类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;IndexManager&lt;/font&gt;&lt;/code&gt; 提供了三个方法，分别是 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;createIndex&lt;/font&gt;&lt;/code&gt;, &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;addDocument&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;ifIndexExist&lt;/font&gt;&lt;/code&gt;。如果索引不存在的话，你可以使用方法 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;createIndex&lt;/font&gt;&lt;/code&gt; 去创建一个新的索引，用方法 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;addDocument&lt;/font&gt;&lt;/code&gt; 去向一个索引上添加文档。在我们的场景中，一个文档就是一个 HTML 页面。方法 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;addDocument&lt;/font&gt;&lt;/code&gt; 会调用由类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HTMLDocParser&lt;/font&gt;&lt;/code&gt; 提供的方法对 HTML 文档进行解析。你可以使用最后一个方法 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;ifIndexExist&lt;/font&gt;&lt;/code&gt; 来判断 Lucene 的索引是否已经存在。 &lt;/p&gt;
&lt;p&gt;现在我们来看一下放在包 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;sample.dw.paper.lucene.util&lt;/font&gt;&lt;/code&gt; 里面的类 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HTMLDocParser&lt;/font&gt;&lt;/code&gt;。这个类用来从 HTML 文件中提取出文本信息。这个类包含三个方法，分别是 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;getContent&lt;/font&gt;&lt;/code&gt;，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;getTitle&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;getPath&lt;/font&gt;&lt;/code&gt;。第一个方法返回去除了 HTML 标记的文本内容，第二个方法返回 HTML 文件的标题，最后一个方法返回 HTML 文件的路径。&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#Listing9&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;清单9&lt;/font&gt;&lt;/a&gt; 给出了这个类的源代码。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;Listing9&quot;&gt;&lt;strong&gt;清单9：HTML 解析器&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;
&lt;div&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;package&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;sample.dw.paper.lucene.util;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.FileInputStream;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.FileNotFoundException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.IOException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.InputStream;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.InputStreamReader;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.Reader;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;java.io.UnsupportedEncodingException;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;org.apache.lucene.demo.html.HTMLParser;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_342_1672_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_342_1672_Open_Text').style.display='none'; document.getElementById('_342_1672_Closed_Image').style.display='inline'; document.getElementById('_342_1672_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&quot; /&gt;&lt;img id=&quot;_342_1672_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_342_1672_Closed_Text').style.display='none'; document.getElementById('_342_1672_Open_Image').style.display='inline'; document.getElementById('_342_1672_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif&quot; /&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;HTMLDocParser&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_342_1672_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_342_1672_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;htmlPath;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;HTMLParser&amp;nbsp;htmlParser;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_451_517_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_451_517_Open_Text').style.display='none'; document.getElementById('_451_517_Closed_Image').style.display='inline'; document.getElementById('_451_517_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_451_517_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_451_517_Closed_Text').style.display='none'; document.getElementById('_451_517_Open_Image').style.display='inline'; document.getElementById('_451_517_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;HTMLDocParser(String&amp;nbsp;htmlPath)&lt;/span&gt;&lt;span id=&quot;_451_517_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_451_517_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.htmlPath&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlPath;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initHtmlParser();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_553_1011_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_553_1011_Open_Text').style.display='none'; document.getElementById('_553_1011_Closed_Image').style.display='inline'; document.getElementById('_553_1011_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_553_1011_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_553_1011_Closed_Text').style.display='none'; document.getElementById('_553_1011_Open_Image').style.display='inline'; document.getElementById('_553_1011_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;initHtmlParser()&lt;/span&gt;&lt;span id=&quot;_553_1011_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_553_1011_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InputStream&amp;nbsp;inputStream&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img id=&quot;_607_674_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_607_674_Open_Text').style.display='none'; document.getElementById('_607_674_Closed_Image').style.display='inline'; document.getElementById('_607_674_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_607_674_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_607_674_Closed_Text').style.display='none'; document.getElementById('_607_674_Open_Image').style.display='inline'; document.getElementById('_607_674_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_607_674_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_607_674_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inputStream&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;FileInputStream(htmlPath);&lt;br /&gt;&lt;img id=&quot;_708_751_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_708_751_Open_Text').style.display='none'; document.getElementById('_708_751_Closed_Image').style.display='inline'; document.getElementById('_708_751_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_708_751_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_708_751_Closed_Text').style.display='none'; document.getElementById('_708_751_Open_Image').style.display='inline'; document.getElementById('_708_751_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(FileNotFoundException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_708_751_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_708_751_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img id=&quot;_784_1005_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_784_1005_Open_Text').style.display='none'; document.getElementById('_784_1005_Closed_Image').style.display='inline'; document.getElementById('_784_1005_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_784_1005_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_784_1005_Closed_Text').style.display='none'; document.getElementById('_784_1005_Open_Image').style.display='inline'; document.getElementById('_784_1005_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;inputStream)&lt;/span&gt;&lt;span id=&quot;_784_1005_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_784_1005_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_799_903_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_799_903_Open_Text').style.display='none'; document.getElementById('_799_903_Closed_Image').style.display='inline'; document.getElementById('_799_903_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_799_903_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_799_903_Closed_Text').style.display='none'; document.getElementById('_799_903_Open_Image').style.display='inline'; document.getElementById('_799_903_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_799_903_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_799_903_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;htmlParser&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;HTMLParser(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;InputStreamReader(inputStream,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;utf-8&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;));&lt;br /&gt;&lt;img id=&quot;_944_995_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_944_995_Open_Text').style.display='none'; document.getElementById('_944_995_Closed_Image').style.display='inline'; document.getElementById('_944_995_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_944_995_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_944_995_Closed_Text').style.display='none'; document.getElementById('_944_995_Open_Image').style.display='inline'; document.getElementById('_944_995_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(UnsupportedEncodingException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_944_995_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_944_995_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_1042_1342_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1042_1342_Open_Text').style.display='none'; document.getElementById('_1042_1342_Closed_Image').style.display='inline'; document.getElementById('_1042_1342_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1042_1342_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1042_1342_Closed_Text').style.display='none'; document.getElementById('_1042_1342_Open_Image').style.display='inline'; document.getElementById('_1042_1342_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;getTitle()&lt;/span&gt;&lt;span id=&quot;_1042_1342_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1042_1342_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_1074_1321_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1074_1321_Open_Text').style.display='none'; document.getElementById('_1074_1321_Closed_Image').style.display='inline'; document.getElementById('_1074_1321_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1074_1321_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1074_1321_Closed_Text').style.display='none'; document.getElementById('_1074_1321_Open_Image').style.display='inline'; document.getElementById('_1074_1321_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlParser)&lt;/span&gt;&lt;span id=&quot;_1074_1321_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1074_1321_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_1092_1152_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1092_1152_Open_Text').style.display='none'; document.getElementById('_1092_1152_Closed_Image').style.display='inline'; document.getElementById('_1092_1152_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1092_1152_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1092_1152_Closed_Text').style.display='none'; document.getElementById('_1092_1152_Open_Image').style.display='inline'; document.getElementById('_1092_1152_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1092_1152_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1092_1152_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlParser.getTitle();&lt;br /&gt;&lt;img id=&quot;_1176_1227_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1176_1227_Open_Text').style.display='none'; document.getElementById('_1176_1227_Closed_Image').style.display='inline'; document.getElementById('_1176_1227_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1176_1227_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1176_1227_Closed_Text').style.display='none'; document.getElementById('_1176_1227_Open_Image').style.display='inline'; document.getElementById('_1176_1227_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(IOException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1176_1227_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1176_1227_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img id=&quot;_1260_1311_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1260_1311_Open_Text').style.display='none'; document.getElementById('_1260_1311_Closed_Image').style.display='inline'; document.getElementById('_1260_1311_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1260_1311_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1260_1311_Closed_Text').style.display='none'; document.getElementById('_1260_1311_Open_Image').style.display='inline'; document.getElementById('_1260_1311_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(InterruptedException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1260_1311_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1260_1311_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_1375_1602_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1375_1602_Open_Text').style.display='none'; document.getElementById('_1375_1602_Closed_Image').style.display='inline'; document.getElementById('_1375_1602_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1375_1602_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1375_1602_Closed_Text').style.display='none'; document.getElementById('_1375_1602_Open_Image').style.display='inline'; document.getElementById('_1375_1602_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;Reader&amp;nbsp;getContent()&lt;/span&gt;&lt;span id=&quot;_1375_1602_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1375_1602_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_1403_1575_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1403_1575_Open_Text').style.display='none'; document.getElementById('_1403_1575_Closed_Image').style.display='inline'; document.getElementById('_1403_1575_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1403_1575_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1403_1575_Closed_Text').style.display='none'; document.getElementById('_1403_1575_Open_Image').style.display='inline'; document.getElementById('_1403_1575_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlParser)&lt;/span&gt;&lt;span id=&quot;_1403_1575_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1403_1575_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img id=&quot;_1421_1486_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1421_1486_Open_Text').style.display='none'; document.getElementById('_1421_1486_Closed_Image').style.display='inline'; document.getElementById('_1421_1486_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1421_1486_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1421_1486_Closed_Text').style.display='none'; document.getElementById('_1421_1486_Open_Image').style.display='inline'; document.getElementById('_1421_1486_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1421_1486_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1421_1486_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;htmlParser.getReader();&lt;br /&gt;&lt;img id=&quot;_1510_1565_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1510_1565_Open_Text').style.display='none'; document.getElementById('_1510_1565_Closed_Image').style.display='inline'; document.getElementById('_1510_1565_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1510_1565_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1510_1565_Closed_Text').style.display='none'; document.getElementById('_1510_1565_Open_Image').style.display='inline'; document.getElementById('_1510_1565_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;(IOException&amp;nbsp;e)&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;_1510_1565_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1510_1565_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&lt;br /&gt;&lt;img id=&quot;_1632_1670_Open_Image&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1632_1670_Open_Text').style.display='none'; document.getElementById('_1632_1670_Closed_Image').style.display='inline'; document.getElementById('_1632_1670_Closed_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&quot; /&gt;&lt;img id=&quot;_1632_1670_Closed_Image&quot; style=&quot;DISPLAY: none&quot; onclick=&quot;this.style.display='none'; document.getElementById('_1632_1670_Closed_Text').style.display='none'; document.getElementById('_1632_1670_Open_Image').style.display='inline'; document.getElementById('_1632_1670_Open_Text').style.display='inline';&quot; alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;String&amp;nbsp;getPath()&lt;/span&gt;&lt;span id=&quot;_1632_1670_Closed_Text&quot; style=&quot;BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff&quot;&gt;...&lt;/span&gt;&lt;span id=&quot;_1632_1670_Open_Text&quot;&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;{&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;COLOR: #0000ff&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;.htmlPath;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img alt=&quot;&quot; align=&quot;top&quot; src=&quot;http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&quot; /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N1032A&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;5．在 Tomcat 5.0 上运行应用程序&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;现在我们可以在 Tomcat 5.0 上运行开发好的应用程序。 &lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;右键单击 &lt;strong&gt;search.jsp&lt;/strong&gt;，然后选择 &lt;strong&gt;Run as &amp;gt; Run on Server&lt;/strong&gt;，如&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure7&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图7&lt;/font&gt;&lt;/a&gt;所示。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure7&quot;&gt;&lt;strong&gt;图7：配置 Tomcat 5.0&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;434&quot; alt=&quot;配置 Tomcat 5.0&quot; width=&quot;478&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure7.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
    &lt;li&gt;在弹出的窗口中，选择 &lt;strong&gt;Tomcat v5.0 Server&lt;/strong&gt; 作为目标 Web 应用程序服务器，然后点击 &lt;strong&gt;Next&lt;/strong&gt;，如&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure8&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图8&lt;/font&gt;&lt;/a&gt; 所示： &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure8&quot;&gt;&lt;strong&gt;图8：选择 Tomcat 5.0&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;433&quot; alt=&quot;选择 Tomcat 5.0&quot; width=&quot;467&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure8.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
    &lt;li&gt;现在需要指定用来运行 Web 应用程序的 Apache Tomcat 5.0 以及 JRE 的路径。这里你所选择的 JRE 的版本必须和你用来编译 Java 文件的 JRE 的版本一致。配置好之后，点击 &lt;strong&gt;Finish&lt;/strong&gt;。如 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure9&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图9&lt;/font&gt;&lt;/a&gt; 所示。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure9&quot;&gt;&lt;strong&gt;图9：完成Tomcat 5.0的配置&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;436&quot; alt=&quot;完成Tomcat 5.0的配置&quot; width=&quot;468&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure9.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
    &lt;li&gt;配置好之后，Tomcat 会自动运行，并且会对 search.jsp 进行编译并显示给用户。如 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure10&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图10&lt;/font&gt;&lt;/a&gt; 所示。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure10&quot;&gt;&lt;strong&gt;图10：用户界面&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;403&quot; alt=&quot;用户界面&quot; width=&quot;521&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure10.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
    &lt;li&gt;在输入框中输入关键词 &amp;ldquo;information&amp;rdquo; 然后单击 &lt;strong&gt;Search&lt;/strong&gt; 按钮。然后这个页面上会显示出搜索结果来，如 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure11&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图11&lt;/font&gt;&lt;/a&gt; 所示。 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure11&quot;&gt;&lt;strong&gt;图11：搜索结果&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;416&quot; alt=&quot;搜索结果&quot; width=&quot;526&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure11.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
    &lt;li&gt;单击搜索结果的第一个链接，页面上就会显示出所链接到的页面的内容。如 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/index.html#figure12&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;图12&lt;/font&gt;&lt;/a&gt; 所示. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;figure12&quot;&gt;&lt;strong&gt;图12：详细信息&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;419&quot; alt=&quot;详细信息&quot; width=&quot;525&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/web/wa-lucene2/figure12.jpg&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;现在我们已经成功的完成了示例项目的开发，并成功的用Lucene实现了搜索和索引功能。你可以下载这个项目的源代码。 &lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N103E7&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;总结&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lucene 提供了灵活的接口使我们更加方便的设计我们的 Web 搜索应用程序。如果你想在你的应用程序中加入搜索功能，那么 Lucene 是一个很好的选择。在设计你的下一个带有搜索功能的应用程序的时候可以考虑使用 Lucene 来提供搜索功能。&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;a name=&quot;download&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;下载&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;60%&quot; summary=&quot;&quot; border=&quot;0&quot; class=&quot;data-table-1&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;th&gt;描述&lt;/th&gt;
            &lt;th&gt;名字&lt;/th&gt;
            &lt;th style=&quot;TEXT-ALIGN: right&quot;&gt;大小&lt;/th&gt;
            &lt;th&gt;下载方法&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&quot;tb-row&quot;&gt;Lucene Web 应用程序示例&lt;/td&gt;
            &lt;td nowrap=&quot;nowrap&quot;&gt;wa-lucene2_source_code.zip&lt;/td&gt;
            &lt;td style=&quot;TEXT-ALIGN: right&quot; nowrap=&quot;nowrap&quot;&gt;504KB&lt;/td&gt;
            &lt;td nowrap=&quot;nowrap&quot;&gt;&lt;a class=&quot;fbox&quot; target=&quot;_blank&quot; href=&quot;http://download.boulder.ibm.com/ibmdl/pub/software/dw/web/wa-lucene2_source_code.zip&quot;&gt;&lt;strong&gt;&lt;font face=&quot;Verdana&quot; color=&quot;#5c81a7&quot;&gt;HTTP&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2006-9-12 23:43:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1215172&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：10335 评论：5 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1215172#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Tue, 12 Sep 2006 23:43:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1215172</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1215172</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094746/1063817</fs:itemid></item><item><title>[转]用Spring JMS使异步消息变得简单</title><link>http://blog.csdn.net/baggio785/article/details/1215136</link><description>&lt;p&gt;作者:Srini;&lt;a target=&quot;_blank&quot; href=&quot;http://www.matrix.org.cn/user.shtml?username=David_w_johnson&quot;&gt;David_w_johnson&lt;/a&gt;&lt;br /&gt;原文:&lt;a target=&quot;_blank&quot; href=&quot;http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html&quot;&gt;http://www.onjava.com/pub/a/onjava/2006/02/22/asynchronous-messaging-with-spring-jms.html&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;异步处理通信是面向服务架构（SOA）的重要部分，因为企业中的许多系统通信，尤其是跟外部系统通信本来就是异步的。Java消息服务（JMS）就是用来编写异步消息J2EE应用的API。使用JMS API的传统消息实现涉及到象这样的一些步骤：查找对列连接工厂、队列资源以及在实际发送和接受消息前，创建JMS会话（JMS session）。&lt;br /&gt;&lt;br /&gt;Spring framework简化了用JEE组件（包括JMS）开发JMS应用的工作。它提供了一个模板机制来隐藏典型的JMS实现细节，所以开发者可以专注于消息处理任务而不用担心怎样创建、访问和释放JMS资源。&lt;br /&gt;&lt;br /&gt;本文用一个运行在JBoss MQ server上的简单Web应用概述了Spring JMS API和怎样使用它异步处理（发送和接受）消息。我将对比JMS实现的传统方法和Spring JMS实现方法，以显示使用Spring JMS来处理消息是多么的简单和灵活。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;异步消息和SOA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;现实世界中，大多数Web请求是同步处理的。例如，当用户登陆一个站点，他或她输入用户名和口令以及服务器识别登陆凭证。如果身份验证成功，程序让用户进入站点。这里，登陆请求从客户端被接受后，立即被处理。信用卡授权也是一个同步处理的例子；仅当服务器核实了发送进来的信用卡号是有效并且该客户的帐号有足够的信用额度后，才允许客户继续进行下一步动作。让我们来考察一下订单处理系统中的支付结算步骤。一旦系统核实了那个用户的信用卡信息是正确的，而且帐户上有足够的资金，那么不需要等到支付细节和转帐最终完成。支付结算用异步方式处理，如此客户便可以继续进行结帐处理。&lt;br /&gt;&lt;br /&gt;与典型的同步请求相比，异步处理用于需要长时间来处理的请求。异步处理的另外一个例子是住房贷款处理应用中，处理提交到AUS（Automated Underwriting System）的贷款请求。贷款人提交贷款申请后，抵押公司发送请求到AUS取得信用历史信息。因为该请求要取得综合详细的信用报告如贷款人当前和过去的信用帐户，最近的支付以及其它金融详细信息，所以从请求到获得响应常常需要很长时间。对客户端程序来说开一个到服务器的连接并且长时间等待响应是没有意义的。于是就有了异步通信；也就是，一旦请求被提交，它就被放入队列里面并且客户断开服务器连接。然后，AUS服务从特定队列摘取请求，处理它，把结果消息放入另外一个消息队列。最后客户程序从消息队列摘取响应结果继续处理信用历史结果信息。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;JMS&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;如果用过JMS的话，会发现它类似写JDBC或JCA代码。它有创建或检索JMS资源的样板代码，每当你需要编写一个新类来发送或接受消息时，都得重复编写那个样本代码。下面列出了传统JMS实现涉及的步骤：&lt;br /&gt;1、创建JNDI初始上下文context；&lt;br /&gt;2、从JNDI上下文获得队列连接工厂；&lt;br /&gt;3、从队列连接工厂取得队列Queue；&lt;br /&gt;4、创建一个Session对象；&lt;br /&gt;5、创建一个发送或接受对象；&lt;br /&gt;6、利用第5部创建的发送或接受对象发送或接受消息；&lt;br /&gt;7、处理完消息后，关闭所有JMS资源。&lt;br /&gt;&lt;br /&gt;如你所见，只有第6步是处理消息的步骤。其他步骤都只是管理JMS资源，与实际业务需求无关，但开发者不得不编写和维护那些附加步骤代码。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;Spring JMS&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Spring框架提供一个模板机制来隐藏Java API细节。JEE开发者可用JDBCTemplate 和JNDITemplate类来分别访问后端数据库和JEE资源（数据源，连接池）。JMS没有异常。Spring提供了JMSTemplate类，所以开发者不必为JMS实现编写样本代码。当开发JMS应用时，Spring提供了一下一些优势：&lt;br /&gt;1、提供了一个JMS的抽象API，简化了JMS的使用。如：访问目的地（队列或主体）和出版消息到特定目的地。&lt;br /&gt;2、JEE开发者不必关心JMS不同版本之间的差异（如JMS 1.0.2 同 JMS 1.1）；&lt;br /&gt;3、开发者不必特定地处理JMS异常，因为Spring为JMS代码抛出的任何JMS异常提供了一个unchecked异常。&lt;br /&gt;&lt;br /&gt;一旦你在JMS应用中开始使用Spring，你将会欣赏到异步消息处理的简易性。Spring JMS框架提供了各种java类使JMS开发变得简单。&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; height=&quot;726&quot; alt=&quot;image&quot; width=&quot;607&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;1&quot; src=&quot;http://www.matrix.org.cn/resource/upload/forum/2006_09_05_201903_OrVFFFTSyu.jpg&quot; /&gt;&lt;br /&gt;表1，Spring JMS类&lt;br /&gt;&lt;br /&gt;随后的部分，我将详细解释表1中的类（如JmsTemplate, DestinationResolver,和 MessageConverter）。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;JMSTemplate&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;JmsTemplate提供了几个helper方法来执行基本操作。开始使用JmsTemplate前，有必要知道JMS提供者支持哪种JMS规范。JBoss AS 4.0.2 和 WebLogic 8.1服务器支持JMS1.0.2规范。WebLogic 服务器 9.0包含JMS1.1支持。JMS1.1统一了PTP和Pub/Sub编程接口。有了这个改变，开发者可以创建一个事务会话，然后在同一个JMS事务中，从Queue（PTP）接受消息和发送一个消息到Topic（Pub/Sub）。JMS1.1向后兼容JMS1.0，因此基于JMS1.0编写的代码仍然能跟JMS1.1工作。&lt;br /&gt;&lt;br /&gt;JmsTemplate提供各种方法来接收和发送消息。表2是方法列表。&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/forum/2006_09_05_202057_elyVKDAPjp.jpg&quot; width=&quot;600&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;1&quot; /&gt;&lt;br /&gt;表2。JMS模板方法&lt;br /&gt;&lt;br /&gt;使用JNDI上下文存储和检索目的地。当配置Spring应用上下文时，我们用JndiObjectFactoryBean获得JMS目的地引用。DestinationResolver用来解析目的地名称到一个JMS目的地，当应用有许多目的地时，那是很有帮助的。DynamicDestinationResolver（缺省DestinationResolver实现）用于解析动态目的地。&lt;br /&gt;&lt;br /&gt;MessageConverter接口定义了java对象和JMS消息之间转换的契约。使用转换器，应用代码可以专注于业务对象，不用操心它是如何代表JMS消息的。SimpleMessageConverter（和SimpleMessageConverter102）是缺省MessageConverter实现。它们用于将String、字节数组（(byte[]）、Map、Serializable对象分别转换成JMS TextMessage、JMS BytesMessage，JMS MapMessage，JMS ObjectMessage。你可以编写MessageConverter接口的定制实现并结合XML绑定框架如JAXB, Castor, Commons Digester, XMLBeans, 或 XStream来转换XML文档到TextMessage。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;样本应用&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;我将用一个样本贷款应用处理系统（叫LoanProc）来说明怎样在JMS应用中使用Spring。作为贷款处理的一部分，LoanProc发送贷款详细资料（loan ID, borrower name, borrower's SSN, loan expiration date, and loan amount）从AUS系统请求信贷历史。为让例子简单一点，我们将基于两个参数：信用评分和贷款数量来获得信贷历史详细资料。让我们假定处理信用检查请求的业务规则如下：&lt;br /&gt;1、如果贷款数量等于或小于$500,000，那么贷款人必须至少有一个&amp;ldquo;good&amp;rdquo;信用（例如，贷款人的信用评分在680到699之间）；&lt;br /&gt;2、如果贷款数量超过$500,000，那么贷款人必须至少要有一个&amp;ldquo;very good&amp;rdquo;信用，这意味他/她的信用评分超过700。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;贷款应用Use Case&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;贷款请求处理Use Case由下列步骤组成：&lt;br /&gt;1、用户在贷款申请web页面输入贷款详细资料并提交贷款申请；&lt;br /&gt;2、然后程序发送贷款详细资料到AUS系统取得信用历史详细资料。用发送请求到名叫CreditRequestSendQueue的消息队列来完成。&lt;br /&gt;3、AUS系统从队列摘取贷款详细资料并用贷款参数来从数据库检索信用历史信息；&lt;br /&gt;4、然后AUS系统用找到的贷款人信用历史信息创建一个新的消息并发送到名叫CreditRequestReceiveQueue的消息队列；&lt;br /&gt;5、最后LoanProc从接收消息队列摘取响应消息并处理贷款申请，决定申请是被核准还是拒绝。&lt;br /&gt;&lt;br /&gt;应用中，在同样的JBoss MQ server中配置了两个消息队列。Use Case用序列图1表示如下：&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/forum/2006_09_05_202057_elyVKDAPjp.jpg&quot; width=&quot;600&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;1&quot; /&gt;&lt;br /&gt;图1：贷款处理应用的序列图&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;技术&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;表3列出了例子应用中用到的一些技术和开源框架&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/forum/2006_09_05_202413_gBIKWmjTZt.jpg&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;br /&gt;表3，JMS应用中用到的框架&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;使用Hermes 的JMS资源设置&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;为异步处理消息，首先，我们需要消息队列来发送和接收消息。我们在JBoss中使用xml配置文件创建消息队列并且用JMS控制台来浏览队列详细资料。清单1显示了XML配置文件JMS配置片断。（这个片断可以被添加到%JBOSS_HOME%/server/all/deploy-hasingleton/jms目录下的jbossmq-destinations-service.xml文件中。）&lt;br /&gt;&lt;br /&gt;清单1，JBoss MQ服务器中JMS队列配置&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;!--&amp;nbsp;&amp;nbsp;Credit Request Send Queue&amp;nbsp;&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;lt;mbean code=&amp;quot;org.jboss.mq.server.jmx.Queue&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;name=&amp;quot;jboss.mq.destination:service=Queue,name=CreditRequestSendQueue&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;depends optional-attribute-name=&amp;quot;DestinationManager&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jboss.mq:service=DestinationManager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/depends&amp;gt;&lt;br /&gt;&amp;lt;/mbean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--&amp;nbsp;&amp;nbsp;Credit Request Receive Queue&amp;nbsp;&amp;nbsp;--&amp;gt;&lt;br /&gt;&amp;lt;mbean code=&amp;quot;org.jboss.mq.server.jmx.Queue&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;name=&amp;quot;jboss.mq.destination:service=Queue,name=CreditRequestReceiveQueue&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;depends optional-attribute-name=&amp;quot;DestinationManager&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jboss.mq:service=DestinationManager&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/depends&amp;gt;&lt;br /&gt;&amp;lt;/mbean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;现在，让我们看看怎么使用一个叫做Hermes的JMS工具浏览消息队列。Hermes是一个Java Swing应用，它能创建、管理和监控JMS提供者中的JMS destination。这样的JMS提供者有JBossMQ, WebSphereMQ, ActiveMQ 和 Arjuna。从website下载Hermes并解压zip文件到一个本地目录(如c:/dev/tools/hermes)。一旦安装，双击hermes.bat (在bin目录)启动程序。&lt;br /&gt;&lt;br /&gt;为在Hermes中配置JBossMQ服务器，参考Hermes站点上的demo。它一步一步形象说明了JBoss MQ的配置。当配置一个新的JNDI初始上下文时，输入下面的配置信息。&lt;br /&gt;&lt;br /&gt;&amp;bull;providerURL = jnp://localhost:1099 &lt;br /&gt;&amp;bull;initialContextFactory = org.jnp.interfaces.NamingContextFactory &lt;br /&gt;&amp;bull;urlPkgPrefixes = org.jnp.interfaces:org.jboss.naming &lt;br /&gt;&amp;bull;securityCredentials = admin &lt;br /&gt;&amp;bull;securityPrincipal = admin &lt;br /&gt;&lt;br /&gt;当创建一个新destinations时，输入queue/CreditRequestSendQueue 和 queue/CreditRequestReceiveQueue。图2显示了JMS控制台主屏幕，它显示了为样本JMS应用创建的新消息。&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/forum/2006_09_05_202413_gBIKWmjTZt.jpg&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt; &lt;br /&gt;图2.Hermes中所有destinations的截屏&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;图3是消息发送者发送一些消息到CreditRequestSendQueue后，Hermes JMS控制台显示的消息队列详细资料。你能看到这里队列中有5个消息并且控制台显示了消息的详细信息如message ID、message destination、time stamp、和实际的消息。&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/forum/2006_09_05_202925_oAwpQRVjgl.jpg&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;br /&gt;图3.Hermes中队列详细资料截屏&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;使用Spring JMS，异步消息变得简单&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;用在样本应用中的这些消息队列名和其它JMS以及JNDI参数如下表4所示。&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/forum/2006_09_05_203029_PLMHufJeiy.jpg&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;br /&gt;表4,Spring JMS配置参数&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;Spring配置&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;已经有了运行样本应用所需的JMS destinations，现在该是进入用XML Spring配置文件(叫做spring-jms.xml)装配JMS组件的细节的时候了。用IOC设计模式中的setter依赖注入原理装入这些组件。让我们仔细看看组件，为每一个JMS组件显示了一个XML配置片断。&lt;br /&gt;&lt;br /&gt;JNDI上下文是获取JMS资源的入口，所以我们首先配置一个JNDI模板。清单2显示了一名为jndiTemplate的Spring bean，它具有取得JNDI初始上下文必须的常用参数。&lt;br /&gt;&lt;br /&gt;清单2，JNDI上下文模板&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;bean id=&amp;quot;jndiTemplate&amp;quot; class=&amp;quot;org.springframework.jndi.JndiTemplate&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;environment&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&amp;quot;java.naming.factory.initial&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.jnp.interfaces.NamingContextFactory&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&amp;quot;java.naming.provider.url&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;localhost&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;prop key=&amp;quot;java.naming.factory.url.pkgs&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;org.jnp.interfaces:org.jboss.naming&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;下一步，我们配置队列连接工厂。清单3显示了队列连接工厂。&lt;br /&gt;&lt;br /&gt;清单3，JMS对了连接工厂配置&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;bean id=&amp;quot;jmsQueueConnectionFactory&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jndiTemplate&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&amp;quot;jndiTemplate&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jndiName&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;UIL2ConnectionFactory&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;我们定义了两个JMS destinations来发送和接收消息。清单4和清单5显示了这些细节。&lt;br /&gt;&lt;br /&gt;清单4，发送队列配置&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;bean id=&amp;quot;sendDestination&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jndiTemplate&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&amp;quot;jndiTemplate&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jndiName&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;queue/CreditRequestSendQueue&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;清单5，接收队列配置&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;bean id=&amp;quot;receiveDestination&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class=&amp;quot;org.springframework.jndi.JndiObjectFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jndiTemplate&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&amp;quot;jndiTemplate&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jndiName&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;queue/CreditReqeustReceiveQueue&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;然后，我们配置JmsTemplate组件。我们在样本应用中使用JmsTemplate102。使用defaultDestination属性来指定JMS destination。&lt;br /&gt;&lt;br /&gt;清单6，JMS template配置&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;bean id=&amp;quot;jmsTemplate&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class=&amp;quot;org.springframework.jms.core.JmsTemplate102&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;connectionFactory&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&amp;quot;jmsQueueConnectionFactory&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;defaultDestination&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&amp;quot;destination&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;receiveTimeout&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;value&amp;gt;30000&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;最后，我们配置发送和接收者组件。清单7和清单8显示了Sender 和Receiver 对象配置。&lt;br /&gt;&lt;br /&gt;清单7，JMS Sender配置&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;Listing 7. JMS Sender configuration&lt;br /&gt;&amp;lt;bean id=&amp;quot;jmsSender&amp;quot; class=&amp;quot;springexample.client.JMSSender&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jmsTemplate&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&amp;quot;jmsTemplate&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;清单8，JMS Receiver配置&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;bean id=&amp;quot;jmsReceiver&amp;quot; class=&amp;quot;springexample.client.JMSReceiver&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;property name=&amp;quot;jmsTemplate&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ref bean=&amp;quot;jmsTemplate&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;测试和监控&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;我些了一个叫做LoanApplicationControllerTest的测试类来测试LoanProc应用。我们使用这个类来设置贷款参数和调用那个信用请求服务类。&lt;br /&gt;&lt;br /&gt;让我们看看使用传统JMS而不用Spring JMS API的消息发送者实现。清单9显示了MessageSenderJMS这个类的sendMessage方法，这个类具备使用JMS API处理消息的所有必须步骤。&lt;br /&gt;&lt;br /&gt;清单9，传统JMS实现&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;public void sendMessage() {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueName = &amp;quot;queue/CreditRequestSendQueue&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Queue name is &amp;quot; + queueName);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Create JNDI Initial Context&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hashtable env = new Hashtable();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env.put(&amp;quot;java.naming.factory.initial&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;org.jnp.interfaces.NamingContextFactory&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env.put(&amp;quot;java.naming.provider.url&amp;quot;,&amp;quot;localhost&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;env.put(&amp;quot;java.naming.factory.url.pkgs&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;org.jnp.interfaces:org.jboss.naming&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jndiContext = new InitialContext(env);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (NamingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Could not create JNDI API &amp;quot; +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;context: &amp;quot; + e.toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Get queue connection factory and queue objects from JNDI context.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueConnectionFactory = (QueueConnectionFactory)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jndiContext.lookup(&amp;quot;UIL2ConnectionFactory&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queue = (Queue) jndiContext.lookup(queueName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (NamingException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;JNDI API lookup failed: &amp;quot; +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Create connection, session, sender objects.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Send the message.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Cleanup JMS connection.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueConnection =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueConnectionFactory.createQueueConnection();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueSession = queueConnection.createQueueSession(false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueSender = queueSession.createSender(queue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message = queueSession.createTextMessage();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;message.setText(&amp;quot;This is a sample JMS message.&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Sending message: &amp;quot; + message.getText());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueSender.send(message);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (JMSException e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Exception occurred: &amp;quot; + e.toString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} finally {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (queueConnection != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queueConnection.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch (JMSException e) {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;现在，让我们看看用Spring实现的消息发送者。清单10显示了MessageSenderSpringJMS类中send方法代码。&lt;br /&gt;&lt;br /&gt;清单10，用Spring API 的JMS实现&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;public void send() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;spring-jms.xml&amp;quot;});&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Classpath loaded&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JMSSender jmsSender = (JMSSender)appContext.getBean(&amp;quot;jmsSender&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jmsSender.sendMesage();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;Message sent using Spring JMS.&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} catch(Exception e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;如你所见，所有与管理JMS资源相关的资源步骤都由Spring容器用配置文件处理。我们仅需要获取JMSSender引用并且调用它上面的sendMessage即可。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;结论&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;本文中，我们看到Spring框架如何简化了使用JMS API的异步消息应用开发的工作。Spring移走了所有JMS消息处理必须的样板代码，如获取连接工厂，从Java代码创建队列和会话对象并在运行时用配置文件装配它们。由于这个强大的IOC原理，我们可以不必修改Java代码便可动态交换JMS资源对象。&lt;br /&gt;&lt;br /&gt;因为异步消息是构成SOA框架整体所需的一部分，Spring非常适合放入SOA工具集。同样，JMS管理工具如Hermes使得创建，管理和控制JMS资源变得简单，尤其对系统管理员。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;资源&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.onjava.com/onjava/2006/02/22/examples/sample-code.zip&quot;&gt;本文样本代码&lt;/a&gt;&lt;br /&gt;Matrix:&lt;a target=&quot;_blank&quot; href=&quot;http://www.matrix.org.cn/&quot;&gt;http://www.matrix.org.cn/&lt;/a&gt;&lt;br /&gt;Spring JMS documentation &lt;br /&gt;&amp;quot;1-2-3 Messaging with Spring JMS&amp;quot; &lt;br /&gt;JBoss MQ wiki &lt;br /&gt;&lt;br /&gt;Srini Penchikala是Flagstar Bank信息系统领域问题专家。&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2006-9-12 23:35:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1215136&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：9247 评论：0 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1215136#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Tue, 12 Sep 2006 23:35:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1215136</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1215136</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094745/1063817</fs:itemid></item><item><title>[转]使Weblogic服务器的资源配置自动化</title><link>http://blog.csdn.net/baggio785/article/details/1215124</link><description>&lt;p&gt;作者:Tanmay Ambre;&lt;a target=&quot;_blank&quot; href=&quot;http://www.matrix.org.cn/user.shtml?username=leniz&quot;&gt;leniz&lt;/a&gt;&lt;br /&gt;原文:&lt;a target=&quot;_blank&quot; href=&quot;http://www.javaworld.com/javaworld/jw-10-2005/jw-1010-wlst.html&quot;&gt;http://www.javaworld.com/javaworld/jw-10-2005/jw-1010-wlst.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 20px&quot;&gt;在Weblogic服务器上使用WLST和Ant进行资源配置&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;概述&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;企业级的Java程序如果没有进行程序服务器的配置，例如链接池、数据源、JMS队列和安全等的配置，想要准确运行是不太可能的。而这些配置都是在应用程序部署之前进行正确无误地配置的。然而，在考虑程序可能部署到多环境的情况下，这些配置工作就变得复杂起来。自动而集成的资源配置提供了这种便利，尤其是出于系统维护导致系统的配置发生变化或突然出于性能的需要需将程序部署到一个新的服务器上。这篇文章阐述的就是Weblogic服务器下借助Weblogic的脚本语言和Ant实现这种资源配置自动化。&lt;br /&gt;&lt;br /&gt;每种可部署的J2EE组件，要在应用服务器运行准确无误都必须进行相应的配置。对于使用Weblogic服务器的开发人员来说，这种配置可以通过控制台来完成，也可以通过Weblogic Ant的wlconfig和wldeploy两个任务，或直接使用命令行工具weblogic deployer。Ant任务和命令行工具因为依赖于具体的环境特性，所以在Weblogic9.0下，都建议尽量减少这些工具的使用。&lt;br /&gt;&lt;br /&gt;因为开发人员与应用程序之间并没有一个统一的维护和沟通配置信息的方式，从而导致一些自定义的脚本配置和手动配置并存。自定义的脚本配置难以维护，而手动配置常常导致错误的发生，获取一个流畅的传播和释放机制对J2EE而言显得艰难无比。在应用程序需部署到多样环境的下（开发，测试和产品），这变得更加复杂，因为这些多样环境使得程序很难做到完全地独立于环境。并且，如果整个程序的维护信息本身并不规范的话，突然变动程序目标将导致过程变得冗长乏味。因此，每一个程序都必须始终如一的将配置信息保持环境独立。也正据于此，一种可以自动读取配置信息并在服务器上进行自动配置的工具，将大大地提供便利，而这种工具也将成为程序部署的一个部分。这样的一个工具在加强标准和指引中起到至关重要的作用。&lt;br /&gt;&lt;br /&gt;这篇文章提供了一个样例，在此样例中配置信息得以通过程序来维护。它同时也提供了以Ant任务的方式执行读取配置信息和在服务器部署的工具。此样例已经编译测试过，测试的环境为J2SE 1.4.2_03和Weblogic 8.1，同时也兼容Weblogic7.0，8.1和9.0。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;Weblogic服务器配置的种类&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;J2EE程序通常使用链接池，数据源，Java信息服务（JMS），储存技术（文件储存或数据链接储存），JMS服务，JMS目标（队列和主题），以及分布式JMS目标。其中部分资源的创建是处于域级的。有些时候应用程序可以共享配置信息，有些时候却不是那样。这些共享的配置信息，在应用程序反部署的时候并不允许被删除。这篇文章所述的Ant任务和配置需要非常谨慎的处理这种情况,即共享配置不能够被删除。同时，也不能覆盖掉那些已经存在的配置信息。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;资源配置和WLST&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Weblogic针对每个配置创建相应的管理Bean（MBeans），并通过java管理扩展（Java Managerment Extensions（JMX））来管理这些Mbeans。所以，每一个配置都有一个对应的MBean 被创建和部署。创建这些MBean 所必须的参数有:它的名字，类别和其它一系列属性。&lt;br /&gt;&lt;br /&gt;WLST（Wblogic Scripting Tool）是一个脚本工具，它使得用户可以访问并操作MBean，类似于在文件系统中对普通文件的操作。这是一个脚本接口，使得开发人员可以借此配置Weblogic服务器并与之交互。WLST与Weblogic 9.0相应而生，提供了在线和离线两种工作方式。当在线操作时，WLST可以以以下三种模式工作：&lt;br /&gt;+脚本模式&lt;br /&gt;+交互模式（命令行和GUI）&lt;br /&gt;+Java封装模式&lt;br /&gt;&lt;br /&gt;这篇文章重点放在Java封装模式上。这种模式因为可以在不需要开发人员了解WLST的脚本语法的情况下，用基于Java的工具（例如 Ant任务）很便捷地创建出WLST环境下的配置。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;创建和维护资源配置&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;最好的维护资源配置的方法就是使得资源配置模块化。每一个可部署的应用程序都必须维护它自身的资源配置，所以这也使得我们很容易决定哪些资源是程序必须的。应用程序的资源配置可以跟着程序架构被带到各种不同的环境中。因此，针对一个机构的J2EE多环境下的程序资源配置变得易于维护和管理。&lt;br /&gt;&lt;br /&gt;再也找不到比xml格式更适合于保存配置的了！这种格式可以通过结构化的方式来维护配置并通过模式提供有效性检测。XML文件保存着名字，类型和Weblogic服务器资源的一系列属性。你所需要注意的无非只有如下一些信息。&lt;br /&gt;+MBean的类型（比如 JDBCConnectionPool） &lt;br /&gt;+MBean中必须设置的属性&lt;br /&gt;&lt;br /&gt;类型都不会改动，而通常每个MBean必须设置的属性也无外乎那些。因此完全有可能创建一个通用的配置模板，并将它结合到一些通用的IDE开发工具中（比如 IDEA和Eclipse）。XML文件中使用的值都必须独立于环境，并且这个XML文件必须要有版本控制。在程序发放阶段也必须包含它们的自己的资源配置。&lt;br /&gt;&lt;br /&gt;参看资源部分的源码，这些源码是依据这篇文章提出的XML模式定义的，是配置文件的一个样例。现在把它称为Weblogic服务器资源配置XML。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;资源配置的配置器任务&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;一旦应用程序开始维护它的资源配置，你需要定义一个Ant的常规任务，这个任务将执行如下的操作。&lt;br /&gt;+读取Weblogic应用程序服务器的资源配置XML文件&lt;br /&gt;+可以读取环境变量和其它一些来自或文件或URL或资源的默认的属性&lt;br /&gt;+在给定的目标服务器上运行配置文件&lt;br /&gt;+配置文件部署失败将触发程序的部署失败&lt;br /&gt;&lt;br /&gt;这些配置任务可以通过任何一个开源的XML绑定框架(Castor, XMLBeans,或Java Architecture for XML Binding)来解析XML文件。在例子中，我使用的是XMLBeans.接下来任务必须产生一个WLST兼容的脚本，并触发它。为了在线运行这个脚本，我们必须连接到管理服务器，并在这个服务器上触发配置。下列的是配置任务的输入参数。&lt;br /&gt;+url：&amp;nbsp;&amp;nbsp;管理服务器的URL&lt;br /&gt;+username：管理服务器的用户名&lt;br /&gt;+password：管理服务器的密码&lt;br /&gt;+configfile: 配置文件路径&lt;br /&gt;+action: 动作(创建，删除，部署，反部署)&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;配置任务首先解析配置文件。接着连接到一个域管理服务器.依据输入参数,按照XML文档给定的参数将产生一个WLST脚本,并以嵌入的模式执行此脚本.在完成所有配置的部署之后,这个task将优雅从容的断开与管理服务器的链接&lt;br /&gt;&lt;br /&gt;生成的WLST脚本将首先检测bean是否存在,如果存在的话,将不创建配置.配置器任务也同时检查依赖性.(比如数据源是依赖于数据链接池的).在删除阶段,也将进行依赖性检测已确定删除万无一失.&lt;br /&gt;&lt;br /&gt;参看资源部分的配置器源代码样例.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;Ant 任务示例&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Ant任务名称为com.tanmayambre.wls.tools.anttaskdefs.&lt;br /&gt;WLSTConfigurator.它拥有如下的输入参数.&lt;br /&gt;+url: 管理服务器 的URL &lt;br /&gt;+username: 管理服务器 的的用户名 &lt;br /&gt;+password: 用户密码&lt;br /&gt;+configFile: 配置文件路径 &lt;br /&gt;+propertiesFile: 包含环境变量的属性文件 &lt;br /&gt;+action: 创建,删除,部署,反部署,重部署&lt;br /&gt;&lt;br /&gt;部署与反部署动作都将内在地先触发创建动作去创建一份配置.属性可以是环境变量&lt;br /&gt;示例:&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;&amp;lt;target name=&amp;quot;create-configuration&amp;quot; depends=&amp;quot;init-demo&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;echo message=&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Creating the Configuration&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;wlsconfig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username=&amp;quot;${weblogic.user}&amp;quot; password=&amp;quot;${weblogic.passwd}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url=&amp;quot;${weblogic.url}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configFile=&amp;quot;${basedir}/samples/wlsconfig/example.xml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;propertiesFile=&amp;quot;${basedir}/samples/wlsconfig/environment.properties&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action=&amp;quot;create&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name=&amp;quot;delete-configuration&amp;quot; depends=&amp;quot;init-demo&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;echo message=&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Deleting the Configuration&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;wlsconfig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username=&amp;quot;${weblogic.user}&amp;quot; password=&amp;quot;${weblogic.passwd}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url=&amp;quot;${weblogic.url}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configFile=&amp;quot;${basedir}/samples/wlsconfig/example.xml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;propertiesFile=&amp;quot;${basedir}/samples/wlsconfig/environment.properties&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action=&amp;quot;delete&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name=&amp;quot;deploy-application&amp;quot; depends=&amp;quot;init-demo&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;echo message=&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Deploying the application&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;wlsconfig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username=&amp;quot;${weblogic.user}&amp;quot; password=&amp;quot;${weblogic.passwd}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url=&amp;quot;${weblogic.url}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configFile=&amp;quot;${basedir}/samples/wlsconfig/example.xml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;propertiesFile=&amp;quot;${basedir}/samples/wlsconfig/environment.properties&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action=&amp;quot;deploy&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name=&amp;quot;undeploy-application&amp;quot; depends=&amp;quot;init-demo&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;echo message=&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; UNDeploying the application&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;wlsconfig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username=&amp;quot;${weblogic.user}&amp;quot; password=&amp;quot;${weblogic.passwd}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url=&amp;quot;${weblogic.url}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configFile=&amp;quot;${basedir}/samples/wlsconfig/example.xml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;propertiesFile=&amp;quot;${basedir}/samples/wlsconfig/environment.properties&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action=&amp;quot;undeploy&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name=&amp;quot;redeploy-application&amp;quot; depends=&amp;quot;init-demo&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;echo message=&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; Redeploying the application&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;wlsconfig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;username=&amp;quot;${weblogic.user}&amp;quot; password=&amp;quot;${weblogic.passwd}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url=&amp;quot;${weblogic.url}&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;configFile=&amp;quot;${basedir}/samples/wlsconfig/example.xml&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;propertiesFile=&amp;quot;${basedir}/samples/wlsconfig/environment.properties&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action=&amp;quot;redeploy&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;实现环境独立性&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;某些运行期的配置会因为运行环境的不同而有所不同.比如链接数据库服务器的用户ID和用户密码在测试阶段和实际运行阶段可能不一样.对开发者而言,针对每种环境都要编写一个配置文件将是一个冗长乏味的工作.他们要考虑各种各样的环境下的配置可能.&lt;br /&gt;所以不太可能这样做,一个更为有效的方法将抽象出配置文件中的信息,并将这些信息作为一个独立的属性文件(或作为环境变量).此文件将由系统管理员进行维护,而开发者所要做的无非只是从这些属性文件中提取属性值&lt;br /&gt;配置器使用一个属性读取器(com.tanmayambre.wls.tools.utils.&lt;br /&gt;PropertiesReader)读取不同环境的属性值,那些属性值将依照如下的顺序依次读取.后面读取的属性将覆盖之前读取的同名的属性.&lt;br /&gt;+系统属性(System properties) &lt;br /&gt;+环境变量(Environment variables) &lt;br /&gt;+来自文件的属性(Properties from a file&lt;br /&gt;&lt;br /&gt;环境变量可以声明为常用变量,比如环境名称或域名称.属性文件包含默认的值,比如,用户ID,用户密码,最大容量,最小容量.此文件关联着环境,所以单独的属性文件将对照不同的环境进行维护.&lt;br /&gt;&lt;br /&gt;资源配置的XML文件不允许使用任何特殊环境下的变量,而必须使用那些声明为系统的或环境的变量,或特定环境下属性文件的某属性值.&lt;br /&gt;&lt;br /&gt;这种解决方案的好处在于,无论开发者或是程序的编译者只需一次配置好所有环境下的配置.示例代码包含了一个这样的属性读取器,这个读取器可以读取环境相关变量.配置器使用这个属性读取器替换资源配置XML中的环境变量.此解决方法类似于Maven读取环境变量所使用的方法.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;资源命名约定&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;因为我们要使创建的配置文件具有环境独立性，所以必须制定相应的命名规则来规范程序员和应用程序开发者对资源的命名.这也使得在跨平台使用时有统一的标准,有助于有效的维护系统.命名规格必须加于公布,文档化,并由开发者和部署人员达成共识.下列有几条关于命名规范的的指导:&lt;br /&gt;+域级资源,比如数据链接池,JMS存储库等, 因为部署于跨服务器实例,所以不应该使用依赖特定服务器的变量.&lt;br /&gt;+在命名时使用匈牙利字符命名方式&lt;br /&gt;+根据应用程序命名的资源做为特定应用资源。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;处理过程&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;下列步骤,概要的说明了开发和维护配置的过程.&lt;br /&gt;1.针对每个环境,创建一个包含环境特性的属性文件(一次性).&lt;br /&gt;2.发布资源命名约定的规范方针&lt;br /&gt;3.将创建Weblogic服务器资源配置文件, 这是程序开发的一部份&lt;br /&gt;4.在builder.xml中, 将创建和删除配置以及布署和反布署程序与ant任务相结合, 确保布署相关的任务依赖于资源配置任务。&lt;br /&gt;5.在版本控制系统里, 检查Weblogic服务器配置和build.xml。&lt;br /&gt;6.告知应用程序开发者, 环境变量已经可用.&lt;br /&gt;7.在发布阶段,先发布Weblogic服务器资源配置.&lt;br /&gt;8.使用ant的任务来完成部署工作.配置器任务能够创建资源配置,同时也能不熟应用程序.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;优点&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;所建议的解决方案可以自动化以及维护Weblogic服务器配置.这些步骤具有如下的优势:&lt;br /&gt;+对每个应用程序,模块化Weblogic服务器配置.部署应用程序变得异常简单.&lt;br /&gt;+一种结构化的维护配置的方法. &lt;br /&gt;+Weblogic9.0 使得WLST官方化&lt;br /&gt;+创建配置文件只需要很少的工作量&lt;br /&gt;+因为工具使用的是Ant的任务的方式,所以可以很方便地将此工具集成到Maven.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;结论&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;这篇文章中,你已经看到如何将Weblogic服务器资源集成到应用程序中.完成这些工作借助于资源配置的XML文件，以及使用配置器任务按照必要的资源配置去布署。同时我们也看到了,如何使得我们的资源配置文件独立与环境.这些方法有助于机构完全自动化J2EE应用程序的部署和反部署工作,同时缩小错误出现的范围.如果对资源配置的XML文件加上版本控制的话,将更有利于对程序资源变动的追踪.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;关于作者&lt;/strong&gt;&lt;br /&gt;Tanmay Amber就职于印度孟买的Infosys 技术公司.涉及领域包括Java/J2EE技术,并有四年从事Weblogic相关产品工作的经验.Amber同时专长于Java/J2EE平台的工具使用(特别是开源项目).&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2006-9-12 23:32:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1215124&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：8663 评论：1 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1215124#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Tue, 12 Sep 2006 23:32:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1215124</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1215124</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094744/1063817</fs:itemid></item><item><title>[转]在Eclipse3.0中配置SQLExplorer访问数据库</title><link>http://blog.csdn.net/baggio785/article/details/1175433</link><description>&lt;p&gt;作者： Deepak Vohra&lt;/p&gt;
&lt;p&gt;SQLExplorer是Eclipse集成开发环境的一种插件，它可以被用来从Eclipse连接到一个数据库。SQLExplorer插件提供了一个使用SQL语句访问数据库的图形用户接口（GUI）。通过使用SQLExplorer，你能够显示表格、表格结构和表格中的数据，以及提取、添加、更新或删除表格数据。SQLExplorer同样能够生成SQL脚本来创建和查询表格。所以，与命令行客户端相比，使用SQLExplorer可能是更优越的选择。在这篇指南中，我们将使用SQLExplorer插件建立一个从Eclipse3.0到开源数据库MySQL的JDBC连接。&lt;br /&gt;&lt;br /&gt;这篇指南有如下章节：&lt;br /&gt;&lt;br /&gt;1.概览&lt;br /&gt;2.预备安装&lt;br /&gt;3.配置 SQLExplorer&lt;br /&gt;4.访问数据库数据&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;概&amp;nbsp;&amp;nbsp; 览&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;通过在集成开发环境中加入一个SQLExplorer视窗，SQLExplorer插件为Eclipse配置了一个访问数据库的SQL客户端。&lt;br /&gt;&lt;br /&gt;为了演示SQLExplorer插件的使用，我们将在开源数据库MySQL中创建一个示例表，并且建立一个从Eclipse到MySQL数据库的JDBC连接。接着，我们将在SQLExplorer的图形SQL客户端中提取和显示示例数据。同样，我们也将通过更新和删除示例表中的数据来演示SQLExplorer插件的不同特点。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;预 备 安 装&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1. 下载并安装 &lt;a href=&quot;http://www.eclipse.org/&quot; target=&quot;_new&quot;&gt;Eclipse 3.02&lt;/a&gt;&lt;br /&gt;2. 下载&lt;a href=&quot;https://sqlexplorer.dev.java.net/&quot; target=&quot;_new&quot;&gt;SQLExplorer&lt;/a&gt;文件 net.sourceforge.sqlexplorer_2.2.3.zip.&lt;br /&gt;3. 解压 SQLExplorer .zip 文件到 &amp;lt;Eclipse&amp;gt;/eclipse 目录。 &amp;lt;Eclipse&amp;gt; 是Eclipse安装的目录。 这将把SQLExplorer插件的 features 和 plugins 目录添加到Eclipse中的 features 和 plugins 目录。（译者注：这里说得不是十分清楚，其实是先将SQLExplorer .zip文件解压，然后分别把features 和 plugins 目录中的所有文件拷贝到Eclipse中对应的features 和 plugins 目录中，这是安装Eclipse插件的常用方法，当然也可以使用link方式安装插件，请参阅网上相应文档）&lt;br /&gt;4. 重启Eclipse.&lt;br /&gt;5. 安装&lt;a href=&quot;http://www.mysql.com/&quot; target=&quot;_new&quot;&gt;MySQL&lt;/a&gt;数据库。&lt;br /&gt;6. 下载&lt;a href=&quot;http://www.mysql.com/products/connector/j/&quot; target=&quot;_new&quot;&gt;Connector/J&lt;/a&gt;，通过使用包含在其中的一个 .jar文件中的JDBC驱动来连接MySQL数据库。&lt;br /&gt;7. 作为一个root用户登陆到MySQL数据库，命令如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;COLOR: blue&quot;&gt;&amp;gt;mysql -u root&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; root用户没有设定密码。需要通过密码登陆到数据库时，指定如下命令：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;COLOR: blue&quot;&gt;&amp;gt;mysql -u root -p&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;8. 使用如下命令连接到test数据库，这是一个示例数据库实例：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;COLOR: blue&quot;&gt;&amp;gt;use test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;9. 在test数据库中创建一个示例表。示例表 Catalog 由ONJava上的文章名称组成。用来创建示例表的SQL脚本列在下面：&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;pre class=&quot;overflow&quot;&gt;CREATE TABLE Catalog(CatalogId INTEGER, Journal VARCHAR(25),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Publisher Varchar(25), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Date VARCHAR(25), Title Varchar(45), Author Varchar(25));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; INSERT INTO Catalog VALUES('1', 'onjava',&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'OReilly', 'April 2005', 'Five Favorite Features from 5.0', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'David Flanagan');&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; INSERT INTO Catalog VALUES('2', 'onjava',&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'OReilly', 'Feb 2005', 'Introducing JBoss Remoting', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'John Mazzitelli');&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; INSERT INTO Catalog VALUES('3', 'onjava',&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'OReilly', 'March 2005', 'Aspect-Oriented Annotations', &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Bill Burke');&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;配置 SQLExplorer&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;安装了SQLExplorer插件后，我们将要在Eclipse 3.02中配置SQLExplorer.首先，在Eclipse中打开SQLExplorer视窗。在Eclipse 集成开发环境中单击 &amp;ldquo;Open a perspective&amp;rdquo;按扭来打开一个视窗。图1说明了&amp;ldquo;Open a perspective&amp;rdquo;按扭。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_225343_bBPFZMUdSH.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 1. 打开视窗&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;在条目列表中，选择&amp;ldquo;Other...&amp;rdquo;来显示SQLExplorer插件，如图2所示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_225521_EzmCVualXK.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 2. &amp;ldquo; other&amp;hellip; &amp;rdquo;菜单项&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;在 Select Perspective框中，选择SQLExplorer视窗，如图3所示。通过选择SQLExplorer视窗，SQLExplorer插件的功能部件在Eclipse中变得可用。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_225705_IklAlPSQNA.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 3. SQLExplorer 视窗&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Drivers 标签显示了不同的数据库驱动，它们被用来连接不同的数据库。现在可用的数据库包括DB2, MySQL, Oracle, Sybase, HSQLDB, SQLServer 和 PostgreSQL。针对MySQL，我们需要配置SQLExplorer。为了配置MySQL驱动，右击 MMMySQL Driver 结点， 并且选择 Change the Selected Driver, 如图4所示。&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_225751_GpUQMFOOcK.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 4. 修改驱动&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;在 Modify Driver框中，选择 Extra Class Path 标签，并且单击 Add 按扭将 MySQL 驱动 .jar 文件（为下载的 Connector/J 的一部分）添加到类路径中。图5阐明了将MySQL 的 JDBC 驱动加到 Eclipse 的类路径中。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230105_qfdstgvJpq.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 5. 设置驱动&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;添加 MySQL Connector/J 驱动 .jar 文件，mysql-connector-java-3.0.16-ga-bin.jar，到类路径中。在 Example URL 域中， 指定连接到数据库的 URL。一个连接到 test 数据库的JDBC连接将被创建，test数据库已经在MySQL安装的时候预先创建了。连接到 test 数据库的 URL 为 jdbc:mysql://localhost/test。在 Driver Class Name 域中，指定MySQL JDBC 驱动为 com.mysql.jdbc.Driver。MMMySQL 驱动按如图6所示的设置配置。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230212_zgkkDxANRd.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 6. 设定 MySQL JDBC 设置&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;想要连接到 MySQL 数据库并提取其中的表格，我们需要为连接建立一个别名。一个连接的别名说明了连接设置，JDBC 驱动，URL，用户名和密码。在SQLExplorer视窗中选择 Aliases 标签。单击 &amp;ldquo;Create new Alias&amp;rdquo; 按扭来创建一个新的别名，如图7所示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230254_MSaUrfJVgP.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 7. 创建一个新的别名&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;在&amp;ldquo;Create new Alias&amp;quot;框中，指定一个别名。选择MMMySQL Driver 来为MySQL数据库创建一个别名。在 URL 域中指定 test 数据库的连接 URL, jdbc:mysql://localhost/test。图8展示了MySQL 别名的设置。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230323_gYSqOUPKzI.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 8. 创建一个新的别名&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上操作将一个MySQL的别名加入到 Aliases 标签中，正如图9所示。想要修改一个别名，右击别名结点并选择 &amp;ldquo;Change the selected Alias.&amp;rdquo;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230354_SgseoemzdT.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 9. MySQL 别名&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;MySQL 别名用来连接到 MySQL 数据库并且从中提取数据。要想打开数据库连接，右击 MySQL 别名结点并选择 Open，如图10所示。&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230449_WzgrudgdpN.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 10. 打开别名&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;在 Connection 框中，指定登陆到 MySQL 数据库使用的用户名和密码，然后单击 OK 按扭。图11展示了登陆的设置。缺省情况下，对于 root 用户不需要密码。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230528_gcVOHZxPux.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 11. 打开连接&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;一个与 MySQL 数据库的 JDBC 连接就这样建立了。一旦连接上了，Eclipse 就会显示 MySQL 数据库中的不同的数据库模式，如图12所示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230630_qWLVuLGUoc.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 12. 列出数据库模式&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 14px&quot;&gt;对其他数据库的支持&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;这个 JDBC 连接的例子是关于配置与 MySQL 数据库连接的。通过在 Drivers 标签中为数据库选择合适的驱动，可以配置与其他数据库的 JDBC 连接。只需为选定的数据库指定驱动类和连接URL，就可以配置与该数据库的 JDBC 连接。以下列出的是其他数据库的驱动类、连接URL和驱动 .jar 文件。&lt;br /&gt;&lt;br /&gt;DB2 &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver Class: COM.ibm.db2.jdbc.app.DB2Driver &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection URL: jdbc:db2:&amp;lt;database&amp;gt; &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver .jar/.zip: db2java.zip&lt;br /&gt;&lt;br /&gt;Sybase &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver Class: com.sybase.jdbc2.jdbc.SybDriver &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection URL: jdbc:sybase:Tds:&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;database&amp;gt; &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver .jar/.zip: jconn2.jar&lt;br /&gt;&lt;br /&gt;Oracle &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver Class: oracle.jdbc.driver.OracleDriver &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection URL: jdbc:oracle:thin:@ &amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;:&amp;lt;sid&amp;gt; &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver .jar/.zip: classes12.zip&lt;br /&gt;&lt;br /&gt;SQLServer &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver Class: com.microsoft.jdbc.sqlserver.SQLServerDriver &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection URL: jdbc:microsoft:sqlserver://localhost:1433 &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver .jar/.zip: mssqlserver.jar, msbase.jar, msutil.jar&lt;br /&gt;&lt;br /&gt;PostgreSQL &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver Class: org.postgresql.Driver &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection URL: jdbc:postgresql://&amp;lt;server&amp;gt;:&amp;lt;port&amp;gt;/&amp;lt;database&amp;gt; &lt;br /&gt;o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Driver .jar/.zip: postgresql.jar&lt;br /&gt;&lt;br /&gt;在如上列表中，&amp;lt;database&amp;gt; 是指数据库实例，&amp;lt;port&amp;gt; 是数据库连接端口，&amp;lt;sid&amp;gt; 是数据库的SID，&amp;lt;server&amp;gt; 是数据库服务器。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;访问数据库数据&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;在上一节中我们在 Eclipse 中配置了 SQLExplorer 插件。下面，我们将从示例表 Catalog 中提取并修改数据。如果是从一个命令行 SQL 客户端访问数据库，则使用如下命令来提取数据（在一行中）：&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;COLOR: blue&quot;&gt;SQL&amp;gt;SELECT catalogId, journal, publisher, date,&lt;br /&gt;title, author from Catalog;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这将以文本表的形式显示数据。使用图形 SQL 客户端 SQLExplorer,数据将以结构表的形式显示。SQLExplorer 同样也会生成创建表和从中提取数据的 SQL 脚本。如果使用 DESC 命令在一个命令行客户端中显示表格的结构，只有列名，列数据的类型，列数据的长度大小以及非空的值会被显示。有了 SQLExplorer, 索引、主键和外键值都会被显示。&lt;br /&gt;&lt;br /&gt;在 Eclipse 的 SQLExplorer 视窗中选择 Database Structure View 标签。为了显示表 Catalog 的结构，在 Database Structure View 中选择 Database&amp;gt;test&amp;gt;TABLE&amp;gt;Catalog 结点。图13显示了表 Catalog 的结构。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230848_sUYCgNfAGR.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 13. Database Structure View&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Columns 标签显示了下表中列出的列：&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_233019_mKXTqFqzic.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;为了显示选中的表格中的数据，请选择 Preview 标签。图14显示了表 Catalog 中的数据。关于表格的其他的信息分别在 Indexes, Primary Key, Foreign Key 和 Row Count 标签中显示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; height=&quot;450&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231157_hMNHvYKlAW.gif&quot; width=&quot;484&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;1&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 14. 显示表格数据&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;若想得到创建表格的 SQL 脚本，右击表结点并且选择 Create Table Script,如图15所示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231226_fdGYxlGUTs.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 15. 生成建表脚本&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;如图16所示，这将生成创建被选表格的 SQL 脚本， 并将其显示在 SQLExplorer 视窗中的 SQL Editor 中。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231327_yjgaQDNFMB.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 16. 建表脚本&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Database Structure View 的 Preview 标签中的数据是使用缺省的 Select 查询提取的，它包括了表格中所有的列。要想显示缺省的 Select 查询语句，右击表结点并且选择 &amp;ldquo;Generate Select in Sql Editor&amp;rdquo;，如图17所示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231423_olemCtxtRk.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 17. 生成缺省 select 查询语句&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;如图18所示，SQL Editor 中显示了从表 Catalog 中提取数据的缺省查询语句。注意：显示在 SQL Editor 中的 SELECT 查询语句的结尾没有分号（；）。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; height=&quot;450&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231502_AYdCXusCXz.gif&quot; width=&quot;382&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;1&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 18. Select 查询语句&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;查询语句可能被定制为只显示表格中的几列数据。比如，修改 Select 语句使其显示除了 CatalogId 列的其他所有列。选择 Execute SQL 按扭来运行 SQL 脚本。由修改后的 select 语句得到的数据显示在 SQL Results 框中，如图19所示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; height=&quot;450&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231703_suAZvTQclg.gif&quot; width=&quot;382&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;1&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 19. 使用定制的 SELECT 查询语句提取表中数据&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;接下来，SQL Editor 中的一条 SQL 脚本将会更新表 Catalog。例如，把标题&amp;ldquo;Five Favorite Features from 5.0&amp;rdquo;修改为&amp;ldquo;New Features in JDK 5.0&amp;rdquo;。如图20所示，在 SQL Editor 中运行更新表 Catalog 的脚本&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231725_uUNsVvlcpW.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 20. 更新 SQL 脚本&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;表格中数据被更新了。在修改后的表格上运行缺省的 select 查询，修改后的数据将被显示在 SQL Results 框中。图21显示了表 Catalog 修改后的数据。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231754_kZeLYRrMFy.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 21. 修改表格数据&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;接着，使用 DELETE SQL语句从表中删除一行数据，如图22所示。CatalogId='3'的行将从表中删除。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231838_DHGCPWAFbE.gif&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 22. DELETE SQL 脚本&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;运行缺省的 select 查询语句来显示修改后的表中的数据。SQL Results 框中的表格不再包括被删除的行了，如图23所示。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; height=&quot;450&quot; alt=&quot;image&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_231903_IbYFNsTify.gif&quot; width=&quot;383&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;1&quot; /&gt;&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;center&gt;图 23. 删除了一行后的表格数据&lt;/center&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;通过在 Eclipse 中配置 SQLExplorer 插件，该集成开发环境获得了图形用户界面（GUI）较之命令行客户端的许多优点。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 16px&quot;&gt;总&amp;nbsp;&amp;nbsp; 结&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;例子中，我们与 MySQL 数据库建立了一个 JDBC 连接，并访问其中的一个示例数据库。SQL Explorer 同样可以被用来配置与其他数据库的连接，包括 DB2, Sybase, Oracle, HSQLDB, SQL Server 和 PostgreSQL。&amp;nbsp;&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2006-9-4 13:29:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1175433&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：11868 评论：1 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1175433#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Mon, 04 Sep 2006 13:29:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1175433</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1175433</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094743/1063817</fs:itemid></item><item><title>[转]Eclipse SQL Explorer 3 发布</title><link>http://blog.csdn.net/baggio785/article/details/1175426</link><description>Eclipse SQL Explorer 3 发布了.&lt;br /&gt;&lt;br /&gt;SQLExplorer是Eclipse集成开发环境的一种插件，它可以被用来从Eclipse连接到一个数据库。&lt;br /&gt;&lt;br /&gt;SQLExplorer插件提供了一个使用SQL语句访问数据库的图形用户接口（GUI）。通过使用SQLExplorer，你能够显示表格、表格结构和表格中的数据，以及提取、添加、更新或删除表格数据。&lt;br /&gt;&lt;br /&gt;SQLExplorer同样能够生成SQL脚本来创建和查询表格。所以，与命令行客户端相比，使用SQLExplorer可能是更优越的选择.&lt;br /&gt;&lt;br /&gt;新版本有一系列提升.&lt;br /&gt;&lt;br /&gt;&lt;img style=&quot;DISPLAY: inline&quot; onclick=&quot;javascript:imgClick(this);&quot; alt=&quot;image&quot; onload=&quot;javascript:imgLoad(this);&quot; border=&quot;0&quot; resized=&quot;0&quot; src=&quot;http://www.matrix.org.cn/resource/upload/content/2005_08_21_230848_sUYCgNfAGR.gif&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://blog.csdn.net/baggio785/archive/2006/09/04/1175433.aspx&quot;&gt;在Eclipse3.0中配置SQLExplorer访问数据库&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;官方站点:&lt;br /&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://eclipsesql.sourceforge.net/index.html&quot;&gt;http://eclipsesql.sourceforge.net/index.html&lt;/a&gt;&amp;nbsp;
            &lt;div&gt;
                作者：baggio785 发表于2006-9-4 13:27:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1175426&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：8821 评论：0 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1175426#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Mon, 04 Sep 2006 13:27:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1175426</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1175426</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094742/1063817</fs:itemid></item><item><title>[转]Java多线程程序设计详细解析</title><link>http://blog.csdn.net/baggio785/article/details/1155150</link><description>一、理解多线程&lt;br /&gt;&lt;br /&gt;　　多线程是这样一种机制，它允许在程序中并发执行多个指令流，每个指令流都称为一个线程，彼此间互相独立。&lt;br /&gt;&lt;br /&gt;　　线程又称为轻量级进程，它和进程一样拥有独立的执行控制，由操作系统负责调度，区别在于线程没有独立的存储空间，而是和所属进程中的其它线程共享一个存储空间，这使得线程间的通信远较进程简单。&lt;br /&gt;&lt;br /&gt;　　多个线程的执行是并发的，也就是在逻辑上&amp;ldquo;同时&amp;rdquo;，而不管是否是物理上的&amp;ldquo;同时&amp;rdquo;。如果系统只有一个CPU，那么真正的&amp;ldquo;同时&amp;rdquo;是不可能的，但是由于CPU的速度非常快，用户感觉不到其中的区别，因此我们也不用关心它，只需要设想各个线程是同时执行即可。&lt;br /&gt;&lt;br /&gt;　　多线程和传统的单线程在程序设计上最大的区别在于，由于各个线程的控制流彼此独立，使得各个线程之间的代码是乱序执行的，由此带来的线程调度，同步等问题，将在以后探讨。&lt;br /&gt;&lt;br /&gt;　　二、在Java中实现多线程&lt;br /&gt;&lt;br /&gt;　　我们不妨设想，为了创建一个新的线程，我们需要做些什么？很显然，我们必须指明这个线程所要执行的代码，而这就是在Java中实现多线程我们所需要做的一切！&lt;br /&gt;&lt;br /&gt;　　真是神奇！Java是如何做到这一点的？通过类！作为一个完全面向对象的语言，Java提供了类java.lang.Thread来方便多线程编程，这个类提供了大量的方法来方便我们控制自己的各个线程，我们以后的讨论都将围绕这个类进行。&lt;br /&gt;&lt;br /&gt;　　那么如何提供给&amp;nbsp;Java&amp;nbsp;我们要线程执行的代码呢？让我们来看一看&amp;nbsp;Thread&amp;nbsp;类。Thread&amp;nbsp;类最重要的方法是run()，它为Thread类的方法start()所调用，提供我们的线程所要执行的代码。为了指定我们自己的代码，只需要覆盖它！&lt;br /&gt;&lt;br /&gt;　　方法一：继承&amp;nbsp;Thread&amp;nbsp;类，覆盖方法&amp;nbsp;run()，我们在创建的&amp;nbsp;Thread&amp;nbsp;类的子类中重写&amp;nbsp;run()&amp;nbsp;,加入线程所要执行的代码即可。下面是一个例子：&lt;br /&gt;&lt;br /&gt;　　public&amp;nbsp;class&amp;nbsp;MyThread&amp;nbsp;extends&amp;nbsp;Thread&lt;br /&gt;　　{&lt;br /&gt;　　int&amp;nbsp;count=&amp;nbsp;1,&amp;nbsp;number;&lt;br /&gt;　　public&amp;nbsp;MyThread(int&amp;nbsp;num)&lt;br /&gt;　　{&lt;br /&gt;　　number&amp;nbsp;=&amp;nbsp;num;&lt;br /&gt;　　System.out.println&lt;br /&gt;　　(&amp;quot;创建线程&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;number);&lt;br /&gt;　　}&lt;br /&gt;　　public&amp;nbsp;void&amp;nbsp;run()&amp;nbsp;{&lt;br /&gt;　　while(true)&amp;nbsp;{&lt;br /&gt;　　System.out.println&lt;br /&gt;　　(&amp;quot;线程&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;number&amp;nbsp;+&amp;nbsp;&amp;quot;:计数&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;count);&lt;br /&gt;　　if(++count==&amp;nbsp;6)&amp;nbsp;return;&lt;br /&gt;　　}&lt;br /&gt;　　}&lt;br /&gt;　　public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main(String&amp;nbsp;args[])&lt;br /&gt;　　{&lt;br /&gt;　　for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;　　i&amp;nbsp;〈&amp;nbsp;5;&amp;nbsp;i++)&amp;nbsp;new&amp;nbsp;MyThread(i+1).start();&lt;br /&gt;　　}&lt;br /&gt;　　}&lt;br /&gt;　　&lt;br /&gt;　　这种方法简单明了，符合大家的习惯，但是，它也有一个很大的缺点，那就是如果我们的类已经从一个类继承（如小程序必须继承自&amp;nbsp;Applet&amp;nbsp;类），则无法再继承&amp;nbsp;Thread&amp;nbsp;类，这时如果我们又不想建立一个新的类，应该怎么办呢？&lt;br /&gt;&lt;br /&gt;　　我们不妨来探索一种新的方法：我们不创建Thread类的子类，而是直接使用它，那么我们只能将我们的方法作为参数传递给&amp;nbsp;Thread&amp;nbsp;类的实例，有点类似回调函数。但是&amp;nbsp;Java&amp;nbsp;没有指针，我们只能传递一个包含这个方法的类的实例。&lt;br /&gt;&lt;br /&gt;　　那么如何限制这个类必须包含这一方法呢？当然是使用接口！（虽然抽象类也可满足，但是需要继承，而我们之所以要采用这种新方法，不就是为了避免继承带来的限制吗？）&lt;br /&gt;&lt;br /&gt;　　Java&amp;nbsp;提供了接口&amp;nbsp;java.lang.Runnable&amp;nbsp;来支持这种方法。&lt;br /&gt;&lt;br /&gt;　　方法二：实现&amp;nbsp;Runnable&amp;nbsp;接口&lt;br /&gt;&lt;br /&gt;　　Runnable接口只有一个方法run()，我们声明自己的类实现Runnable接口并提供这一方法，将我们的线程代码写入其中，就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持，我们还必须创建Thread类的实例，这一点通过Thread类的构造函数&amp;nbsp;public&amp;nbsp;Thread(Runnable&amp;nbsp;target);来实现。下面是一个例子：&lt;br /&gt;&lt;br /&gt;　　public&amp;nbsp;class&amp;nbsp;MyThread&amp;nbsp;implements&amp;nbsp;Runnable&lt;br /&gt;　　{&lt;br /&gt;　　int&amp;nbsp;count=&amp;nbsp;1,&amp;nbsp;number;&lt;br /&gt;　　public&amp;nbsp;MyThread(int&amp;nbsp;num)&lt;br /&gt;　　{&lt;br /&gt;　　number&amp;nbsp;=&amp;nbsp;num;&lt;br /&gt;　　System.out.println(&amp;quot;创建线程&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;number);&lt;br /&gt;　　}&lt;br /&gt;　　public&amp;nbsp;void&amp;nbsp;run()&lt;br /&gt;　　{&lt;br /&gt;　　while(true)&lt;br /&gt;　　{&lt;br /&gt;　　System.out.println&lt;br /&gt;　　(&amp;quot;线程&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;number&amp;nbsp;+&amp;nbsp;&amp;quot;:计数&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;count);&lt;br /&gt;　　if(++count==&amp;nbsp;6)&amp;nbsp;return;&lt;br /&gt;　　}&lt;br /&gt;　　}&lt;br /&gt;　　public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main(String&amp;nbsp;args[])&lt;br /&gt;　　{&lt;br /&gt;　　for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;〈&amp;nbsp;5;&lt;br /&gt;　　i++)&amp;nbsp;new&amp;nbsp;Thread(new&amp;nbsp;MyThread(i+1)).start();&lt;br /&gt;　　}&lt;br /&gt;　　}&lt;br /&gt;　　&lt;br /&gt;　　严格地说，创建Thread子类的实例也是可行的，但是必须注意的是，该子类必须没有覆盖&amp;nbsp;Thread&amp;nbsp;类的&amp;nbsp;run&amp;nbsp;方法，否则该线程执行的将是子类的&amp;nbsp;run&amp;nbsp;方法，而不是我们用以实现Runnable&amp;nbsp;接口的类的&amp;nbsp;run&amp;nbsp;方法，对此大家不妨试验一下。&lt;br /&gt;&lt;br /&gt;　　使用&amp;nbsp;Runnable&amp;nbsp;接口来实现多线程使得我们能够在一个类中包容所有的代码，有利于封装，它的缺点在于，我们只能使用一套代码，若想创建多个线程并使各个线程执行不同的代码，则仍必须额外创建类，如果这样的话，在大多数情况下也许还不如直接用多个类分别继承&amp;nbsp;Thread&amp;nbsp;来得紧凑。&lt;br /&gt;&lt;br /&gt;　　综上所述，两种方法各有千秋，大家可以灵活运用。&lt;br /&gt;&lt;br /&gt;　　下面让我们一起来研究一下多线程使用中的一些问题。&lt;br /&gt;&lt;br /&gt;　　三、线程的四种状态&lt;br /&gt;&lt;br /&gt;　　1.&amp;nbsp;新状态：线程已被创建但尚未执行（start()&amp;nbsp;尚未被调用）。&lt;br /&gt;&lt;br /&gt;　　2.&amp;nbsp;可执行状态：线程可以执行，虽然不一定正在执行。CPU&amp;nbsp;时间随时可能被分配给该线程，从而使得它执行。&lt;br /&gt;&lt;br /&gt;　　3.&amp;nbsp;死亡状态：正常情况下&amp;nbsp;run()&amp;nbsp;返回使得线程死亡。调用&amp;nbsp;stop()或&amp;nbsp;destroy()&amp;nbsp;亦有同样效果，但是不被推荐，前者会产生异常，后者是强制终止，不会释放锁。&lt;br /&gt;&lt;br /&gt;　　4.&amp;nbsp;阻塞状态：线程不会被分配&amp;nbsp;CPU&amp;nbsp;时间，无法执行。&lt;br /&gt;&lt;br /&gt;　　四、线程的优先级&lt;br /&gt;&lt;br /&gt;　　线程的优先级代表该线程的重要程度，当有多个线程同时处于可执行状态并等待获得&amp;nbsp;CPU&amp;nbsp;时间时，线程调度系统根据各个线程的优先级来决定给谁分配&amp;nbsp;CPU&amp;nbsp;时间，优先级高的线程有更大的机会获得&amp;nbsp;CPU&amp;nbsp;时间，优先级低的线程也不是没有机会，只是机会要小一些罢了。&lt;br /&gt;&lt;br /&gt;　　你可以调用&amp;nbsp;Thread&amp;nbsp;类的方法&amp;nbsp;getPriority()&amp;nbsp;和&amp;nbsp;setPriority()来存取线程的优先级，线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间，缺省是5(NORM_PRIORITY)。&lt;br /&gt;&lt;br /&gt;　　五、线程的同步&lt;br /&gt;&lt;br /&gt;　　由于同一进程的多个线程共享同一片存储空间，在带来方便的同时，也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突，有效避免了同一个数据对象被多个线程同时访问。&lt;br /&gt;&lt;br /&gt;　　由于我们可以通过&amp;nbsp;private&amp;nbsp;关键字来保证数据对象只能被方法访问，所以我们只需针对方法提出一套机制，这套机制就是&amp;nbsp;synchronized&amp;nbsp;关键字，它包括两种用法：synchronized&amp;nbsp;方法和&amp;nbsp;synchronized&amp;nbsp;块。&lt;br /&gt;&lt;br /&gt;　　1.&amp;nbsp;synchronized&amp;nbsp;方法：通过在方法声明中加入&amp;nbsp;synchronized关键字来声明&amp;nbsp;synchronized&amp;nbsp;方法。如：&lt;br /&gt;&lt;br /&gt;　　public&amp;nbsp;synchronized&amp;nbsp;void&amp;nbsp;accessVal(int&amp;nbsp;newVal);&lt;br /&gt;　　&lt;br /&gt;　　&amp;nbsp;synchronized&amp;nbsp;方法控制对类成员变量的访问：每个类实例对应一把锁，每个&amp;nbsp;synchronized&amp;nbsp;方法都必须获得调用该方法的类实例的锁方能执行，否则所属线程阻塞，方法一旦执行，就独占该锁，直到从该方法返回时才将锁释放，此后被阻塞的线程方能获得该锁，重新进入可执行状态。&lt;br /&gt;&lt;br /&gt;　　这种机制确保了同一时刻对于每一个类实例，其所有声明为&amp;nbsp;synchronized&amp;nbsp;的成员函数中至多只有一个处于可执行状态（因为至多只有一个能够获得该类实例对应的锁），从而有效避免了类成员变量的访问冲突（只要所有可能访问类成员变量的方法均被声明为&amp;nbsp;synchronized）。&lt;br /&gt;&lt;br /&gt;　　在&amp;nbsp;Java&amp;nbsp;中，不光是类实例，每一个类也对应一把锁，这样我们也可将类的静态成员函数声明为&amp;nbsp;synchronized&amp;nbsp;，以控制其对类的静态成员变量的访问。&lt;br /&gt;&lt;br /&gt;　　synchronized&amp;nbsp;方法的缺陷：若将一个大的方法声明为synchronized&amp;nbsp;将会大大影响效率，典型地，若将线程类的方法&amp;nbsp;run()&amp;nbsp;声明为&amp;nbsp;synchronized&amp;nbsp;，由于在线程的整个生命期内它一直在运行，因此将导致它对本类任何&amp;nbsp;synchronized&amp;nbsp;方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中，将其声明为&amp;nbsp;synchronized&amp;nbsp;，并在主方法中调用来解决这一问题，但是&amp;nbsp;Java&amp;nbsp;为我们提供了更好的解决办法，那就是&amp;nbsp;synchronized&amp;nbsp;块。&lt;br /&gt;&lt;br /&gt;　　2.&amp;nbsp;synchronized&amp;nbsp;块：通过&amp;nbsp;synchronized关键字来声明synchronized&amp;nbsp;块。语法如下：&lt;br /&gt;&lt;br /&gt;　　synchronized(syncObject)&lt;br /&gt;　　{&lt;br /&gt;　　//允许访问控制的代码&lt;br /&gt;　　}&lt;br /&gt;　　&lt;br /&gt;　　synchronized&amp;nbsp;块是这样一个代码块，其中的代码必须获得对象&amp;nbsp;syncObject&amp;nbsp;（如前所述，可以是类实例或类）的锁方能执行，具体机制同前所述。由于可以针对任意代码块，且可任意指定上锁的对象，故灵活性较高。&lt;br /&gt;&lt;br /&gt;　　六、线程的阻塞&lt;br /&gt;&lt;br /&gt;　　为了解决对共享存储区的访问冲突，Java&amp;nbsp;引入了同步机制，现在让我们来考察多个线程对共享资源的访问，显然同步机制已经不够了，因为在任意时刻所要求的资源不一定已经准备好了被访问，反过来，同一时刻准备好了的资源也可能不止一个。为了解决这种情况下的访问控制问题，Java&amp;nbsp;引入了对阻塞机制的支持。&lt;br /&gt;&lt;br /&gt;　　阻塞指的是暂停一个线程的执行以等待某个条件发生（如某资源就绪），学过操作系统的同学对它一定已经很熟悉了。Java&amp;nbsp;提供了大量方法来支持阻塞，下面让我们逐一分析。&lt;br /&gt;&lt;br /&gt;　　1.&amp;nbsp;sleep()&amp;nbsp;方法：sleep()&amp;nbsp;允许指定以毫秒为单位的一段时间作为参数，它使得线程在指定的时间内进入阻塞状态，不能得到CPU&amp;nbsp;时间，指定的时间一过，线程重新进入可执行状态。典型地，sleep()&amp;nbsp;被用在等待某个资源就绪的情形：测试发现条件不满足后，让线程阻塞一段时间后重新测试，直到条件满足为止。&lt;br /&gt;&lt;br /&gt;　　2.&amp;nbsp;suspend()&amp;nbsp;和&amp;nbsp;resume()&amp;nbsp;方法：两个方法配套使用，suspend()使得线程进入阻塞状态，并且不会自动恢复，必须其对应的resume()&amp;nbsp;被调用，才能使得线程重新进入可执行状态。典型地，suspend()&amp;nbsp;和&amp;nbsp;resume()&amp;nbsp;被用在等待另一个线程产生的结果的情形：测试发现结果还没有产生后，让线程阻塞，另一个线程产生了结果后，调用&amp;nbsp;resume()&amp;nbsp;使其恢复。&lt;br /&gt;&lt;br /&gt;　　3.&amp;nbsp;yield()&amp;nbsp;方法：yield()&amp;nbsp;使得线程放弃当前分得的&amp;nbsp;CPU&amp;nbsp;时间，但是不使线程阻塞，即线程仍处于可执行状态，随时可能再次分得&amp;nbsp;CPU&amp;nbsp;时间。调用&amp;nbsp;yield()&amp;nbsp;的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。&lt;br /&gt;&lt;br /&gt;　　4.&amp;nbsp;wait()&amp;nbsp;和&amp;nbsp;notify()&amp;nbsp;方法：两个方法配套使用，wait()&amp;nbsp;使得线程进入阻塞状态，它有两种形式，一种允许指定以毫秒为单位的一段时间作为参数，另一种没有参数，前者当对应的&amp;nbsp;notify()&amp;nbsp;被调用或者超出指定时间时线程重新进入可执行状态，后者则必须对应的&amp;nbsp;notify()&amp;nbsp;被调用。&lt;br /&gt;&lt;br /&gt;　　初看起来它们与&amp;nbsp;suspend()&amp;nbsp;和&amp;nbsp;resume()&amp;nbsp;方法对没有什么分别，但是事实上它们是截然不同的。区别的核心在于，前面叙述的所有方法，阻塞时都不会释放占用的锁（如果占用了的话），而这一对方法则相反。&lt;br /&gt;&lt;br /&gt;　　上述的核心区别导致了一系列的细节上的区别。&lt;br /&gt;&lt;br /&gt;　　首先，前面叙述的所有方法都隶属于&amp;nbsp;Thread&amp;nbsp;类，但是这一对却直接隶属于&amp;nbsp;Object&amp;nbsp;类，也就是说，所有对象都拥有这一对方法。初看起来这十分不可思议，但是实际上却是很自然的，因为这一对方法阻塞时要释放占用的锁，而锁是任何对象都具有的，调用任意对象的&amp;nbsp;wait()&amp;nbsp;方法导致线程阻塞，并且该对象上的锁被释放。&lt;br /&gt;&lt;br /&gt;　　而调用&amp;nbsp;任意对象的notify()方法则导致因调用该对象的&amp;nbsp;wait()&amp;nbsp;方法而阻塞的线程中随机选择的一个解除阻塞（但要等到获得锁后才真正可执行）。&lt;br /&gt;&lt;br /&gt;　　其次，前面叙述的所有方法都可在任何位置调用，但是这一对方法却必须在&amp;nbsp;synchronized&amp;nbsp;方法或块中调用，理由也很简单，只有在synchronized&amp;nbsp;方法或块中当前线程才占有锁，才有锁可以释放。&lt;br /&gt;&lt;br /&gt;　　同样的道理，调用这一对方法的对象上的锁必须为当前线程所拥有，这样才有锁可以释放。因此，这一对方法调用必须放置在这样的&amp;nbsp;synchronized&amp;nbsp;方法或块中，该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件，则程序虽然仍能编译，但在运行时会出现&amp;nbsp;IllegalMonitorStateException&amp;nbsp;异常。&lt;br /&gt;&lt;br /&gt;　　wait()&amp;nbsp;和&amp;nbsp;notify()&amp;nbsp;方法的上述特性决定了它们经常和synchronized&amp;nbsp;方法或块一起使用，将它们和操作系统的进程间通信机制作一个比较就会发现它们的相似性：synchronized方法或块提供了类似于操作系统原语的功能，它们的执行不会受到多线程机制的干扰，而这一对方法则相当于&amp;nbsp;block&amp;nbsp;和wakeup&amp;nbsp;原语（这一对方法均声明为&amp;nbsp;synchronized）。&lt;br /&gt;&lt;br /&gt;　　它们的结合使得我们可以实现操作系统上一系列精妙的进程间通信的算法（如信号量算法），并用于解决各种复杂的线程间通信问题。关于&amp;nbsp;wait()&amp;nbsp;和&amp;nbsp;notify()&amp;nbsp;方法最后再说明两点：&lt;br /&gt;&lt;br /&gt;　　第一：调用&amp;nbsp;notify()&amp;nbsp;方法导致解除阻塞的线程是从因调用该对象的&amp;nbsp;wait()&amp;nbsp;方法而阻塞的线程中随机选取的，我们无法预料哪一个线程将会被选择，所以编程时要特别小心，避免因这种不确定性而产生问题。&lt;br /&gt;&lt;br /&gt;　　第二：除了&amp;nbsp;notify()，还有一个方法&amp;nbsp;notifyAll()&amp;nbsp;也可起到类似作用，唯一的区别在于，调用&amp;nbsp;notifyAll()&amp;nbsp;方法将把因调用该对象的&amp;nbsp;wait()&amp;nbsp;方法而阻塞的所有线程一次性全部解除阻塞。当然，只有获得锁的那一个线程才能进入可执行状态。&lt;br /&gt;&lt;br /&gt;　　谈到阻塞，就不能不谈一谈死锁，略一分析就能发现，suspend()&amp;nbsp;方法和不指定超时期限的&amp;nbsp;wait()&amp;nbsp;方法的调用都可能产生死锁。遗憾的是，Java&amp;nbsp;并不在语言级别上支持死锁的避免，我们在编程中必须小心地避免死锁。&lt;br /&gt;&lt;br /&gt;　　以上我们对&amp;nbsp;Java&amp;nbsp;中实现线程阻塞的各种方法作了一番分析，我们重点分析了&amp;nbsp;wait()&amp;nbsp;和&amp;nbsp;notify()方法，因为它们的功能最强大，使用也最灵活，但是这也导致了它们的效率较低，较容易出错。实际使用中我们应该灵活使用各种方法，以便更好地达到我们的目的。&lt;br /&gt;&lt;br /&gt;　　七、守护线程&lt;br /&gt;&lt;br /&gt;　　守护线程是一类特殊的线程，它和普通线程的区别在于它并不是应用程序的核心部分，当一个应用程序的所有非守护线程终止运行时，即使仍然有守护线程在运行，应用程序也将终止，反之，只要有一个非守护线程在运行，应用程序就不会终止。守护线程一般被用于在后台为其它线程提供服务。&lt;br /&gt;&lt;br /&gt;　　可以通过调用方法&amp;nbsp;isDaemon()&amp;nbsp;来判断一个线程是否是守护线程，也可以调用方法&amp;nbsp;setDaemon()&amp;nbsp;来将一个线程设为守护线程。&lt;br /&gt;&lt;br /&gt;　　八、线程组&lt;br /&gt;&lt;br /&gt;　　线程组是一个&amp;nbsp;Java&amp;nbsp;特有的概念，在&amp;nbsp;Java&amp;nbsp;中，线程组是类ThreadGroup&amp;nbsp;的对象，每个线程都隶属于唯一一个线程组，这个线程组在线程创建时指定并在线程的整个生命期内都不能更改。&lt;br /&gt;&lt;br /&gt;　　你可以通过调用包含&amp;nbsp;ThreadGroup&amp;nbsp;类型参数的&amp;nbsp;Thread&amp;nbsp;类构造函数来指定线程属的线程组，若没有指定，则线程缺省地隶属于名为&amp;nbsp;system&amp;nbsp;的系统线程组。&lt;br /&gt;&lt;br /&gt;　　在&amp;nbsp;Java&amp;nbsp;中，除了预建的系统线程组外，所有线程组都必须显式创建。在&amp;nbsp;Java&amp;nbsp;中，除系统线程组外的每个线程组又隶属于另一个线程组，你可以在创建线程组时指定其所隶属的线程组，若没有指定，则缺省地隶属于系统线程组。这样，所有线程组组成了一棵以系统线程组为根的树。&lt;br /&gt;&lt;br /&gt;　　Java&amp;nbsp;允许我们对一个线程组中的所有线程同时进行操作，比如我们可以通过调用线程组的相应方法来设置其中所有线程的优先级，也可以启动或阻塞其中的所有线程。&lt;br /&gt;&lt;br /&gt;　　Java&amp;nbsp;的线程组机制的另一个重要作用是线程安全。线程组机制允许我们通过分组来区分有不同安全特性的线程，对不同组的线程进行不同的处理，还可以通过线程组的分层结构来支持不对等安全措施的采用。&lt;br /&gt;&lt;br /&gt;　　Java&amp;nbsp;的&amp;nbsp;ThreadGroup&amp;nbsp;类提供了大量的方法来方便我们对线程组树中的每一个线程组以及线程组中的每一个线程进行操作。&lt;br /&gt;&lt;br /&gt;　　九、总结&lt;br /&gt;&lt;br /&gt;　　在本文中，我们讲述了&amp;nbsp;Java&amp;nbsp;多线程编程的方方面面，包括创建线程，以及对多个线程进行调度、管理。我们深刻认识到了多线程编程的复杂性，以及线程切换开销带来的多线程程序的低效性，这也促使我们认真地思考一个问题：我们是否需要多线程？何时需要多线程？&lt;br /&gt;&lt;br /&gt;　　多线程的核心在于多个代码块并发执行，本质特点在于各代码块之间的代码是乱序执行的。我们的程序是否需要多线程，就是要看这是否也是它的内在特点。&lt;br /&gt;&lt;br /&gt;　　假如我们的程序根本不要求多个代码块并发执行，那自然不需要使用多线程；假如我们的程序虽然要求多个代码块并发执行，但是却不要求乱序，则我们完全可以用一个循环来简单高效地实现，也不需要使用多线程；只有当它完全符合多线程的特点时，多线程机制对线程间通信和线程管理的强大支持才能有用武之地，这时使用多线程才是值得的。&amp;nbsp;&amp;nbsp;
            &lt;div&gt;
                作者：baggio785 发表于2006-9-1 17:43:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1155150&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：9629 评论：2 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1155150#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Fri, 01 Sep 2006 17:43:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1155150</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1155150</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094741/1063817</fs:itemid></item><item><title>[转]方便 Ajax 与 Java EE 的集成</title><link>http://blog.csdn.net/baggio785/article/details/1155119</link><description>&lt;p&gt;&lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#author&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;Patrick Gan&lt;/font&gt;&lt;/a&gt; (&lt;a href=&quot;mailto:patgan@us.ibm.com?subject=方便 Ajax 与 Java EE 的集成&quot;&gt;&lt;font color=&quot;#5c81a7&quot;&gt;patgan@us.ibm.com&lt;/font&gt;&lt;/a&gt;), 应用程序卓越创新服务中心的高级 IT 专家, IBM&lt;/p&gt;
&lt;p&gt;Asynchronous JavaScript + XML （Ajax）是个相当新的术语（有些人说它是旧酒装新瓶），在不同的 Web 开发社区中，都引起了很大的争议，其中包括 Java EE 社区。Ajax 技术通过消除过多的 Web 页面刷新，提高了应用程序的可用性。而且 Ajax 二者通吃的技术，同时利用了客户端和服务器端代码，向 Web 用户呈现了几乎无缝的用户界面。Ajax 被鼓吹成 Web 开发复兴（或称为 Web 2.0）的一个主要推动者。 &lt;/p&gt;
&lt;p&gt;作为用心的 Java EE 开发人员，您可能已经阅读了许多关于 Ajax 的 how-to 文章，并对它会给应用程序带来的可能改进而兴奋。但是 Ajax 基于异步通信的模式要怎样才适合您的 Java EE 应用程序呢？这篇文章通过研究在 Java EE 应用程序的设计、开发、执行和测试各阶段引入 Ajax 会带来的影响，将帮助您回答这个问题。我的目的不是不鼓励使用 Ajax 或者暗示您可能遇到的问题是 Ajax 技术固有的问题。相反，我是为了帮助您规划并减轻这些问题，好让您更有效而顺利地利用 Ajax。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N10050&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;解决设计缺陷&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;相当一段时间以来，Java 社区一直在努力把好的设计模式应用到与 Web 有关的应用程序开发上。其中使用最广泛的一个模式就是模型-视图-控制器（MVC）。一些开放源码框架，例如 Apache Struts，就基于这个设计模式/架构（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。MVC 的众多优势包括：&lt;em&gt;问题隔离&lt;/em&gt; 和减少冗余代码。&lt;/p&gt;
&lt;p&gt;问题隔离在整个应用程序架构中使用预先协商好的接口，从而让应用程序开发项目中的每个开发人员都专注于自己特定的角色。例如，模型层的开发人员侧重于 JDBC、企业 JavaBean（EJB）组件或者与底层数据持久技术接口的 Java 类这一类的技术。视图层开发人员侧重于 Java 服务器页面（JSP）技术、标记库和其他与表示有关的技术。控制器层隔离及协调模型和视图，把进入的请求路由到后端持久性调用，同时维护问题的清晰隔离。图 1 演示了 MVC 架构：&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;N10065&quot;&gt;&lt;strong&gt;图 1. MVC 架构&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;156&quot; alt=&quot;MVC 架构&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/reference_mvc.gif&quot; width=&quot;477&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;把 Ajax 引入 Java EE Web 应用程序对于问题的隔离（以及开发人员角色的隔离）是有意义的。在某些情况下，Ajax 会把大量 JavaScript 代码带回视图层（JSP）页面。表 1 描述了没有 Ajax 的视图层，还指出了需要的代码（假设控制器层由 servlet 实现，视图层由 JSP 技术实现。（在下一节 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#developmentSection&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;处理开发困境&lt;/font&gt;&lt;/a&gt; 我将解释同步和异步请求的区别。）&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;table1&quot;&gt;&lt;strong&gt;表 1. 没有 Ajax 的 MVC：与典型的视图层序列有关的代码数量&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;MVC without Ajax&quot; border=&quot;0&quot; class=&quot;data-table-2&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;th&gt;序列&lt;/th&gt;
            &lt;th&gt;说明&lt;/th&gt;
            &lt;th&gt;要求代码？&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&quot;tb-row&quot;&gt;在调用同步请求之前&lt;/td&gt;
            &lt;td&gt;准备表单提交需要的脚本代码&lt;/td&gt;
            &lt;td&gt;否&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&quot;tb-row&quot;&gt;调用异步请求&lt;/td&gt;
            &lt;td&gt;由按钮或链接调用引起表单提交；DOM 元素的值自动设置到 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpRequest&lt;/font&gt;&lt;/code&gt;（通过 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;GET&lt;/font&gt;&lt;/code&gt; 或 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;POST&lt;/font&gt;&lt;/code&gt;）。&lt;/td&gt;
            &lt;td&gt;否：所需要的只是调用页面提交的途径。&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&quot;tb-row&quot;&gt;处理同步请求的响应&lt;/td&gt;
            &lt;td&gt;在服务器端代码执行完成后，通常会向 JSP 发送回一个对象（通过 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpRequest&lt;/font&gt;&lt;/code&gt; 或保存在 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpSession&lt;/font&gt;&lt;/code&gt; 中）。这时，在 JSP 中可以通过 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpRequest&lt;/font&gt;&lt;/code&gt; 或 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpSession&lt;/font&gt;&lt;/code&gt; 访问这个对象（通过脚本或某些标记库），只需要编写极少的脚本就可以显示对象的内容。&lt;/td&gt;
            &lt;td&gt;是：最少的脚本。&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;对比表 1 和表 2，表 2 描述了&lt;em&gt;有&lt;/em&gt; Ajax 的 MVC 视图层，同样假设控制层由 servlet 实现，视图层由 JSP 技术实现。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;table2&quot;&gt;&lt;strong&gt;表 2. 有 Ajax 的 MVC：与典型的视图层序列有关的代码数量&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;MVC w Ajax&quot; border=&quot;0&quot; class=&quot;data-table-2&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;th&gt;序列&lt;/th&gt;
            &lt;th&gt;说明&lt;/th&gt;
            &lt;th&gt;需要代码？&lt;/th&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&quot;tb-row&quot;&gt;在调用异步请求之前&lt;/td&gt;
            &lt;td&gt;需要用 JavaScript 代码检索出 Ajax 调用需要的 DOM 元素的值。&lt;/td&gt;
            &lt;td&gt;是&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&quot;tb-row&quot;&gt;调用异步请求&lt;/td&gt;
            &lt;td&gt;需要用 JavaScript 代码创建 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;XMLHTTPRequest&lt;/font&gt;&lt;/code&gt; 并把（以前搜集的）DOM 元素值与之关联并发送（&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;XMLHTTPRequest.send()&lt;/font&gt;&lt;/code&gt;）。&lt;/td&gt;
            &lt;td&gt;是&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td class=&quot;tb-row&quot;&gt;处理异步请求的响应&lt;/td&gt;
            &lt;td&gt;在服务器端代码执行完成后，要用 JavaScript 代码得到请求（从 XML 响应流中）并把值相应地填充到适当的 DOM 元素。&lt;/td&gt;
            &lt;td&gt;是&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;可以看出，由于使用了 Ajax，视图层的脚本编写量增加了，从而导致三个明显缺陷：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;JSP 要求大量的 JavaScript 代码。 &lt;/li&gt;
    &lt;li&gt;这个设计破坏了角色问题的隔离。 &lt;/li&gt;
    &lt;li&gt;设计重新带回了&lt;em&gt;单一 JSP&lt;/em&gt;（模式 1 方法：一堆 HTML、CSS 代码、图片和脚本代码），这是一种反模式，极难阅读和维护（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有几个选项可以避免或者至少减轻这些设计缺陷：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;设计时脑子里记着重用&lt;/strong&gt;：不幸的是，编写特定于 Ajax 支持的代码通常很难避免。请计划和设计脚本代码，以便能够最大限度地重用它。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;采用客户端 MVC 方法&lt;/strong&gt;：可以合并使用客户端 MVC 方法，详见 Dave Crane 等编写的 &lt;em&gt;Ajax in Action&lt;/em&gt;（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。这种方法可以促进问题的隔离，但是增加了复杂性，所以使用的时候要仔细考虑。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;使用 Ajax 框架&lt;/strong&gt;：存在多个开放源码的 Ajax 框架，例如 Direct Web Remoting （DWR）（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;），它们做了很好的工作，可以用最少的编码，就把 Ajax 模式集成到 Java EE 应用程序。 &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;重新评估设计的正确性&lt;/strong&gt;：实际上，Ajax 为 Web 应用程序提供了桌面应用程序的属性。如果一个 Web 应用程序中大多数客户端交互都利用 Ajax，那么这个应用程序可能最好设计成桌面应用程序。 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&quot;developmentSection&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;处理开发困境&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 Java Web 开发中使用 Ajax 时，重要的是完整理解&lt;em&gt;同步&lt;/em&gt; 和&lt;em&gt;异步&lt;/em&gt; 通信模型的区别（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。对异步通信模型支持的缺乏，会对客户端开发、与 Web 框架的集成、标记库的使用、IDE 的使用以及线程的行为有影响。&lt;/p&gt;
&lt;p&gt;在同步请求/响应通信模型中，总是浏览器（与 Web 服务器、应用服务器或 Web 应用程序相对）发起请求（通过 Web 用户）。接着，Web 服务器、应用服务器或 Web 应用程序响应进入的请求。在处理同步请求/响应对期间，用户不能继续使用浏览器。&lt;/p&gt;
&lt;p&gt;图 2 中的序列图演示了传统 Web 应用程序的同步通信模型。请注意在服务器的生命线上，来自客户机的数据提交和服务器端的处理是紧密耦合的。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig2&quot;&gt;&lt;strong&gt;图 2. 同步通信序列&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;228&quot; alt=&quot;同步通信序列&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/synchronous_sequence.gif&quot; width=&quot;389&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;在异步请求/响应通信模型中，浏览器（通过 Web 用户）到 Web 服务器、应用服务器或 Web 应用程序的通信（以及反过来）是解耦的。在异步请求/响应对的处理中，Web 用户在当前异步请求被处理时还可以继续使用浏览器。一旦异步请求处理完成，异步响应就被通信（从 Web 服务器、应用服务器或 Web 应用程序）回客户机页面。典型情况下，在这个过程中，调用对 Web 用户没有影响；他们不需要等候响应。 &lt;/p&gt;
&lt;p&gt;图 3 的序列图演示了异步通信模型。请注意第一个 dataSubmission （由服务器端处理）和第一个返回的 dataSubmission，两个都用红圈圈上了。这些序列是解耦的。这个图示还强调了一个重要方面（后面将详细介绍，请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#threadingSection&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;线程问题&lt;/font&gt;&lt;/a&gt;）：在这个模型中，可以发生多个提交（线程）。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig3&quot;&gt;&lt;strong&gt;图 3. 异步通信序列&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;418&quot; alt=&quot;异步通信序列&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/asynchronous_sequence.gif&quot; width=&quot;342&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N101AD&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;客户端影响&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在向 Web 应用程序引入 Ajax 时，开发团队需要注意几个风险，主要与生成的 HTML 页面及其与浏览器的交互方式有关。这些问题在 Chris Laffra 两部分的 &lt;em&gt;Considering Ajax&lt;/em&gt; 系列中有详细介绍（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。有些需要记住的要点是：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;可能没打开脚本功能&lt;/strong&gt;：出于各种原因，在许多用户的浏览器上禁止了 JavaScript 支持。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;跨浏览器支持增加了代码需求&lt;/strong&gt;：支持多种浏览器和多个浏览器版本的应用程序，要求的脚本代码可能会增多，因为浏览器解释 DOM 对象的方式有细微的差异（所以操作这些元素的 JavaScript 代码也有差异）。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;JavaScript 不安全&lt;/strong&gt;：在多数浏览器中，可以选择查看源代码选项，查看到与 HTML 页面关联的 JavaScript 源代码。在使用 Ajax 模式时，要确保脚本代码中实现的逻辑不是敏感逻辑。 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&quot;N101D3&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;与 Web 框架集成&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;试着把 Ajax 开发与所选的 Java EE Web 框架集成，是很自然的。但是有些 Java EE Web 框架对异步通信模型提供直接可以使用的支持。要体会这个事实的意义，需要理解 servlet 处理同步和异步通信的方式。图 4 显示了处理同步请求的传统 servlet 序列： &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;N101DE&quot;&gt;&lt;strong&gt;图 4. 处理同步请求的 Servlet 序列&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;299&quot; alt=&quot;传统 Servlet 序列（同步）&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/servlet_synchronous_sequence.jpg&quot; width=&quot;523&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;图 4 对于 Java EE Web 开发人员来说应当相当熟悉。来自浏览器的请求先由控制器 servlet 的 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;service()&lt;/font&gt;&lt;/code&gt; 处理。servlet 可以从 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpRequest&lt;/font&gt;&lt;/code&gt; 检索到需要的任何值（以参数的形式或者以属性的形式）。一旦控制器处理完成，结果就发送回 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpRequest&lt;/font&gt;&lt;/code&gt; （或 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpSession&lt;/font&gt;&lt;/code&gt;），而 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;RequestDispatcher&lt;/font&gt;&lt;/code&gt; 则把控制转发（或包含）回页面。 &lt;/p&gt;
&lt;p&gt;图 5 显示了处理异步请求的 servlet 序列：&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig5&quot;&gt;&lt;strong&gt;图 5. 处理异步请求的 Servlet 序列&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;403&quot; alt=&quot;Servlet 序列（异步）&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/servlet_asynchronous_sequence.jpg&quot; width=&quot;572&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;图 5 中的序列与同步序列略有不同。来自浏览器的请求先由控制器 servlet 的 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;service()&lt;/font&gt;&lt;/code&gt; 处理。servlet 可以从 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpRequest&lt;/font&gt;&lt;/code&gt; 检索到需要的任何值（以参数的形式或者以属性的形式）。一旦控制器处理完成，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpServletResponse&lt;/font&gt;&lt;/code&gt; 的内容类型必须设置成 XML。而且，控制器逻辑的结果要用 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;PrintWriter&lt;/font&gt;&lt;/code&gt; 写入。这时，&lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;RequestDispatcher&lt;/font&gt;&lt;/code&gt; 的使用被越过。&lt;/p&gt;
&lt;p&gt;这个（异步序列）恰恰是多数 Java EE Web 框架不支持的，从而造成与 Ajax 的集成非常困难。不支持异步通信模型的 Portlet 和 JavaServer Faces （JSF）框架面临着同样的问题。 &lt;/p&gt;
&lt;p&gt;克服这个问题也有一些选项： &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;与 Web 框架并存：&lt;/strong&gt; 不必等待内置的 Ajax 支持或者在所选的框架中强行实现 Ajax 支持，可以使用独立的 servlet 来处理全部异步请求。DWR 就使用了这种方式。这种方式的不足在于 Ajax 请求不能方便地利用框架的特性。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;与 Web 框架集成&lt;/strong&gt;：通过使用免费的扩展或编写定制的扩展，可以设计出与所选 Web 框架集成的途径。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;迁移到支持 Ajax 的框架&lt;/strong&gt;：更新的框架开始支持异步通信模型。其中一个是 Apache Shale（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&quot;N1024B&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;使用标记库&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大量使用标记库（taglib）在 Java 的 Web 应用程序开发中是很普遍的。像许多 Java EE Web 框架一样，有些标记库现在也不支持异步通信模型，没有把通过 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;XMLHttpRequest&lt;/font&gt;&lt;/code&gt; 提交的数据转换成 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;HttpServletRequest&lt;/font&gt;&lt;/code&gt; （以及反过来）的途径。实际上，不支持异步通信的标记库，在 Ajax &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;XMLHttpRequest&lt;/font&gt;&lt;/code&gt; 调用期间不工作。可用的选项有： &lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;放弃使用不支持异步模型的标记库&lt;/strong&gt;：把现在由标记库生成的代码迁移到 HTML/JavaScript 代码。（如果 Web 应用程序高度依赖标记库，这种方式最终会造成视图层页面尺寸的增大。）&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;解决问题&lt;/strong&gt;：使用已经解决了这个问题的 Ajax 框架。示例之一就是 DWR（请参阅 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;ExecutionContext.forwardToString()&lt;/font&gt;&lt;/code&gt;）。 在这种情况下，可以继续使用以前一直使用的标记库。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;使用支持 Ajax 的标记库&lt;/strong&gt;：使用支持异步模型的标记库，例如 Ajax JSP 标记库（AjaxTags）（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&quot;N1027E&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;用 IDE 进行开发与调试&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有许多 JavaScript 调试工具可以帮助开发人员开发 JavaScript 解决方案。但是，传统的 Java 开发环境不允许检查 &lt;code&gt;&lt;font face=&quot;Courier&quot; size=&quot;2&quot;&gt;XMLHTTPRequest&lt;/font&gt;&lt;/code&gt; 和与 Ajax 相关的其他东西的值。&lt;/p&gt;
&lt;p&gt;一个解决方案是利用 AJAX Toolkit Framework（ATF）（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。ATF 是个 Eclipse 插件，带有增强的 JavaScript 编辑特性，例如编辑时语法检查，内嵌的 Mozilla Web 浏览器，内嵌的 DOM 浏览器，内嵌的 JavaScript 调试器。ATF 还包含 Personality Builder 功能，这个功能可以帮助任何 Ajax 运行时框架构建 IDE 特性，从而加入到 ATF 支持的运行时环境集中。 &lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;threadingSection&quot;&gt;&lt;span class=&quot;smalltitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;线程问题&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在典型的同步 Web 应用程序中，有些领域对按钮或链接点击要求更长一点的处理时间。没有耐心和没经验的 Web 用户通常会不止一次地点击按钮或链接，以为可以帮助加快处理速度，从而引发多重表单提交。其他时候，用户认为需要双击（就像桌面应用程序那样）。Web 应用程序中的多重表单提交在某些情况下是无害的。而在其他情况下，副作用可能造成严重的线程问题或争用情况（此时多个线程竞争执行一个代码块）。例如，在银行应用程序中多次点击转帐按钮，可能造成不希望的多次转帐。 &lt;/p&gt;
&lt;p&gt;既支持同步通信模型又支持异步通信模型的 Web 应用程序会发现，如果它的功能没有正确分析和规划，那么自己就处在了相似的困境中。支持两种通信模型的应用程序在某个页面上可能混合了服务器端调用（即，或者同步，或者异步，或者混合了同步和异步）。就像在多重点击场景中一样，异步调用可能处理得慢些。如果应用程序不做预防，用户可能会在异步线程正在处理时又调用了一个同步调用，因为页面没有刷新，所以无法阻止页面上的进一步活动。结果是两个线程并发处理。虽然不是由 Web 页面上的同一按钮或链接引发，这类情况还是会造成服务器端的线程问题（与多重点击问题类似）。 &lt;/p&gt;
&lt;p&gt;例如，以图 6 所示的银行应用程序的转账页面为例： &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a name=&quot;fig6&quot;&gt;&lt;strong&gt;图 6. 转帐示例&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;img height=&quot;254&quot; alt=&quot;转账示例&quot; src=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/transfer_funds_example.jpg&quot; width=&quot;388&quot; /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;对于这个示例，用红色表示的转账按钮引发一个 Ajax 调用。退出链接（黄色）引发同步调用。如果不耐烦或没有经验的用户点击了红色按钮之后接着又点击黄色链接（假设两个链接在代码中有共同的路径），就会发生争用情况。&lt;/p&gt;
&lt;p&gt;一般来说，有两种方式可以避免这类情况发生。第一种方式是客户端解决方案。一旦点击了一个链接或按钮，就用 JavaScript 确保禁止后续的页面提交，直到当前线程执行完成。第二个解决方案是允许多线程提交，但是依赖于服务器端代码中的同步来避免争用情况。如果引入同步来解决这个问题，请记住 Java EE Web 组件（servlet、portlet、JSF 等）是多线程的。要当心大段代码的同步（特别是与请求/响应生命周期处理有关的代码）。在效果上，同步的误用，会把应用程序变成单线程应用程序，从而降低吞吐率。 &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;performanceSection&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;克服性能缺陷&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用 Ajax 还有可能影响基于 Java EE Web 的应用程序的性能。允许每个请求上有额外线程的可能性，可能会影响两个资源。 &lt;/p&gt;
&lt;p&gt;首先，servlet 容器的&lt;em&gt;线程池&lt;/em&gt; 可能受到影响。线程池指定 Web 容器中允许并发运行的线程的最大数量。每个客户机请求需要一个线程。但是，一个客户机请求不一定等于一个用户请求。浏览器可能为一个用户请求要求多个客户机请求。例如，提交表单的一个用户可能要求多个客户机请求（其中包含提交表单的值、检索 GIF 文件、检索 JavaScript 文件、检索 CSS 文件）。如果允许并发地提交同步和异步请求，就意味着每个用户请求至少要支持多出一个的线程消耗（用于 Ajax 请求）。虽然为每个用户请求多增加一个线程的可能性看起来不多，但是当应用程序处在负载之下时，影响就明显了（这时每个用户请求多出的一个额外线程乘上平均用户数量）。显示，这种情况有可能影响 servlet 容器的性能。 &lt;/p&gt;
&lt;p&gt;另一个可能受影响的资源是&lt;em&gt;数据库连接池&lt;/em&gt;。典型的 Java EE Web 应用程序支持一个用户请求的两类序列：&lt;em&gt;浅（shallow）&lt;/em&gt;请求和 &lt;em&gt;深（deep）&lt;/em&gt;请求。浅请求是执行服务器端代码但是不访问持久性存储（例如数据库）就完成请求的 Web 页面发出的请求。深请求是执行服务器端代码并访问持久性存储才能完成请求的 Web 页面发出的请求。 &lt;/p&gt;
&lt;p&gt;在深请求序列中（假设需要数据库连接），数据库连接池的这些方面可能会由于允许多个线程而受到影响：&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;等待连接的线程的平均数量 &lt;/li&gt;
    &lt;li&gt;以毫秒为单位的连接的平均等候时间 &lt;/li&gt;
    &lt;li&gt;连接被使用的平均时间 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，可能需要提高连接池的平均大小或连接数量。 &lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;testingSection&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;对付测试&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Java 开发人员一直在不断地努力为 Java SE 和 Java EE 代码提供单元测试工具。由于 Ajax 的引入造成浏览器内的 JavaScript 增多，对可靠的 JavaScript 单元测试框架也提出了要求。现在可用的框架有 JsUnit、Selenium 和 HttpUnit（请参阅 &lt;a href=&quot;http://www-128.ibm.com/developerworks/cn/java/j-ajaxee/index.html#resources&quot;&gt;&lt;font color=&quot;#996699&quot;&gt;参考资料&lt;/font&gt;&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;这些框架提供了为 JavaScript 函数开发单元测试的工具，可以操纵 Web 页面上的 DOM 元素。它们允许把单元测试组织成测试套件。Selenium 的浏览器兼容性测试特性允许在不同的浏览器和操作系统上测试 JavaScript 函数。它利用 JavaScript 和 Iframe 在浏览器中嵌入了测试自动引擎。这项技术应当可以在任何支持 JavaScript 的浏览器中工作，对于支持多个浏览器和浏览器版本的应用程序来说特别有用。Selenium 和 JsUnit 都支持&lt;em&gt;持续集成&lt;/em&gt;：可以把 JavaScript 单元测试和测试套件集成到自动构建过程。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N102F6&quot;&gt;&lt;span class=&quot;atitle&quot;&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;结束语&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;把 Ajax &amp;mdash;&amp;mdash; 就像其他技术或模式一样 &amp;mdash;&amp;mdash; 引入 Java EE 应用程序，也有它的优势和不足。本文提供了把 Ajax 集成到 Java EE Web 应用程序的概述。Ajax 的异步通信模型与传统 Java EE Web 应用程序内置就支持的同步模型有很大不同。为了避免盲目，请确保在采用 Ajax 之前对潜在的问题领域有全面的事前规划。&lt;/p&gt;
&lt;p&gt;Java EE 框架对 Ajax 的支持和工具在不断改进。未来有望会有框架自带的 Ajax 支持来降低集成的复杂性。基于 JSF 的 Apache Shale 和基于 servlet 的 DWR 是两个希望您保持关注的框架。&lt;/p&gt;
            &lt;div&gt;
                作者：baggio785 发表于2006-9-1 17:41:00 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1155119&quot;&gt;原文链接&lt;/a&gt;
            &lt;/div&gt;
            &lt;div&gt;
            阅读：9621 评论：1 &lt;a href=&quot;http://blog.csdn.net/baggio785/article/details/1155119#comments&quot; target=&quot;_blank&quot;&gt;查看评论&lt;/a&gt;
            &lt;/div&gt;</description><pubDate>Fri, 01 Sep 2006 17:41:00 +0800</pubDate><author>baggio785</author><guid isPermaLink="false">http://blog.csdn.net/baggio785/article/details/1155119</guid><dc:creator>baggio785</dc:creator><fs:srclink>http://blog.csdn.net/baggio785/article/details/1155119</fs:srclink><fs:srcfeed>http://blog.csdn.net/baggio785/feed.aspx</fs:srcfeed><fs:itemid>csdn.net/baggio785/~1063817/638094740/1063817</fs:itemid></item></channel></rss>
