




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目目 录录 摘要 1 Abstract 2 第 1 章 引言 3 1 1 课题背景 3 1 2 国内外研究现状 3 1 3 课题的目的和意义 4 1 4 本章小结 4 第 2 章 相关技术及开发工具介绍 5 2 1 J2EE 简介 5 2 2 Lucene 6 2 3 开发环境及工具 7 第 3 章 系统总体设计 8 3 1 总体设计框架 8 3 2 系统基本功能 8 3 3 数据库设计 11 3 4 本章小结 13 第 4 章 部分系统模块详细设计与实现 14 4 1 邮箱管理模块 14 4 2 用户管理模块 18 4 3 JMS 应用 19 4 4 本章小结 22 第 5 章 邮件检索模块详细设计与实现 23 5 1 邮件的索引 23 5 2 邮件的搜索 27 5 3 搜索结果的高亮显示 30 5 4 本章小结 31 第 6 章 总结与展望 32 6 1 系统总结 32 6 2 系统实现部分效果图 32 6 3 发展前景 34 谢辞 35 参考文献 36 附 录 37 支持全文检索的邮件代理服务平台支持全文检索的邮件代理服务平台 多邮箱管理及多邮箱管理及 LuceneLucene 在邮件搜索上的应用在邮件搜索上的应用 摘要摘要 本文阐述了设计与实现支持全文检索的邮件代理服务平台的理论基础 设计 思想 整体架构等 其中最主要的是应用了 J2EE 中的 JavaMail JMS EJB3 中的消息驱 动 Bean 和 Lucene 本文着重阐述了 Lucene 全文索引及检索技术在该系统中的应用 包括 索引的建立 索引的修改 搜索 对搜索结果的高亮显示等 关键字 关键字 J2EE JavaMail 消息驱动 Bean Lucene 全文检索 Support Full text Search Platform for E mail Proxy Service Management of Multiple Mailboxes and Application of Lucene in Mail Search Abstract This paper describes the design and implementation support for full text indexing of e mail proxy service platform based on the theory design thinking the overall structure and so on The most important is the use of J2EE in the JavaMail JMS EJB3 of Message Driven Bean and Lucene This article focuses on the Lucene full text indexing and retrieval technology in the system including the establishment of the index index changes and search on the highlighted search results display Key words J2EE JavaMail Message Driven Bean Lucene Full text Search 第第 1 章章 引言引言 1 1 课题背景课题背景 电子邮件是一种用电子手段提供信息交换的通信方式 是 Internet 应用最 广的服务 通过网络的电子邮件系统 用户可以用非常低廉的价格 以非常快 速的方式 与世界上任何一个角落的网络用户联系 这些电子邮件可以是文字 图像 声音等各种方式 同时 用户可以得到大量免费的新闻 专题邮件 并 实现轻松的信息搜索 这是任何传统的方式也无法相比的 正是由于电子邮件 的使用简易 投递迅速 收费低廉 易于保存 全球畅通无阻 使得电子邮件 被广泛地应用 它使人们的交流方式得到了极大的改变 另外 电子邮件还可 以进行一对多的邮件传递 同一邮件可以一次发送给许多人 最重要的是 电 子邮件是整个网间网以至所有其他网络系统中直接面向人与人之间信息交流的 系统 它的数据发送方和接收方都是人 所以极大地满足了大量存在的人与人 通信的需求 当今社会是信息化的社会 人们并不仅仅满足于现有的电子邮件服务 由 于移动办公的需要 电子邮件服务由单纯的客户端收发邮件发展到了 Web 邮件 但电子邮件的发展还未就此停止 现在的人群当中存在一大批人是拥有不止一 个电子邮箱的 他们对电子邮件服务又有了新的需求 此时电子邮件服务就必 须满足支持多个邮箱管理的功能 1 2 国内外研究现状国内外研究现状 电子邮件发展到现在 用户使用电子邮件服务的方式有两种 一种是用户 使用个人计算机上的客户端软件 比如Outlook Foxmail等 Outlook是由美国 微软公司 Microsoft 出品的免费软件 与Internet Explorer浏览器软件捆绑发行 Foxmail是由国人张小龙编写的一个功能强大非商业软件 它实现了真正的多用 户 多账户 多POP3支持 自动进行拨号 能设置邮件过滤功能 能阅读和收 发Big5码的邮件 可以直接查看HTML格式邮件 这两种客户端软件只要通过 适当的配置后 就可以对邮件进行接收和发送 但单纯使用邮件客户端程序进 行邮件的收发已经不能满足用户移动办公的需要 另一种就是使用WebMail系 统 将E mail和Web结合在一起 即通过Web编程和适当的系统设置 使用户仅 仅以访问Web的方式就可以得到和使用完整的邮件服务的系统称为WebMail系 统 WebMail是目前Internet上最受欢迎和使用最多的服务之一 也是很多网站 必备功能之一 像网易 新浪等大型门户网站都提供了免费的WebMail服务 并在其中加入了一些别的实用功能 如Google的GMail提供给邮箱用户网络硬盘 用户可以将一些电子资料存入网络硬盘中 并提供了全文检索的功能 现在许 多WebMail系统在这些方面的改进越来越多 并在一定程度上满足了用户的要 求 但仅此还是不够的 1 3 课题的目的和意义课题的目的和意义 本课题意在设计并实现一种支持全文检索的邮件代理服务平台 使用户进 一步感受到电子邮件服务给他们带来的方便与快捷 虽然现有的邮件服务系统 已经比较完善 但对于多个邮箱的支持还是比较少的 而且对多个邮箱中的文 件进行统一管理的更少 因此有必要设计并实现一个支持多个邮箱收发邮件的 系统 对于这种服务系统 虽然现在在用户中使用地比较少 而且专门提供类似 服务的系统也不多 但随着电子邮件的发展 相信在这方面的需求会越来越突 出 而这种系统将会越来越得到用户的青睐 1 4 本章小结本章小结 本章主要介绍了支持全文检索的邮件代理服务平台的研究背景 国内外的 研究状况及本课题的目的和意义 第第 2 章章 相关技术及开发工具介绍相关技术及开发工具介绍 2 1 J2EE 简介简介 J2EE 是一种利用 Java 2 平台来简化企业解决方案的开发 部署和管理相关 的复杂问题的体系结构 J2EE 技术的基础就是核心 Java 平台或 Java 2 平台的 标准版 J2EE 不仅巩固了标准版中的许多优点 例如 编写一次 随处运行 的特性 方便存取数据库的 JDBC API CORBA 技术以及能够在 Internet 应用 中保护数据的安全模式等等 同时还提供了对 EJB Enterprise JavaBeans Java Servlet API JSP Java Server Pages 以及 XML 技术的全面支持 其最终目的就 是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构 J2EE 体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用 性 高可靠性以及可扩展性的应用的需求 通过提供统一的开发平台 J2EE 降 低了开发多层应用的费用和复杂性 同时提供对现有应用程序集成强有力支持 完全支持 Enterprise JavaBeans 有良好的向导支持打包和部署应用 添加目录 支持 增强了安全机制 提高了性能 13 2 1 1 JavaMail JavaMail 顾名思义 提供给开发者处理电子邮件相关的编程接口 它 是 Sun 发布的用来处理 email 的 API 它可以方便地执行一些常用的邮件传 输 我们可以基于 JavaMail 开发出类似于 Microsoft Outlook 的应用程序 虽然 JavaMail 是 Sun 的 API 之一 但它目前还没有被加在标准的java 开发工具包中 Java Development Kit 这就意味着你在使用前必须另外下载 JavaMail 文件 除此以外 你还需要有 Sun 的 JavaBeans Activation Framework JAF JavaBeans Activation Framework 的运行很复杂 在这里 简单的说就是 JavaMail 的运行必须得依赖于它的支持 在Windows 2000 下使用需要指定这些文件的路径 在其它的操作系统上也类似 2 1 2 JMS JMS Java Message Service Java 消息服务 是一组 Java 应用接口 它提供创 建 发送 接收 读取消息的服务 JMS API 定义了一组公共的应用程序接口 和相应语法 使得 Java 应用能够和各种消息中间件进行通信 这些消息中间件 包括 IBM MQ Series Microsoft MSMQ 及纯 Java 的 Sonic MQ 通过使用 JMS API 开发人员无需掌握不同消息产品的使用方法 也可以使用统一的 JMS API 来操纵各种消息中间件 通过使用 JMS 能够最大限度地提升消息应用的可移 植性 JMS 既支持点对点的消息通信 也支持发布 订阅式的消息通信 2 1 3 EJB3 EJB 是 sun 的服务器端组件模型 最大的用处是部署分布式应用程序 类 似微软的 com 技术 凭借 java 跨平台的优势 用 EJB 技术部署的分布式系统可 以不限于特定的平台 EJB Enterprise Java Bean 是 J2EE 的一部分 定义了一个用于开发基于组件 的企业多重应用程序的标准 其特点包括网络服务支持和核心开发工具 SDK 在 J2EE 里 Enterprise Java Beans EJB 称为 Java 企业 Bean 是 Java 的核 心代码 分别是会话 Bean Session Bean 实体 Bean Entity Bean 和消息驱动 Bean MessageDriven Bean Session Bean 用于实现业务逻辑 它可以是有状态的 也可以是无状态的 每当客户端请求时 容器就会选择一个 Session Bean 来为客户端服务 Session Bean 可以直接访问数据库 但更多时候 它会通过 Entity Bean 实 现数据访问 Entity Bean 是域模型对象 用于实现 O R 映射 负责将数据库中的表记录 映射为内存中的 Entity 对象 事实上 创建一个 Entity Bean 对象相当于新 建一条记录 删除一个 Entity Bean 会同时从数据库中删除对应记录 修改 一个 Entity Bean 时 容器会自动将 Entity Bean 的状态和数据库同步 MessageDriven Bean 是 EJB2 0 中引入的新的企业 Bean 它基于 JMS 消息 只能接收客户端发送的 JMS 消息然后处理 MDB 实际上是一个异步的无 状态 Session Bean 客户端调用 MDB 后无需等待 立刻返回 MDB 将异 步处理客户请求 这适合于需要异步处理请求的场合 比如订单处理 这 样就能避免客户端长时间的等待一个方法调用直到返回结果 2 2 Lucene Lucene 是 apache 软件基金会 jakarta 项目组的一个子项目 是一个开放源 代码的全文检索引擎工具包 即它不是一个完整的全文检索引擎 而是一个全 文检索引擎的架构 提供了完整的查询引擎和索引引擎 部分文本分析引擎 英文与德文两种西方语言 Lucene 的目的是为软件开发人员提供一个简单 易用的工具包 以方便的在目标系统中实现全文检索的功能 或者是以此为基 础建立起完整的全文检索引擎 Lucene 作为一个全文检索引擎 其具有如下突出的优点 索引文件格式独立于应用平台 Lucene 定义了一套以 8 位字节为基础的索 引文件格式 使得兼容系统或者不同平台的应用能够共享建立的索引文件 在传统全文检索引擎的倒排索引的基础上 实现了分块索引 能够针对新 的文件建立小文件索引 提升索引速度 然后通过与原有索引的合并 达 到优化的目的 优秀的面向对象的系统架构 使得对于 Lucene 扩展的学习难度降低 方便 扩充新功能 设计了独立于语言和文件格式的文本分析接口 索引器通过接受 Token 流 完成索引文件的创立 用户扩展新的语言和文件格式 只需要实现文本分 析的接口 已经默认实现了一套强大的查询引擎 用户无需自己编写代码即使系统可 获得强大的查询能力 Lucene 的查询实现中默认实现了布尔操作 模糊查 询 分组查询等等 9 2 3 开发环境及工具开发环境及工具 开发环境 Windows XP SP2 Java 环境 JDK 6 0 开发工具 MyEclipse 6 0 部署环境 Sun Java System Application Server 9 1 第第 3 章章 系统总体设计系统总体设计 3 1 总体设计框架总体设计框架 支持全文检索的邮件代理服务平台主要是利用 J2EE 和 Lucene 来架构 涉 及到 J2EE 中的 JSP Servlet JavaMail JMS EJB3 中的消息驱动 Bean 以及 Lucene 中的索引 搜索和高亮等 该系统的整体框架如图 3 1 所示 图图 3 1 支持全文检索的邮件代理服务平台整体框架支持全文检索的邮件代理服务平台整体框架 3 2 系统基本功能系统基本功能 支持全文检索的邮件代理服务平台主要是为满足用户有多个邮箱 并且需 要对多个邮箱进行统一管理 包括接收各个邮箱中的邮件 通过各个不同的邮 箱来发送邮件等 因此在该系统中需要提供的功能有 接收多个邮箱中的邮件 通过不同的邮箱发送不同的邮件 添加不同的邮箱 可以对收件箱中的邮件进行全文检索 对用户密码进行修改 对已添加的邮箱进行修改 3 2 1 系统模块结构图系统模块结构图 根据系统所具有的基本功能得到该系统的功能模块结构示意图 如图 3 2 所示 支持全文检索的邮件代理服务平台 注册 登录 邮件 管理 邮件 收发 邮件 检索 邮箱 管理 用户 管理 注 册 登 录 查 看 邮 件 删 除 邮 件 发 送 邮 件 修 改 邮 箱 删 除 邮 箱 修改 密码 索 引 邮 件 搜 索 邮 件 添 加 邮 箱 接 收 邮 件 图图 3 2 系统功能模块结构示意图系统功能模块结构示意图 3 2 2 各个模块功能概述各个模块功能概述 该系统中包含的功能有 注册 登录 接收邮件 写邮件 邮件管理 查 看 删除 回复 已发邮件管理 查看 删除 转发 邮箱管理 添加 删除 修改 邮件的索引和邮件的搜索 各个功能模块分别介绍如下 1 注册 注册部分主要是为了使刚开始使用该系统的用户能有自己唯一的一个账户 并能在注册之后使用该系统 用户所提供的密码是经过 DES 加密后才存储的 2 登录 登录部分主要是为了验证用户所提供的用户名和密码的合法性 若合法的 话 则提供给该用户相应的可靠服务 否则做非法用户处理 并且要求该用户 注册或者是提示该用户他所提供的用户名和密码是非法的 要求其重新登录 3 接收邮件 接收邮件部分主要是为了帮用户接收用户所提供的邮箱中的邮件 这是一 个后台的服务程序 用户自己是感觉不到什么时候接收到邮件的 但后台程序 会定时地为每一个用户提供邮件接收的服务 并且每个邮箱中的邮件是不会被 重复接收的 4 发送邮件 发送邮件部分是给用户提供发送新邮件之用 这里可以支持不同的邮箱发 送邮件 就是说虽然用户是在同一个地方写新邮件 发送邮件 但是该系统可 以根据用户所提供的不同的发件人 让用户用他自己的不同邮箱来发送信件 而接收信件的人则看到的也是不同的发件人 5 邮件管理 查看 删除 回复 邮件管理部分主要是提供用户查看邮件 删除邮件和回复邮件的功能 当 用户接收到新邮件时 收到的新邮件都会重点提示用户这是一封新邮件 让用 户很快就能看到是否有新的邮件 当有邮件时 用户可以查看邮件 查看的时 候 如果用户想回复该邮件 则点击 回复 系统就自动产生一封新的邮件 用户只需写好信的内容即可发送 当然 如果用户认为收件箱中的邮件已经没 有利用价值 就可以删除邮件 6 已发邮件管理 查看 删除 转发 已发邮件管理部分主要是为了用户方便管理已经发送的邮件和未发送成功 的邮件 凡是用户发送过的邮件 不管是否发送成功 用户都可以在已发邮件 中找到该邮件 并且可以删除和转发 7 邮箱管理 添加 删除 修改 邮箱管理部分主要是让用户可以添加自己已有的所有邮箱 之后该系统可 以帮用户在后台接收这些邮箱中的所有邮件 这是为了方便用户统一管理自己 的所有邮箱 在这里 用户可以随意添加 删除和修改自己的邮箱 8 邮件的索引 邮件的索引主要是为邮件的搜索做准备 只要系统在后台接收到新邮件 系统就会自动的为该邮件建立索引 方便用户以后对该邮件的搜索 这是由 Lucene 来实现的 这与直接对数据库进行搜索相比较 效率比较高 而且功能 也比较强 易于在以后扩展 9 邮件的搜索 邮件的搜索主要是提供给用户查找自己的相关邮件之用 这是通过之前建 立的邮件全文索引来实现的 应用 Lucene 中提供的搜索功能构建自己的搜索器 将搜索的结果返回给用户 并高亮显示一些关键字 能使用户很准确的找到自 己想要的邮件 3 3 数据库设计数据库设计 支持全文检索的邮件代理服务平台中存在有四种不同用处的表 包括用户 表 已收邮件表 已发邮件表 邮箱表 3 3 1 用户表用户表 用户表是用来存放已注册的用户名和密码 因此该表只有 2 个字段 包括 用户名和密码 用户实体 E R 图如图 3 3 所示 用户表的具体各字段设计如表 3 1 所示 用户 用户名密码 图图 3 3 用户实体用户实体 E R 图图 表表 3 1 用户表用户表 NameTypeNullableKey USERNAMEVARCHAR2 50 NOT NULL PASSWORDVARCHAR2 50 NOT NULL 3 3 2 已收邮件表已收邮件表 已收邮件表是用来存放该用户所有邮箱中的邮件 该表中有 8 个字段 包 括序列 sid 邮件的 ID 发件人 mailfrom 收件人 mailto 邮件主题 subject 邮 件内容 content 时间 time 和状态 state 已收邮件实体 E R 图如图 3 4 所示 已 收邮件表的具体各字段设计如表 3 2 所示 已收邮件 序列邮件 ID收件人 发件人主题内容 状态 时间 图图 3 4 已收邮件实体已收邮件实体 E R 图图 表表 3 2 已收邮件表已收邮件表 NameTypeNullableKey SIDNUMBERNOT NULL IDVARCHAR2 100 NOT NULL MAILFROMVARCHAR2 100 NOT NULL MAILTOVARCHAR2 100 NOT NULL SUBJECTVARCHAR2 200 NOT NULL CONTENTCLOB TIMEVARCHAR2 30 NOT NULL STATEVARCHAR2 2 3 3 3 已发邮件表已发邮件表 已发邮件表是用来存放该用户已经发送过的邮件 该表中有 8 个字段 包 括序列 sid 邮件的 ID 发件人 mailfrom 收件人 mailto 邮件主题 subject 邮 件内容 content 时间 time 和状态 state 该表与收件箱表的设计相同 已发邮件 实体 E R 图如图 3 5 所示 已发邮件表的具体各字段设计如表 3 3 所示 已发邮件 序列邮件 ID收件人 发件人主题内容 状态 时间 图图 3 5 已发邮件实体已发邮件实体 E R 图图 表表 3 3 已发邮件表已发邮件表 NameTypeNullableKey SIDNUMBERNOT NULL IDVARCHAR2 100 NOT NULL MAILFROMVARCHAR2 100 NOT NULL MAILTOVARCHAR2 100 NOT NULL SUBJECTVARCHAR2 200 NOT NULL CONTENTCLOB TIMEVARCHAR2 30 NOT NULL STATEVARCHAR2 2 3 3 4 邮箱表邮箱表 邮箱表是用来存放该用户所添加的所有邮箱 该表中有 3 个字段 包括序 列 id 邮箱名 email 和密码 password 邮箱实体 E R 图如图 3 6 所示 邮箱表 的具体各字段设计如表 3 4 所示 邮箱 序列邮箱名密码 图图 3 6 邮箱实体邮箱实体 E R 图图 表表 3 4 邮箱表邮箱表 NameTypeNullableKey IDNUMBERNOT NULL EMAILVARCHAR2 50 NOT NULL PASSWORDVARCHAR2 50 NOT NULL 3 4 本章小结本章小结 本章主要介绍了支持全文检索的邮件代理服务平台的总体设计框架 系统 基本功能模块 数据库的设计 让读者对该系统有一个总体的认识 下一章将 具体阐述邮箱管理 用户管理及 JMS 应用的详细设计和实现 第第 4 章章 部分系统模块详细设计与实现部分系统模块详细设计与实现 在支持全文检索的邮件代理服务平台中一共有六个模块 如图 3 2 所示 分别为注册登录 邮件管理 写邮件 邮箱管理 用户管理和邮件检索 由于 该系统是由两人合作完成 因此在本章将详细介绍该系统的邮箱管理和用户管 理模块 4 1 邮箱管理模块邮箱管理模块 在邮箱管理模块中 包括添加邮箱 修改邮箱和删除邮箱 其给用户所提 供的功能为 用户可以添加其所有邮箱到该系统中 系统在后台负责管理其已 添加的所有邮箱 但有一点用户应该注意的 在添加邮箱的时候 用户应该提 供其正确的邮箱用户名和密码 确保系统能真正管理该邮箱 因为系统不会去 检查该邮箱的合法性 当然用户还可以修改其之前所添加的邮箱 以防用户输 入错误 如该邮箱对用户来说已经没有使用价值的话 该邮箱可以被删除 4 1 1 添加邮箱添加邮箱 在该模块中的添加邮箱部分 系统只是比较简单的将用户所提供的用户名 和密码存入了系统的数据库中 若用户提供的邮箱用户名和密码有误的话 系 统将接收不到该邮箱中的邮件 自然不能为用户起到管理邮箱的作用 在用户添加邮箱的时候 为了能让用户能及时的看到他那个邮箱中的邮件 在添加邮箱成功的时候 程序会开一个接收邮件的线程 让这个线程去接收这 个邮箱中的邮件 这样在后台开启一个线程 用户也不能觉察到接收邮件的过 程 但后台程序确实已经开始接收邮件的工作了 只要过一定时间 用户就可 以在他的收件箱中看到已经收到的邮件 该模块中添加邮箱部分的具体实现 用 request 类中的 getParameter 方法得到用户在 setupMailBox jsp 页面中所 提交的邮箱名和密码 用 DES 加密算法对用户提交的密码进行加密处理 根据以上得到的邮箱名和密码 实例化一个邮箱类 通过 JNDI 查找数据源 jdbc oracleds 得到一个数据库的连接 将实例化的一个邮箱类 通过 MailBoxDAOJdbc 类来存入数据库 存入数据库成功的话就开启一个接收邮件的一个线程 来接收刚添加的邮 箱中的邮件 否则 页面跳转回添加邮箱的页面 setupMailBox jsp 在该模块的实现中 添加邮箱部分用到了 JDBC Servlet 和 JSP 技术 实 现的流程图如图 4 1 所示 当前用户的输入的密码 与数据库中的是否相同 用户输入当前用户 的密码和新密码 开始 通过数据源得到一 个数据库的连接 结束 更新数据库中的 当前用户的密码 是 否 图图 4 1 添加邮箱部分流程图添加邮箱部分流程图 部分代码简析 通过 request 类的 getParameter 方法得到邮箱名和密码 String email request getParameter email toString String mailServerName request getParameter mailServerName toString String emailpwd request getParameter emailpwd toString DES 加密 String emailpwd DES encrypt request getParameter emailpwd toString 实例化一个邮箱类 MailBox mb new MailBox mb setEmail email mailServerName 设置邮箱名 mb setPassword emailpwd 设置密码 通过 JNDI 查找数据源 Context initContext initContext new InitialContext DataSource ds DataSource initContext lookup jdbc oracleds 将邮箱类存入数据库 String insertSql insert into currentUser mailbox id email password values currentUser seq nextval PreparedStatement pstmt pstmt conn prepareStatement insertSql pstmt setString 1 mb getEmail pstmt setString 2 mb getPassword pstmt execute pstmt close 4 1 2 修改邮箱修改邮箱 在该模块的修改邮箱部分 系统也只是简单的将数据库中原有的密码更新 为用户新提交的密码 并不会去检查别的 因此该功能的实现比较简单 该模块中修改邮箱部分的具体实现 用 request 类中的 getParameter 方法得到用户在 modifyMailBox jsp 页面中 所提交的邮箱名和密码 用 DES 加密算法对用户提交的密码进行加密处理 根据以上得到的邮箱名和密码 实例化一个邮箱类 通过 JNDI 查找数据源 jdbc oracleds 得到一个数据库的连接 将实例化的一个邮箱类 通过 MailBoxDAOJdbc 类中的 updateMailBox 方法 来更新数据库中的密码 修改邮箱部分的流程图如图 4 2 所示 图图 4 2 修改邮箱部分流程图修改邮箱部分流程图 部分代码简析 由于在添加邮箱部分已经分析过部分相同的代码 在这里只简析不同的代 码片段 根据邮箱名来更新邮箱密码 String updateSql update currentUser mailbox set password password where id id PreparedStatement pstmt pstmt conn prepareStatement updateSql pstmt execute pstmt close 4 1 3 删除邮箱删除邮箱 在该模块的删除邮箱部分 系统根据邮箱在数据库中存储的 id 来删除邮箱 在数据库中的记录 因此该功能的实现也比较简单 该模块中修改邮箱部分的具体实现 用 request 类中的 getParameter 方法得到用户在 modifyMailBox jsp 页面中 得到邮箱在数据库中的 id 通过 JNDI 查找数据源 jdbc oracleds 得到一个数据库的连接 将实例化的一个邮箱类 通过 MailBoxDAOJdbc 类中的 deleteMailBox 方法 来删除数据库中的邮箱 修改邮箱部分的流程图如图 4 3 所示 图图 4 3 删除邮箱部分流程图删除邮箱部分流程图 部分代码简析 由于在添加邮箱部分已经分析过部分相同的代码 在这里只简析不同的代 码片段 根据邮箱 ID 来删除邮箱 String deleteSql delete from currentUser mailbox where id id 得到邮箱在数据库 中的 ID 开始 通过数据源得到一 个数据库的连接 根据邮箱 ID 删除邮箱 结束 PreparedStatement pstmt pstmt conn prepareStatement deleteSql pstmt execute pstmt close 4 2 用户管理模块用户管理模块 在用户管理模块中 只包括用户密码的修改部分 其给用户所提供的功能 为 用户可以为自己在该系统中的当前用户修改密码 这只是为了某些用户要 修改密码的需要 该模块中用户密码修改部分的具体实现 用 request 类中的 getParameter 方法得到用户在 modifyUserpwd jsp 页面中 得到用户输入的先前密码和新的密码 根据当前用户 从数据库中读取先前的密码 与用户输入的当前密码比对 看是否相同 如果相同的话 则实例化一个用户类 将数据库中的密码更新为用户输入 的新密码 若不相同的话 修改密码失败 用户密码修改部分的流程图如图 4 4 所示 当前用户的输入的密码 与数据库中的是否相同 用户输入当前用户 的密码和新密码 开始 通过数据源得到一 个数据库的连接 结束 更新数据库中的 当前用户的密码 是 否 图图 4 4 用户密码修改部分流程图用户密码修改部分流程图 部分代码简析 更新数据库中的用户密码 public static final String UPDATE USER SQL update users set password where username PreparedStatement pstmt conn prepareStatement UPDATE USER SQL pstmt setString 1 u getPassword pstmt settring 2 u getUsername pstmt executeUpdate pstmt close 4 3 JMS 应用应用 在本系统中 为了提高系统后台的工作效率 采用了消息中间件 实现异 步的消息传递 这对于本系统的稳定性是很关键的 由于本系统在后台要不断地帮用户处 理业务 包括邮件的接受和邮件的索引 而就这两部分 在系统中就有可能随 着时间的推移而业务不断地加重 因为有可能使用该系统的用户会越来越多 这样的话接收邮件和索引邮件的工作量就会越来越重 如果采用同步机制 则 严重影响系统的运行效率 用户体验也会越来越差 最终本系统就选择使用 JMS 的异步消息处理来解决此问题 4 3 1 JMS 消息模型消息模型 在 JMS 中 提供了两种模型 一种是点对点模型 另一种是发布 订阅模 型 点对点模型是与消息队列一起工作的 它们是点对点的 是因为客户端将 消息发送到一个队列 而另一个客户端将从这个队列中接收消息 点对点模型 示意图如图4 5所示 客户端 1队列客户端 2 消 息 消 息 发送 接收 确认 图图 4 5 点对点模型示意图点对点模型示意图 发布 订阅模型是发送方针对一个主题发送消息 多个接收方可以订阅他们 的主题 一个主题消息只能被传递给订阅该主题的接收方 同时一个接收方只 能接收他所订阅的主题中的消息 发布 订阅模型示意图如图 4 6 所示 发布者 Topic 发布 消息 订阅者 1 订阅者 2 消息 接收 订阅 消息 接收 订阅 图图 4 6 发布发布 订阅模型示意图订阅模型示意图 4 3 2 消息模型的选择消息模型的选择 根据本系统的特点 我们选择了点对点的消息模型 这是出于容易构建本 系统的基础上的 4 3 3 点对点模型在系统中的应用点对点模型在系统中的应用 确定选择点对点模型之后 开始构建本系统中特有的点对点模型 在本系 统中 消息的生产者是接收邮件的线程 接收邮件的线程一接收完一封邮件就 马上向消息队列中发送一条消息 而本系统中的消息队列是通过 Sun Java System Application Server 这个应用服务器提供的 只要对服务器中的某些设置 项进行适当的配置即可产生一个消息队列 消息的消费者是消息驱动 Bean 这 是 EJB3 里提供的 只要消息队列中一有消息 EJB 容器就会自动让消息驱动 Bean 去处理消息 在本系统中实现的点对点消息模型示意图如图 4 7 所示 接收邮件线程 消息队列 消息驱动 Bean 图图 4 7 系统实现点对点模型示意图系统实现点对点模型示意图 由于接收邮件是多线程的 因此消息驱动 Bean 的处理也是多线程的 这样 大大地提高了本系统的性能 但这样也给系统带来了其他问题 如线程之间的 同步问题 这下一章讲到邮件索引的时候会给出解决方案 4 3 4 消息驱动消息驱动 Bean 的实现的实现 本系统中 消息驱动 Bean MDB 是一个很重的部分 MDB 负责将邮件存 入数据库并索引邮件 1 具体实现 当消息到达时 判断是不是欲接收的消息 若是的话 就下一步 否则就 不接收 将消息转换为本地的一般邮件对象 将邮件对象存入数据库 若成功存入数据库 则索引这邮件对象 否则就不索引 2 核心代码 public void onMessage Message message ObjectMessage omsg null JMSMessage jmsg null try if message instanceof ObjectMessage omsg ObjectMessage message jmsg JMSMessage omsg getObject 转化为本地对象 String username jmsg getUsername String currentUser username substring username lastIndexOf 1 username length MailMessage msg jmsg getMsg 获取邮件对象 MsgSaveToDB mstdb new MsgSaveToDB boolean falg false falg mstdb saveMessage currentUser msg 保存邮件 if falg IndexUtil addIndex jmsg 索引邮件 catch Exception e e printStackTrace 4 4 本章小结本章小结 本章详细地介绍了支持全文检索的邮件代理服务平台中的两个模块 邮箱 管理和用户管理 这两个模块主要是侧重数据库的插入 删除和更新 使用户 比较方便的管理其所有邮箱和其账号密码 下一章将重点介绍在该系统中邮件 检索模块的详细设计与实现 第第 5 章章 邮件检索模块详细设计与实现邮件检索模块详细设计与实现 在支持全文检索的邮件代理服务平台中 邮件检索模块主要包括两部分 1 邮 件的索引 2 邮件的搜索 本章将具体介绍 Lucene 各方面的原理及在该系统中 的应用 包括对每一封邮件建立索引的过程 对邮件的搜索过程和对搜索结果 的高亮显示 5 1 邮件的索引邮件的索引 在该系统中的邮件索引是应用 Lucene 来实现的 5 1 1 Lucene 索引介绍索引介绍 Lucene 是一个高性能的 java 全文检索工具包 它使用的是倒排文件索引结 构 从实现方式上来看 倒排索引是典型的为满足实际应用需要而设计的一种 数据结构 这种数据结构中的每一个元素是一个索引项 每一个索引项是由关 键字属性值和关键字关联记录 或者记录的存放地址组成 这种结构的最大特 点是改变了以往的检索过程 通常的查找方法是先确定文档 然后在文档中顺 序查找后续的文档 倒排索引则是利用索引关键字直接确定文档列表 最后才 确定希望找到的文档列表 2 Lucene 索引结构图如图 5 1 所示 图图 5 1 Lucene 索引结构图索引结构图 在 Lucene 中 索引文件的存储还分两种结构 一种是多文件索引结构 另 一种是复合索引结构 多文件索引是使用一系列索引文件分别存储索引 分散管理数据的索引存 储格式 多文件索引在打开时需要读取大量文件 会大大占用系统的文件句柄 等资源 造成系统响应速度慢 甚至系统崩溃 2 因此 在本系统中 我们采 用复合索引结构 复合索引是把索引相关的一系列数据结构组织到少数几个文件中进行管理 的索引存储模式 复合索引把所有的索引数据被组合成简单的 3 个文件 大大 减少了打开大量文件的压力 但是使用统一文件存储大量数据会造成数据更新 的问题 每次更改需要操作一个大的数据文件 读取和存储都会比较慢 对本 系统来说 因为数据量不是很大 所以并不会产生大的数据文件 因此 选择 以这种结构来存储邮件的索引文件是一种比较好的解决方案 5 1 2 Lucene 中的分词中的分词 对于分词 在 Lucene 这个全文检索工具包中 是一个非常重要的 因为如 果要对一篇文章建立全文索引 就必须先对这篇文章进行文本分析 对文章要 进行有意义的分词 这就必须要用到分词器 由于 Lucene 不是本国人开发的全文检索工具包 因此 Lucene 中自带的分 词器对于中文分词的支持不是很好 Lucene 包中有两个支持中文的分词器 一 个是 ChineseAnalyzer 另一个是 CJKAnalyzer 但是 ChineseAnalyzer 这个分词 器只是单字切分 而 CJKAnalyzer 分词器则是一个二分法的分词器 因此 总 的来说 Lucene 自带包中的分词器对中文分词的支持都不是很好 国内有一个比较出名的中文分词器 是中科院计算所开发的 ICTCLAS 但 由于这个分词器是用 C 开发的 因此如果在 Java 应用程序中使用的话 容易 出现不稳定的现象 最后 在我们这个系统中选择一个第三方提供的分词器 JE 分词器 这个分词器是基于词库的 所以分词的效果相对其余分词器的分 词效果要好 各种分词器分词效果比较 对 我爱我伟大的老爸老妈 我爱我壮丽的中华 这句话进行分词 ChineseAnalyzer 分词结果 我 爱 我 伟 大 的 老 爸 老 妈 我 爱 我 壮 丽 的 中 华 CJKAnalyzer 分词结果 我爱 爱我 我伟 伟大 大的 的老 老爸 爸老 老妈 我爱 爱我 我壮 壮丽 丽的 的中 中华 JE 分词器分词结果 我 爱我 伟大 老爸 老妈 我 爱我 壮丽 中华 5 1 3 建立邮件建立邮件索引索引 了解 Lucene 建立索引过程的原理之后 我们要对本系统进行定制邮件索引 器 在本系统中的一封邮件包括 6 个部分 分别是邮件 ID 收件人 发件人 邮件主题 邮件内容和发信时间 1 邮件索引的需求 在本系统中 要求建立的邮件索引必须能够支持用户对邮件的收件人 发 件人 邮件主题 邮件内容和发信时间进行搜索 因此在一封邮件中 除了邮 件 ID 不被搜索到 邮件的其余部分都要能被搜索到 但是邮件 ID 有其特殊的 功能 所以在本系统中 每一封邮件的各个部分都建立相关的索引 2 建立索引的具体实现 判断要存放索引的路径是否被锁定 若没被锁定 就下一步 否则就等待 该锁定的路径被解锁 用路径名和 JE 分词器生成一个 IndexWriter 对象 生成一个 Document 对象 生成一个邮件 ID 的索引域 并加入到 Document 对象中 生成一个收件人的索引域 并加入到 Document 对象中 生成一个发件人的索引域 并加入到 Document 对象中 生成一个邮件主题的索引域 并加入到 Document 对象中 生成一个邮件内容的索引域 并加入到 Document 对象中 生成一个发信时间的索引域 并加入到 Document 对象中 将 Document 对象添加到 IndexWriter 对象中 IndexWriter 对象进行索引优化操作 关闭 IndexWriter 3 建立邮件索引核心代码 public static boolean addIndex String path MailMessage msg String indexPath path try while IndexReader isLocked indexPath IndexWriter writer new IndexWriter indexPath new MMAnalyzer Document doc new Document Field field new Field id msg getId Field Store YES Field Index UN TOKENIZED doc add field field new Field from msg getMailfrom Field Store YES Field Index TOKENIZED doc add field field new Field to msg getMailto Field Store YES Field Index TOKENIZED doc add field field new Field subject msg getSubject Field Store YES Field Index TOKENIZED doc add field field new Field content StringUtil removeHtml msg getContent Field Store YES Field Index TOKENIZED doc add field field new Field time msg getTime Field Store YES Field Index TOKENIZED doc add field writer addDocument doc writer optimize writer close catch IOException e e printStackTrace return false catch Exception e e printStackTrace return true 4 邮件建立索引过程中的三处细节 由于邮件建立索引是采用多线程实现的 就是在同一时刻有可能存在多个 索引程序在运行 如果有一个程序在为邮件建立索引的时候 则另一个索 引程序要等待其完成才能开始为邮件建立索引 否则将产生写冲突 即 while IndexReader isLocked indexPath 这行代码是至关重要的 邮件 ID 在建立索引的时候不能被分词 否则就失去了邮件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 31080-2025水产品冷链物流服务规范
- GB/T 20644.1-2025特殊环境条件选用导则第1部分:金属表面防护
- 森林水文学课件
- 电力系统职业技能鉴定考试试题及答案
- 2025年市场营销经理职位招聘笔试题及解题策略
- 2025年篮球裁判规则题库及答案
- 2025年轻微型无人机考试题库含完整答案详解【易错题】
- 2025年电力行业信息技术部招聘面试全攻略及模拟题答案
- 2025年初级无损检测员磁粉-MT-模拟面试题及答案详解
- 2025年市场营销经理专业技能考核预测题
- 2025年幼儿园教师大班数学工作总结样本(3篇)
- 2025年毕节市农业发展集团有限公司招聘考试笔试试题(含答案)
- 供应链安全管理知识培训课件
- 牛鼻子引流技术
- (2025年标准)班组承包协议书
- 2025国家能源投资集团有限责任公司审计中心社会招聘12人笔试参考题库附带答案详解(10套)
- 2025年全国I卷高考地理试题和答案
- 深圳微利房管理办法
- 生产安全会议纪要
- 护理文书书写PDCA案例
- 制作瓷器培训课件
评论
0/150
提交评论