个性化音乐推荐系统设计与实现

更新时间:2024-04-11 20:03:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

个性化音乐推荐系统设计与实现

摘要

21世纪是信息化时代,随着信息技术和网络技术的发展,信息化已经渗透到人们日常生活的各个方面,与人们的日常生活早已建立了离不开的联系。对网络音乐服务来说,不管是音乐下载服务,或者是网络音乐电台服务,都需要用到优秀的内容推荐系统去辅助整个系统。个性化音乐推荐系统是目前最流行的应用方法之一。同时音乐成为重要的媒介与朋友交流文化,所以很多SNS应用当中将音乐服务添加到里面。

本系统采用SSH框架组合进行设计,基于Java Web技术,系统使用UML建模。本系统的功能模块主要包括:音乐上传、单曲管理、个人信息维护、收集歌曲信息、音乐检索以及系统推荐等。音乐上传利用JavaScript脚本定义了一个函数,单曲管理在action中定义一个方法,系统推荐是利用协同过滤算法来进行的。

整个系统主要实现了从用户注册和登录、检索音乐到收听音乐、评分音乐,个性化推荐的整个音乐系统,管理员可使用系统后台对音乐歌曲信息进行修改、会员信息修改、系统推荐等进行有效的管理。很大程度上提高了对音乐管理的效率,符合了广大用户们的基本需求。

关键词:SSH框架,音乐系统,协同过滤,MVC模式

DESIGN AND INPLEMENTATION OF

PERSONALIZED MUSIC RECOMMENDATION SYSTEM

Abstract

The 21st century is the era of information, with the development of information technology and network technology, it has penetrated into every aspect of daily life, with people in daily life has been inextricably linked to the establishment.For the Internet music service, whether it is music download service, or network music radio service, all need to use the excellent content recommendation system to support the whole system. Personalized music recommendation system is one of the most popular applications. At the same time music has become an important medium of communication with friends culture, so many SNS applications when the music services added to the inside.

The system uses a combination of SSH framework design, based on Java Web technology,system used UML modeling. Site function modules include: Music upload, music management,personal information maintenance, collecting music information, music search and system recommend.

The entire site is simple, user-friendly, flexible and practical. The main achievement of the user registration and login, retrieve music to listen to music, the whole comment is called online music listening processes, and system administrators can use the background information on the goods, membership information, message information, and effective management. Greatly improving the efficiency of music management, in line with the needs of customers.

Keywords: SSH Framework,Music System,Collaborative Filtering,MVC Pattern

目录

1 绪论 ………………………1 1.1 项目背景 ………………………1 1.2 系统开发的意义 ………………………2 1.3 国内外音乐系统现状 ………………………3 1.3.1全球音乐系统系统发展情况 ………………………3 1.3.2中国音乐系统发展现状 ………………………3 1.3.3网络音乐系统市场发展趋势 ………………………4 2 技术准备 ………………………6 2.1 Java Web ………………………6 2.1.1 Servlet技术 ………………………6 2.1.2 JSP技术 ………………………8 2.1.3 JSTL标签 ………………………9

2.1.4 JSP 2.0自定义标签 ………………………9 2.1.5 Filter过滤器 ………………………10 2.2 MVC模式 ………………………11 2.3 Spring框架 ………………………12 2.4 AJAX技术 ………………………12 3 系统分析与设计 ………………………14 3.1 系统简介 ………………………14 3.2 系统框架设计 ………………………14 3.3 功能需求 ………………………15

3.3.1面向管理的需求定义 ………………………16 3.3.2面向体验的需求定义 ………………………17 3.3.3面向维护的需求定义 ………………………18 3.4个性化音乐推荐系统设计 ………………………21

3.4.1 音乐上传设计 ………………………22 3.4.2 单曲管理设计 ………………………22 3.4.3 收集歌曲信息设计 ………………………22 3.4.4 音乐检索设计 ………………………22 3.4.5 音乐推荐设计 ………………………23 3.5数据库设计 ………………………23

3.5.1 数据库概念结构设计(E-R图) ………………………23 3.5.2 音乐推荐系统数据库表设计 ………………………25 4 系统技术实现 ………………………30 4.1 音乐上传功能的实现 ………………………31 4.2 收集歌曲信息功能的实现 ………………………32 4.3 单曲管理功能的实现 ………………………33 4.3.1 播放功能的实现 ………………………35 4.3.2 下载功能的实现 ………………………35 4.4音乐推荐功能的实现 ………………………36 4.4.1所用数据表 ………………………37 4.4.2实现过程 ………………………37 5 总结 ………………………41 参考文献 ………………………43 致谢 ………………………45 译文及原文 ………………………46

1 绪论 1.1 项目背景

信息技术改变了了人们的生活方式,是当今信息化时代便捷人们生活的一项伟大创举。在生活节奏越来越快的今天,人们对娱乐便捷的需求也越来越强烈。

日益发展的网格技术与信息技术,各种音乐推荐系统也是逐渐应运而生。用信息技术与互联网技术相结合的音乐网站,其便利性、数据存储安全性、共享性、数据容量等,明显优于传统的磁带与CD。

计算机科学技术日益发展,它早已深入到人类社会的每个角落里,而且发挥着越来越不可代替的作用,利用传统方式的存储数据资料的方式已经逐渐离我们而去。设计本系统的目的是为了改善那些原有网站的的缺点,为用户提供一个使用更好更便利的在线音乐平台系统,并且在协调不同的用户偏好方面也可以做的更好。此外,系统能提供给管理员一个清晰简明的界面,合理安排音乐分类信息,并根据用户的要求和信息;根据用户的某些特点,为用户提供一些更能产生共鸣的音乐。

自古以来,音乐就一直伴随着人们的日常生活,古有笙箫唢呐,今有吉他萨克斯,如今人们听音乐大多通过手机、音乐播放器,或是直接在电脑上在线收听,连mp3,mp4都很少有人使用。人们也在不断地对音乐的形式进行创新和发展,21世纪初,人们还通过磁带或是光盘收听音乐,而今天数字音乐以遍及全球,人们大多通过互联网来收听音乐,换句话说,互联网是今天最流行的数字音乐的音乐介质和最大载体。

Java技术是在Web开发领域中,表现极其出色的技术之一,由于在Web开发领域中的杰出表现,Java技术近年来的发展非常迅猛,越来越多的网站使用Java进行开发。例如众所周知的淘宝网,随着就业务规模的不断扩大,php架构有些不能适应现在的用户需求,所以淘宝高层曾经考虑过将淘宝网转型成为Java平台架构,这无疑是对Java技术的一种巨大的肯定。在中国交通领域中,

有许多在线购票网站,首当其冲的就是国家铁道部的12306网站,它隶属于国家机关,对技术的要求十分高,就连如此重要的网站也是使用SSH框架开发的,而SSH框架是隶属于Java平台。

虽然有许多重要且成功的网站都是使用Java技术进行开发的,但由于Java技术过于复杂等原因,现有音乐网站多是通过php等其他语言进行编写的。此外,这些音乐网站也几乎没有将最新的HTML5标准适用于网站中最重要的音频解码方面,而仍使用Windows自带的解码控件,这节省了网站开发的难度,但却十分不利于Android和iOS端的手机用户在该网站上获得良好的音乐体验。

1.2 系统开发的意义

此系统使用JAVA WEB技术, 采用SSH框架和MYSQL数据库作为工具进行开发解决方案,实现了B/S模式的个性化音乐推荐系统的设计。利用web服务器和客户自己的浏览器,为用户提供在线音乐系统平台,通过浏览器在网站上直接检索音乐、收听音乐、对音乐评分等,这些功能可以让用户得到更好的音乐体验,让用户在一天24小时的时间内都可以在在线音乐系统中收听自己喜欢的音乐。网站的规则是根据目前商业网站的成熟规则进行设计的,主要功能为网上在线音乐收听,再加上留言等功能,此外能提供给管理者一个简单的界面,可以合理安排音乐分类信息,并根据用户的要求和信息;根据用户的某些特点,为用户提供一些更能产生共鸣的音乐。是一个综合性在线音乐系统网站。

