java课程设计—网络爬虫搜索引擎
搜索引擎实例讲解

搜索引擎
Heritrix介绍
• 在一个搜索引擎的开发过程中,使用一个合适 的爬虫来获得所需要的网页信息是第一步,这 一步是整个系统成功的基础。 • Heritrix是一个纯由Java开发的、开源的Web 网络爬虫,用户可以使用它从网络上抓取想要 的资源。 • 它来自于。 • Heritrix最出色之处在于它的可扩展性,开发者 可以扩展它的各个组件,来实现自己的抓取逻 辑。
Modules
• CrawlScope用于配置当前应该在什么范围内抓取网页链接。比如,如果选 择BroadScope,则表示当前抓取的范围不受限制,但如果选择了 HostScope,则表示抓取的范围在当前的Host内 • Frontier则是一个URL的处理器,它将决定下一个被处理的URL是什么。同 时,它还会将经由处理器链所解析出来的URL加入到等待处理的队列中去。 • PreProcessor:这个队列中,所有的处理器都是用来对抓取时的一些先决 条件做判断的。比如判断robot.txt的信息等,它是整个处理器链的入口。 • Fetcher:从名称上看,它用于解析网络传输协议,比如解析DNS、HTTP 或FTP等。 • Extractor:它的名字就很好的揭示了它的作用。它主要用是于解析当前获 取到的服务器返回内容,这些内容通常是以字符串形式缓存的。在这个队 列中, 包括了一系列的工具,如解析HTML、CSS等。在解析完毕,取出 页面中的URL后,将它们放入队列中,等待下次继续抓取。 • Writer:主要是用于将所抓取到的信息写入磁盘。通常写入磁盘时有两种形 式,一种是采用压缩的方式写入,在这里被称为Arc方式,另一种则采用镜 象方式写入。当然处理起来,镜象方式要更为容易一些, • PostProcessor:在整个抓取解析过程结束后,进行一些扫尾的工作,比如 将前面Extractor解析出来的URL有条件的加入到待处理队列中去。
网络爬虫软件的研究与开发

网络爬虫软件的研究与开发摘要:作为一种快捷、高效访问网络海量数据的工具,通用搜索引擎自诞生以来备受人们喜爱。
然而在设计上它却存在着很多不足,并且随着万维网的快速发展而日益不能满足人们的需求。
基于这种背景,用于对网页进行定向抓取的主题爬虫应运而生。
主题爬虫的设计理念是利用最少的资源,尽可能快而准确地抓取网络中用户关心的网页,目前已经有着非常广泛的应用。
首先,了解主题爬虫提出的历史背景及当前国内外的发展状况,分析与主题爬虫设计相关的技术知识,如HTTP协议、HTML解析、中文分词等。
其次,提出使用向量空间模型进行主题相关度计算。
为了能够充分利用网页中丰富的启发式信息,综合运用了网页内容分析和网页链接分析技术。
最后,基于对主题爬虫设计与实现方法的研究,使用Java开发一个多线程主题爬虫。
关键词:主题爬虫;向量空间模型;主题相关度;爬虫阻止协议1 背景及发展状况万维网诞生以来,其独特的魅力极大地激发了人类创作的积极性,短短十几年便发展成为了目前世界上规模最大的公共数据源。
然而人类的接受能力却是十分有限的,因此便产生了一种能够高效访问网络资源的需求。
在这种背景下,通用搜索引擎应运而生,如比较知名的Baidu、Google。
爬虫(Crawler),又称蜘蛛(Spider)或者机器人(Robot),是一种能够高效抓取网络资源的程序。
通用搜索引擎设计中用于抓取网络资源的爬虫被称为通用爬虫,这种爬虫的设计目标是尽可能快而多地抓取网络中的各种资源,具有很强的通用性。
但是,随着万维网的不断发展及人类的进步,通用爬虫的应用暴露出了很大的局限性。
比如大量不相关网络资源被抓取、严重浪费网络带宽、不能够支持语义查询等等。
为解决所面临的问题,用于定向抓取网络资源的主题爬虫被提上了研究日程。
最佳优先爬虫是一种简单、高效的主题爬虫。
在页面主题相关度评价上,它采用了经典的向量空间模型;而在对页面中所含链接进行主题相关度预测打分时则充分考虑了链接锚文本、链接所在页面的主题相关度、兄弟链接等等各种启发式信息。
网络爬虫课程设计文档

