基于Web的图书推荐系统展示平台

一,摘  要 ​ 推荐系统是目前互联网中最常见的一种智能产品形式,由于网络中信息量的快速增长以及图书出版行业出版量的攀升,人们需要一种办法,来解决信息过载的问题

本文包含相关资料包-----> 点击直达获取<-------

一、摘  要

​ 推荐系统是目前互联网中最常见的一种智能产品形式。由于网络中信息量的快速增长以及图书出版行业出版量的攀升,人们需要一种办法,来解决信息过载的问题。此外,用户访问网络是为了获取信息,但并不是所有的访问都有很强的目的性,所以对于这些没有明确的目的的访问,就需要智能系统把一些用户可能感兴趣的信息推送给用户。基于这些需求,图书网站的推荐功能就变得非常重要。

​ 本文首先对图书推荐系统的发展历史做了介绍,然后对开发图书推荐系统所需的项目管理工具(Maven、Git)、数据持久化工具(MyBatis,Spring MVC 框架)和 Bootstrap 前端开发框架进行了简单分析,在此基础上,设计并开发了一套基于 Web 的图书推荐系统展示平台,主要工作可概括为四个方面。

​ 对图书推荐系统的结构进行了重新设计。主要是在 Spring MVC 框架的基础上,将系统分为了三层:Web 层、服务与模块层、数据层,并对每层的结构与需要完成的功能做了定义。

  • 基于 MySQL 数据库管理系统,设计并建立了图书推荐系统所需的数据库,该数据库的数据共分为三个部分:原始数据、清洗后数据和用户数据。
  • 从便于操作和使用的角度出发,设计了图书推荐系统的页面,主要包括首页、搜索、展示、登录、注册等页面。
  • 对整个开发过程以及系统组成的三个主要类:控制器类、模块类与视图类进行了分析。

经过后期的数据库优化与功能测试,系统与同类网站相比,性能良好。

关键词 :基于 Web 的图书推荐系统;展示平台;MVC 框架;Web 系统设计

二、引  言

图书推荐功能在图书馆网站,图书销售网站,以及图书分享网站中都占有很重要的地位。它可以根据长尾理论挖掘图书数据,改善用户体验,增加用户的粘性,解决信息过载问题。

本论文的目的就是要构建一个图书推荐系统的展示平台,将图书信息以及推荐内容,显示在页面之上。并且支持用户的注册登录,用来提供数据,使得推荐算法可以依照此数据来计算出用户喜好,进而向用户推送推荐信息。

在推荐系统领域,最为成功的该属亚马逊网站,在亚马逊的收入中,有 20%~30% 的都来自于推荐系统。而在图书馆等非盈利性网站,图书推荐系统也对优化用户的浏览体验以及均衡每本书的借阅率,都有促进作用。

系统后台是基于 Java 的 Spring MVC 框架与 Tomcat 服务器,前台基于浏览器、HTML 与 jQuery 页面展示技术,数据库基于 MySQL 开源数据库。利用 MVC 框架,可以方便地构建出健壮、扩展性强的应用。MySQL 数据库,作为最热门的开源数据库,提供了完整的关系数据库支持与成熟的数据存储解决方案。浏览器展示技术,使用户不需要在操作系统中安装独立的应用,并且使得系统的访问不局限于某个操作系统,适用面变得更广。系统提供推荐内容的展示,图书排行的展示,图书搜索,图书详细内容展示,用户登录注册等基本的图书推荐系统所具有的功能。界面使用 Bootstrap 框架,布局对用户更加友好。

整个系统通过实现一个轻量的框架,来提供完整的图书推荐功能,后续的功能可以方便地在此基础上扩展。相对于其它的系统,有小巧、灵活的优点,并且本系统全部采用开源软件,因此几乎为零成本。在引用第三方库的过程中,不对其源码进行修改,减少耦合,使得之后第三方库的升级也不会对系统有大的影响。系统在一台机器上部署,并且在同一网段的另一台机器上访问测试后,性能表现良好。

三、文献综述

如今,推荐系统无处不在。在网上逛商城,购物,在音乐网站听歌,在社交网站发表自己的感受以及分享照片,网站服务提供商都会收集用户的访问记录以及用户的喜好,对用户的行为进行分析并且根据用户喜好以及用户群体统计信息,给用户提供相似物品的推荐以及广告推送,进而增加商家的销量,提高网站质量。

一般认为,推荐系统这个研究领域源于协同过滤算法的提出。从它的诞生到现在 20 多年中,很多学者和公司对推荐系统的发展做出了重要的贡献。随着信息技术和互联网的发展,人们逐渐从信息匮乏的时代走入了信息过载的时代[1]。而图书出版物等作为一个传统的信息载体,在人类发展的过程中不断增多,一些大的互联网公司与网络图书销售商,比如谷歌、亚马逊等,也一直在为图书的数字化做着贡献。从 2004 年谷歌宣布他的图书搜索服务之后,到 2012 年,共有两千万本图书扫描、经由光学字符识别并存储于数字化数据库中作为搜索数据[2]。这些数据为图书推荐提供了丰富的基础。

本系统采用 BS 结构,对数据库中的图书内容进行查询、处理,对查询结果进行展示,并且提供用户注册登录以及采集用户访问记录的功能。在服务器端采用 Spring MVC 框架与对象持久化技术对图书信息进行处理,在客户端使用浏览器技术对数据进行展示与交互,最终完成图书通过 Web 平台展示、推荐与相关图书搜索的功能。

3.1 课题背景

3.1.1 图书推荐系统发展背景

随着互联网的快速发展,网络中的图书信息量迅速增长,图书种类也日趋繁多,用户通过互联网要获得自己感兴趣的图书文章需要花费越来越多的时间。由此催生了图书推荐系统。图书推荐系统的基本作用是依据用户的访问记录,特定行为,分析用户的喜好,主动向用户推荐可能喜欢的图书与文献给用户,供用户参考[3]。推荐系统满足了用户个性化的需求,节省了用户搜寻信息的时间,获得和用户喜好相关的最热门最新的图书。在许多商务网站,社交网站中,都使用推荐系统来向用户推荐商品。

在线售卖领域,亚马逊拥有最好的图书推荐系统。在过去的十多年里,亚马逊投入了大量的精力去建立一个包含大众推荐和个人记录的高效个人推荐系统,其最显著特点就是所有的推荐都建立在对顾客以往的浏览记录和购买记录之上[4]。

亚马逊可以向用户精确的投放畅销书以及经典书推荐信息,每月有评有畅销书排行榜,通过简洁美观的介绍与醒目的导航,引导读者阅读与购买。另外,在畅销书的介绍中,还有本书在相关的分类栏目中的排名,并且有链接指向此分类的畅销排行榜,读者可以方便的查询同类书中最畅销的书籍。在书籍介绍底端还有购买过此书的人还购买了的书籍,购买的比例,以及同类书籍的推荐信息。在首页还有促销书的推荐,用于吸引没有明确目的,而想要以优惠的价格购书的消费者。在经典书方面,亚马逊推出年度畅销图书排行,年度编辑推荐 100 本畅销书等手段,依据惯性定律,进一步推动图书的销售。其中排序规则还根据用户的评价,人气、出版日期等,迎合不同人的喜好。

3.1.2 主要技术发展背景

Spring 框架是一个开源的应用框架,基于 Java 平台的控制反转容器。第一个版本是 Rod Johnson 在他 2002 年十月出版的《Expert One-on-One J2EE Design and Development》书中发布的。第一次在 Apache 2.0 license 下发布是在 2003 年六月,在 2004 年三月,发布了第一个里程碑:1.0 版本。在 2006 年,Spring 框架 1.2.6 版本获得了 Jolt productivity award 和 JAX Innovation Award。当前的版本 3.2.2 是在 2013 年三月发布的。

Spring Framework 的核心特性可以被用于任何的 Java 应用。尽管 Spring Framework 没有强加任何特殊的编程模块,它依旧在 Java 社区变得流行,并且有取代 Enterprise JavaBean 模块的趋势。

在 2001 年,Clinton Begin 开始一个叫做 iBATIS 的项目,刚开始,开发的重点是一个加密的软件解决方案。iBATIS 项目发布的第一个软件名字叫做 Secrets,一个个人的数据加密和登录工具。Secrets 完全的用 Java 实现,并且在开源协议下发布。

年,Clinton 开发了一个应用叫做 JPetStore 来展示 Java 可以比.NET 更高效,JPetStore 1.0 影响很大,并且其中用到的数据库层吸引了社区的注意。很快,iBATIS Database Layer 1.0 项目启动了,其中包括两个组件:iBATIS DAO 和 iBATIS SQL Maps。2004 年,iBATIS 2.0 发布,它是在保持原有特性上的全新设计。Clinton 将 iBATIS 这个名字和源代码都捐献给了 Apache Software Fundation,这个项目在 ASF 一直持续了六年。最终,iBATIS DAO 被抛弃了,因为有更好的 DAO 框架的出现,比如 Spring Framework。

在 2010 年 5 月 19 日,iBATIS 3.0 发布了,同时,开发团队决定将项目转移到 Google Code。由于 iBATIS 这个名称已经捐赠给了 ASF,所以项目改用了新名称 MyBatis。

c++ jQuery是一个多浏览器的JavaScript库,目的是简化客户端的HTML脚本编程。John Resig在2006年一月发布,目前有一个Dave Methvin领导的开发小组进行开发。在一万个最热门的网站中,他被65%的网站使用。jQuery是目前最流行的JavaScript库。

MySQL 是世界最广泛使用的开源关系数据库管理系统。它作为一个系统服务,允许多用户访问多个数据库。

MySQL 开发项目将代码依照 GNU General Public License 发布。MySQL 被一家瑞典的公司 MySQL AB 拥有并且提供赞助,这家公司现在隶属于 Oracle。

3.2 开展研究的意义

图书推荐系统 Web 平台用于支持图书内容的获取和图书推荐的展示。如果没有此平台,那么图书推荐系统就无法收集用户行为,统计用户喜好,展示推荐结果以及实现推荐系统的原有意义[5]。任何一个推荐系统都需要网络或者客户端平台来展示[6]。而构建这样一个后台服务器与浏览器客户端共同协作展示的平台,对于图书推荐系统具有重要的意义。

3.3 论文研究内容

本课题意图开发一套轻量、扩展性强、功能完善,性能良好的图书推荐系统。系统的最终目标是实现对图书内容进行展示、查询、用户登录注册,还有推荐信息的展示功能。用户通过浏览器与后台系统的 Java Servlet、数据库交互,完成展示、查询与用户管理的目的。

研究的着重点在于通过现有流行的开源系统、框架,来搭建轻量级的目标 Web 系统,在实现过程中更注重于代码结构与开发方法,所以并不追求功能的繁杂冗余。系统中数据来源于豆瓣,数据的抓取不是本课题研究的内容。为了使数据适用于 Web 系统,重新构建了表,并对数据进行了二次清洗。由于是展示平台,并不涉及图书推荐算法的实现与搜索功能的完善,所以搜索结果由数据库查询获得。但是在开发过程中为图书推荐与社会化图书搜索预留了接口,可以方便的加入这些功能。

