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","女","[email protected]");
用户+音乐部分设计:
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的简单使用。