• 项目简介
  • 项目功能
  • 项目技术
  • 项目结构
  • 项目内容
    • 1.数据库设计
    • 2.项目及idea的配置
    • 3.创建entity包(实体包)
    • 4.根据功能介绍,确定请求和响应
    • 5.封装数据库的相关操作
    • 6.实现Servlet
    • 7.前端页面设计
    • 8.最终实现效果

项目简介

基于Java Servlet 构建的在线音乐服务器。

项目功能

  1. 登录、注册
  2. 上传音乐
  3. 删除某一个音乐信息
  4. 删除选中的音乐信息
  5. 查询音乐(包含查找指定/模糊匹配的音乐)
  6. 添加音乐到“喜欢列表”。
  7. 查询喜欢的音乐(包含查找指定/模糊匹配的音乐)

项目技术

  1. 前端知识:HTML+CSS+JavaScript
  2. 后端:Servlet 的使用
  3. 数据库:mysql
  4. tomcat、Maven的使用
  5. json 的使用

项目结构

项目整体基于HTTP协议。
前端使用HTML+CSS+JS构建页面整体布局。
后端采用分层结构,分为Servlet层,Dao层。
采用分层设计,降低了整个代码的耦合度。

MySQL由Dao层操作再返回给Dao层。
Dao层由Servlet操作,再返回。
前端页面和Servlet进行交互。

项目内容

1.数据库设计

当前需要三张表。

• 创建数据库

drop database if exists musicplayer;
create database if not exists musicplayer character set utf8;
--使用数据库
use musicplayer;

• 创建表

user表

drop table if exists user;
create table user (
id int primary key auto_increment,
username varchar(20) not null,
password varchar(30) not null,
age int not null,
sex varchar(2) not null,
email varchar(50) not null
);

music表

drop table if exists music;
create table music (id int primary key auto_increment,title varchar(50) not null,singer varchar(30) not null,time varchar(13) not null,url varchar(100) not null,userid int(11) not null
);

lovemusic表

drop table if exists lovemusic;
create table lovemusic (
id int primary key auto_increment,
user_id int(11) not null,
music_id int(11) not null
);
-- 可插入一条用户信息
insert into user(username,password,age,sex,email)
values("lala","2233","12","女","965543061@qq.com");

2.项目及idea的配置

1)使用maven打包。
在 pom.xml 指定当前打包打成 war 包。

2)创建结构,生成 web.xml。
main文件夹下,NewFile --> webapp/ WEB-INF/ web.xml

3)设置编码格式,防止出现中文乱码。

4)设置自动编译。

5)配置 pom.xml
向 maven 中引入相关依赖。
pom.xml 文件 中放Jackson、servlet、 mysql相关的依赖。
再指定当前 war包的名字:

<finalName>OnlineMusic</finalName>
<!-- 注意:指定的war包的名称是之后项目运行时的 根目录 -->

再指定一些插件的版本,以免受到 maven 版本的影响。

3.创建entity包(实体包)

根据数据库创建实体类:User、Music。其中的属性与数据库中的对应。

User类

package entity;
public class User {private int id;private String username;private String password;private int age;private String sex;private String email;
}

Music类

package entity;
public class Music {private int id;private String title;private String singer;private String time;private String url;private int userId;
}

4.根据功能介绍,确定请求和响应

使用Json
Json 是一种键值对风格的数据格式, 把前端输入的对象转换成字符串(序列化)。

Java中 我们采用Jackson库中的 ObjectMapper类来完成Json的构造。

向 maven 中引入依赖:

<!-- Jackson相关-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.4</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.11.4</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.11.4</version>
</dependency>

1)登录:

请求:

POST:/loginServlet
data:{username,password}

响应:{msg:true}

2)注册:

请求:

POST:/register
data:{username,password,age,sex,email}

响应:{msg:true}

3)上传音乐:

请求:

POST:/upload
data:filename

4)删除某一个音乐:

请求:

POST:/deleteServlet
data:{“id”:id}

响应:{msg:true}

5)删除选中:

请求:(id 数组)

POST:/deleteSelMusic
data:{“id”:id}