3.4 论文的组织结构

  • 第一章,文献综述。先讲了课题的背景,从图书推荐历史和技术发展史两个方面介绍,之后介绍了开展研究的意义,最后明确了研究的工作重点。
  • 第二章,框架与工具介绍。对 Maven、Git 等项目管理工具,Spring MVC、MyBatis、Bootstrap、jQuery 等开发框架进行了介绍。
  • 第三章,基于 Web 的图书推荐系统展示平台的设计。对此 Web 系统所用到的数据库结构、页面原型、模块组成、总体的功能进行了论述。

第四章,基于 Web 的图书推荐系统展示平台的实现。介绍了对数据的二次清洗、数据库的创建、数据的导入、工程的搭建、模块的开发以及测试等。并介绍了测试过程中做的一些性能优化工作。

最后,结论。对本系统的优缺点做了一个总结,展望了一下未来的发展方向。

四、框架与工具介绍

4.1 Maven 介绍

4.1.1 Maven 概述

python Maven是一个主要用于Java项目的自动化构建工具。Maven与Apache Ant工具具有相似的目的,但是他们是基于不同的理念并且以不同的方式来工作。Ant还可以用来构建和管理C#,Ruby,Scala以及其他的语言开发的项目,但是Maven原生并不支持这些。Maven项目由Apache Software Fundation托管,之前是Jakarta Project项目的一个部分[7]。

Maven 使用 XML 文件来描述需要构建的软件项目、项目的依赖模块和组件、构建顺序、目录结构以及需要的插件。他具有预定义的目标来实现确切的任务,比如编译源码并打包。

Maven 动态地从一个或多个库中下载 Java 库和 Maven 插件,比如 Maven 2 Central Repository,并且将下载的内容保存到本地的缓存中。这个本地的下载缓存可以被本地项目更新,公共的库也可以被更新。

Maven 使用基于插件的体系来构建,他允许通过标准的输入控制任何的应用。理论上说,这将允许任何人为任何语言来在这个平台上编写插件。实际上,支持和使用除 Java 外其它语言的插件数量已经微乎其微。目前,只有支持.NET 框架以及一个 C/C++ 的原生插件还在被维护。

4.1.2 Maven 概念

项目对象模型(POM):一个项目对象模型提供一个项目的所有配置属性。一般配置包括项目名称,owner 和它的依赖。也可以通过插件,配置构建过程的各个阶段。比如说,用户可以配置编译插件,让它使用 Java 1.5 来编译,或者指定在一些单元测试失败以后,依旧打包工程。大的项目应该分成几个模块或者子项目,每个模块拥有自己的 POM。用户可以编写一个根 POM,通过这个根 POM 来使用一条命令来编译所有的模块。POM 也可以从其它 POM 文件继承配置信息。所有的 POM 文件默认继承自 Super POM。Super POM 提供默认的配置,比如默认源代码目录、默认插件,等等。

插件:大部分 Maven 的功能是通过插件来实现的。插件提供一组目标,并且可以通过以下的语法来执行:

c++ mvn [plugin-name]:[goal-name]

比如说,一个 Java 项目可以使用 compiler-plugin 的 complile-goal 来编译:mvn compiler:compile。Maven 插件提供构建、测试、源码控制管理、运行 Web 服务、生成 Eclipse 项目文件等等功能。插件由 pom.xml 文件中的 标签区域引入并且配置。

然而,如果构建、测试、打包一个软件项目需要手动运行下面每条 goal,那么,它将会变得非常笨重:

c++ mvn compiler: compile mvn surefire: test mvn jar: jar

Maven 的生命周期概念处理这类问题。

插件是扩展 Maven 的主要方式。可以通过继承 org.apache.maven.plugin.AbstractMojo 类来开发 Maven 插件。

构建生命周期:构建生命周期是一个用来给出为了达到 goal 所执行语句顺序的列表。Maven 的一个标准生命周期叫做“默认生命周期”,它包括以下语句:

c++ process-resources compile process-test-resources test-compile test package install deploy

插件提供的 goal 可以与不同的生命周期阶段相关联。比如说,默认情况下,“compiler:compile”的 goal 与编译阶段有关,而 goal“surefire:test”与测试阶段有关。考虑下面的命令:

c++ mvn test

当以上的命令被执行,Maven 运行所有的在 test 语句之前的 goal,直到 test 语句。在这种情况下,Maven 运行“resources:resources”goal,然后是“compiler:compile”,等等,直到最终运行“surefire:test”goal。

Maven 也有标准用来清理项目和生成项目站点的语句。如果清理是默认生命周期的一部分,那么项目将在每次构建的时候被清理,这显然不是想要的。所以,清理有它自己的生命周期。

标准的生命周期允许新用户能够通过一个简单的语句准确的构建、测试和安装每个 Maven 项目:

c++ mvn install

依赖:Maven 的依赖处理机制围绕一个坐标系统识别单个软件库或者模块。比如说,一个项目需要 Hibernate 库,仅仅需要在 POM 文件中声明 Hibernate 项目,Maven 将自动下载依赖和 Hibernate 自身的依赖,并且把它们存储在本地的仓库中。Maven 2 Central Repository 是默认的用来搜索的库,但是也可以在 POM 文件中自定义仓库。

还有一些其他的搜索引擎,比如说 Maven Central,可以被用来去不同的开源库和框架中寻找模块。

在同一个机器上开发的项目之间可以通过本地仓库来互相依赖对方。本地仓库是一个简单的目录结构,充当下载的依赖包的缓存与本地构建的项目的集中存储的地方。Maven 命令 mvn install 构建一个项目,并且把它的二进制文件放到本地仓库中。然后其它的项目可以通过在 POM 文件中添加项目来引用这个工程。

4.2 Git 介绍

4.2.1 Git 概述

Git 是一个分布式的版本控制系统和源代码管理系统。它最初是 Linus Torvalds 为 Linux 内核开发而设计开发的,从那以后,Git 就被许多其它的项目用来管理代码[8]。每个 Git 工作目录都是一个完整的仓库,保存着完整的历史和全部的版本跟踪能力,不需要依赖于网络连接或者一个中央服务器。Git 是基于 GNU General Public License version 2 的开源软件。

Git 设计灵感来自于 BitKeeper 和 Monotone。Git 最初被设计成一个底层的版本控制系统引擎,在它上方其他人可以编写前端,比如说 Cogito 和 StGIT。然而,核心的 Git 项目最终变成一个可以直接使用的完整的版本控制系统。由于受 BitKeeper 的严重影响,Torvalds 故意地试着避免传统的方法,最终实现了一个独一无二的设计。

4.2.2 Git 特性

Git 的设计来源于 Torvalds 在开发 Linux 过程中积累的管理大的分布式项目的经验和对文件系统性能的知识,以及在短期内构建一个可以工作的系统的需求。这些影响导致了以下实现方案:

对非线性开发的强大支持

Git 支持快速的分支和合并操作,并且包含专门的工具用来可视化和导航一个非线性的开发历史。Git 的一个核心设想是:由于项目被分给好多个人来完成,修改会更多的被合并,而不是被写入。在 Git 中,分支是非常轻量的:一个分支仅仅是一次提交的关联,通过其父提交历史,整个分支结构就可以创建出来。

分布式开发

就像 Darcs、BitKeeper、Mercurial、SVK、Bazaar 和 Monotone,Git 给每个开发者一份整个开发历史的本地副本,并且修改记录会从一个这样的本地仓库复制给另一个。这些修改作为附加的开发分支导入进来,并且可以合并到本地的开发分支中。

兼容已存在的系统和协议

仓库可以通过 HTTP、FTP、rsync 或者通过建立在纯 socket、SSH、或 HTTP 上的 Git 协议来推送。Git 还有一个 CVS 服务器模拟,用来让使用 CVS 客户端和 IDE 插件的用户来使用 Git 仓库。Subversion 和 SVK 仓库可以直接使用 git-svn。

高效处理大型项目

Torvalds 描述 Git 处理速度非常快、可扩展,并且 Mozilla 对其做的测试显示,它比一些版本控制系统快一个数量级,从本地存储的仓库获取比从远程服务器快一百倍。Git 甚至在项目历史变得很大的时候速度依旧不会减慢。

历史记录加密认证

Git 历史记录以这样一种方式存储:某次提交的 id 号取决于之前的完整的开发历史。一旦被发布了,就不可能再去修改旧的版本而不产生记录。这种结构就像一个 hash 树,但是在每个节点和叶子上,都有附加的数据。

基于工具的设计

Git 是 C 语言程序,它有一些 shell 脚本来对其进行封装。尽管大部分的脚本为了提升速度和可移植性,已经用 C 语言重写过,但是依旧有一些并且很容易的就可以将组件和 Git 连接起来。

  • 可控的合并机制
  • 作为工具设计的一部分,Git 具有对不能完成的合并有良好的定义模块,并且它还具有多种算法来完成合并。不能自动合并的部分它会最终提示用户,并且由用户来手动编辑。
  • 垃圾回收机制

放弃等操作会在数据库中留下无用的对象。这是基本上是逐渐增长的历史记录的一个小碎片。Git 将会在足够多的松散对象积累够之后,自动的进行垃圾回收。垃圾回收也可以使用 Git gc –prune 命令来调用。

定期对象包装

Git 将每个新创建的对象作为一个独立的文件来保存,尽管每个都会压缩,但是这依旧会占用大量的空间并且降低效率。这个问题是用一种叫做 packfile 的单一文件存储大量的对象在一个包中来解决的。每个 packfile 创建一个对应的索引文件,用来表示 packfile 中的每个对象的偏移地址。新创建的对象依旧独立存储,定期的打包,以保持空间利用率。打包仓库的过程会非常消耗计算机资源。相对于允许对象松散的存在于仓库中,Git 允许在空闲时间花费较大的开销来将他们打包。Git 会定期的自动重新打包对象,不过,也可以使用 Git gc 命令来手动打包。为了保证文件的完整性,每个 packfile 和它的索引内部都有 SHA-1 校验码,并且 packfile 的文件名包含一个 SHA-1 校验码。输入 Git fsck 命令即可验证完整性。

4.3 MVC 模式与 Spring Framework 框架

4.3.1 MVC 模式

MVC 模式是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC 模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观[9]。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。组件合作关系如图 2.1 所示。

图 2.1 一种典型的 MVC 组件合作方式

模型(Model):“数据模型”用于封装与应用程序的业务逻辑和数据处理相关的方法。“模型”有对数据直接访问的权力,例如对数据库的访问。“模型”不依赖于“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中的数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解数据模型上发生的变化。

视图(View):视图层能够实现数据有目的的显示(理论上,这不是必需的)。在视图中一般没有程序上的逻辑。为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。

控制器(Controller):控制器起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并做出响应。“事件”包括用户的行为和数据模型上的改变。

4.3.2 Spring MVC 框架

Spring Framework 提供它自己的 MVC Web 应用程序框架,这并不是开发之初计划的。由于当时流行的 Jakarta Struts Web 框架的设计很糟糕,并且其他框架也有许多不足之处,Spring 开发者决定去编写他们自己的 Web 框架。最重要的一点,他们觉得在表现与请求处理层之间没有完整的分离,并且请求处理层和模块层也没有完全分离。

