Java web项目——音乐播放器

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","女","919205480@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,成品画面

在这里插入图片描述登录页面

在这里插入图片描述 主页

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值