由于Java平台技术在当今时代已经逐渐取代php等其他技术成为Web开发的主流,而且通过SSH框架对Web网站进行编程开发的案例也更多更好,以此为背景,通过学习SSH框架,进行一个音乐网站的设计具有非常重要的意义。

对Java平台技术加深深刻理解的最好方法,便是学会Hibernate ORM框架的映射关系维护和加载策略,在学会这个技术后,对使用Spring的基本整合配置对系统架构优化进行掌握和了解,在有了一定的技术基础后研究MVC思想(Struts 2.x框架)实现及标签库的使用方法,

有很多音乐网站在页面复用方面并没有重点进行研究和开发,而本音乐网站在此方面进行了很多的研究并达到了很高的复用标准,这是对充分理解软件工程

的复用思想的很好体现,在充分理解了复用思想后,对网站的开发提供了许多实践经验;如何设计并实现一个网站特有的音乐播放器是网站开发的重点之一,最终决定使用JavaScript/HTML5/CSS和对细小的图片进行素材处理来进行开发,实现一个原创的音乐播放器,可以很好地帮助流媒体空间的跨平台开发;根据用户需求,要求网站在设计模式中必须具有开闭原则(对扩展开放,对修改关闭),在实现开闭原则的方法上,网站决定通过码表实现数据字典扩展功能从而完成这项技术要求。

(1)在软件工程领域中设计理论和方法来分析个性化音乐推荐系统的发展过程中,使音乐网络领域在面向对象的方法研究中做出了实质性的贡献。

(2)个性化音乐推荐系统使视图模型抽象方法、建模过程、模型表示等多个点的出发构建建了科学和有效的系统。

(3)从个性化音乐推荐系统的结构,过程和可视化功能的统一建模语言UML元素来看,个性化音乐推荐系统设计的可视化功能提供了方法和技术支持。

1.3 国内外音乐系统现状

在设计整个系统之前,我们对国内外的预测系统进行了调研,希望吸取它们的优秀设计功能。

个性化音乐推荐系统市场需求,以不断探索自己的发展模式来看,在解决了现有的版权等一系列音乐市场的问题后,个性化音乐推荐系统市场规模必然会增大,与此同时的传统模式的音乐专辑的销售情况就变得不容乐观了。

1.3.1中国音乐系统发展现状

个性化音乐推荐系统在中国,虽然一直被关注着,但它似乎并没有走出亏损的底部。然而,尽管它一直在底部,但并没有阻止个性化音乐推荐系统服务供应商探讨行业的发展模式。从A8,发展到百度音乐和新浪音乐以及爱国者推出的音乐超市和腾讯QQ独特的平台和服务相结合,中国的音乐系统永不放弃在对个性化音乐推荐产业的热情。有声音认为,随着4G市场的到来,未来的音乐服务将有什么办法打造产业链,但如何以创新模式在4G时代,这些不确定因素决定了中国的个性化音乐推荐系统仍然需要很长的路要走。

2012 年,中国在线音乐系统市场规模仅为 3.8亿元,与传统唱片的市场规模不可相提并论。近年来预计,2014 年以后国内在线音乐系统市场将进入健康发展阶段,2013 年中国在线音乐系统市场规模超过 5 亿元,年增长率超过 60%,预计 2014 年将达 7.5 亿元。

盗版一直是中国音乐市场的一个很大的敌人,它严重影响着在中国音乐的发展,2014年,中国个性化音乐推荐系统的市场规模仅仅是2.8亿元。近年来,政策调控加大,利益的各项业务间的合理有效分配在产业链,有效政策法规的颁布和实施,将对中国的在线音乐系统市场产生积极的影响。预计2017年个性化音乐推荐系统市场之后将进入良性发展阶段,2015年中国音乐推荐系统市场规模超过5亿人民币,超过60%的年均速度增长,预计在2016年将达到8.5亿的市场规模。

1.3.2网络音乐系统市场发展趋势

网络开始成为释放原创音乐的重要途径。 2001年3月6日0时,MP3格式的中国第一个网络歌曲出现在人们的生活空间中,开始了音乐网亮相的序幕。经过10多年的发展,今天的互联网和移动互联网已成为唱片公司的歌曲和视频发布推广的主要路径,网络首发的歌曲也成为在线音乐服务提供商吸引用户,用户聚集的重要手段之一。

网上商店已经成为最新的无线音乐下载的亮点之一。国际知名的apple公司开发了在线应用程序商店模式,google,blackberry,samsung等厂商纷纷跟进,nokia,motorola,lenovo等移动终端运营商已经投入巨资,试图开辟属于自己的一片天地。中国移动,中国电信,中国联通等通信运营商,也开始建立自己的在线软件商店。

社区网站的音乐带来的变化和方式转变。人人网,赛我网等快速发展的社交阶层网站的代表,嵌入式网络音乐播放器插件和用户分享,口碑传播模式,以促进音乐的网络传输改造,让中小型CD公司和非主流创作者可以更容易地传播他们的作品。社区网站的粘贴性和互动性将带来互联网音乐传播的巨大变化。

互联网音乐将从一个简单统一向个性化发展。互联网音乐服务的形式已经从纯粹的音乐内容,发展到现在的提供音乐共享交换阶段。更多的网友不满意被动

地听音乐,而是热衷于分享。在未来的网络音乐将发展到精密推荐音乐的阶段,用户需要实现智能网络音乐内容提供商推荐音乐。该网络音乐内容服务提供商和运营商提出了更高的要求,用户需要准确识别的行为,和智能地为用户提供分类服务。

音乐云将成为热门的服务,未来尚不明确。A8音乐在2011年年初提出的音乐云服务的理念,开始了中国网络音乐云前奏,其他厂商纷纷效仿。所谓“云音乐”,简单来说是通过音乐软件的用户可存储在云音乐内容中的各种设备,如移动电话,个人电脑和电视的播出,共享,而不需要用户再耗时从计算机内存中拷贝到其他终端设备。

2 技术准备

本系统中的设计部分主要使用JAVA WEB(SERVLET、JSP自定义标签、JSTL标签等)开发技术;对于系统的业务控制层我们使用STRUCTS2框架实现软件设计MVC思想中的业务的控制流转;本系统的数据持久层使用HIBERNATE框架进行系统托管;在系统架构方面,本系统使用WEB开发中常用的SPRING框架。如下章节将对上述关键开发技术进行必要的阐述。

2.1 Java Web

Java技术中最为核心的技术就是Java SE[1](Java 2 Platform Standard Edition),Java SE技术多被用于企业开发Java应用程序。随着计算机技术的发展Java开发技术在互联网得到了极大的发展,目前来看来说是应用最为广泛、开发技术占有率最高开发技术,当我们掌握了Java SE的主要内容后,面向Web开发时主要使用的是Java EE,Java EE是Java Web的主要开发技术。

Web开发技术主要有两个最为重要内容:客户端(CLIENT)和服务器(SERVER)端。Java Applet是Java客户端的应用之一,Java Applet实际应用中使用得相对来说较少;对于服务器端的应用来说却显得异常丰富,最为人们熟知的如SERVLET技术、过滤器、JSP自定义标签等,下文中将详细介绍这些技术。

2.1.1 Servlet技术

随着动态页面技术在上个世纪末开始流行,动态页面技术为Web开发技术带来了一次成功的大变革,它不仅极大的节省了人力成本,使得开发人员专注于静态页面维护的工作转移到如何使页面更加高效上来。对于动态展示的Web应用程序可以根据来自使用者的不同页面请求,依据不同请求动态地返回所需要的结果集。我们称之为公共网关接口程序CGI,而这是一种用于系统产生动态页面的程序代码。