就像 Struts,Spring MVC 也是一个基于请求的框架。每个接口的目的是让 Spring MVC 用户能够清晰、容易的实现 MVC 框架的应用。所有的接口都是与 Servlet API 紧耦合的[10]。这个对 Servlet API 的紧耦合被某些开发者看做是 Spring 的失败,它不能提供一个高层次的对基于 Web 的应用的抽象层。然而,这样耦合确保了 Servlet API 能够给开发者提供一个高度抽象的框架来使得开发变得容易[11]。

Spring MVC 框架围绕一个核心 servlet 来给控制器分发请求并且提供一些其它的功能来方便 Web 应用的开发,Spring 的 DispatcherServlet 就是用来干这些的。它将 Spring IoC 容器完全集成在一起,这样你就可以使用所有其它的 Spring 特性。

Spring Web MVC DispatcherServlet 的请求处理工作流如图 2.2 所示。DispatcherServlet 是一种“Front Controller”设计模式的表现(这种设计模式在许多其它的 Web 框架中也很常见)。

图 2.2 Spring Web MVC 中的请求处理工作流(高层)

DispatcherServlet 是一个真实存在的 Servlet(它继承自 HttpServlet 基类),并且在 Web 应用的 web.xml 文件中声明。那些你想要 DispatcherServlet 处理的请求必须在同一个 web.xml 文件中使用 URL 映射来映射到这个 Servlet。这是标准的 J2EE servlet 配置。图 2.3 是对 DispatcherServlet 的声明和映射。

1-5044e17901529e6b94e8e703946c566e

图 2.3 DispatcherServlet 的声明和映射

在上面的配置示例中,所有的以.form 结尾的请求都会被”example” DispatcherServlet 来处理。这仅仅是配置 Spring Web MVC 的第一步。

在 Web MVC 框架中,每个 DispatcherServlet 都有自己的 WebApplicationContext,这个 WebApplicationContext 继承了根 WebApplicationContext 定义的所有的 beans。图 2.4 为 Spring Web MVC 中的上下文层次关系。

图 2.4 Spring Web MVC 中的上下文层次关系

框架将会在初始化 DispatcherServlet 的时候,在你 Web 应用的 WEB-INF 目录中寻找一个名字叫[servlet-name]-servlet.xml 的文件,然后创建在那个文件里定义的 beans。

WebApplicationContext 是一个对单纯的 ApplicationContext 的扩展,对 Web 应用增加了一些额外的特性。它区别于普通的 ApplicationContext 的地方是,它可以解析主题,并且它知道自己与哪个 servlet 相关联。

Spring DispatcherServlet 有一些特定的 beans 来实现处理请求和获取正确的视图返回给用户。这些 beans 被包括在 Spring 框架中并且能在 WebApplicationContext 中配置,就像其它的 beans 一样的配置方式。

一些比较重要的接口定义以及他们的功能列举如下:

HandlerMapping:选择对象来处理来自内部或者外部的请求。

HandlerAdapter:对请求进行处理。

Controller:介于 Model 和 View 之间来管理请求和返回合适的响应。他就像一个门,来对传入的请求进行处理。它从 Model 获取数据,传递给 View 并将 View 展现出来。

  • View:用于向客户端返回数据。一些请求可能会直接请求到视图,而不经过模块部分,其它的请求三者都要经过。
  • ViewResolver:根据逻辑名称为视图选择一个 View。
  • LocaleResolver:获取并且保存用户的位置信息。
  • MultipartResolver:提供对文件上传的请求的封装。

以上的每个接口对整个框架都有重要的作用。这些接口提供的抽象层用处非常大,所有继承自这些接口的类都按照同样的特性建立在 Servlet API 之上。开发者可以自由的去编写他们的实现类。Spring MVC 使用 Java 的 java.util.Map 接口作为数据 Model,数据 Model 与 View 共同生成最终的返回页面[12]。

4.4 MyBatis 介绍

MyBatis 是一个在 Java 和.NET 平台的持久层框架,它将 SQL 声明与存储过程使用 XML 描述[13]。MyBatis 是一个自由软件,基于 Apache License 2.0 发布,它的原名为 iBATIS[14]。

MyBatis 允许你可以使用所有的数据库功能,比如存储过程、视图、任何复杂的查询,以及数据库厂商所专有的功能。它经常被用来处理遗留数据库、规范化的数据库或者是需要完全的控制 SQL 执行的时候。

它相对于 JDBC 简化了编码,SQL 语句仅仅需要一行代码便可以执行。这样便节约了时间,避免了一些常见的失误,比如忘记关闭数据库连接、编写了一个错误的数据映射、超过了结果集的数量限制或者是查询结果不仅仅是一条。

MyBatis 提供了一种映射引擎,将 SQL 结果映射到对象树中。SQL 语句可以通过使用内置的有 XML 类似语法的语言来动态的建立,或者通过使用 Velocity 集成插件来使用 Apache Velocity 建立。MyBatis 集成在 Spring Framework 和 Google Guice 中,这个特性可以允许自由的构建商业应用并且不需要调用任何的 MyBatis 接口。

MyBatis 支持声明式的数据缓存。MyBatis 集成了:OSCache,EHcache,Hazelcast 和 Memcached,并且支持集成自定义的缓存工具。

MyBatis 提供一套自动生成代码的工具:MyBatis Generator。MyBatis Generator 将会检查一个数据库表(或者许多表),然后生成 MyBatis 项目用来支持增删改查操作。

4.5 Bootstrap 介绍

4.5.1 Bootstrap 概述

Bootstrap 是一个用来创建网站和 Web 应用的工具集。它包含许多基于 HTML 和 CSS 的设计模板:排版、表单、按钮、图表、导航、其他的界面组件以及可选的 JavaScript 扩展。它是 GitHub 上最流行的项目,NASA 和 MSNBC 网站都在使用此框架。

Bootstrap 有相对不完整的对 HTML 5 和 CSS 3 的支持,但是它兼容所有的主流浏览器。从 2.0 版本开始,它开始支持响应式设计。这意味着网站页面的视图设计根据设备的特点来动态的调整。

Bootstrap 是 Twitter 发布在 GitHub 上的开源软件。开发者可以参与项目并且对平台贡献自己的力量。

4.5.2 结构和功能

Bootstrap 是模块化的,包含一系列的 LESS 样式,用来实现工具的不同部件。一个叫做 bootstrap.less 的样式表包含了组件的样式。开发者可以选择自己需要的组件来创建自己的 bootstrap.less 文件。使用 LESS 样式表语言允许用户使用变量、函数、运算符、嵌套选择器,以及所谓的 mixins。

自从 2.0 版本开始,在 Bootstrap 网站上添加了自定义的配置选项。开发者可以在一个表单上选择想要的组件和调整参数,然后生成配置好的预编译 CSS 样式表。

栅格系统和响应式设计

Bootstrap 默认支持 940 像素宽度的栅格布局。另外,开发者可以使用一个可变宽度的布局。工具集中有四个参数来使用不同的分辨率和设备类型:手机、竖屏、横屏格式、平板电脑、有低分辨率和高分辨率的电脑。页面会自动根据这些分辨率来调整列的宽度。

  • CSS 样式表
  • Bootstrap 提供一系列的样式表来为主要的 HTML 组件提供基本的样式定义。这样可以对不同的浏览器和不同宽度的设备提供一套统一的文字格式、表格、表单项目布局。
  • 可重用的组件

除了常用的 HTML 元素,Bootstrap 包含一些其它的样式元素:带有高级特性的按钮(比如按钮组、带有下拉选择的按钮、导航列表、横向、纵向的标签、面包屑导航、分页等等)、标签、高级的排版功能、缩略图、带格式的警告信息以及进度条。

JavaScript 插件

JavaScript 组件基于 jQuery JavaScript 库。它提供附加的用户界面元素,比如对话框、工具提示以及轮播。他们也扩展了一些已经存在的页面元素,包括:一个输入框自动完成的功能。

4.6 jQuery 介绍

c++ jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作。目前是由 Dave Methvin 领导的开发团队进行开发。全球前10000个访问最高的网站中,有59%使用了jQuery,是目前最受欢迎的JavaScript库[15]。

jQuery 是开源软件,使用 MIT 许可证授权。jQuery 的语法设计使得许多操作变得容易,如操作文档对象、选择 DOM 元素、创建动画效果、处理事件、以及开发 AJAX 程序。jQuery 也提供了给开发人员在其上创建插件的能力。这使开发人员可以对底层交互与动画、高级效果和高级主题化的组件进行抽象化。模块化的方式使 jQuery 函数库能够创建功能强大的动态网页以及网络应用程序[16]。

jQuery 有下列特色:

  • 跨浏览器的 DOM 元素选择
  • DOM 巡访与更改:支持 CSS 1-3
  • 事件(Events)
  • CSS 操纵
  • 特效和动画(移动显示位置、淡入、淡出)

c++ Ajax

  • 延伸性(Extensibility)
  • 工具:例如浏览器版本(已取消自带,改由 jQuery Migrate plugin 外挂提供)和 each 函数。
  • JavaScript 插件
  • 轻量级

jQuery 1.8.0 版时(自带 Sizzle.js):

表 2.1 jQuery 1.8.0 版本文件大小

文件 行数(行) 大小(KB)
jquery-1.8.0.min.js 2 91
jquery-1.8.0.js 9228 254

DHTML DOM 选择器与链式语法

经由 jQuery 的 DHTML DOM 选择器,可以更容易的操作在复杂的树状 HTML 中的任何 DHTML DOM 对象,并可用链式语法对同一对象的不同属性进行操作。

例如:

c++ $("p.surprise").addClass("ohmy").show("slow");

相当于:查找 HTML 的

标签,且其 class 为"surprise"的 DHTML DOM 对象,将其 Class 属性多加上一个"ohmy"(通常是配 CSS 的定义做显示时的配色修改),打开显示。

CSS 1-3 选择器:支持 CSS 选择器选定 DOM 对象。

跨浏览器:跨浏览器的 AJAX 解决方式,支持 Internet Explorer 6.0+、Opera 9.0+、Firefox 2+、Safari 2.0+、Google Chrome 1.0+

简单:较其它 JavaScript 库更易于入门。

4.7 小结

本章简要介绍了开发过程中用到的几个比较重要的工具与框架。在项目创建和最后的部署过程中,Maven 工具为项目的依赖的解决和编译打包提供了很好的解决方案。而在项目开发过程中,Git 工具为代码管理、版本控制以及进度统计,都提供了很大的帮助[17]。

本章还介绍了四种框架:Spring MVC、MyBatis、Bootstrap 和 jQuery。前两者是后台框架,提供了一系列的类与接口,用于实现系统功能、简化与美化代码结构设计,并提供了一些工具来方便开发者实现相应的功能[18]。后两者为前台框架,简化了前台的开发过程,提供封装好的方法来让前台交互更加方便,界面更加友好。这四种框架为开发的核心框架,它们极大的提高了生产率,并且使最终的产品不仅内部结构,而且外部表现都健壮、美观。

五、基于 Web 的图书推荐系统展示平台设计

5.1 系统总体设计

5.1.1 总体功能描述

本课题是要开发一套轻量级、功能完善的基于 Web 的图书推荐系统展示平台。利用此平台,对图书信息进行展示与推荐,对用户提供注册与登录功能。由于原始数据为从豆瓣依照网站网页结构抓取得来,并不适用于系统直接读取,于是需要将原始数据表格进行重新设计,遍历分离所需数据存入新设计的表中,使其可以更便捷的查询与处理。开发过程需要考虑 Spring MVC 框架,将功能按照模块、视图、控制器三部分分离,模块与视图适度的模块化使其可以较好的重用。beans 使用注解来注入,这样可以提高小的个人项目的开发效率。在开发开始,配置 Maven 来解决需要的依赖包,创建 Git 仓库,来控制版本。