响应:{msg:true}

6)模糊查询音乐:

请求:

Get:/findMusic
data:{musicName:musicName}

响应:{msg:true}

7)添加喜欢音乐到喜欢列表:

请求:

POST:/loveMusic
data:{“id”:obj}

响应:{msg:true}

8)模糊查询喜欢的音乐:

请求:

Get:/findLoveMusic
data:{musicName:musicName}

响应:{msg:true}

9)移除喜欢的音乐:

请求:

POST:/removeLoveMusic
data:{‘id’:obj}

响应:{msg:true}

5.封装数据库的相关操作

1)创建 util 包(工具相关的),其中再创建 DBUtils 类,和数据库建立连接。


public class DBUtils {                                        // 数据库名字对应private static String url = "jdbc:mysql://127.0.0.1:3306/数据库名称?useSSL=false";private static String password ="2222";//数据库密码private static String username = "root";private static volatile DataSource dataSource;// 获取数据源private static DataSource getDataSource(){// 双重校验锁if(dataSource == null){synchronized (DBUtils.class){if(dataSource == null){dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl(url);((MysqlDataSource) dataSource).setUser(username);((MysqlDataSource) dataSource).setPassword(password);}}}return dataSource;}// 获取连接public static Connection getConn(){try {Connection connection = getDataSource().getConnection();return connection;} catch (SQLException e) {e.printStackTrace();throw new RuntimeException("获取数据库连接失败");}}// 关闭数据库  存在依赖关系,关闭和连接顺序相反public static void getClose(Connection connection, PreparedStatement statement,ResultSet resultSet) {if(resultSet!=null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if(statement!=null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

2)创建 dao 包(数据库持久层),主要来操作MySQL,实现各功能。

创建UserDao类:
login;
register
创建MusicDao类:
insert;
findMusic;
findMusicById;
findMusicByKey;
deleteMusicById;
findLoveMusicById;
deleteLoveMusicById
创建LoveMusicDao类:
findLoveMusic;
findLoveMusicByMusicIdAndUserId;
findLoveMusicBykeyAndUID;
removeLoveMusic

注意:
1.查询当前用户喜欢的音乐,数据库中需要两张表联合查询 music、musicLove。

   public List<Music> findLoveMusic(int user_id) {List<Music> musicList = new ArrayList<>();Connection con = null;PreparedStatement prs = null;ResultSet resultSet = null;try {con = DBUtils.getConn();//  String sql ="select * from lovemusic where user_id =?";// 查询 user_id ,数据在 music表里,需要两张表联合查询// music: id title singer time url userid// lovemusic: id user_id music_idString sql = "select m.id as m_id,title,singer,time,url,userid from" +" music m,lovemusic lm where m.id = lm.music_id and lm.user_id =?";prs = con.prepareStatement(sql); // 执行完 不需要插入prs.setInt(1,user_id);  // 给个指定的值resultSet = prs.executeQuery(); // 然后 判断结果集 显示while (resultSet.next()){Music music = new Music();music.setId(resultSet.getInt("m_id"));music.setTitle(resultSet.getString("title"));music.setSinger(resultSet.getString("singer"));music.setTime(resultSet.getString("time"));music.setUrl(resultSet.getString("url"));music.setUserId(resultSet.getInt("userid"));musicList.add(music);}} catch (SQLException e) {e.printStackTrace();}finally {DBUtils.getClose(con,prs,resultSet);}return musicList;}

6.实现Servlet

实现各个Servlet,处理请求。
Servlet与前端页面交互,生成动态Web页面。

例:登录loginServlet:

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");  // 设置编码,设置响应数据格式,拿到数据,通过dao层,操作数据库,最后返回响应的数据,再返回给前端String username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username:"+username);System.out.println("password:"+password);Map<String ,Object> return_map = new HashMap<>();// service层和dao层联系,又需要 dao层操作数据库UserDao userDao = new UserDao();// 登录需要登录用户 loginUserUser loginUser = new User(); //创建一个数据库实体类对象loginUser.setUsername(username);loginUser.setPassword(password);LoginService loginService = new LoginService();User user = loginService.login(loginUser);//  User user = userDao.login(loginUser);  // 接受下登录的返回值if (user == null){// 登录失败return_map.put("msg",false);}else {req.getSession().setAttribute("user", user);//绑定数据return_map.put("msg",true);}ObjectMapper mapper = new ObjectMapper();//利用Jackson将map转化为json对象,// writer 将转换后的json字符串保存到字符输出流中,最后给客户端mapper.writeValue(resp.getWriter(),return_map);  // 写到前端}
}