实现页面的动态输出功能的公共网关接口程序是运行在系统的服务器端,Java开发语言可以用来编写绝大部分的CGI程序,但是Java 程序编写的CGI执行效率相对来说较低。因为要执行Java程序编写的CGI程序,不仅要在操作系统中运行CGI程序,还必须在操作系统中运行Java Virtual Machine,Java虚拟机,首先要在操作系统中运行Java虚拟机,然后才能在Java虚拟机中执行Java CGI程序,对于操作系统来说资源的浪费是非常大的。而CGI程序是运行在服务器端的程序,其执行效率是系统管理者非常关心的问题。

因为CGI技术存在上述的弊端,也为了有效的解决CGI的执行效率问题,Java所属的公司SUN公司又推出了一套SERVLET技术规范[2]。SERVLET的本质是一种改进之后的CGI程序接口,引入SERVLET的主要目的就是为了减少系统的资源消耗,减少对JVM的依赖和不必要的频繁交互性操作,从而从资源消耗方面来提高程序效率。

SERVLET技术对于CGI程序的主要改进的地方有:SERVLET运行所需资源较少,此时操作系统只为SERVLET程序提供唯一的进程和JVM就可以满足程序运行所需的资源;当客户有多次请求同一个相同动态页面的请求结果集, SERVLET程序将只加载一个Java类来处理相同的请求;原始的CGI程序于WEB服务器交互方面不能直接进行有效的交互,SERVLET程序可以于WEB服务器交互,而且SERVLET程序还可以使不同程序进行共享数据。由此我们可以总结出,SERVLET技术在应用程序的性能方面提升是明显的。

SERVLET技术处理Java Web客户断请求与数据的处理过程如图2-1所示。 图2-1 Java Web请求响应过程

二十世纪九十年代末期,Java的所属SUN公司为了让SERVLET技术适应商业发展,建立了一套有效开发API成之为Java Servlet API,这就使得SERVLET技术具有了更好的跨平台性和较好的可移植性。

在计算机科学技术的发展过程中任何一项技术都有自己的突出点和短板——SERVLET在生成客户请求的网页时,需要在HTML标签中嵌套上JAVA程序代码。这时如果HTML标签中发生个CSS样式细小的变化将导致SERVLET中的Java类不得不重新进行修改。而实际应用中HTML页面的展现必须与Servlet后台代码的侧重点不同,因而这种关联关系会让后台代码Java代码的维护非常麻烦。

2.1.2 JSP技术

JSP[3](Java Server Pages)最大的特点是将静态的HTML标签技术和动态的页面技术相结合,它不仅能够扩展SERVLET API接口,还在继承原有技术上全面保留Java API,在页面的展现形式上更加趋近于HTML技术。

当我们从JSP页面文件的布局上可以非常清楚地看到它与HTML静态网页在布局格式上几乎一致,然而于HTML静态页面相比JSP文件中却可以在任意符合JSP语法的地方嵌入Java程序代码,这样就可以轻松的实现SERVLET程序逻辑。那么在SERVLET应用程序中不易被提取出来的HTML标签代码在JSP页面中能够以较为直接的显示方式展现给开发设计人员,这非常有利于前台页面的有效的结构和展示的设计。

如果对TOMCAT服务器的Web服务器下的WEB/APP目录中的JSP文件进行解析,可以发现每一个JSP文件都将存在一个.java的文件于JSP文件相对。而且当开发人员或用户对JSP文件的HTML标签进行部分修改,系统将没有必要重新启动TOMCAT服务器就可以直接刷新更改后的页面直接看到效果。这跟SERVLET技术有很大的区别,主要是由于被修改的静态代码对Servlet程序代码没有起到作用,这时我们就不需要重新对JSP进行编译,所以直接刷新浏览器即可重新显示页面的更改。

当来自用户的请求系统中的某个JSP页面时,Web容器将会按照以下三个步骤进行处理:

首先将开发人员编写好的动态JSP文件通过Web容器中的SERVLET转换引擎转换成为*.java源代码;然后通过Java虚拟机将*.java源代码文件翻译成为机器能够识别的字节码文件(二进制);最后当客户端发来页面请求时,WEB容器将按照已经编译好的二进制字节码文件进行处理,将生成的HTML页面代码反馈给客户端中显示。

总的来说,JSP技术是一种更接近于视图层、更加易于表现的Servlet程序代码。二者在本质上并没有明显的区别,但是JSP技术为使用者和开发人员提供了丰富的标签库,例如JSTL标签、自定义标签等更加灵活便捷的标签。

2.1.3 JSTL标签

JSTL[4]全称为JSP Standard Tag Library,JSP标准标签库。由于这是基于JSP标准的标签库文件,与STRUCT2等标签库相比,JSTL标准标签库所提供的功能虽然并不是特别丰富,但是JSTL标准标签库的适用性却非常广泛。

JSTL标签库主要为用户提供CORE标签库、FN方法库、XML标签库和FMT标签库、SQL标签库等5个部分的内容。

首先CORE标签库为开发人员提供诸如为了达到实现循环效果后台代码中可以使用标签的for循环语句;FMT标签库主要用于控制标签库的标签格式化输出等;FN方法库提供多种方法来丰富开发者操作例如fn:contains()、fn:split()等;开发者可以使用对数据库操作的支持SQL标签库对数据库进行操作,如使用标签来实现数据库中的事务管理等,但这些标签在主流框架的冲击下,大多数项目环境中已经很少用这些标签;XML标签库实现XML相关的操作我们们可以使用等标签。

2.1.4 JSP 2.0自定义标签

JSP 1.x标准模版中提供了为用户自定义的标签库的功能供开发者使用,允许开发者编写其所需的标签而且能够并配置定义若干个标签,并以在开发过程中以标签库的形式对页面展示进行合理配置管理。但是开发者在编写自定义标签的时候首先要实现Tag接口或者继承TagSupport类,这个使用方法是JSP 1.x为开发人员提供的开放API。自从JSP 2.0[5]标准发布之后,用户只需要使用更加

简单的SimpleTagSupport类来重写doTag(),这样就使得开发人员在自定义标签的时候更加快捷。

JSP标签库中的自定义标签API的组织结构如图2-2所示。 图2-2 JSP自定义标签的API体系

本系统项目中在处理实体对象数据原型的管理逻辑时,由于分页功能的使用率非常高,因而在本系统我们使用了JSP 标准技术中的自定义标签库功能,定义了标签,标签极大的减少了JSP前台页面中的重复代码,为代码维护和界面显示带来了极大的便利。

2.1.5 Filter过滤器

Servlet API[6]代表着开源和开放的意思。2000年,三星公司通过发布Servlet 2.3规范,Filter过滤器的功能得到添加,接下来的2.4、2.5版本又使其各项功能得了进一步的改进。

在平时上网时,我们很少的会遇到这样一种情况,用户发的帖子中贴图显现出来的图文与本来所想的样子有很大的出入,出现这种情况最主要的原因就是贴子中的图片的来源网站用了“防盗链”的功能。而绝大多数的网站,在处理权限控制时(如在淘宝网购物必须具有已登录的账户),对于一些重要的操作过程都设置了审核这一环节(如检测到当前用户没有有效的登录状态,则拦截后续操作并转到提示页面)。这一类常用操作都是可以利用Filter过滤器来完成的。

在这一项目中,我们想到有的用户会通过浏览器地址栏暴力探索等非常规方式登录还没有完成的JSP页面造成逻辑错误,从而恶性的利用Filter过滤器拦截,让用户不能登录访问目的网页。

这归根到底是由于本项目所采用的方法是:页面只能用作后台间接反馈给用户的调用出来的结果,用户只能访问后台功能的各模块。

所谓监听器,其实和Java AWT/Swing[7]编程中的Listener是差不多的,一旦触发某一个事件,用户所指定的程序逻辑就会被立即执行,实现预设的目的。程序开发人员只要知道触发了一个事件所调用指定的Listener方法就行,而无需了解事件(Event)和监听器(Listener)是相互作用的过程。因此,只要把用户自己的业务逻辑编入所设定的方法程序中便可。