5.1.2 系统模块组成

首先将系统在 Spring MVC 的基础上分为了三层,分别为:Web 层,服务及模块层,数据层,而 Web 层中,分为 Controller 与 View 模块,View 为 Controller 服务,按照预定义的格式来展示 Controller 的数据。Controller 将数据访问与一些公共的逻辑算法交给 Model 来处理,Model 将处理结果交还给 Controller。而 Model 类就像前面 Controller 给他的任务,负责与界面无关的逻辑计算与数据库的访问、以及其它格式数据的获取。结构如图 3.1 所示。

图 3.1 系统结构设计

Web 层负责处理用户的请求,其中 Controller 会接收 DispatcherServlet 分发过来的请求,Controller 调用服务与模块层中的模块,进过逻辑计算,生成最终的数据,将数据通过键值对的方式,将视图通过字符串方式传递给 DispatcherServlet,DispatcherServlet 再读取对应的 View,使用 View 作为模板,生成最终的页面,返回给用户。

服务与模块层负责逻辑计算与数据获取。其中 MyBatis Mapping 模块为通过 MyBatis Generator 自动生成的 DAO 类,以及自定义的 DAO 类,用于连接 MySQL 数据库并且执行增删改查操作。而逻辑计算与数据获取模块包含了公共方法类,某些特殊的算法计算,以及对配置文件的查询取值。

最底下的数据层,包括数据库系统与文件系统,是用来存储数据与配置的层。其中数据库采用 MySQL 数据库,配置文件使用 Java 自带的.properties 文件。

三层之间是互相独立的,只有最近的两层之间可以访问:服务与模块层只可以访问数据层,而 Web 层只可以调用服务与模块层。其中,服务与模块层中的逻辑计算与数据获取模块,每个模块之间是相互独立的,模块与模块之间不可以互相访问,这样用来降低耦合性,每个模块完成一个完整的任务。由于 Web 请求的模式决定 Web 应用只能是被动接收请求,并且 Web 应用没有涉及费时的网络获取,在代码中没有回调函数,所以层与层之间的调用为单向的,即模块层只可调用数据层,让数据层来执行操作,然后返回数据给模块,Web 层调用模块层,将一些逻辑计算与数据获取的过程交给模块来完成,结果返回给 Web 层,而不可能模块层主动的调用 Web 层,来对其中的值进行更改,而后返回给用户一个新的页面。在 Web 层中,View 模块只负责对数据进行格式化,生成最终用户页面,因此,它只接收 Controller 模块的值,而与程序的其它层次模块之间不可以通信。这样,在编写 Controller 模块时,并不需要了解数据库的组织结构以及配置文件的具体文件名等,只需要知道调用哪个模块,将需要的参数传入模块,模块返回的值就是所需要的数据。而在编写 View 模块时,也不需要了解其它各个层次都有什么作用,只需要分析页面哪个部分的数据是动态获取的,然后将此部分数据安排给 Controller,让 Controller 传过来就可以了,这样将不同模块之间的耦合性降到了最低。而 Controller 就像一个乐队的指挥,按照需求调用各个模块,让系统的各个部分井然有序的工作。

5.2 模块详细设计

5.2.1 数据库设计

原始数据库

原始数据库存储从豆瓣抓取下来的数据,分为三张表:book_author_info,book_online_info,book_publishing_info。

book_author_info 表存储作者信息,分为图书编号、作者姓名、作者简介与介绍四列。作者简介内容包括作者的生平以及与此书和作者都有关的一些事件介绍,介绍列与前者相同。作者姓名列存储了各个作者加国籍的信息,需要进行清洗。

book_online_info 表存储图书的一些社会化信息,分为图书编号、标签、访问次数、5 星评价数量、4 星评价数量、3 星评价数量、2 星评价数量、1 星评价数量、想读用户数量、在读用户数量、已读用户数量、还想阅读的书 这十二列。其中标签列将所有的标签,带上打标签的次数都放到了同一个字符串中,需要对其清洗。

book_publishing_info 表存储了图书的出版信息,分为图书编号、ISBN 号、书名、作者姓名、图书描述、图书目录、包装类型、定价、总页数、出版社名称、出版时间以及图书封面缩略图名称这十二列。作者姓名与 book_author_info 表的作者姓名列重复,而定价、总页数等数据使用 varchar 来存储,出版社也没有构建序号,不便于检索,所以这些内容都需要清洗整理。

清洗后数据库

清洗后的数据库是可以直接拿来网站使用的,从原始数据库中数据清洗整合出来的数据,分为九张表:book_info,tag_info,book_tag_relation,author_info,book_author_relation,nationality_info,publisher_info,binding_type,book_relation,内容如表 3.1-3.9 所示。

表 3.1 book_info 表内容

表名称 书籍详细信息表
列名称 图书编号、ISBN 号、书名、书籍描述、书籍目录、包装类型序号、定价、页数、出版社序号、出版时间、封面图片名称、评论数量、5 星评价数量、4 星评价数量、3 星评价数量、2 星评价数量、1 星评价数量、想读人数、正在读人数、已读人数
描述 其中书名数据类型由原来的 text 转换为 varchar,便于构建索引,提高查询速度。将原先耦合在一起的包装、出版社数据独立出来,只在表中引入其序号,便于按不同类型来查询。将定价和页数的数据类型由 varchar 改为 int,方便程序读取,提高查询速度。定价数据类型并没有采用 double,因为它是固定的两位小数,精确到分即可,并没有必要采用比较大的 double 类型。

表 3.2 tag_info 表内容

表名称 标签内容表
列名称 标签序号、标签名称、标签数量以及标签等级
描述 标签序号为自动生成的这个标签唯一的序号,用来识别标签。标签名称是清洗出的单个的标签,使用 varchar 存储,便于生成索引,提高搜索速度,标签数量为在所有图书的标签中,标签出现的次数。

表 3.3 book_tag_relation 表内容

表名称 图书与标签关系表
列名称 图书编号、标签序号以及使用次数
描述 图书编号为 book_info 表中的主键,标签序号为 tag_info 表中的主键,使用次数为给这本书打这个标签的用户的数量。

表 3.4 author_info 表内容

表名称 作者信息表
列名称 作者编号、作者姓名、作者简介内容、作者的国籍编号
描述 作者编号为自动生成,是表中的主键,作者姓名是将原始数据中的作者姓名清洗出单个的作者后,放入表中的。改用 varchar 存储,便于生成索引。国籍编号为 nationality_info 的主键。

表 3.5 book_author_relation 表内容

表名称 书籍与作者关联表
列名称 图书编号、作者编号
描述 图书编号对应 book_info 表主键,作者编号对应 author_info 表主键。

表 3.6 nationality_info 表内容

表名称 国籍信息表
列名称 国籍编号、国籍名称
描述 国籍编号为自动生成的主键,国籍名称为从作者信息中解析出来的作者的国籍。

表 3.7 publisher_info 表内容

表名称 出版社信息表
列名称 出版社的序号、出版社名称
描述 出版社序号为自动生成的主键,出版社名称为从原始数据中清洗出来,转换为 varchar 格式的数据,方便生成索引以提高查询速度。

表 3.8 binding_type 表内容

表名称 包装类型信息表
列名称 包装类型序号、包装类型名称
描述 包装类型序号为自动生成的主键,而包装类型名称为从原始数据中清洗出来,转换为 varchar 类型的数据。

表 3.9 book_relation 表内容

表名称 相关借阅信息表
列名称 书籍编号、相关借阅书籍编号、相关借阅书籍名称
描述 书籍编号与相关书籍借阅编号都来自于 book_info 的主键。而相关借阅书籍名称为书籍的字符串名称,因为有部分相关借阅书籍可能不在数据库中,所以有必要将其字符串名称存于表中,可以拿去搜索或者进行其他一些操作。

用户数据

用户数据是用户的登陆注册以及访问记录的表。其中的数据为 Web 应用自己生成,而不是预先装入系统之中的,分为:user_info,user_visit_history,user_search_history,内容如表 3.10-3.12 所示。

表 3.10 user_info 表内容

表名称 用户信息表
列名称 用户编号、用户名、密码、用户邮箱、用户状态、用户口令
描述 其中用户编号为自动生成的主键,用户名为用户注册时所起的名称,与密码一起用于登录。密码使用 SHA 算法加密,用户邮箱为注册时填写,用于激活账户与找回密码之用。用户状态分三种:0:已注册,未激活,1:注册并激活,2:密码已丢失,需要重新找回。用户口令取自第一次登录的 session id,用于保持用户持久登录状态。

表 3.11 user_visit_history 表内容

表名称 用户访问记录表
列名称 用户编号、用户访问图书编号、访问时间、访问来源、访问来源图书编号
描述 用户编号对应 user_info 表中的主键,用户访问图书编号为用户打开的图书介绍页面中图书的编号,访问时间为打开图书介绍页面的时间,访问来源分三类:0:首页,1:搜索结果,2:其它图书推荐,其中访问来源为 2 的,需要填写访问来源图书编号。

表 3.12 user_search_history 表内容

表名称 用户搜索记录表
列名称 用户编号、用户搜索关键词、搜索时间
描述 用户编号对应 user_info 表中的主键,搜索关键词为用户在搜索框中输入的关键词,搜索时间为发生搜索事件的时间。

5.2.2 页面原型设计

使用快速原型工具 Axure RP Pro,根据功能设计了需要实现的页面的原型:首页、搜索结果页、图书展示页、注册页面、登录页面。生成的首页原型效果如图 3.2 所示。

2-83783cfaf1d28226be7264b0e6ccfce3

图 3.2 首页页面原型效果

首页顶部包含一个 logo,链接到本页;搜索框,提供对图书的搜索入口。以及登陆和注册链接,用于用户的注册与登录管理。正文部分分为四个大模块,名称分别为:相关图书推荐、分类热门图书、图书分类以及图书排行。图书推荐模块列出单本书的缩略图与简要介绍,而分类热门模块列出了几个大的图书分类,以及几本此分类下的比较热门的图书。图书分类模块列出了所有的图书分类,用户可以直接点入查看此分类下的所有图书。图书排行列出前九本最热门的图书。页脚部分注明页面版权信息,以及创建年份。

搜索页面页眉页脚与首页相同,正文部分为一个搜索结果列表,显示搜索结果中的 15 条记录,每条记录显示图书缩略图、书名、作者、出版社、出版日期、价格以及评分。正文底部是分页,列出了结果的页数,可通过点击来查看后面的搜索结果。右侧列出了热门图书列表,用于向用户推荐。

图书展示页面页眉页脚与首页也相同,正文部分分四大块,第一块为图书基本信息,包括标题、缩略图以及一些图书在版编目信息:作者、出版社、出版时间、页数、定价、装帧、ISBN 号。同时还显示评分以及各个星评分数量。第二块为内容简介,是对书内容的简要介绍以及图书目录。第三块为作者简介,是对图书作者以及译者的简要介绍。第四块为相关推荐,展示阅读此书的人还阅读了的书籍。由于原始数据并不包含用户评论,因此用户评论的内容并没有加入展示。