注意:
上传音乐的流程:
1)将音乐上传到服务器
2)再将音乐信息存入数据库


@WebServlet("/upload")
@MultipartConfig
public class UploadMusicServlet extends HttpServlet {// 定义文件存储位置,上传到 music 文件夹private static final String SAVEPATH = "D:\\IDEA\\IdeaProjects\\OnlineMusic\\src\\main\\webapp\\music\\";private static final String SAVEPATH = "/home/liu/install/apache-tomcat-8.5.69/webapps/OnlineMusic/music/";  // 部署到云服务器 对应路径@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("application/json;charset=utf-8");User user =(User) req.getSession().getAttribute("user");  // 需要从请求中拿到刚刚登录后的session;// 此处attribute()中取的要和登录时的key--》user对应if (user == null){System.out.println("没有登录,不能上传!");}else {//1、先上传服务器Part part = req.getPart("filename");    // fiddler 抓包获取到的内容 Content-Disposition:// form-data; name="filename"; filename="毛不易 - 若有缘由.mp3";                     //从content-disposition头中获取源文件名称,获取到一个字符串String header = part.getHeader("Content-Disposition");// 字符串处理int start = header.lastIndexOf("=");   // 最后一个 = 的后面 ,就是需要的内容String fileName = header.substring(start + 1) .replace("\"", "");  // 把 " 替换掉// 最后获取到的应该是:毛不易 - 若有缘由.mp3System.out.println("fileName2:" + fileName); // 现在已经拿到音乐文件.mp3  --- 写到服务器指定路径下part.write(SAVEPATH + fileName);  // 调用 write方法,在SAVEPATH路径下,把文件存进去String singer = req.getParameter("singer");System.out.println("歌手:"+singer);// 此时可以查看到 music文件夹里包含了 音乐// 2、插入数据库// 看数据库中的信息 title、singer、time、urlString[] titles = fileName.split("\\."); // 毛不易 - 若有缘由.mp3, 用.分割,title=毛不易 - 若有缘由 0下标String title = titles[0];System.out.println("title:" + title);String url = "music\\"+title;System.out.println("url:"+url);// 格式化时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String time=sdf.format(new Date());int userId = user.getId();MusicDao musicDao = new MusicDao();int ret = musicDao.insert(title,singer,time,url,userId); // 数据库里存if (ret == 1){// 上传成功resp.sendRedirect("list.html"); // 重定向}else {System.out.println("上传失败!");part.delete();  // 数据库上传失败了,就要把前面服务器上传成功的给删掉}}}
}

7.前端页面设计

采用HTML+CSS+JS设计
不做重点,可寻找模板,稍作改动。

8.最终实现效果

登录:

注册:

列表页:

添加音乐到喜欢列表:

喜欢音乐列表:

音乐播放器在线链接:
http://106.54.183.128:8080/OnlineMusic/login.html