监听器有监听对象属性变化、监听对象的创建与销毁、监听Session内的对象、监听Session/Request/ServletContext等对象等这几种种类。

该项目中的使用Listener监听器做到了“单态登录”,如果处于登录状态,而这一帐户又在此时于异地登录,先前的登录便会被注销。

只要将业务逻辑编入到HttpSessionAttributeListener接口的attributeAdded()方法中便可实现这一功能。

2.2 MVC模式

Model-View-Controller可缩写为MVC[8]。Java EE中较为广泛的使用了这种分层的思想,主要特点就是提供对流程进行管理的用于控制导向的Controller,同时把业务逻辑和前台表现层隔离开来。

MVC思想最早是在1982年被提出来的,现在它作为差不多全部主流面向对像Web开发技术框架的标准,把业务逻辑和显示层进行分离,不但使得开发效率有所提升,而且具有部署快、可维护性高、耦合性低、重用性高等诸多优点。

如果不使用第三方框加,采用的又是原生的Java EE技术,我们一般就会这样的判断:POJO、DAO、Service等内容为Model层,JSP为View层,Servlet为Controller层,请参见图2-3所示。

图2-3 MVC分层思想

一般想思想意识中的POJO(也称为Bean、VO或原型)不局限于Model层,也不属于其他任何一层。比如在JSP页面当中的EL表达式一般情况下能通过“${bean.attribute}”的形式调用到一个POJO内部的东西。当然这种调用是建立在JSP API基础之上的,绝非与人为设定的Model层产生相互作用。POJO作为数据传递的媒介,将表数据以POJO的形式通过Hibernate等框架到达DAO层,DAO层再把POJO原型对象与Service的交换。在Struts 2.x框架中的ModelDriven接口中有些时候POJO也会作为Controller层与前台交互的媒介。

因此我们会错误的认为POJO与其他层是平等的,其实不然,把它归纳到Model层中是非常不科学的,它只是MVC分层中的一种通讯工具。但事事都无绝对性,这要看开发的人如何去理解和应用。

2.3 Spring框架

Spring框架是一功能强大的整合工具,一直是多框架的保护神,Spring是由Rod Johnson于2003年创建并兴起,它为项目的解耦与新需求的扩展带来了很多方便,设计的初衷是为了应对企业应用的复杂性,积极支持Java EE,弥补了其臃肿、低效等不足之处。当然对传统的Java EE框架也是一种挑点。

尽管Struts框架[8]充分的体现了MVC思想,但也带来局限性,Action与DAO层、Service层过于紧密的耦合,这将对项目的需要变化转型产生消极的影响。这种情况下我们可以使用Spring间接的协调,使用Spring的IoC机制来配置管理并维护这种耦合关系。只有这样,Struts的Action和DAO与Service才能不互相依赖,而是更好的互相配合工作了。

一样的道理,Hibernate也可以通过整合到Spring中来获得同样的良好效果。 虽然Spring框架中提供MVC模块,但暂时并没有使用它们,而使用的是Struts 2框架,这主要是因为该项目中大量的采用了Struts 2标签库内容。

2.4 AJAX技术

AJAX指的是“异步的JavaScript包括XML”(Asynchronous JavaScript and XML)。即在不需要等待服务器将结果返回就可以继续下面的业务逻辑,就是所说的“同步方式”。而传统的“同步方式”是客户端发出了一个请求,只有在服务器响应后,方可继续下一步的业务逻辑。

比如我们平时在一个网站注册一个用户名,用户名输入后直接显示用户名是不是被占用,而不需要刷新页面或者点击一控件。之所以这样,最主要的就是因为onkeyup或onblur等HTML事件触发了AJAX的回调函数,在JavaScript作用下,直接根据服务器的结果信息改变HTML代码内容,而不必刷新页面。

XMLHttpRequest对象是AJAX技术最核心的地方。常见的浏览器都支持AJAX技术,同时在不影响客户端当前的操作的情况下把数据通过一种简单的方式传递到服务器端。AJAX对数据的传递一般采用高效的JSON,但也习惯使用XML格式数据。

3 系统分析与设计 3.1 系统简介

本系统的主要功有,首先是对系统中用户、播放列表、歌曲、歌手等相关数据进行整合并存入数据库中,在需要时进行查询,并且还支持查看各类原型信息的查看、修改、删除等。通过本系统,用户可以很方便的了解到歌手的信息,以及专辑的信息,并且这些信息还可以保存在用的账户中,以便用户以后可以快速的查看。

3.2 系统框架设计

Struts 1.x原本是Apache中一个项目,但是现在已经成为java web开发中一个非常流行的网络框架,如果开发者想要基于Servlet和JSP创建一个可扩展的应用,Struts 1.x是一个不错的选择。而在后来的版本Struts 2.x中,是以WebWork为核心,从而使得那些与Servlet API相关的可避免的依赖关系不出现在核心业务控制层,不仅如此,Struts 2.x还提供了更方便的Validator、OGNL等工具,并且还抛弃了不繁琐的ActionForm。另外值得注意的一点是,一般软件的后续版本与之前本大同小异,没有什么根本的变化,但是在Struts框架中却不是这样,Struts 2.x和Struts 1.x具有完全不同核心,而它们具有相同的名字完全是因为Struts 1.x使用的广泛性。

本项目便是基于Struts 2.x搭建,并且在设计中使用了MVC模型,项目运行的逻辑如下:

(1)用户请求指定的Action;

(2)Action根据参数等条件进行导向;

(3)Action调用指定的业务逻辑完成后台操作并准备前台数据; (4)根据struts.xml配置文件将带有结果数据的前台页面反馈给浏览器。 数据持久化框架(Object-Relative Database-Mapping, ORM)一个在很多场景下对数据的访问都要求极其严格的框架,与Apache的iBatis提供的半自动化方式相比,Hibernate提供一种全自动化的数据持久化方案。在Hibernate中,

通过相应的文件配置,我们可以实现相同的程序在不同的数据库平台下后可以正常运行,并且不需要做任何修改,而因此Hibernate也成为了Java中最为流行的数据持久化框架。

使用通用JDBC编程,开发者需要编写大量的插入,更新,删除,选择等语句来操作数据库。但是,这些SQL语句往往因为数据库平台的不同而变化,这使得程序的维护变得非常麻烦。在Hibernate中我们可以使用HQL语句,根据HQL语法和配置好的数据库类型,将不变的HQL语句随环境的不同而转换成不同的SQL语句。

JDBC的缺点是,开发者必须关注数据库与POJO对象属性中的数据之间的映射关系,当多个POJO直接彼此带有关系映射时,该缺点更明显。因此可以通过合理的配置Hibernate使得自动的关联起表字段和类属性,自动维护单向或双向关系映射,那么开发者就可以很方便的对数据库进行操作。

在本项目当中我们除了使用Struts 2.x来创建Controller层外,还用到了文件上传的功能。在Structs 1.x中我们只能使用FormFile类来上传文件,但是在Structs 2.x中我们就可以直接使用java.io.File对文件进行操作,从而使得文件上传更加简单。

3.3 功能需求

本系统的需求方向主要分为“面向管理”、“面向体验”与“面向维护”共三个方面。 首先是面向管理,所谓管理就是指系统管理员在登录账户后可以对数据库中的各项数据进行增、删、查、改等操作;然后是面向体验,指普通用户或者没有账户的游客也可以在网站上搜索、播放、收藏自己喜欢的歌曲;而面向维护则指在后期的修改中开发者能最低程度的修改当前已有代码从而完成所需的功能。

项目中的功能与具体需求方向之间关系概括整理如图3-1所示。 图3-1 功能模块与需求方向

3.3.1面向管理的需求定义

面向管理的需求定理主要是针对系统管理员,涉及一般用户的内容比较少,并且不涉及未登录的用户。

在本项目当中我们对管理的定义为可以对数据进行添加、修改以及删除等操作,而一般的浏览、搜索或者播放歌曲并不归类在管理当中。当用户登录系统之后具有不同的身份,而根据不同的身份我们分配不同的权限,其中主要身份包括超级管理员、一般管理员、普通用户以及未登录用户几大类。