注册页面和登录页面较为简单,用户填写用户名、邮箱、密码、确认密码,之后点击注册即可。登录时,用户输入用户名、密码,然后登录系统,会跳转到首页,首页右侧顶端登录注册不再显示,改为用户名与退出。

5.3 小结

本章介绍了本课题所研究的基于 Web 的图书推荐系统展示平台的系统总体设计与详细设计。总体设计主要讲述了系统设计的层次结构,并且规定了系统各层各模块之间的组织结构与通信规则。详细设计部分对数据库进行了设计,列出了各个表的结构与描述。并且使用页面原型工具构建了简单的页面,来作为之后页面开发与功能模块划分的依据。总体合计与详细设计在系统开发之前,对之后系统的结构与功能都起到非常重要的影响,结构的好坏直接影响到系统的性能。此章是下一步实现系统的必要步骤和重要依据。

六、基于 Web 的图书推荐系统展示平台实现

6.1 环境的搭建

6.1.1 数据库的建立与数据的导入

PowerDesigner 创建一个物理数据模型,配置好数据库类型,添加表结构,将在详细设计中所设计的数据库信息与列信息、自增列属性输入到表结构中,生成如图 4.1 所示的物理结构设计图。

3-02529bc7d2d83e5b3e5676df8d3ca3f2

图 4.1 PowerDesigner 数据库部分表物理结构设计图截图

使用其自动生成工具,生成用于创建数据库的 SQL 脚本。之后,使用 MySQL 工具导入到数据库中。同时,将原始数据也使用 MySQL 工具导入到数据库中。

6.1.2 工程建立

使用 Eclipse 创建一个 Spring MVC 项目,系统会自动生成一套目录结构,如图 4.2 所示。

4-aeffc6a5ba20eedc5a91e98d28340b98

图 4.2 Spring MVC 项目结构

src/main/java 目录用来存放项目的主体部分的源代码,所有的 Controller 模块、Model 模块,以及 DAO 的 Java 类,都放在这里,在发布的时候,这里的源码会在编译成 class 文件后,放入 WEB-INF 目录下的 classes 目录。

src/main/resources 目录用来存放项目的配置文件以及 MyBatis 的 Mapping 文件。在部署过程中,也会被放入 WEB-INF 目录下的 classes 目录中。

src/test/java 目录用来存放项目的测试类,src/test/resource 目录用来存放项目的测试配置文件,这些都会在部署时,放入 WEB-INF 目录下的 test-classes 目录中。

JRE System Library 包含系统中安装的 JRE 的库,在项目创建时,可以选择版本。

Maven Dependencies 包含了在 Maven 的 POM 配置文件中所配置的依赖包,这些包在工程创建时,由 Maven 从 Maven 仓库中下载到本地缓存,并且链接到工程中。

src 目录分 main 和 test,而 main/webapp 目录下有 resources 与 WEB-INF 目录,其中 resources 目录是在 servlet-context.xml 中配置的,用于存放页面中的资源的目录,分为 CSS、img、js 三个目录,WEB-INF 目录分为 classes、Spring 与 views 目录以及 web.xml 文件,web.xml 文件为 Java Servlet 的标准配置文件,Spring 就在这里配置进去。classes 为应用发布时,.class 文件的目录,Spring 目录为 Spring 配置文件存放的目录,用于修改配置,添加 beans 用于注入等。views 目录为视图模块存放的地方,使用 JSP 作为视图文件。

target 目录为自动编译的目录,目录中有所有类、测试类的编译结果.class 文件,以及 Maven 的配置文件 pom.xml。

pom.xml 文件为 Maven 的配置文件,它包含了项目的基本配置、依赖包以及插件配置。项目创建时,默认只有 Spring MVC 的基本配置。

6.1.3 版本控制

为了开发的方便,防止不必要的损失以及对进度的掌控,项目一开始便进行了版本控制,在 GitHub 网站创建了一个私有仓库,项目的根目录下初始化了 Git 本地仓库,配置好全局变量:用户名、邮箱以及 SSH key,项目目录下加入远程的 GitHub 仓库,之后便可以添加文件、提交更改并且推送到远程服务器上。

修改提交的节点选择在每次一个功能完成之后或者是对之前的文件需要进行比较大的修改之前。功能完成之后提交,可以确保自己能够定期的跟踪到完整的可运行的项目,不至于两次提交之间项目变化过大,如果想要修改,那就不容易找到一个合适的检出时间点。进行比较大的修改之前提交,虽然可能一个功能并没有完成,但是修改过程中可能要参考到之前的部分功能,所以仍有必要将其保存提交。在修改完之后,最终确定了用新的方案,再次提交。

6.1.4 MyBatis 配置

MyBatis 官方提供了一个自动生成代码的工具:MyBatis Generator(MBG)。它会检测数据库的所有表,并且生成可以用来访问数据库表的代码。这样可以减轻最初访问数据库所需编写代码的工作量。MBG 提供了所有常用的数据库操作:增删改查。对于单表的操作,只需要使用这一套生成的类即可,生成结果如图 4.3 所示。

5-08dfac787f1defdccaf9d1531d972564

图 4.3 MyBatis Generator 自动生成模块

在生成的文件中,dao 为 mapper 接口,存放 TableNameMapper.java 文件,用来在配置中注入或者使用 SqlSession 来获取实例,对数据库表执行增删改查操作。model 为表结构的类 TableName.java 和查询条件构造类 TableNameExample.java,TableName.java 用于存储对应表的响应条目值,用来实现 update 和 insert 操作,以及查询出结果的存储。TableNameExample.java 用来构造 where 语句,用于执行 select 操作。在数据库中有多于两个列的类型为 TEXT 或者 BLOB,那么除了生成 TableName.java,还会生成一种 TableNameWithBLOBs.java 的文件,其中 TableName.java 负责存储一般的数据类型,TableNameWithBLOBs.java 文件负责存储 TableName.java 中所有数据之外,还包括了 TEXT 和 BLOB 类型的数据。mapper 目录存储 XML 配置文件,用于支持在 TableNameMapper.java 文件中定义的操作。

将代码和配置文件加入到工程中之后,会出现编译错误,显示一些引用的类不存在于工程中。查找原因,发现是因为项目中没有加入数据库与 MyBatis 的依赖,修改 pom.xml 配置文件,加入 spring-jdbc、MyBatis、mybatis-spring 与 mysql-connector-java 依赖配置。

在 src/main/resources 加入 mybatis-config.xml,用来为 MyBatis 提供连接数据库的配置与 Mapper 类集合的配置。创建 Mysql.properties 文件,将配置写入文件中以便复用。

6.2 数据的清洗

由于原始数据并不能直接拿来使用,因此需要按照之前设计的数据库,将三个表中的原始数据清洗后,存入新设计的表中,程序流程如图 4.5 所示。

程序会先定义起始和终止图书编号,之后,从第一个图书编号开始,通过主键,查询到图书的数据,将需要的值取出,比如作者信息。作者信息包括了作者国籍、作者姓名以及其它作者姓名,格式如图 4.4 所示。

6-255bb0fc458425822ec9184d83a8c116

图 4.4 原始数据中部分作者姓名格式

开始打算通过一个完整的正则表达式来对作者信息进行解析,但是由于 Java 的正则表达式并不能够分辨出中文标点与中文文字,因此,先对字符串做初步的清理:将“编著”、“译者”、“主编”替换为英文斜杠“/”来区分不同的作者,将中英文逗号、中英文括号等内容都替换为英文分号“;”,用于区分国籍与作者。之后,使用将字符串按照斜杠来分割成一个字符串数组,数组中每个字符串代表一个可能带有国家信息的作者名称,使用正则表达式:”^(;([\u4e00-\u9fa5]+);)?([\w\u4e00-\u9fa5\.]+)”来匹配,取出可能以分号加中文字符开头的,作为国籍,以英文字符或者中文字符组成的连续的词作为作者姓名。

之后,拿国籍信息去国籍信息表中查询,没有此项,则作为一个新的条目插入,有则不做处理。在有的数据清洗过程中,比如标签,它有一个统计数据,那么如果表中有这个标签,会将统计数据增加一个。作者姓名与国籍类似,采用相同的方法来存储。之后便查询下一条图书记录。

7-7cd465760ffa846a8f945f2568da05ac

图 4.5 数据清洗程序流程图

为了加快读取速度,每次的读取并不只是一条,而是多条图书数据一起读取出来,这样会一次将较多的数据调入内存,降低磁盘 IO 操作,加快速度。可是由于每本书有三到五个作者,每个作者和国籍都会在解析出来之后变为一个独立的需要插入到数据库中或者去数据库中查询的条目,随着数据条数的增多,同时提交的事务数量会加倍增长,MySQL 系统就出现了 session 数量不足的错误。于是,将每次取出的条数减少,并且在每次操作完成一组数据后,提交并关闭数据库,在需要操作前,再打开数据库。这样就能够即时的关闭用完的 session,不会出现由于大量已结束的事务占用 session 而报错的问题。

同样为了加快数据清洗速度,使用两台电脑,一台运行数据库系统,另一台运行 Java 程序,MySQL 系统打开网络用户的访问权限和所在系统的防火墙 3306 端口,另一台连接并处理数据。由于数据库操作占比较大的时间,所以瓶颈依旧在运行数据库的系统中,不过相对与在同一个系统中,CPU 占用和内存占用有一定程度的下降。

6.3 系统开发

按照总体设计阶段的分层,将系统分为三个包:cn.edu.ustb.controller、cn.edu.ustb.dm、cn.edu.ustb.model。如图 4.6 所示。

8-d3bbe6a3151c746379253acce310e3a4

图 4.6 项目包结构图

6.3.1 控制器类

controller 包为系统结构中的 controller 模块,根据功能,划分为了五个类:BookInfoController.java 负责图书详细信息的展示,IndexController.java 负责首页的视图内容获取展示,LoginController.java 负责登录信息的处理,RegisterListController.java 负责对注册信息的处理,ResultListController.java 负责处理查询。

controller 类将 SqlSessionFactory 使用注解的方式注入类中,并且使用注解来实现 Controller 类与请求映射。使用 Log4j 工具来输出日志。借鉴 Objective-C 的方式,使用 setter/getter 方法来获取变量,以便延迟加载以及提高利用率。代码结构如图 4.7 所示。

9-b3c8c1c6c74f29daa44655703355dc16

图 4.7 BookInfoController 类部分代码截图

在最开始,Mapper 都是使用注解来注入进来的,但是发现 SqlSession 的开启与关闭不受到控制,完全靠系统来自动完成,那么在并发数量过大之后,大量线程占用 session,很容易出现 session 数量过多的问题,其他人访问不了网站。将 Mapper 的获取方法改为了使用 SqlSession 的 getMapper 方法来获取,这样就可以完全控制 session 开启时间、结束时间。在每次访问页面的时候,包括浏览器会话没有关闭时刷新,都会重新开启一个新的 SqlSession,获取新的 Mapper 实例,然后执行数据库操作,最后,关闭数据库连接。这样,能够即时的回收过期的 SqlSession,防止大量无用的 session 占用数据库资源。