网络爬虫网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
简单来说,网络爬虫的基本工作流程可以分为如下几步:1.首先选取一部分精心挑选的种子URL;2.将这些URL放入待抓取URL队列;3.从待抓取URL队列中取出待抓取URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。
此外,将这些URL放进已抓取URL队列。
4.分析已抓取URL队列中的URL,并且将URL放入待抓取URL队列,从而进入下一个循环。
对URL的认识爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它进行进一步的处理。
因此,准确地理解URL对理解网络爬虫至关重要。
URL:统一资源定位符,是Internet 上描述信息资源的字符串。
URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL 的格式由三部分组成:第一部分是协议(或称为服务方式)。
第二部分是存有该资源的主机IP地址(有时也包括端口号)。
第三部分是主机资源的具体地址,如目录和文件名等。
第一部分和第二部分用“://”符号隔开,第二部分和第三部分用“/”符号隔开。
第一部分和第二部分是不可缺少的,第三部分有时可以省略。
1.HTTP 协议的URL 示例使用超级文本传输协议HTTP,提供超级文本信息服务的资源。
例:/channel/welcome.htm。
其计算机域名为。
超级文本文件(文件类型为.html)是在目录/channel 下的welcome.htm。
这是中国人民日报的一台计算机。
例:/talk/talk1.htm。
其计算机域名为。
超级文本文件(文件类型为.html)是在目录/talk 下的talk1.htm。
JAVA基于网络爬虫的搜索引擎设计与实现

本科毕业设计题目:基于网络爬虫的搜索引擎设计与实现系别:专业:计算机科学与技术班级:学号:姓名:同组人:指导教师:教师职称:协助指导教师:教师职称:摘要本文从搜索引擎的应用出发,探讨了网络蜘蛛在搜索引擎中的作用和地住,提出了网络蜘蛛的功能和设计要求。
在对网络蜘蛛系统结构和工作原理所作分析的基础上,研究了页面爬取、解析等策略和算法,并使用Java实现了一个网络蜘蛛的程序,对其运行结果做了分析。
关键字:爬虫、搜索引擎AbstractThe paper,discussing from the application of the search engine,searches the importance and function of Web spider in the search engine.and puts forward its demand of function and design.On the base of analyzing Web Spider’s system strtucture and working elements.this paper also researches the method and strategy of multithreading scheduler,Web page crawling and HTML parsing.And then.a program of web page crawling based on Java is applied and analyzed.Keyword: spider, search engine目录摘要 (2)Abstract (3)一、项目背景 (5)1.1搜索引擎现状分析 (5)1.2课题开发背景 (5)1.3网络爬虫的工作原理 (8)二、系统开发工具和平台 (8)2.1关于java语言 (8)2.2 Jbuilder介绍 (10)2.3 servlet的原理 (11)三、系统总体设计 (13)3.1系统总体结构 (13)3.2系统类图 (13)四、系统详细设计 (17)4.1搜索引擎界面设计 (17)4.2 servlet的实现 (18)4.3网页的解析实现 (20)4.3.1网页的分析 (20)4.3.2网页的处理队列 (21)4.3.3 搜索字符串的匹配 (22)4.3.4网页分析类的实现 (22)4.4网络爬虫的实现 (25)五、系统测试 (33)六、结论 (35)致谢 (35)参考文献 (36)一、项目背景1.1搜索引擎现状分析互联网被普及前,人们查阅资料首先想到的便是拥有大量书籍的图书馆,而在当今很多人都会选择一种更方便、快捷、全面、准确的方式——互联网.如果说互联网是一个知识宝库,那么搜索引擎就是打开知识宝库的一把钥匙.搜索引擎是随着WEB信息的迅速增加,从1995年开始逐渐发展起来的技术,用于帮助互联网用户查询信息的搜索工具.搜索引擎以一定的策略在互联网中搜集、发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服务,从而起到信息导航的目的.目前搜索引擎已经成为倍受网络用户关注的焦点,也成为计算机工业界和学术界争相研究、开发的对象.目前较流行的搜索引擎已有Google, Yahoo, Info seek, baidu 等. 出于商业机密的考虑, 目前各个搜索引擎使用的Crawler 系统的技术内幕一般都不公开, 现有的文献也仅限于概要性介绍. 随着W eb 信息资源呈指数级增长及Web 信息资源动态变化, 传统的搜索引擎提供的信息检索服务已不能满足人们日益增长的对个性化服务的需要, 它们正面临着巨大的挑战. 以何种策略访问Web, 提高搜索效率, 成为近年来专业搜索引擎网络爬虫研究的主要问题之一。
java爬虫框架有哪些,各有什么特点

