欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java web项目——音乐播放器

程序员文章站 2022-05-22 19:00:32
...

Java web项目——音乐播放器

1,需求分析
①登录并查看自己的音乐列表
②从本地上传音乐
③删除某个音乐
④删除选中的音乐
⑤查询音乐(支持模糊查询)
⑥添加音乐到喜欢列表且可进行移除
⑦可在喜欢列表查询音乐(支持模糊查询)

2,整体架构

HTML+CSS+JS
Servlet
Service
Dao
MySQL

3,服务器API
(1)Json的使用
本项目采用Jackson库中ObjectMapper类完成Json的解析和构造,主要是将对象变为字符串。
(2) 登录
请求:
POST /loginServlet
data:{username,password}
响应:
{msg:true} HashMap

(3) 登录
请求:
POST /loginServlet
data:{username,password}
响应:
{msg:true} HashMap

(4)上传音乐
请求1:上传到服务器
POST /upload
请求2:信息插入数据库
POST /uploadsucess

(5)删除某一个音乐
请求:
POST /deleteServlet
data{“id”:id}
响应
{msg,true}

(6)删除选中音乐(批量)
POST /deleteSelMusicServlet
data{“id”:id}
响应
{msg,true}

(7)查询音乐(指定/模糊查询)
请求:
POST /findLoveMusic
data:{musicName:musicName}

(8)添加到喜欢列表
请求:
POST /loveMusicServlet
data:{“id”:obj}
响应{msg:true}

(9)查询喜欢
POST /findLoveMusic

(10)移除喜欢音乐
POST /removeLoveServlet

4,开发阶段

建库-建表

create database musicserver charset utf8mb4;
use musicserver;
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
);
creat table user (
id int primary key auto_increment,
username varchar(20) not null,
password varchar(32) not null,
age int not null,
gender varchar(2) not null,
email varchar(50) not null
);
vreat 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,gender,email)
 values ("yjx","123","20","女","aaa@qq.com");

用户+音乐部分设计:
entity包 ——创建User类和Music类并提供构造方法

(1)Dao层→直接操作数据库

①UserDao 用户数据库操作

package dao;
import entity.User;
import util.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {

    public User login(User loginUser) {
    //User loginUser 相当于是给了一个对象,在登录的时候请求的是username和password,这两者实际上可以组成用户的一个对象。 
        User user=null;
        Connection connection=null;
        PreparedStatement ps=null;
        ResultSet rs=null;

        try {
            String sql="select *from user where username=? and password=?";
            connection= DBUtils.getConnection();
            ps=connection.prepareStatement(sql); 
            ps.setString(1,loginUser.getUsername());
            ps.setString(2,loginUser.getPassword());
            rs=ps.executeQuery();
            if(rs.next()) {
                user=new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword((rs.getString("password")));
                user.setAge(rs.getInt("age"));
                user.setGender(rs.getString("gender"));
                user.setEmail(rs.getString("email"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtils.getClose(connection,ps,rs);
        }
        return user;
    }
}

②MusicDao 音乐数据库操作
➤查找全部音乐 findMusic

select  * from music where id=?

➤根据id查找音乐 findMusicById

select  * from music where id=?

➤根据关键字查找音乐(支持模糊查询)ifMusic

select * from music where title like '%" + str +"%'

➤上传音乐 insert

insert into music(title, singer, time, url, userid) values (?,?,?,?,?)

➤删除音乐 deleteMusicById

delete from music where id=?

删除之前要先看这首歌是否在喜欢列表里 findLoveMusicOnDel

select * from lovemusic where music_id=?

如果在的话要把这首从喜欢列表的删除 removeLoveMusicOnDel

delete  from lovemusic where music_id=?

➤添加到喜欢列表 findMusicByMusicId

insert into lovemusic(user_id, music_id) VALUES (?,?)

这首歌是否已经被添加过 findMusicByMusicId

select * from lovemusic where user_id=? and music_id=?

移除 removeLoveMusic

delete from lovemusic where user_id=? and music_id=?

➤查询喜欢的所有音乐 findLoveMusic

select m.id as music_id,title,singer,time,url,userid from lovemusic lm,music m where lm.music_id=m.id and user_id=?

➤根据关键字查喜欢(支持模糊查询) ifMusicLove

select m.id as music_id,title,singer,time,url,userid from lovemusic lm,music m " +
                    "where lm.music_id=m.id and user_id=? and title like '%"+str+"%'

(2)Service层(可拓展)
在这里可以把dao层东西进行嵌套

public class MusicService {
    public List<Music> findMusic() {
        MusicDao musicDao=new MusicDao();
        List<Music> musicList=musicDao.findMusic();
        return musicList;
    }
}
public class UserService {
    public User login(User loginUser) {
        UserDao userDao = new UserDao();
        User user = userDao.login(loginUser);
        return user;
    }
}

(3)Servlet层
LoginServlet:

//登录需要响应一个map表 转换成json。
Map<String ,Object> return_map = new HashMap<>(); 

将该用户的信息写入到session,进行数据绑定

   //将return_map返回给前端→利用Jackson将map转化为json对象
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(resp.getWriter(),return_map);

UploadMusicServlet
此处需要一个上传的操作

FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
 List<FileItem> fileItems = null;

不仅要上传服务器,还有数据库UploadInsertServlet

String fileName = (String)req.getSession().getAttribute("fileName");//xxx.mp3
        String[] strings = fileName.split("\\.");//.分割取前面
        String title = strings[0];

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String time = sdf.format(new Date());  //字符串接收格式化的日期

DeleteServlet
删除要注意数据库删除了,服务器上的音乐是否存在?
此处要注意的是路径问题,数据库里有music,应该去掉路径里的music

 File file = new File("C:\\Users\\lenovo\\Desktop\\音乐播放器\\web\\"+music.getUrl()+".mp3");

DeleteSelMusicServlet (删除选中)
此时进行的是批量删除,可以用数组来存放一组参数。values数组中,存放所有需要删除的歌曲的id。定义一个sum,当它等于values数组的长度时,才算删掉了全部的歌曲。

RemoveLoveServlet 移除喜欢
此处也要响应一个map表

FindMusicServlet 查找数据
输入关键词进行查找,如果输入为空,则跳回musicDao.findMusic,查找到所有的歌曲。FindLoveMusicServlet同理。

5,成品画面

Java web项目——音乐播放器登录页面

Java web项目——音乐播放器 主页

Java web项目——音乐播放器
Java web项目——音乐播放器
Java web项目——音乐播放器

Java web项目——音乐播放器

Java web项目——音乐播放器Java web项目——音乐播放器
Java web项目——音乐播放器6,问题总结
①类型转换问题,有些地方没有看清楚返回值,所以会一直报错,需要进行强制类型转换。
②删除时的路径问题,在删除音乐时,由于数据库里已经有music,所以在代码里标明路径时要去掉music,否则会出现删除了服务器上的文件却没有删除数据库内容的情况。
③删除选中音乐,这种情况是批量删除,选用数组来存放一组参数,全部删除完才算删除成功。

7,项目总结
整个项目基于HTTP协议,通过servlet部分的编程更加深入了对HTTP协议的理解。同时这个项目有些部分需要把对象变为字符串。用到了Jackson库中ObjectMapper类完成Json的解析和构造,更加熟悉了json;还融合了哈希表的使用,将知识融会贯通。前端部分直接在网上找了模板进行改动,了解了一些前端HTML+CSS+JS的简单使用。