在使用 getter/setter 方法时,刚开始将 SqlSession 的获取放到了 getter 中,这样会首先检测有没有实例,没有实例再创建,意图是为了延迟加载,在用到的地方才初始化它,并且防止每次使用都创建新实例。可是在实际中却发现,如果用户刷新页面,或者点击分页按钮,系统会抛出错误,说数据库已关闭,无法执行查询操作。原来每次访问,在浏览器没有结束会话时,Web 容器会将 Controller 类的实例保存在内存中,而每次请求只会执行 RequestMapping 所指定的函数。于是修改 SqlSession 的获取方式,在浏览器每次发起请求时,通过 SqlSessionFactory 类的 openSession 函数来获取一个 SqlSession 实例。

Mapper 的获取也受到了影响,因为每次访问都会创建一个新的 SqlSession 实例,那么 Mapper 如果不为 null 的话,就不会重新创建 Mapper 实例,这样,Mapper 的 SqlSession 将是已经关闭的 session,它不能够执行任何数据库操作。因此,在每次访问时,会将所有的 Mapper 都重置为 null,以使其重新初始化。

6.3.2 模块类

模块类包含一些页面需要的数据结构,对数据的加工函数以及分页功能实现。其中,BookClassifyItemModel.java 类为单纯的书籍按照分类来显示信息的模块,其中,借鉴了 MyBatis 的 Example 类的方法,添加了一个内部类,在父类中编写了创建内部类的函数,用于创建图书列表。

BookListItemModel.java 类为图书的基本信息展示类,用在了图书推荐、图书排行、查询结果展示以及图书详细信息中。在类中提供了计算得分的函数,以及格式化日期的函数,用于在页面中显示。

SearchResultPaginationModel.java 类为查询结果分页模块,用于支持查询的分页显示以及分页功能。由于数据量巨大,为了提高查询效率,分页查询并没有采用 MyBatis 的分页查询方法,MyBatis 会在第一次查询时,将所有的符合条件的结果读入内存中,之后再根据分页条件来显示,这样,虽然会在页面跳转的时候很快,但在第一次查询时,会有大量的磁盘 IO 操作,在数据类大的情况下,会对系统性能造成很大的影响,而搜索结果大部分用户只是关注前几页,后面的结果访问量并不大,这样就有些得不偿失。分页查询采用数据库的 limit 条件,只在每次查询时获取每一页要显示的数据,在创建了索引以后,这个查询过程是非常迅速的,只将需要的数据读入内存。查询效率提高了,就需要自己来实现分页。

6.3.3 视图类

视图使用 JSP 作为页面,引入了 JSTL 的 c 库来辅助生成布局。视图文件如图 4.8 所示。

10-3b0e8c2602311243112641df1495c1c1

图 4.8 视图文件

header.jsp 为页面顶端的 logo、搜索栏与登录注册按钮的部分。footer.jsp 为页面底部版权信息的内容。pagination.jsp 为分页,根据 SearchResultPaginationModel.java 的内容来生成分页。

bookInfo.jsp 负责显示图书的详细内容,index.jsp 负责首页内容的显示,login 和 register 负责登录与注册页面,resultList 为搜索结果,只是单纯的搜索结果列表,用于分页时,通过 AJAX 请求来局部刷新,减少流量。resultListPag 为搜索结果页面,是页面的框架,其中引入了 resultList,作为第一次访问时,搜索结果的展示。

每个页面都引入 header.jsp 与 footer.jsp,用来引入所需要的布局文件与页面脚本,构建起基本的页面框架。页面导航栏的布局采用 Bootstrap 的导航栏样式,登录可以从导航栏上直接输入来登录。搜索条件分为标题、作者、出版社,可以对这三者进行查询。

采用 JSTL 的标准 c 标签库,方便的实现循环(c:forEach)、判断(c:if、c:when),

页面整体布局采用 Bootstrap 的响应式布局,首页、搜索结果页将正文部分分为左右两块,图书信息页面只有一个块。在首页中各个块中,每本书作为一个 row 类型,每个 row 又分为两个 span,用于分割左右两块。一部分布局是由自定义的 main.css 文件来定制。而自定义的 JavaScript 也由在 footer 中引入的 main.js 来定制那些比如搜索按钮点击事件、分页按钮点击事件、登录等等。

分页按钮的样式采用了 Bootstrap 的分页按钮,参考 Amazon 查询结果的分页效果,在页数多于 9 页的情况下,翻到中部,则只显示部分挨着的页码,结合 SearchResultPaginationModel 类的结构,完成了查询的分页。

6.4 分析及调优

首页为所有页面中最为复杂的页面,需要查询四块内容,页面效果如图 4.9 所示。

11-abb5684b74af9d2c54eeb5b1cd3a9e29

图 4.9 首页页面效果

四块内容分别需要按照各自的查询条件来排序,然后取前几个符合条件的结果。在刚开始,没有对数据库优化之前,页面打开速度几乎需要 3 秒,对查询 SQL 进行分析,发现,大部分操作时间都消耗在了排序上,于是对排序条件创建了索引,首页的首次打开延迟变得小于 1 秒,并且由于在控制器中使用 getter\setter,部分没有参数的数据会在查询之后一直留在内存中,不会进行第二次查询,所以刷新会返回 304,页面内容没有改变。

12-7f39be22f572b4859f7ca4cf5e657efa

图 4.10 查询结果页面

图 4.10 为查询结果页面。由于此平台不涉及搜索算法的研究,所以搜索结果为从数据库字符串中 like 出来的。考虑到数据库巨大,若不做处理,将会严重影响查询效率。于是按照查询特点,对图书标题、出版日期两列做了索引,查询速度有了成倍的提升。再加上每次查询使用 limit,磁盘内存间的交换操作减少了许多。

13-a5ebfc8e0aa2a2696d95a6b1527c74db

图 4.11 图书信息页面

图 4.11 为图书信息的展示页面,对图书的缩略图、内容以及作者简介做了展示,还有登录失败后会跳转到的登录页面,注册按钮点击后跳转到的注册页面,相对于其它两个相对功能较单一,性能也没有太大的提升空间。

6.5 性能测试

使用 Chrome 浏览器的开发者工具来进行测试。结果如图 4.12 所示,首次加载首页需要等待 6ms,其它静态的 CSS 与 js 文件几乎不需要时间,在统计结果中,显示为 0。之后刷新,Tomcat 会从内存中直接取得返回结果,统计如图 4.13 所示,由图可知,加载页面仅需要用时 2ms。

14-2823d77eed17871d1df7fe478d45a3de

图 4.12 首次加载首页时页面内容访问速度

15-008723921c57e1ebe3bfd04d3bdca764

图 4.13 刷新首页时页面内容访问速度

在查询结果页面,查询一个关键词“iOS”,页面的等待时间为 223ms。同样由于缓存的作用,刷新的等待时长变为 8ms。结果如图 4.14 与 4.15 所示。

16-251e1326185759ec3f0f94c44c34146a

图 4.14 查询访问速度测试结果

17-c5f02684b9e0b1b925c91b31bd33b6d5

图 4.15 查询结果刷新速度测试结果

6.6 小结

本章介绍了整个系统的每个模块的整体设计、详细设计以及实现方式。并进行了简单的分析以及性能的调优,最终系统运行性能良好,稳定,系统结构简洁,功能完善。

七、结  论

随着计算机网络技术的发展,越来越多的电子商务网站、图书分析网站以及一些图书馆系统都采用了图书推荐系统这种智能化的解决方案,它有效的实践了长尾理论,增加了用户粘性。

本文对基于 Web 的图书推荐系统的展示平台做了初步研究,开发了一个平台,开发过程包括网站数据库设计、数据清洗、系统结构设计、系统搭建、版本控制、性能调优等,功能模块包括图书展示、图书搜索、图书推荐、用户登录注册等,还对设计的过程、网站的结构、项目的管理方法进行了探索,对项目中遇到的难点给出了一些解决方案,起到的效果也比较不错。

研究的核心部分是系统的设计与工具的使用。由于系统开发采用 MVC 结构,系统各个层级与模块之间的关系以及数据库结构,都需要一个具有高扩展性和可复用的设计,否则在开发后期或是在后期维护阶段,都会因为工程大小的增长而带来耦合性的急剧上升,最终导致功能实现与错误修改变得异常艰难。一些开源的开发框架与项目管理工具在系统开发过程中会极大地减轻开发者浪费在无关事务上的工作量,开发者不需要去操心布局怎样实现才能美观,怎样达到浏览器兼容,以及怎样去管理版本,控制查看进度,去哪里下载依赖包,项目需要哪些依赖,依赖包怎样升级等等。工具也可以减少开发者的重复劳动,比如 MyBatis Generator 可以自动生成单表操作的 Mapper 文件。

开发中的难点是数据的清洗过程与数据库查询效率的优化。数据的清洗过程需要读取出记录后,对数据解析、去新表查询,根据查询结果插入到新表或者更新新表。操作比较复杂,由于数据的格式极不规整,在解析时,花了许多时间研究数据的格式的可能性,编写代码去除干扰数据,并用正则表达式解析它。一开始数据查询效率极低,在分析了 SQL 查询语句之后,对数据相应字段创建了索引,才使得数据查询的速度符合期望,解决了查询的效率问题。

八、参 考 文 献

项亮,陈义,王益著.推荐系统实践[M].北京:人民邮电出版社,2012.

Vincent, L.Google Book Search: Document Understanding on a Massive Scale[J].Document Analysis and Recognition,2007: 819 - 823

  • 裴玉洁著.采用数据挖掘技术的自动化推荐系统的研究[D].2012.
  • 吴定勇,王峰著.亚马逊书店的网络售书之道[J].北京:当代传播,2008, (6): 123-125.
  • 李连焕,刘建东著.基于 Web 日志挖掘的图书借阅推荐算法研究[J].北京:硅谷,2012, (6): 93-94.
  • 古丽拜天.卡米尔著.基于 Web 数据挖掘的智能推荐研究[D].湖南:中南大学,2010.
  • 李俊杰著.Maven 在企业 Java 软件产品中的应用[D].北京:北京邮电大学,2011.
  • 刘悦之著.基于 Git 的分布式版本控制系统的设计与实现[D].上海:同济大学,2012.
  • 张琛,吴跃,邱会中著.基于 Structs+Spring+Hibernate 的整合架构及其在电信业中的应用[D].四川成都:电子科技大学,2006.
  • 陆荣幸,郁洲,阮永良,王志强著.J2EE 平台上 MVC 设计模式的研究与实现[J].计算机应用研究,2003, 20(3): 144-146.

Praveen Gupta, Prof. M.C. Govil. MVC Design Pattern for the multi framework distributed applications using XML, Spring and struts framework[J].International Journal on Computer Science and Engineering,2010, 2(4): 1047-1051.

冯润民著.基于 SSH 的高校学生管理系统设计与实现[J].北京:计算机工程,2009, 35(6): 280-282.

Dave Minter,Jeff Linwood 著.Hibernate 基础教程[M].陈剑瓯等译.北京:人民邮电出版社,2008.