从表面上来看,超级管理员和普通管理员没有什么区别,但在权限上还是有些差别,比如超级管理员在用户管理上的权限要比普通管理员大。

“面向管理”的需求则是体现在系统的全局架构上,而并没有体现在任何一个单一的功能模块中。例如对系统架构解耦的要求,对页面代码复用率的要求等。

面向管理方向的功能需求归纳如图3-2所示。 图3-2 面向管理的需求定义

3.3.2面向体验的需求定义

“面向体验”则是指主要操作是浏览、搜索或者播放等,而不涉及数据的添加、修改、删除等。在本节定义的功能中,大多数以游客的身份就可以完成。

下面是需求定义图3-3所示。 图3-3 面向定义的需求定义

3.3.3面向维护的需求定义

一个好的系统不仅要求界面的美观以及功能的完善,而且需要后期维护的方便,所以在系统设计时就应该考虑这些问题,程序代码之间不应该只是简简单单的堆在一起,而是应该定义好每个模块的功能,从而能使得整个系统结构更加清晰,同样的,代码的复用率也是评判一个系统健壮性的重要标准。

本节所讨论的需求定义则是为了提高系统健壮性、可扩展性和代码质量而设定的。下面是需求定义如图3-4所示。

图3-4 面向维护的需求定义

这里列出的8条需求定义主要是为了整个系统的健壮性、逻辑安全性以及代码安全性,对于最终的功能上则没有什么影响,也就是说即使不使用SSH框架,不进行任何代码的复用,整个项目还是可以正常实现并运行,不过在各方面的效率相对较低。

(1)前台JSP页面的复用

在所有实现的代码当中JSP页面占了很大的比重,所以如果可以代码复用,那么后期维护将会极其便利,在本项目中所采取的复用策略是:

如果在布局和样式上有两个或者两个以上的页面相似,那么我们就考虑使用同一个页面完成相应的功能。

例如我们在设计页面的功能时发现,添加歌手信息界面和编辑歌手信息页面基本类似,不同就在于在添加歌手信息是表格里的内容都是没有值,而在修改歌手信息时,表格中相应的项都已经有值;另外一个不同就在于单击提交按钮后执行的操作不同;最后一个不同就是添加时歌手的ID值为空,为修改时歌手ID值不为空。

所以当我们遇到两个页面在布局和样式上基本一样时,而只有在内容上有细微的差异,我们就考虑使用一个页面来完成两部分功能,而不是使用不同的页面去显示。而我们采取这种方法不仅仅是为了精简代码,更是为了后期维护的便利。例如,如果页面要添加新的功能或者更换布局风格,那么我们在复用代码之后,就只需要修改一小部分代码就可以完成要求的功能,而不是像复用之前需要去修改所有页面相应的内容。

(2)后台代码的复用

后台也同样有复用的要求,这在软件工程理论中占有非常重要的地位。大致的策略为:

如果一个Java类文件中的某些方法或部分代码可以脱离其所在环境而独立完成指定的功能,而这部分功能还有另外至少1处被使用的场景,那么就将这些代码提取出来供多个Java类文件共同调用。

通常情况下,这种复用的代码都被放在*.util包中。 (3)码表:可扩展性

在我们的整个系统中,有很多部分都涉及到“静态列表信息”,比如在显示用户的所在地时,我们一般会选择select标签来实现选择的功能,但是在使用该标签是要注意,我们不能直接将所有所在地的信息直接写入在代码当中,而是应该先将这些信息存在数据库中,在需要时再从数据库中读取。

虽然在我们的项目当中这些信息基本不变,但是当项目应用到其他场景时,例如其他国家的人访问了我们的项目,那么我们就需要添加相应的地址,若果所有地址信息都是直接写到前端,那么我们就要修改所有有关地址的页面,而如果我们将这些信息写入到数据库中,则只需要一条SQL语句即可添加新地址。

码表是数据库中唯一的一张表,所有不同类型的静态列表信息都将存放在码表中,后台为前台加载信息时能够保证内容的动态性,通常我们使用JSP自定义标签来实现这个功能。

(4)系统安全性

本系统的安全性应当分为两个角度考虑:

第一,密码的安全性。首先不应该在任何地方保存用户密码的明文信息,正确的保存方式应该是通过MD5或者其他单项散列函数进行加密之后存储,另外由于自定义安全控件技术上难以实现,所以用户的明文密码也应该只能停留在浏览器的处理阶段。因为我们知道,一旦保存的数据库遭到黑客攻击,那么用户的密码信息将会泄露,而很多用户在不同的网站上基本使用相同的密码,如果密码以密文保存,那么黑客也无法破解出原密码,而如果以明文保存,那么将会给用户的隐私信息带来严重威胁。

第二,逻辑的安全性。在Structs框架中,后台的Action提供给前台所有的页面,而如果用户访问一个后台Action不存在的页面时,那么将会发生逻辑错误。而为了避免这类错误的发生,提高用户体验,并且防止非法用户通过暴力枚举的方式遍历网页目录,本系统将会处理这种情况,保证逻辑上的安全性。

3.4个性化音乐推荐系统设计

通过上面部分的需求分析的调差与研究将音乐推荐系统的功能设计如下图3-1所示。

音乐上传个性化音乐推荐系统单曲管理收集歌曲信息用户信息音乐检索音乐推荐

图3-1 个性化音乐推荐系统模块功能图

* 音乐上传:管理员对音乐进行分类包括音乐类型、音乐风格、音乐地区还有歌手类型并上传音乐。

* 单曲管理:可以将歌曲播放、下载并且可以对它进行评分。

* 收集歌曲信息:收集每个歌曲的信息,比如收集歌曲的播放次数,评分后的歌曲的分数,歌曲的类型和歌手信息。将这些信息放入数据库中对系统音乐推荐做准备。

* 用户信息:新用户需要注册以后才能对音乐进行评分,并能查看、修改自己的登录信息。

* 音乐检索:注册用户可以将进行系统内的音乐搜索操作。

* 音乐推荐:系统将按照歌曲的评分进行协同过滤操后给用户筛选歌曲。

3.4.1 音乐上传设计

音乐上传功能:管理员对上传的音乐进行分类包括音乐地区的分类,音乐风格的分类,音乐类型的分类,歌手类型分类。

下面是音乐上传功能的设计。

管理员从管理员模块上传歌曲时从音乐地区,音乐风格,音乐类型,歌手类型中一一选择属性对该音乐进行描述,此时生成歌曲id和歌曲所对应的地区、风格、类型、歌手的名称并将它存入数据库。

用户可以在首页看到音乐地区、音乐风格、音乐类型和歌手类型,将鼠标移动到各自的栏目就会发现所对应的属性,点击属性的话会出现属性所对应的音乐。

3.4.2 单曲管理设计

用户可以从系统首页进入音乐播放页面播放歌曲,并可以将音乐下载;管理员可以从管理员模块进入系统并修改音乐。

3.4.3 收集歌曲信息设计

收集歌曲信息:对每一首歌曲的信息(歌曲地区、歌曲风格、歌曲类型、歌手、评分、播放量)进行收集并存入数据库。

收集歌曲信息功能如下。

处理:在数据库中查询并收集歌曲信息。

输出:歌曲编号、歌曲类型、歌曲地区、歌曲风格、歌手信息、播放次数、评分结果。

3.4.4 音乐检索设计

可以用歌手或者歌曲名来检索对应的音乐,本模块功能如下。 输入:歌手名,歌曲名。

处理:验证输入是否为空。获取输入数据不空,则在数据库中查询相关音乐的歌手或者歌名。

输出:对应的歌曲。

3.4.5 音乐推荐设计

音乐推荐系统功能:音乐推荐系统功能是根据用户喜欢的音乐来推荐其他类型音乐。

下面是音乐分类功能的设计。