JavaWeb项目--【在线音乐播放器】onlineMusicPlayer相关推荐

  1. Andriod小项目——在线音乐播放器

    Andriod小项目--在线音乐播放器 转载请注明:http://blog.csdn.net/sunkes/article/details/51189189 Android在线音乐播放器 从大一开始就 ...

  2. SSM框架项目 —— 在线音乐播放器(测试)

    前言: 之前写过的SSM项目,现在我们通过 selenium 自动化套件 + junit 单元测试框架,来对其功能进行自动化测试 回顾项目功能:登录.注册.修改密码.播放音乐.搜索音乐.收藏音乐.上传 ...

  3. 【Java项目实战】在线音乐播放器(从需求到产品完整解析)

    准备工作必看:[Java项目实战]在线音乐播放器(前期准备) 核心功能 登录.注册 上传音乐 删除某一个音乐信息 删除选中的音乐信息 查询音乐(包含查找指定/模糊匹配的音乐) 添加音乐到"喜 ...

  4. 【Spring Boot项目】个人在线音乐播放器

    文章目录 1. 项目简介 2. 数据库表的设计 3. 拦截器及返回数据格式 4. 注册功能 5. 登陆功能 6. 音乐列表相关业务 6.1 查询功能 6.2 上传音乐 6.3 播放音乐 6.4 收藏音 ...

  5. QT小项目-QT在线音乐播放器

    QT在线音乐播放器 先上几张音乐播放器的图片 具体实现及部分代码 后面还有好多就不一一例举了 先上几张音乐播放器的图片 (主页图片来源网络) 具体实现及部分代码 搜索歌曲和获取歌曲具体信息的URL,这 ...

  6. python播放在线音乐_Python实现在线音乐播放器

    最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目,使用Python的库Tkinsert做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口, ...

  7. [MAUI 项目实战] 音乐播放器(一):概述与架构

    系列文章将分步解读音乐播放器核心业务及代码: [MAUI 项目实战] 音乐播放器(一):概述与架构 [MAUI 项目实战] 音乐播放器(二):播放内核 [MAUI 项目实战] 音乐播放器(三):界面交 ...

  8. 在线音乐播放器的推荐机制

    对于我这样一个音乐控来说,学习工作时没有音乐是万万不行的.在网易云音乐云音乐面世之前,我总是在QQ音乐,百度音乐等播放器之间徘徊,当时也不够文艺,不知道豆瓣FM的存在. 第一次接触云音乐被其吸引的原因 ...

  9. python播放网络音乐_Python实现在线音乐播放器示例

    这篇文章主要为大家详细介绍了Python实现在线音乐播放器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目 ...

  10. 【基于Qt的在线音乐播放器】

    基于Qt的在线音乐播放器 项目功能: 本在线音乐播放器的功能在于创建一个音乐播放器页面,可以实现搜索功能通过HTTP协议获取网络中数据并解析出来,播放搜索到的歌曲并展示相关信息.效果如图: 相关类及功 ...

最新文章

  1. 面试不怂之redis与缓存大全
  2. fedora21 mysql_在fedora21 上的php+mysql+apache环境搭建
  3. mysql约束sex_MySQL笔记--约束
  4. 66-Flutter移动电商实战-会员中心_编写ListTile的通用方法
  5. winsw将命令部署为服务(比如springboot)
  6. 在Mac OS X Snow Leopard中设置Google App Engine [失败]
  7. 重庆曙光服务器虚拟化部署,VMware vCloud Director 安装部署教程
  8. 关于cmd输入python查看版本号与安装版本不一致的奇怪现象
  9. Atitit.json xml 序列化循环引用解决方案json
  10. 苹果mac屏幕截图工具:Snagit
  11. 淘宝客优惠券领取微信小程序前台和后台源码
  12. 虚拟机Linux终端命令格式
  13. ISO27145协议解析
  14. MySQL树结构查询所有叶子节点
  15. 加密狗方式注册多可系统
  16. 润乾报表 echarts统计图分类显示不全
  17. 华为交换机如何清除console口密码
  18. modelsim-SE仿真error问题
  19. 数据分析之乳腺癌预测
  20. 工程管理系统企业工程管理系统简介

热门文章

  1. FANUC机器人_KAREL编程入门学习(1)
  2. three.js 制作3D相册
  3. QCC频率校准工具定频
  4. 饿了么ui 省市区 三级联动框架
  5. php 美化注册界面,美化,从登录界面背景开始
  6. 计算机专业毕设一般写什么,计算机专业毕设主要流程
  7. PHP生成条形码 之一 条形码介绍
  8. HTML——超链接、音视频
  9. 基于SSM框架的酒店管理系统的设计与实现(附带源码、论文)
  10. 流媒体开发之-音悦台TV解析特定条件下的所有TV视频