孙强,孙龙清,邱小彬著.基于 Structs+Spring+iBATIS 的轻量级 Web 应用框架研究[J].北京:计算机应用与软件,2008, 25(10): 135-137.

  • 王庆民著.基于 Web 图书推荐系统设计[J].山西:晋图学刊,2011, (1): 35-37.
  • 曾庆辉,邱玉辉著.一种基于协作过滤的电子图书推荐系统[J].北京:计算机科学,2005, 32(6): 147-150.
  • 张富国著.电子商务协同过滤推荐系统的研究与进展[D].江西:江西财经大学信息管理学院,2010.
  • 田元,宋纬华,李婷婷著.基于 Markov 链的图书推荐系统的研究与设计[J].陕西:西安理工大学图书馆,2012, 32(6): 79-82.
  • 附 录

8.1 附录 A 外文参考文献原文

c++ MVC Design Pattern for the multi framework distributed applications using XML, spring and struts framework

Abstract— The model view controller (MVC) is a fundamental design pattern for the separation between user interface logic and business logic. Since applications are very large in size these days and the MVC design pattern can weak the coupling among the different application tiers of application. this paper presents a Web application framework based on MVC in J2EE platform, and extends it with XML so that the framework is more flexible, expansible and easy to maintain. This is a multi tier system including presentation layer, business layer, data persistence layer and database layer. This separate codes, and improve maintainability and reusability of the application. In this paper, we implemented MVC using Spring and struts framework. Our research study show that applying multiple framework to design the applications using MVC concepts makes applications easier compare to a single framework.

c++ Index Terma: MVC, Spring, XML INTRODUCTION Web is the very complex issues these days. Since the desire of the companies and organizations are increasing so the complexity and the performance of the web programming matters. Complexity with the different types of communication devices is increasing. The business is demanding applications using the web and many communication devices. So with the increase load of the data on the internet we have to take care of the architecture issue. Let us discuss in brief the research done so far in MVC. NO MVC: In The initial phase of the web development the pages were used to be designed in the html. Html is the plain text only. This was the first markup language which can work on the internet. And today stills it works as building block for the all Internet based programming languages. The user has to interact with the static pages. The information written on the pages had to change manually. As the time grows the demand arises for a language that can interact with the user and page can be changed as per the requirement of the user. MVC Model 1: The first major change in the architecture comes with the introduction of the MVC Model 1 Architecture. This architecture was completely based on the page centric approach. In this model a Java Server Pages to program to control the Presentation, Business Logic and flow of the program. In this model the concept of the Business Logic was introduced. The business logic was hard coded in the form of the Java Beans and scriptlets and expressions. All this codes was used to write within the JSP page. Let us assume a case when we want to transfer the flow of the jsp application based on the data we received from the input. Figure 1 Page Navigation in MVC -1 Architecture MVC Model 2 : The model 1 architecture was able to solve some of the problem of the web and internet programming but still there were a lot of things missing from it. It was centered on the navigation of the jsp pages so there was the scope of the further development in the architecture point of view. During this process the next development was the Model 2 architecture. This problem was solved using the Servlet and JSP together. The Servest handles the Initial request and partially process the data. It set up the beans then forward the result to the one of the jsp page. The Servlet decide the one of the page to be displayed from the list of pages.

18-56cb35db2b02091b999586b003a54524

c++ In this Model 2 architecture the JSP Pages were used to Presentation purpose only. The Business logic has been removed from the page. This makes the pages easier to represent and light weight pages which were easy to display on the internet In this model all Control and application logic were handled by the Servlet. The Servlet was written in the java programming language. So it was also easier to handle the programming part of the Servlet. In this scenario the Servest becomes the power full for the complete application and It has emerged as the center point for the application. In the model 2 architecture the Servlet becomes the gatekeeper for the all common tasks. It provides the common services like authentication, authorization, error control and follow of the application. This architecture have solved the most of the problems. But still there were many new issues emerged while applying this architecture II. APPLYING ARCHITECTURE WITH MULTIPLE FRAMEWORKS

Web and Internet is ever growing area and the demands for the applications are growing. A single framework is not capable to handle the architecture of the application. To meet the currents requirement of the applications it’s necessary to design a architecture to implement the frameworks.

c++ Struts framework have been designed and developed for the front end control of the web applications. It provides the various features for the applications that interact to the users. It also follows the MVC 2 design features. Spring Framework is the designed to handle the various tasks. The spring work for the desktop and internet based applications also. It follows the principals of the MVC 2. The simultaneous use of the Struts and spring frameworks in the single application with the applying the MVC Design principals so that we can Improve the performance of the applications. Struts Framework consists of three major blocks, Described in brief as follows.

VIEW ; CONTROLLER ;; MODEL;

c++ Figure 3 Struts Model Architecture First is The View Block which controls the presentation part of the complete model. This contains following JSP files which you write for your specific application Set of JSP custom tag libraries Resource files for internationalization Second Block is representing the Controller. This is for navigation the complete application. This contains XML configuration files; it contains the tags for the navigation of the paths. Third Block is the Model. This part do the work of the Business Logic, Fetching and storing data to the database.This contains following Java Beans Enterprise Java Beans Database. Following figure shows the working of the components in the struts framework. Figure 1 Component in the Struts Architecture MVC in Struts The major three parts of the MVC are as follows in the spring framework. Servlet controller (Controller Part) Java Server Pages or any other presentation technology (View Part) Application Business Logic: in the form of whatever suits the application (Model Part). SpringComponents. In the spring we also follows the principals of the MVC . It has been designed more for the desktop and internet based applications. Spring consist of three core collaborating components. 1. Controller: Handles navigation logic and interacts with the Service tier for business logic 2. Model: The contract between the Controller and the View Contains the data needed to render the View Populated by the Controller 3. View: Renders the response to the request Pulls data from the model. Core components in the spring MVC are as follows.

DispatcherServlet: Spring’s Front Controller implementation. It is the first controller which interacts to the requests. We can also say it is an implementation of the Servlet. It controls the complete flow of the application.

c++ Controller: User created component for handling requests encapsulates navigation logic delegates to the service objects for business logic. View: Responsible for rendering output. Different views can be selected for the different types of output bases on the results and the viewing device, communication devices. ModelAndView: ModelAndView is the core part of the spring framework. It implements the business logic of the application. It is controlled by the controller. It stores the business logic and the view associated with it. Whenever it is executed it will the data with the name of the view. ViewResolver: How the output is to be displayed depends on the result received from ModelAndView. It is used to map logical view names to actual view implementations. This part identifies and implement what is the output media and how to display it. HandlerMapping: Strategy interface used by DispatcherServlet for mapping incoming requests to individual Controllers. It identifies the request and calls the respective handler to provide the services.

The following figure shows how the model will work. In this the dispatcher Servlet is the entry point for the application. The Struts parts do it’s work and send the request to the dispatcher Servlet. The Servlet decides the handler. Then it will call to the controller. Controller will execute the ModelAndView.

c++ Figure 5: Sequence flow of application in the spring framework. III. PROPOSED METHODOLOGY This approach is based a combination of applying the two framework struts and spring for the application development. The sequence diagram for the combined application is explained as above, which is the main driving force for the application. This approach assumes that basic knowledge of web applications is essential. We have tested the above concepts and find out it successfully. Major benefits of the above architecture are as follows. It will provide a very clean division between actions, action forms, controllers, handlers, JavaBeans models, and views. Spring's MVC is very flexible. Unlike Struts, this forces your Action and Form objects into concrete inheritance. We are using advantage of both. Spring MVC is entirely based on interfaces. Every part of the Spring MVC framework is configurable. It provides controllers, making it easy to handling of many requests from User Interface. We can use JSP or Any other Technology to display the view, results to the user on the any of the output device. Spring Controllers are configured via Inversion of Controls. This makes them easy to test and integrated with other objects managed by spring. Spring MVC web tiers are typically easier to test as compared to Struts web tiers, due to the avoidance of forced concrete inheritance and explicit dependence of controllers on the dispatcher Servlet. The web tier becomes a thin layer on top of a business object layer. This encourages good practice. Struts framework was designed for the web interface purpose only. The spring framework was developed for the desktop and internet applications. When both frameworks used as combined it will provide the flexibility of implementation. CONCLUSION

Multiple framework architecture works better as compare to any single framework architecture. With the effective of the multiple frameworks for the development of the large scale applications we can improve the performance of the Large Database application in terms handling number of requests, processing ability and maximum use of the machinery. It will also open the new scope and new business opportunities’ for the companies and the programmers. It’s recommended to use the multiple frameworks for the Better performance. Due to large size of Java code I am unable to provide it here.

c++ FUTURE RESERCH Open technologies are the best to attract the academic and research scholar to work. J2EE is the vast field now a day, its open technologies also. Architecture is never fixed its goes on changing with the change in the technology. There are many frameworks available to work with J2EE technologies, Single frame is never sufficient to provide the complete solution with all essential features of the application. There is a lot of scope to work further with many other frameworks to implement and enhance the MVC architecture. REFERENCES

Shu-qiang Huang, Huan-ming Zhang, ” Research on Improved MVC Design Pattern Based on Struts and XSL” , in Information Science and Engineering ISISE 08 International Symposium on, 2008, vol. 1 PP. 451 – 455

c++ Juanjuan Yan; Bo Chen; Xiu-e Gao, "Le Wang; Research of Structure Integration Based on Struts and Hibernate", in 2009 WRI World Congress on Computer Science and Information Engineering,2009, vol. 7,PP. 530-534 Wojciechowski, J.; Sakowicz, B.; Dura, K.; Napieralski, A.,"MVC model, struts framework and file upload issues in web applications based on J2EE platform", in Proceedings of the International Conference on Modern Problems of Radio Engineering, Telecommunications and Computer Science 2004, 2004,,PP 342-345 Erxiang Chen; Minghui Liu, "Research and Design on Library Management System Based on Struts and Hibernate Framework", in WASE International Conference on Information Engineering ICIE 09, 2009, Vol. 2,PP. 310-313 Yonglei Tao; "Component- vs. application-level MVC architecture" , in Frontiers in Education 2002 FIE 2002. 32nd Annual,2002, Vol 1,PP. T2G-7 - T2G-10 Meiyu Fang, "Design and Implement of a Web Examination System Using Struts and EJB",Seventh International Conference on in Web-based Learning 2008,,, 2008,pp. 25-28 Wang Ning; Li Liming; Wang Yanzhang; Wang Yi-bing; Wang Jing,"Research on the Web Information System Development Platform Based on MVC Design Pattern",in IEEE/WIC/ACM International Conference on Web Intelligence and Intelligent Agent Technology, 2008, Vol 3,pp. 203-206

8.2 附录 B 外文参考文献译文

使用 XML,Spring 和 struts 框架的多框架分布式应用 MVC 设计模式

摘要 – 模块、视图、控制器(MVC)是一个分割用户交互逻辑与业务逻辑的基本设计模式。由于现在应用的大小变得非常大,MVC 设计模式可以减弱不同应用联系的耦合性。这篇论文展示了一个基于 J2EE 平台的 MVC Web 应用框架,使用 XML 扩展了它,以使其更灵活、可扩展以及容易维护。这是一个多联系的系统,系统包括了表现层、业务层、数据持久层以及数据库层。这样可以分离代码,提高应用过的可维护性和重用性。在这篇论文中,我们使用 Spring 和 struts 框架实现了 MVC。我们的研究表明,使用多个框架和 MVC 概念来设计应用相对于单个框架来说更加容易。

关键词 – MVC,Spring,XML

介绍