登录用户从播放模块可以根据自己的喜好评分当前歌曲,评分类型有差劲、一般、喜欢和非常喜欢。每个类型对应的分数有差劲-2分,一般-3分,喜欢-4分和非常喜欢-5分。当用户选择了喜欢或非常喜欢的时候系统将用户信息和歌曲信息存入数据表,而当用户选择了差劲或一般的时候系统不会讲用户信息和歌曲信息存入数据表。当信息存入数据表后系统将执行协同过滤算法来过滤掉评分低的歌曲并将评分高的歌曲推荐给用户,用户可以在首页发现有个栏目叫做系统推荐的音乐,用户可以从这里收听其他类型的歌曲。

3.5数据库设计

MySQL[9]有一个强大的数据存储和查询相关聚集的功能,是一个小型的关系型数据库管理系统,MySQL被广泛应用在Internet上的中小型网站。因为它的尺寸小,高速度,整体的成本低,特别是对于许多中小型网站开源的特性,以减少站点的整体成本,所以将MySQL选择作为一个网站数据库。把它作为数据库平台。下面一节是音乐推荐系统模块的数据库表设计。

3.5.1 数据库概念结构设计(E-R图)

在系统中采用E-R图[10]来分析数据关系的。下面具体列出个性化音乐推荐系统中主要的实体图及E-R图。

歌曲信息表E-R图如图3-2所示:主要有歌曲ID、歌曲名称、地区、风格等基本数据。收集每一首歌曲的基本信息,以便于系统推荐歌曲。

音乐歌曲id歌曲名称地区URLURL风格 图3-2 歌曲信息实体图

用户基本信息表E-R图如图3-3所示:主要包括用户编号、用户名、用户密码,其中通过用户编号来区分不同的用户。

用户用户名用户编号用户密码 图3-3 用户信息实体图

歌手信息表E-R图如图3-4所示:主要包括歌手编号、名称、类型、性别、地区、乐团编号、组合编号。完整地记录每一位歌手、组合或乐团的基本信息。

歌手歌手类型地区姓名性别组合编号歌手编号乐团编号 图3-4 歌手信息实体图

每一个管理员可以管理多个用户和歌曲,同时用户信息、歌曲类别、歌曲信息可以被多个管理员管理。用户可以收藏多首歌曲。每个模块之间的E-R图如图3-5所示。

1MN11用户管理员歌曲管理收藏管理歌曲N 图3-5 实体-关系图

3.5.2 音乐推荐系统数据库表设计

此表是音乐地区数据表,用于分类音乐地区。其中包含音乐地区编号AreaID,不可重复,必须填写;音乐地区名称AreaName,必须填写。

音乐地区编号AreaID是音乐信息表的外键。由于不同音乐有不同地区,设计“音乐地区数据表”如表3-1所示。

表3-1音乐地区数据表(表名:t_music_area) 字段名类型长度描述说明

AreaID int 11 音乐地区编号主键,自动增加 AreaName varchar 255 音乐地区名称非空

此表是音乐风格数据表,用于分类音乐风格。其中包含音乐风格编号StyleID,不可重复,必须填写;音乐风格名称StyleName,必须填写。

音乐风格编号StyleID是音乐信息表的外键。由于不同音乐有不同风格,设计“音乐风格数据表”如表3-2所示。

表3-2音乐风格数据表(表名:t_music_style) 字段名类型长度描述说明

StyleID int 11 音乐风格编号主键,自动增加 StyleName varchar 255 音乐风格名称非空

此表是音乐类型数据表,用于分类音乐类型。其中包含音乐类型编号TypeID,不可重复,必须填写;音乐类型名称TypeName,必须填写。

音乐类型编号TypeID是音乐信息表的外键。由于不同音乐有不同类型,设计“音乐类型数据表”如表3-3所示。

表3-3音乐类型数据表(表名:t_music_type) 字段名类型长度描述说明

TypeID int 11 音乐类型编号主键,自动增加 TypeName varchar 255 音乐类型名称非空

此表是管理员信息的数据表,用于记录管理员登录信息。此表包含管理员编号SysuserID;管理员用户名SysuserName;管理员密码Userpassword。

由于不同管理员有不同个人信息,设计“管理员数据表”如表3-4所示。 表3-4管理员数据表(表名:t-sysuser) 字段名类型长度描述说明

SysuserID int 11 管理员编号主键,自动增加 SysuserName int 11 管理员用户名非空 SysuserPassword varchar 150 管理员密码非空

此表是用户信息的数据表,用于记录用户登录信息。此表包含用户名编号UserID;用户名UName;用户地址UserAddress;邮箱地址UserEmail;用户

生日UserBirth;用户性别UserGender;用户姓名UserName:用户密码UserPasswd;用户电话UserCell。

由于不同用户有不同个人信息,设计“用户数据表”如表3-5所示。 表3-5用户信息数据表(表名:t_user) 字段名类型长度描述说明

UserID int 11 用户编号主键, 自动增加 UName varchar 20 用户昵称非空

UserAddress varchar 100 用户地址外键引用“音乐地区数据表” UserBirth varchar 10 用户生日 UserEmail varchar 50 用户邮箱 UserGender int 11 用户性别 UserName varchar 20 用户姓名非空 UserPasswd varchar 150 用户密码 UserCell varchar 255 用户电话

此表是筛选结果数据表,用于筛选用于喜欢的音乐。其中包含筛选结果编号ResultID,不可重复,自动增加;音乐编号MusicID,不可重复;用户编号UserID,不可重复。

由于不同用户有不同筛选结果,设计“筛选结果表”如表3-6所示。 字段名类型长度描述说明

ResultID int 11 筛选结果编号主键,自动增加 MusicID varchar 255 音乐编号外键引用“音乐信息表” UserID int 11 用户编号外键引用“用户信息数据表” 表3-6 筛选结果表(表名:t_filtling_result)

此表是音乐信息数据表,用于收集音乐信息。其中包含音乐编号MusicID;不可重复;音乐路径Filepath;音乐点击量Hits;歌词Lyrics;音乐名称Name;歌手Singer;音乐地区编号AreaID;音乐风格编号StyleID;音乐类型编号TypeID;用户喜欢次数Likes;音乐评分Score。

由于不同音乐有不同信息,设计“音乐信息表”如表3-7所示。 表3-7 音乐信息表(表名:t_music)

字段名类型长度描述说明

MusicID int 11 音乐编号主键,自动增加 Filepath varchar 255 音乐路径 Hits int 11 音乐点击量初始0 Lyrics varchar 255 歌词 Name varchar 255 音乐名称 Singer varchar 255 歌手

AreaID int 11 音乐地区编号外键引用“音乐地区数据表” StyleID int 11 音乐风格编号外键引用“音乐风格数据表” TypeID int 11 音乐类型编号外键引用“音乐类型数据表” Likes int 11 用户喜欢次数 Score double 0 评分

StartDate varchar 255 上传日期

此表是歌手信息数据表,用于收集歌手信息。其中包含歌手编号SingerID;不可重复;歌手类型type;歌手地区region;歌手姓名name;歌手性别sex;乐团编号BrandID;组合编号CompeID。

由于不同歌手有不同信息,设计“歌手信息表”如表3-8所示。 表3-8 歌手信息表(表名:t_singer) 字段名类型长度描述说明

SingerID int 10 歌手编号主键,自动增加 SingerType varcher 255 歌手类型非空 Singerregion varcher 255 歌手区域非空 Singername varcher 255 歌手姓名非空 Singersex Char 1 歌手性别非空 SingerBrandID int 10 乐团编号允许为空 SingerCompeID int 10 组合编号允许为空

4 系统技术实现

由于是在互联网上发布个性化音乐推荐系统,所以系统的首页将成为能否吸引用户的关键,而我们在网站的设计过程中不仅保证功能的完善,而且还考虑到了整体的美观性,从而给用户一个更加完美的体验。