java爬虫框架有哪些,各有什么特点目前主流的Java爬虫框架主要有Nutch、Crawler4j、WebMagic、scrapy、WebCollector等,各有各的特点,大家可以根据自己的需求选择使用,下面为大家详细介绍常见的java爬虫框架有哪些?各有什么特点?常见的java爬虫框架有哪些1、NutchNutch是一个基于Lucene,类似Google的完整网络搜索引擎解决方案,基于Hadoop的分布式处理模型保证了系统的性能,类似Eclipse 的插件机制保证了系统的可客户化,而且很容易集成到自己的应用之中。
总体上Nutch可以分为2个部分:抓取部分和搜索部分。
抓取程序抓取页面并把抓取回来的数据做成反向索引,搜索程序则对反向索引搜索回答用户的请求。
抓取程序和搜索程序的接口是索引,两者都使用索引中的字段。
抓取程序和搜索程序可以分别位于不同的机器上。
下面详细介绍一下抓取部分。
Nutch抓取部分:抓取程序是被Nutch的抓取工具驱动的。
这是一组工具,用来建立和维护几个不同的数据结构:web database,a set of segments,and the index。
下面逐个解释这三个不同的数据结构:1、The web database,或者WebDB。
这是一个特殊存储数据结构,用来映像被抓取网站数据的结构和属性的集合。
WebDB 用来存储从抓取开始(包括重新抓取)的所有网站结构数据和属性。
WebDB 只是被抓取程序使用,搜索程序并不使用它。
WebDB 存储2种实体:页面和链接。
页面表示网络上的一个网页,这个网页的Url作为标示被索引,同时建立一个对网页内容的MD5 哈希签名。
跟网页相关的其它内容也被存储,包括:页面中的链接数量(外链接),页面抓取信息(在页面被重复抓取的情况下),还有表示页面级别的分数score 。
链接表示从一个网页的链接到其它网页的链接。
因此WebDB 可以说是一个网络图,节点是页面,链接是边。
网络空间搜索引擎的原理研究及安全应用

网络空间搜索引擎的原理研究及安全应用搜索引擎是互联网上非常常用的工具,它可以帮助用户快速找到所需的信息。
而网络空间搜索引擎是一种特殊的搜索引擎,用于搜索和收集互联网上的信息。
本文将介绍网络空间搜索引擎的原理研究及其在网络安全中的应用。
1. 网络爬虫技术:网络空间搜索引擎需要通过网络爬虫技术获取互联网上的信息。
网络爬虫是一种自动化程序,它可以按照一定的规则自动浏览互联网并收集信息。
网络爬虫技术包括URL的提取、页面的下载和解析等步骤。
2. 数据索引与存储:网络空间搜索引擎需要将收集到的信息进行索引和存储,以便用户能够快速地搜索和查找。
索引是一种将数据整理成结构化格式的技术,可以大大提高搜索的效率。
存储则是将数据保存在磁盘或其他介质中,以便长期存储和管理。
3. 搜索算法和技术:网络空间搜索引擎需要有高效的搜索算法和技术,以便用户能够准确地找到所需的信息。
常见的搜索算法包括倒排索引、布尔搜索和向量空间模型等。
搜索技术还包括相似度计算、查询扩展和排序等操作。
1. 恶意网站检测:网络空间搜索引擎可以对互联网上的网站进行自动化的检测,识别出其中的恶意网站。
恶意网站包括钓鱼网站、恶意下载和漏洞利用等,它们可能对用户的信息安全造成威胁。
通过网络空间搜索引擎,可以对恶意网站进行快速识别和封锁,提高网络安全防护的能力。
2. 威胁情报采集:网络空间搜索引擎可以收集到互联网上的各种信息,包括威胁情报。
威胁情报是指有关网络攻击和威胁的信息,它可以帮助网络安全团队识别和防范潜在的威胁。
通过网络空间搜索引擎,可以自动化地采集和分析威胁情报,提高网络安全的响应能力。
3. 漏洞扫描与修复:网络空间搜索引擎可以发现互联网上存在的漏洞,并及时通知相关的组织和用户。
漏洞是一种软件或系统中的安全弱点,黑客可以利用漏洞进行攻击。
通过网络空间搜索引擎,可以自动化地扫描和识别漏洞,并及时修复,提高系统的安全性。
网络空间搜索引擎在网络安全中起着重要的作用。
网络爬虫技术3篇