现在,Web 是一个非常复杂的问题。由于公司和组织有了更多的要求,编程的复杂性和网站的性能是一个重要的问题。不同类型的通信设备的复杂性正在增长,而企业需要应用运行在 Web 和许多通信设备上。于是,随着互联网上数据的负载的增长,我们不得不关系架构的问题。我们来简单讨论一下目前在 MVC 领域所做的研究。

没有 MVC:在最初的网站设计阶段,页面使用 HTML 来设计。HTML 仅仅是纯文本。这就是最初的可以在网络上工作的标记语言。现在,它依旧作为所有的基于互联网的编程语言的基础模块来工作。用户不得不与静态的页面交互。在页面上写入的信息必须手动的修改。随着时间的增长,人们需要一种语言能够与用户交互,页面可以根据每个用户的需求来改变。

MVC 模块 1:架构中的第一个主要的改变来自于 MVC 框架的 Model 的引入。

一个架构。这个框架完全依赖于以页面为中心的实现。在这个模型中,一个 Java Server Page 控制所有的表现、业务逻辑以及程序的流程。在这个模型中,业务逻辑的概念被引入了。业务逻辑以 Java Beans 和脚本控件的方式硬编码。所有的代码都写在 JSP 页面中。让我们假设一种需要基于我们接收的数据传输 JSP 应用流。

19-48776fec10fbfb9e44eaca54795c98c5

图 1 在 MVC-1 框架中以页面为主的导航

MVC 模块 2:模块 1 的架构可以解决一些 Web 和互联网编程中的问题,但是依旧有许多的问题并没有解决。它基于 JSP 页面的导航,所以我们可以考虑到在框架中加入视图来解决问题。在这个过程中就出现了模块 2 框架。这些问题是用 Servlet 和 JSP 一起来解决。Servlet 处理最初的请求并且处理部分数据。他创建 beans 然后将结构转发到其中的一个 JSP 页面。Servlet 决定由页面列表中的哪个页面来显示。

20-1bfeedeea047d5e09ea2e4e029769e52

图 2 MVC-2 架构

在这个模块 2 架构中,JSP 页面仅仅用来作为表现层。业务逻辑层从页面中移除。这使得页面更容易的展示并且更轻量,更容易在互联网中显示。

在这个模块中,所有的控制器和应用逻辑都被 Servlet 处理。Servlet 使用 Java 编程语言来编写。所以,Servlet 更容易处理编程的部分。在这种场景下,Servlet 编程对整个应用变得非常有用,并且作为了整个应用的核心。

在模块 2 架构中,Servlet 变成了一个所有常见任务的看门人,他提供常用的服务,比如:认证、授权、错误控制以及应用程序流。这个架构解决了大部分的问题,但是在实施这个框架时,仍旧有许多新的问题。

  • 使用多种框架来实现架构
  • Web 和互联网是一直在发展的领域,并且对于应用的需求也在增长。一个简单的框架是不能处理应用的框架的。为了迎合当前应用的需求,设计一种实现这些框架的架构是很有必要的。
  • Struts 框架被设计用来控制 Web 应用前端。它为应用提供了许多的特性来与用户交互。它也包含 MVC 2 的设计特性。
  • Spring 框架被设计用来处理多种任务。Spring 既可以在桌面应用也可以在网络应用中工作。它遵循 MVC 2 的原则。
  • 在一个应用中同时使用 Struts 和 Spring 框架来实现 MVC 的设计原则,我们就可以提高应用的性能。
  • Struts 框架包括了三个主要的模块,以下简要描述之。

21-059aeadfb66d42375a9cc60b50b09d77

  • 图 3 Struts 模块架构
  • 首先是 View 块,它控制整个模块的表现部分。View 块包括以下这些你编写的用于特定应用的 JSP 文件:一个 JSP 自定义标签库的集合、国际化的资源文件。
  • 第二块为 Controller。这是用来整个应用导航的部分。它包括 XML 配置文件,这些配置文件包括了导航路径的标签。

第三个块是 Model。这个部分执行业务逻辑的工作,获取数据并且存储到数据库中。这块包括以下这些内容:Java Beans Enterprise、Java Beans Database。下图展示了 struts 框架中的组件的工作。

22-6592754877a64f6c0e80473e6b3b935c

图 1 Struts 架构中的组件

Struts 中的 MVC

在 Spring MVC 框架中的三个主要的部分是:Servlet 控制器(控制器部分)、Java Server Pages 或者任何其他的表现技术(视图部分)、应用业务逻辑:以各种符合应用的格式(模块部分)。

Spring 组件

在 Spring 中,我们依旧遵循 MVC 的原则。它对桌面和互联网应用在设计上进行了优化。Spring 由三个核心的协作工作组件来组成:1.控制器:处理导航逻辑和与 Service 相关的的业务逻辑打交道。2.模块:控制器与视图之间的控制器用来填充视图的数据的格式。3.视图:生成请求的回复。从模块来拉取数据。

Spring MVC 中的核心组件是以下这些:

  • DispatcherServlet:Spring 的前端控制器。它是第一个与请求交互的控制器。我们可以说,它是 Servlet 的一个实现。它控制应用的整个流程。
  • Controller:用户创建的用来处理请求、封装导航逻辑的组件。它将业务逻辑委托给服务层类。
  • View:负责生成输出。根据结果和设备的不同,不同的视图可能被选择用来实现不同类型的输出。

ModelAndView:ModelAndView 是 Spring 框架的核心部分。它实现了应用的业务逻辑功能。它被控制器控制,保存和它关联的业务逻辑和视图。任何时候,它都带有视图的名称和填充的数据。

ViewResolver:输出依照接收到的 ModelAndView 的结果来显示,它被用来映射逻辑视图名称到一个实际的视图实现。这部分区分并且实现输出媒体内容与显示方式。

HandlerMapper:DispatcherServlet 用来映射输入请求到特定控制器的决策接口。他识别请求,并且调用负责处理的控制器来提供服务。

接下来的图演示了模块时怎样工作的。在这个图中,DispatcherServlet 是整个应用的重点。Struts 部分完成它的工作并将请求发送给 DispatcherServlet。Servlet 决定负责处理的控制器,然后它将会调用控制器,控制器执行并返回 ModelAndView。

23-8fbf3f6c0c0a9da4b1e61976afec5392

图 5:Spring 框架中的顺序应用流

建议的方法

这种方法是基于实现 Spring 和 Struts 两个框架的结合来开发应用。结合起来的应用的序列图在前面解释过了。它是应用的主要的驱动动力。这种方法假设基本的 Web 应用知识是必不可少的。我们已经测试过了以上的概念,并且发现它非常成功。以上的架构的主要益处如下:

  • 它将提供一个非常明确的在执行、执行形式、控制器、处理者、JavaBeans 模型以及视图之间的分割。
  • Spring 的 MVC 是非常灵活的。不像 Struts,它强迫你的 Action 和 Form 类具体的继承。我们使用两者共同的优势。
  • Spring MVC 是完全基于接口的。Spring MVC 框架的每个部分都是可配置的。
  • 提供了控制器,使得它很容易的处理许多来自用于界面的请求。
  • 我们可以使用 JSP 或者其他任何技术来显示视图、结果给使用不同设备的用户。
  • Spring 控制器依照控制反转特性,它是可配置的。这使得它们可以很容易的测试和继承其他的 Spring 管理的类。
  • Spring MVC Web 层相对于 Struts Web 层来说,通常更容易测试。由于控制器的避免强制混合和明确依赖于 DispatcherServlet。
  • Web 层变成了一个更薄的在业务逻辑层之上的层。这鼓励更好的实现。
  • Struts 框架被设计仅仅用来实现 Web 接口。Spring 框架为桌面和网络应用来设计。当两个框架结合起来,它将提供灵活的实现。
  • 总结

多框架的架构工作起来比任何单独框架的架构更好。使用多框架为开发大的可扩展的应用带来的便利,我们可以在多请求的情况下提高大数据库应用的性能、处理能力以及最大的使用量。它也将为企业和程序员开启新的空间和新的商业机会。为了达到更好的性能,最好使用多框架。由于 Java 代码的数量巨大,我不能够在这里提供它。

以后的研究

开放技术是最好的吸引学者和研究人员工作技术。J2EE 是当前广阔的领域,他也是开发技术。架构随着技术的改变而完善。有许多的框架可以使用 J2EE 技术来用作。单一的框架永远不能够为应用的特性提供完整的解决方案。将来会有许多的工作需要用其它的框架来实现并且加强 MVC 架构。

九、在 学 取 得 成 果

  • 在学期间所获的奖励
  • 年 6 月,获北京科技大学“第三届软件开发大赛三等奖”。
  • 年 11 月,获北京科技大学“优秀共青团员”称号。
  • 年 11 月,获北京科技大学“人民三等奖学金”。
  • 在学期间取得的科技成果
  • 年 6 月,参与完成的 2011 年北京市级本科生科技创新项目“基于移动平台的智慧化校园”通过学校验收并获一等奖。

十、致  谢

本课题是在指导老师姚宣霞教授的亲切关怀和悉心指导下完成的。姚老师对提交文档的细心浏览,总能挑出不合要求的地方,指导我改正。对我的毕设进度也一直很关心,提醒我按时提交。殷绪成老师也给予我很大帮助,在项目初期确定题目给我很大帮助。在此,谨向姚老师和殷老师表示由衷的感谢。

另外,要感谢宋利学姐、张博文同学以及张皓辰学弟,在项目初期,与殷老师一起讨论我的题目与内容,在整个毕设过程中,学姐对我提交的文档、论文以及整个毕设中一些注意事项为我提供指导意见。感谢王基镔同学,在我上班时间帮我打印、找老师签字以及提交文档,还有对我关于毕业一些疑问的解答。

最后,感谢我使用的所有开源、自由软件的开发者们。你们无私的工作引导了各个领域的技术创新,改变了人们的生活方式。没有前人的工作,我不可能完成这个课题,感谢你们,感谢所有关心、帮助过本课题的老师、同学们!

参考文献

  • 基于SSH技术的网络书城设计与实现(北京工业大学·谢宗懿)
  • 基于B/S结构的电子商务的研究与应用(哈尔滨工程大学·车彦朋)
  • 网上书店系统设计与实现(吉林大学·关键)
  • 基于SSH框架的图书销售与推荐系统的设计与实现(山西大学·雷兴邦)
  • 图书电子商务交易平台设计与实现(山东大学·唐水金)
  • 基于Web系统的计算机编程语言书籍交流系统设计与开发(吉林大学·刘峰兵)
  • 基于SSH框架的网上书城系统设计与实现(成都理工大学·田涛)
  • 数据挖掘在电子商务推荐系统中的应用与研究(西安科技大学·卫华)
  • 基于SSH框架的网上书城系统设计与实现(成都理工大学·田涛)
  • 面向中学生的图书推荐系统的设计与实现(华南理工大学·陈仪)
  • 基于.NET的网上书店的设计与实现(电子科技大学·刘尧)
  • 数据挖掘在电子商务推荐系统中的应用与研究(西安科技大学·卫华)
  • 基于JSP的网上书店交易系统的设计与实现(吉林大学·徐迎新)
  • 基于Web的书刊进销存系统的设计与实现(大连理工大学·王宁)
  • 网上书店系统的设计与实现(厦门大学·杨一雄)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设工厂 ,原文地址:https://m.bishedaima.com/yuanma/35664.html

相关推荐

发表回复

登录后才能评论