在整个系统的布局当中,模块众多,为了操作的简便性,我们便用一个单独的页面来作为网站的后台。然后在网站首页的下方提供管理员登录的链接,当管理员登录时就可以直接进入登录页面输入用户名密码进行登录,这样就完美的将前台和后台的功能进行区分,首页的主要模块也就可以更多的用来展示其他功能。

程序运行结果如图4-1所示。 图4-1 首页界面

4.1 音乐上传功能的实现

管理员具有此功能,进入adm_add.jsp页面内输入歌曲的相应信息,再点击添加按钮,提交到数据库里。如图4-2所示。

图4-2上传歌曲界面 实现过程

在adm_add.jsp页面中应用到了JavaScript[11]脚本定义了一个函数function checkform(myform)判断那些内容是必须要填写的,当输入了歌曲的名字时可以点击检测该歌曲是否上传按钮,如果数据库里有,则不能再上传,没有则可以此方法为function opendialog(),部分代码如图4-3所示。

图4-3 上传功能关键代码

4.2 收集歌曲信息功能的实现

* 由于系统的很多部分功能都要涉及到对数据库的操作,所以此系统将数据表封装成每个类的形式并进行操作,在其类中定义字段名、属性名、方法来实现数据的添加、修改、删除、查询、更新的功能。这样使得工程的结构清晰,思路明了。例如public List query(String condition)查询歌曲信息的方法、public int insert(Song song)添加方法。

* 此系统中为tools[12]类,方法为change(String str),用过滤器将过滤不符合要求的字符,部分代码如下。