网络爬虫技术第一篇:网络爬虫技术介绍网络爬虫技术是从网络上自动获取信息的一种技术,也叫做网页抓取或者网络蜘蛛。
它是一个自动地通过互联网采集网络数据的程序。
网络爬虫技术是搜索引擎的关键技术之一。
搜索引擎的底层就是一系列爬虫,通过爬虫从万维网上收集信息,然后通过算法对这些信息进行分析、处理、归类、排序等操作,最后呈现给用户。
网络爬虫技术的原理是模拟客户端向服务器发起请求,从而获取网络信息,并根据特定的规则,抓取需要的内容,保存到自己的数据库中。
网络爬虫技术的应用非常广泛,可以用于搜索引擎、数据挖掘、价格比较、信息监控等领域。
其中,搜索引擎应用最为广泛。
搜索引擎需要在短时间内从互联网上获取大量的网页,并对这些网页进行处理,将其中的信息提取出来,进行组织、处理、归纳、分析、挖掘,最终返回给用户。
为了避免网络爬虫造成的网站负荷和数据安全问题,很多网站会通过技术手段来限制网络爬虫的访问。
一些常用的限制手段包括:robots.txt文件、访问频率限制、验证码验证,以及反爬虫策略,如IP封锁、JS反爬虫等。
网络爬虫技术不仅有着广泛的应用范围,而且也有着复杂的技术要求。
爬虫涉及到的技术领域非常广泛,包括但不限于:Java开发、Python编程、分布式计算、数据库管理、网络安全等。
同时,最为关键的是对抓取的数据进行分析,得出有效的信息,这需要掌握一定的数据分析技能。
网络爬虫技术的出现,使得人们可以更加方便地获取互联网上的信息,提高了互联网信息的利用价值。
然而,随着人们对网络爬虫技术的使用,也引发了一系列的争议,包括隐私问题、版权问题、以及对于商业利用的限制问题。
总之,网络爬虫技术是互联网信息采集处理与利用的关键技术。
随着人们对它的需求日益增加,未来网络爬虫技术将会得到进一步的发展和应用。
第二篇:网络爬虫技术的发展与挑战网络爬虫技术自20世纪90年代发展以来,一直在不断地发展和创新。
一方面,随着互联网的快速发展和互联网用户行为方式的不断演进,网络爬虫的使用也不断发展出各种新的应用形态;另一方面,各种阻挡网络爬虫的技术和策略也不断更新,对爬虫技术提出了新的挑战。
网络蜘蛛的基本原理与实现