if (str == null) {return \str.trim().replace(\(Exception e) {return \

图4-4 收集歌曲信息关键代码

* 在进行前台数据显示时,本网站应用了div和css,共有7个类别部分代码如下。

href=\歌手分类| | |

href=\歌曲分类|

图4-5 歌曲分类主要代码

4.3 单曲管理功能的实现

单曲管理的功能主要指的是音乐的下载,上传和播放功能。游客或者是用户进入主页后,可以选中歌曲点击试听如图4-6所示,如果想把它下载到自己电脑上时进入歌曲详细信息,再点击下载歌曲如图4-7所示。

图4-6音乐试听界面 图4-7音乐下载界面

4.3.1 播放功能的实现

利用onClick事件弹出一个窗体,在action中定义了一个方法[13]。 图4-6 播放功能关键代码

4.3.2 下载功能的实现

先点击歌曲名的链接产生一个单击事件,进入searchResult.jsp页面,在action 中有一个方法public ActionForward songDetal(ActionMapping mapping显示歌曲的详细信息。再点击下载产生一个单击事件,进入download.jsp页面,在action 中有定义了一个方法public ActionForward download(ActionMapping mapping, ActionForm.在download.jsp页面中利用jspsmartupload.jar中的upFile.downloadFile(path,null,file)方法进行下载,如果不存在则会提示下载失败。

4.4音乐推荐功能的实现

首先当用户注册了以后在音乐播放界面上可以对该音乐进行评分,评分一共有4个标准,差劲,一般,喜欢和非常喜欢,这些所对应的分数为2分,3分,4分和5分。当用户选择了喜欢或者是非常喜欢的时候如图4-8所示,系统按照评分标准将评分相似的歌曲推荐给用户如图4-9所示。

图4-8对歌曲评分 图4-9系统推荐音乐 4.4.1所用数据表

涉及到的数据表主要是音乐地区数据表t_music_area,音乐风格数据表t_music_style,音乐类型数据表t_music_type,音乐信息表t_music,筛选结果表t_filtling_result。前三个表是用于提取音乐信息到音乐信息表t_music中,最后一个表是将提取的信息利用协同过滤算法来过滤掉不符合标准的音乐,并生成符合标准的音乐。

音乐地区数据表t_music_area,用到的字段有音乐地区编号AreaID,不可重复,必须填写;音乐地区名称AreaName,必须填写。音乐风格数据表t_music_style,用到的字段有音乐风格编号StyleID,不可重复,必须填写;音乐风格名称StyleName,必须填写。音乐类型数据表t_music_type,用到的字段有音乐类型编号TypeID,不可重复,必须填写;音乐类型名称TypeName,必须填写。音乐信息表t_music,用到的字段有音乐编号MusicID;不可重复;音乐路径Filepath;音乐点击量Hits;歌词Lyrics;音乐名称Name;歌手Singer;音

乐地区编号AreaID;音乐风格编号StyleID;音乐类型编号TypeID;用户喜欢次数Likes;音乐评分Score。筛选结果表t_filtling_result,用到的字段有筛选结果编号ResultID,不可重复,自动增加;音乐编号MusicID,不可重复;用户编号UserID,不可重复。

4.4.2实现过程

协同过滤[14]算法是目前推荐系统中应用最为广泛的一种算法,该算法首先有一个前提假设,那就是假设有A和B两个用户,如果他们共同喜欢一系列类似的歌曲,那么用户A也有很大概率喜欢B喜欢的其他类型歌曲。基于这个假设,协同过滤算法的主要思想是:首先用户对他们所听过的歌曲进行评分,然后通过相应的公式计算出不同用户对某个歌曲的相似程度,然后根据这个相似程度就可以找到最近邻居,并且根据最近邻居的评分,推荐相应的歌曲。

举个例子来说,假设在音乐推荐系统中,一共有5个用户,8个音乐,每个用户对每个音乐的评价矩阵如下:

表4-9 每个用户评价音乐

半壶纱演员你北漂洒脱故乡爱去故乡 用户u1 45 2 用户u2 5 5 4 4 2 用户u3 22 5 45 用户u433 2 用户u5544

注:最高为5分,最低为2分,空白处表示该用户没有听过该音乐或者是没有对该歌曲进行评分。

此时要为用户用户u1推荐一些她可能喜欢的音乐步骤如下。 (1)寻找与用户u1“品味”最接近的用户。 自然描述:

这里的“品味”相近反应到数字上就是打分接近。比如表中,用户u1对半壶纱和北漂这两首歌有着极高的评价(分别为4分和5分),但是不喜欢洒脱;通过观察不难发现用户u2对半壶纱和北漂也表示相当的喜欢(分别为5分和4

分),但对洒脱评价较低(仅为2分)。因此不难发现,实际上用户u1和用户u2的品味是较为接近的,用户u2就是用户u1的最近邻用户。

数学模型:

当用户变得越来越多的时候,用人工方法不可能找到用户u1的最近邻居用户,所以对算法进行数学建模让它自动寻找用户u1的最近邻居用户。事实上有很多的方法来判断这两个用户的取向是否相似。假如把上面表格中的每一行看作是一个向量,此向量就能用来表示用户取向,那么就可以有很多种方法来判断这两个用户取向的相似度,此系统用到的是其中之一的余弦相似度[15]。

余弦相似度: (4-1)

其中Cos(u1,u2)就表示用户u1与用户u2的相似度。

R就是评价矩阵,Ru1,y表示用户u1对音乐y的评分,Ru2,y表示用户u2对音乐y的评分。

分子中的y表示用户u1与用户u2评价过的音乐的交集。 分母中的y则表示用户u1与u2各自的评分集合。 (2)利用用户u1的最近邻用户预测用户u1的打分值

系统可以取值遍历所有用户,用户u1与每个人都计算出一个相似度,然后对其相似度进行排序,选择前5个相似度最接近的用户作为用户u1的最近邻居用户。用这5个最近邻居用户的评分数据来给用户u1进行推荐,此时会用到下面这个公式。

(4-2)

(3)最后向用户u1推荐音乐

将第二步得到的一些用户u1从未听过的音乐的预测分值进行排序,选择前5个分值最高的音乐推荐给用户u1。

协同过滤推荐算法是此系统的重点以及难点,现在此系统就实现了系统给用户推荐的功能。Hibernate提供的load()方法将该持久化对象取出,然后进行设置操作,最后使用的是Hibernate提供的update()方法更新该持久化对象。

实现协同过滤算法的代码如下。 图4-11 协同过滤算法推荐

5 总结

自从开始做毕业设计以来,我发现了自己对克服困难方面的能力实在太差了,但是将毕业设计做的过程当中我学到了如何成熟,如何将问题解决的能力,以前的我总是面对什么事情显露出胆小,或者是忽视的态度,但是现在对比过去有了一个很大的转变

毕业设计这门课程对大四下学期之前的我来说是一种可以忽视的课程,但是真正到了开始做毕业设计的时候,我才认识到了我的技术是多么生疏。选择一门语言做毕业设计的时候,我想了好久才将jsp作为本设计的主语言,自从选择了jsp以后我就开始了对jsp的学习。这门语言易入门,但是很难精通,所以我不得不花费大量的时间来对jsp做了学习与研究。

在学习jsp的过程中我从一家IT公司得到了录取通知书,公司那里有个培训班,里面有交各种语言的课程,当时我就直接选择了jsp。我发现去公司培训的时候公司教给我的东西远远比书上和网上的多得多,当我对这门语言的熟悉程度到了一定程度以后我开始自己做了一些小功能。开始是留言板,数据库的调用和增删改查,之后是对控制访问权限和各种小算法。日复一日,我的水平也在慢慢提高,在中期答辩的时候我还没有将毕业设计的5个功能全都做出来,此时曾培峰老师看了我的毕业设计后对我指点了很多东西,这些东西我之前是没有想出来的,过了中期答辩后我就开始按照曾培峰老师的需求重新将5个功能做了出来。

开始做毕业设计以来我都是每周一次去导师办公室给老师看我做的东西,老师看完我的设计以后每次都告诉我哪里是不对的,哪里是写得语句不够通顺,而且不仅老师帮我指点,助教学长也在一旁给我指点,对此我对老师和学长真心想说一句话谢谢。

转眼间就到了毕业设计这门课程的最后一个答辩阶段了,想想自己每天都在赶做设计,写论文,此时终于要结束了,对我来说是将一个负担卸下了。做此次毕业设计的时候我感受到的最大的是我的能力的提升,明显感受到了过去的自己和现在的自己的区别。

放眼过去,自己大学一路走来的风风雨雨,有过欢笑有过悲伤,有过努力拼搏挑灯夜战,也有过好友共聚通宵达旦。在这个时间节点里,我只想对自己说句加油,还有朋友们,也加油。

也许过些年,我会在开发岗上做很久,学习到更多的技术,解决更多的问题,尝试更多的项目。但这次毕业设计,必定是终身难忘的第一次。这里是起点,我已经出发,希望未来可以创造出更多的辉煌。

参考文献

[1] 刘京华. Java Web整合开发王者归来(JSP + Servlet + Struts + Hibernate + Spring)[M]. 北京:清华大学出版社, 2010

[2] Brogden Bill,邱仲潘,谢树锋. Java开发指南 : Servlets和JSP篇. 第一版. 北京:电子工业出版社,2001

[3] 柳永坡,刘雪梅,赵长海. JSP应用开发技术. 第一版. 北京:人民邮电出版社,2005

[4] 孙卫琴. 精通Hibernate:Java对象持久化技术详解. 第一版. 北京:电子工业出版社,2005

[5] 夏昕,曹晓钢,唐勇. 深入浅出Hibernate. 第一版. 北京:电子工业出版社,2005

[6] Deepak Alur,John Crupi,Dan Malks编. 刘天北,熊节等译. J2EE核心模式. 第二版. 北京:机械工业出版社,2005

[7] 赵强. 基于开源软件的J2EE企业级应用开发. 第一版. 北京:电子工业出版社,2005

[8] 张海藩. 软件工程导论. 第四版. 北京:清华大学出版社,2005 [9] Paul Nielsen编. 刘瑞,陈微,闫继忠,刘文等译. Microsoft Sql Server 2000宝典. 第一版. 北京:中国铁道出版社,2005

[10] 施伯乐,丁宝康. 数据库技术. 第一版. 北京:科学出版社,2002 [11] 牛丽平, 郭新志, 宋强, 杨继萍. UML面向对象设计与分析基础教程[M]. 北京:清华大学出版社, 2007

[12] 郎波. Java语言程序设计[M]. 北京:清华大学出版社, 2005

[13] Nicholas C. Zakas, 李晶, 郭凯, 张散集. 编写可维护的JavaScript[M]. 北京:人民邮电出版社, 2013

[14] Harvey M.Deitel,Paul J.Deitel. Java How to Program.The Forth Page. Upper Saddle River, N.J.:Prentice Hall,2005

[15] Harvey M.Deitel,Paul J.Deitel,Sean E.Santry. Advanced Java2 Platform How to Program. The Front Page. Upper Saddle River, N.J.:Prentice Hall,2005

致谢

大四的最后一个课程毕业设计,自从将脚踏入到叫做大学的社会当中,每一年的学习都是为了此毕业设计做铺垫的。而这一次大学4年以来的成果也是展现出来,将我的大学四年圆满的画上了句号。对此我真的有些触动,有些不敢相信,但是回想过去的几年就会情不自禁感慨万分。

本次毕业设计我要感谢的首先是我的导师徐光伟老师,做这门毕业设计以来从第一次接触老师开始,老师就对我们格外的严格,当时的我对老师的这般严格的态度感到不舒服,为什么我们每次比其他组任务更多,每次比其他组早做完提前1-2周,但是越来越往后的时候我便认识到了如果没有当初老师对我们的严格就没有现在的我们。

还要感谢曾培峰老师和蔡棽老师,在中期答辩的时候,我还没有完全将毕业设计的思路搞清楚,但是多亏了两位老师的帮助我才将问题认识清楚,并将其理论实现到了应用当中,而且也将毕业设计圆满的做完。

还要感谢我助教学长,每次检查都会给我点出一些问题,并给出他的思路。同时感谢身边的朋友,池浩明,金成麟,秦梦军,赵晨等人,我们的毕业设计都是每个人自己做的,但在我迷茫的时候他们也会及时伸出援手,给予我一定的帮助。

此外,还要感谢公司对我的技术的帮助,起初对jsp的迷茫到掌握一定程度这段时间,公司的培训起到了一个很大的作用。

最后特别感谢我的父亲、母亲多年来对我的鼓励和支持,是他们让我能全心投入到学习和研究中,完成大学本科的学业。

谢谢! 译文及原文

致谢

大四的最后一个课程毕业设计,自从将脚踏入到叫做大学的社会当中,每一年的学习都是为了此毕业设计做铺垫的。而这一次大学4年以来的成果也是展现出来,将我的大学四年圆满的画上了句号。对此我真的有些触动,有些不敢相信,但是回想过去的几年就会情不自禁感慨万分。

本次毕业设计我要感谢的首先是我的导师徐光伟老师,做这门毕业设计以来从第一次接触老师开始,老师就对我们格外的严格,当时的我对老师的这般严格的态度感到不舒服,为什么我们每次比其他组任务更多,每次比其他组早做完提前1-2周,但是越来越往后的时候我便认识到了如果没有当初老师对我们的严格就没有现在的我们。

还要感谢曾培峰老师和蔡棽老师,在中期答辩的时候,我还没有完全将毕业设计的思路搞清楚,但是多亏了两位老师的帮助我才将问题认识清楚,并将其理论实现到了应用当中,而且也将毕业设计圆满的做完。

还要感谢我助教学长,每次检查都会给我点出一些问题,并给出他的思路。同时感谢身边的朋友,池浩明,金成麟,秦梦军,赵晨等人,我们的毕业设计都是每个人自己做的,但在我迷茫的时候他们也会及时伸出援手,给予我一定的帮助。

此外,还要感谢公司对我的技术的帮助,起初对jsp的迷茫到掌握一定程度这段时间,公司的培训起到了一个很大的作用。

最后特别感谢我的父亲、母亲多年来对我的鼓励和支持,是他们让我能全心投入到学习和研究中,完成大学本科的学业。

谢谢! 译文及原文

本文来源:https://www.bwwdw.com/article/bpcp.html

Top