网络蜘蛛的基本原理与实现摘要目前搜索引擎最重要的事情之一就是如何使搜索引擎快速准确地从庞大的网页数据获取所需资源的需求。
本文从网络蜘蛛的介绍出发,阐述网络蜘蛛的搜索策略以及相关算法,以及提出改进网络蜘蛛搜索优化的相关方法,以便改进后的网络蜘蛛能够更有效地发现和搜集信息。
在对网络蜘蛛系统结构和工作原理所作分析的基础上, 使用Java实现了一个专门搜取招聘信息的网络蜘蛛程序,并对其运行结果做了分析。
关键词:网络蜘蛛,搜索引擎,搜索策略,JA V A目录1 研究背景与意义 (3)1.1研究背景 (3)1.2研究意义 (3)2 研究现状与发展动态 (4)3 搜索引擎概述和基本原理 (5)3.1 搜索引擎概述 (5)3.2 搜索引擎工作原理 (5)4 网络蜘蛛基本原理 (6)4.1 网络蜘蛛在搜索引擎中的位置和基本原理 (6)4.2 网络蜘蛛的搜索策略 (7)5 JA VA编程技术 (8)5 .1 JA VA I/O编程技术 (8)5.1.1 创建输出流 (9)5.1.2 创建输入流 (9)5.2 JA VA套接字编程技术 (10)5.2.1 使用JA VA进行socket编程 (11)5.3 线程 (13)5.3.1 创建线程 (13)5.3.2 线程间通信 (14)6 系统实现 (15)6.1 系统的体系结构设计 (15)6.2 运行及开发环境 (15)6.3系统的功能实现 (16)6.3.1 公司页面解析器 (16)6.3.2 搜索类 (19)6.3.3 正则式提取类 (21)7 网络蜘蛛搜索优化 (25)8 运行实例 (26)参考文献 (28)附录小组成员及其分工..........................................................错误!未定义书签。
1 研究背景与意义1.1研究背景随着Internet的快速发展,网络正在深刻地影响着我们的生活。
而在网络上发展最为迅速的WWW(World Wide Web)技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:课程设计题目网络爬虫搜索引擎学院管理学院专业信息管理与信息系统班级姓名指导教师王新201 年7 月 4 日课程设计任务书学生姓名:指导教师:王新工作单位:信息管理与信息系统系题目: 网络爬虫搜索引擎初始条件:合理应用Java相关知识与编程技能,结合UML面向对象设计,解决信息管理领域的实际问题,如学生成绩管理、学籍管理、图书借阅管理、自动存取款机、通信录管理、商品销售管理、医院门诊管理、火车订票管理、影院自动售票、世界杯足球比赛管理、人力资源管理、酒店前台管理、房产中介管理、停车收费管理等。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.进行需求分析,撰写需求文档,绘制用例图。
2.识别需求文档中的类,建模类,初步绘制类图(之后逐渐完善)。
3.确定、建模类的实例变量。
4.确定、建模类的方法。
5.若有需要,在系统中加入继承与多态。
6.将UML图转换成Java代码框架。
7.设计算法,若有复杂的数据结构需求,使用相应集合框架。
8.设计数据访问层,若有数据持久化需求,使用数据库/文件。
9.添加表示层,若程序运行在桌面,使用图形用户界面。
10.实现完整的系统,最终Java源代码至少在300行以上。
11.进行测试,并给出相应结果。
课程设计报告中要求详细描述思路、步骤、方法、实现、问题及解决过程、操作说明、测试及结果。
时间安排:1.2014年6月23日课程设计选题、查阅资料2.2014年6月24日~25日UML面向对象设计3.2014年6月26日~7月1日Java程序设计与代码调试4.2014年7月2日改进、完善、测试系统5.2014年7月3日~7月4日上午撰写、提交课程设计报告6.2014年7月4日下午课程设计答辩指导教师签名:年月日系主任(或责任教师)签名:年月日网络爬虫搜索引擎1项目介绍1.1开发背景该项目软件开发的意图是开发出一款网络爬虫软件。
应用目标为搜集网络信息,便于查询使用。
在如今的BIG DATA时代,网络信息庞大而又复杂,用户很难直接从中获得需要的信息。
网络爬虫软件就是将这些信息收集并整理,当用户发起搜索请求时,该系统可将用户最需要的信息反馈给用户。
1.2用户的特点本软件为免费软件,可供所有可使用互联网的用户使用。
最终用户只需掌握基本的上网技术即可,操作人员的主要工作是启动和关闭服务器,只需掌握基本的电脑使用方法即可。
维护人员需要专业的程序员,懂得Java的网络编程以及计算机网络基础,教育水平在专科以上。
软件的预期工作时间为24h/日。
组织结构图及用户角色如图表1-1所示:1.3需求分析1.3.1各子模块功能的描述本系统共分为三大模块:爬虫模块、数据库模块和搜索模块,也就是后台、前台和数据库。
每一个模块有各自的分工,最后三大模块集合在一起构成一个完整的网络爬虫系统。
各个子模块的详细功能如下:1.3.2爬虫模块第一个模块为爬虫模块。
爬虫模块的主要任务是负责寻找网页,并将网页内的URL和关键字提取出来。
此模块又详细分为两大模块:服务器模块和正则引擎模块,这两个模块分别负责上述的两个功能。
服务器模块向某个种子URL发送请求,或得其页面内容;正则引擎模块将服务器获取的页面用正则表达式对其进行分析,截取其中的URL和关键字,然后再将URL传递给服务器模块。
系统按照这样的方式不断的抓取网页并进行分析,最后将结果存进数据库。
1.3.3搜索模块第二个模块是搜索模块,用户在搜索界面输入关键字,然后系统在数据库中搜索对应的关键字,最后将结果返回给用户。
此模块又分为搜索界面和结果界面。
搜索界面是首页,用户在此界面中输入想要搜索的关键词,这些关键词将被此页面记录下来传递到数据中进行搜素。
结果页面是数据库结果的接受者,当数据库完成搜素后会将结果传递给次页面,然后结果页面会将结果呈现给用户。
1.3.4数据库模块数据库模块在整个系统中起到存储和桥梁作用。
爬虫模块将搜索的结果整理完成后存入数据库,搜索模块从数据库中获取需要的信息并呈现给用户。
1.4对非功能性的需求1.4.1精度该系统的输入为一个字符串,里面包含了一个或多个关键字,长度在38个汉字以内,超过的部分将被直接舍弃。
输出的数据要求包括网站的URL和页面简介,按照页面内容与搜索内容的匹配程度来排序。
1.4.2时间特性要求a)响应时间≤0.01sb)更新处理时间≤0.1c)数据的转换和传送时间≤0.1s1.4.3灵活性该系统运用的主要语言是Java,由于Java是一门跨平台的语言,所以本系统的兼容性比较强,只要配置了Java环境就可以运行。
当该系统与数据库MySQL 的接口发生变化时,系统在重新加载了新的驱动后要能够正常运行。
1.4.4输人输出要求输入:由用户输入搜索关键字,关键字类型为合法字符。
输出:显示结果列表或提示信息,包含页面地址、页面标题、页面描述的条目列表或字符串提示信息。
1.4.5故障处理要求出错输出信息:根据不同的错误提供不同的错误提示信息。
例如无网络连接、无法检索到结果。
出错处理对策:1)一般错误:显示错误信息,提示用户重新操作2)严重错误:重新启动,必要时启用备份恢复数据1.4.6其他专门要求如用户单位对安全保密的要求,对使用方便的要求,对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。
1) 健壮性:如果用户在发送搜索请求后与服务器连接中断,在用户重新连接后并重新请求时,系统应快速将信息反馈给用户。
2) 可维护性:新的管理员应该可以在10分钟以内掌握关闭和开启服务器等基本操作。
3)运行环境可转换行:任何装有浏览器的系统都应该可以访问服务器。
当服务器更换操作系统时,在部署好Java环境后应可以马上运行。
2程序设计2.1总体设计思想本软件通过客户端浏览器,用户设置自己的爱好,并通过http传给服务器,服务器接收信息执行响应操作。
2.3程序设计总体框图系统功能层次模块图如图1-2所示图表1-1 系统层次模块图2.4程序详细设计(1)RecordDAOProxy类UML设计(2)IRecordDAO类设计说明(3)DatabaseConnection类设计说明(4)RecordDAOImpl类设计说明(5)Record类设计说明(6)HtmlHelper类设计说明(7)SpiderThread类设计说明(8)DAOFactory类设计说明(9)Page类UML设计(10)测试类UML设计(7)主体程序UML类图源代码部分:①RecordDAOProxy.java代码import java.util.ArrayList;import com.engine.dao.impl.RecordDAOProxy;import com.engine.po.Record;import com.engine.util.HtmlHelper;/*** @author*/public class ResultController {private ResultController (){}private static ResultController resultController;/*** @return ResultController*/Public static synchronized ResultController getResultController(){if(resultController == null){resultController = new ResultController();}return resultController;}/*** @param keyWord* @return Record* @throws Exception*/public ArrayList<Record> queryResult(String keyWord) throws Exception { String[] keyWords = keyWord.split("\\s");ArrayList<Record> list = new ArrayList<Record>();RecordDAOProxy recordDao =null;for(int i=0; i<keyWords.length;++i){keyWord = keyWords[i];recordDao = new RecordDAOProxy();list.addAll(recordDao.getRecord("WHERE recordTitle LIKE \'%" + keyWord + "%\'"));recordDao = new RecordDAOProxy();list.addAll(recordDao.getRecord("WHERE recordContent LIKE \'%" + keyWord + "%\'"));}return list;}}②User.java代码import java.io.Serializable;public class User implements Serializable{private static final long serialVersionUID = 5612649006026227700L;private String no;private String name;private Integer age;private String sex;private String phone;private String imagePath;public String getNo() {return no;}public void setNo(String no) {this.no = no;}public String getName() {return name;}public void setName(String name) { = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getImagePath() {return imagePath;}public void setImagePath(String imagePath) {this.imagePath = imagePath;}}③BusinessObject.java代码import java.util.List;public class BusinessObject {int currentPos;User[] users;PropertiesUtil proutil;public BusinessObject(){currentPos = 0;proutil = new PropertiesUtil("config/telephone.dat");users = getAllUsers();}public User[] getAllUsers() {List <User> list = proutil.getUsers();User[] users2 = new User[list.size()];for(int i =0;i<list.size();i++){users2[i]=list.get(i);}return users2;}public User first() {currentPos =0;return users[currentPos];}public User previous() {if(currentPos >0){currentPos --;}return users[currentPos];}public User next() {if(currentPos < users.length - 1){currentPos ++;}return users[currentPos];}public User last() {currentPos = users.length - 1;return users[currentPos];}public void saveUser(User user) {proutil.save(user);users = getAllUsers();currentPos = Integer.parseInt(user.getNo()) - 1;}}④PropertiesUtil.java代码import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.List;import javax.swing.JOptionPane;public class PropertiesUtil {private ObjectInputStream ois = null;private ObjectOutputStream oos = null;private List<User> lstUsers = new ArrayList<User>();private String fileName = null;public PropertiesUtil(String fileName){this.fileName = fileName;}@SuppressWarnings("unchecked")public List<User> getUsers(){try {ois = new ObjectInputStream(new FileInputStream(fileName));lstUsers = (ArrayList<User>)ois.readObject();ois.close();}catch(FileNotFoundException e){intRecord();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return lstUsers;}public void save(User user){try {oos = new ObjectOutputStream(new FileOutputStream("config/telephone.dat"));int i;for( i = 0;i < lstUsers.size();i++){if(user.getNo().equals(lstUsers.get(i).getNo())){lstUsers.set(i, user);//修改break;}}if(i >= lstUsers.size()){lstUsers.add(user);//新增}oos.writeObject(lstUsers);oos.flush();oos.close();e.printStackTrace();}}/*** 若记录文件不存在,则初始化记录文件*/private void intRecord(){//创建文件File f = new File("config/telephone.dat");try {f.createNewFile();} catch (IOException e1) {e1.printStackTrace();}//新建一条记录User u = new User();u.setNo("1");u.setName("");u.setAge(0);u.setSex("F");u.setPhone("");u.setImagePath("");try {oos = new ObjectOutputStream(new FileOutputStream("config/telephone.dat"));lstUsers.add(u);oos.writeObject(lstUsers);oos.close();JOptionPane.showMessageDialog(null, "请重启本程序");System.exit(0);} catch (FileNotFoundException e1) {e1.printStackTrace();e1.printStackTrace();}}}⑤Test.java代码import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.util.ArrayList;import java.util.List;public class Test {private ObjectOutputStream oos = null;private List<User> lstUsers = new ArrayList<User>();User u1 = null;User u2 = null;User u3 = null;public Test() {try {oos = new ObjectOutputStream(new FileOutputStream("config/telephone.dat"));u1 = new User();u1.setNo("1");u1.setName("人物1");u1.setSex("M");u1.setAge(11);u1.setPhone("111");u1.setImagePath("config/demo8.jpg");lstUsers.add(u1);u2 = new User();u2.setNo("2");u2.setName("人物2");u2.setSex("F");u2.setAge(22);u2.setPhone("222");u2.setImagePath("config/demo4.jpg");lstUsers.add(u2);u3 = new User();u3.setNo("3");u3.setName("人物3");u3.setSex("F");u3.setAge(33);u3.setPhone("333");u3.setImagePath("config/demo2.jpg");lstUsers.add(u3);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {Test t = new Test();try {t.oos.writeObject(t.lstUsers);t.oos.close();} catch (IOException e) {e.printStackTrace();}}}⑥public class Result {private String recordLink;private String recordTitle;private String recordAbstractContent;private String keywordTimes;public String getRecordLink() {return recordLink;}public void setRecordLink(String recordLink) {this.recordLink = recordLink;}public String getRecordTitle() {return recordTitle;}public void setRecordTitle(String recordTitle) {this.recordTitle = recordTitle;}public String getRecordAbstractContent() {return recordAbstractContent;}public void setRecordAbstractContent(String recordAbstractContent) { this.recordAbstractContent = recordAbstractContent;}public String getKeywordTimes() {return keywordTimes;}public void setKeywordTimes(String keywordTimes) {this.keywordTimes = keywordTimes;}}⑦import java.sql.*;public class DatabaseConnection {private Connection con=null;private static final String DRIVER="com.mysql.jdbc.Driver";private static final StringURL="jdbc:mysql://localhost:3306/webengine?useUnicode=true&characterEncoding =utf-8";private static final String USER="root";private static final String PASS="1234";public DatabaseConnection() throws Exception{Class.forName(DRIVER);con=DriverManager.getConnection(URL, USER, PASS);}public Connection getConnection() throws Exception{return con;}public void close() throws Exception{if(con!=null){con.close();}}}⑧import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class SetCharacterEncodingFilter implements Filter { private String encoding;@Overridepublic void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stubthis.encoding = filterConfig.getInitParameter("encoding");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stubrequest.setCharacterEncoding(this.encoding);chain.doFilter(request, response);}@Overridepublic void destroy() {// TODO Auto-generated method stubthis.encoding=null;}}⑨import java.sql.*;import java.util.*;import com.engine.dao.IRecordDAO;import com.engine.po.Record;public class RecordDAOImpl implements IRecordDAO {@SuppressWarnings("unused")private Connection con = null;@SuppressWarnings("unused")private PreparedStatement stat = null;public RecordDAOImpl(Connection con) { this.con = con;}@Overridepublic boolean insertRecord(Record record) throws Exception { int i = 0;String sql = "insert into Result(recordTitle,recordContent,recordLink) values(?,?,?)";try {PreparedStatement preStmt = con.prepareStatement(sql);preStmt.setString(1, record.getRecordTitle());preStmt.setString(2, record.getRecordContent());preStmt.setString(3, record.getRecordLink());i = preStmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}if (i == 1) {return true;// } else {return false;}}@Overridepublic boolean clearAll() throws Exception {Connection conn;boolean flag = false;String sql;try {conn = con;sql = "delete * from Result";flag = stat.execute(sql);} catch (Exception ex) {System.out.println("Error : " + ex.toString());}if (flag) {return true;} else {return false;}}@Overridepublic ArrayList<Record> getRecord(String condition) throws Exception { ArrayList<Record> records = new ArrayList<Record>();String sql = "select recordLink,recordTitle,recordContent from Result " + condition;try{ResultSet rs=con.createStatement().executeQuery(sql);while(rs.next()){Record record=new Record();record.setRecordLink(rs.getString("recordLink"));record.setRecordTitle(rs.getString("recordTitle"));String content = rs.getString("recordContent");if(content.length()>=400){content = content.substring(0,400)+"...";}record.setRecordContent(content);records.add(record);}}catch (SQLException e) {e.printStackTrace();}return records;}public ArrayList<Record> getRecord(String where, int number)throws Exception {ArrayList<Record> records = new ArrayList<Record>();String sql = "select recordLink,recordTitle,recordContent from Result where " +where +" limit " + Integer.toString(number);try{ResultSet rs=con.createStatement().executeQuery(sql);while(rs.next()){Record record=new Record();record.setRecordLink(rs.getString("recordLink"));record.setRecordTitle(rs.getString("recordTitle"));String content = rs.getString("recordContent");if(content.length()>=400){content = content.substring(0,400)+"...";}record.setRecordContent(content);records.add(record);}}catch (SQLException e) {e.printStackTrace();}return records;}}⑩import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import com.engine.business.ResultController;import com.engine.po.Record;import com.engine.struts.form.GetResultForm;import com.engine.util.PageController;public class GetResultAction extends Action {public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {GetResultForm getResultForm = (GetResultForm) form;String keyWord = getResultForm.getKeyWord();if(keyWord == null||keyWord.equals("")){keyWord = (String) request.getSession().getAttribute("keyWord");}ResultController resultController = ResultController.getResultController();String str = request.getParameter("PageIndex");if(str==null){str = "1";}int currentPageIndex = Integer.parseInt(str);PageController pc = (PageController)request.getAttribute("pc");if(pc==null){pc = new PageController();ArrayList<Record> list = resultController.queryResult(keyWord);pc.setBigList(list);request.getSession().setAttribute("pc", pc);request.getSession().setAttribute("keyWord", keyWord);}pc.setCurentPageIndex(currentPageIndex);return new ActionForward("/Result.jsp");}}3调试过程(1)进入界面(2)搜索武汉理工大学招生信息网,出来以下界面(3)点击搜索首页或者页面最下方的首页或返回搜索首页都可以回到开始的界面4总结这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。