基于Java Servlet 构建的在线音乐服务器
目录
- 一、项目任务
- 二、核心功能
- 三、整体架构
- 四、项目步骤
- 1.数据库的设计
- (1)数据库设计框架
- (2)数据库操作代码
- 2.用户+音乐模块设计
- (1)创建User类
- (2)创建Music类
- 3.服务器 API 设计
- (1)关于 Json
- (2)登录
- (3)上传音乐
- (4) 删除某一个音乐信息
- (5)删除选中的音乐信息
- (6)查询音乐(包含查找指定/模糊匹配的音乐)
- (7)添加音乐到“喜欢列表”
- (8) 查询喜欢的音乐(包含查找指定/模糊匹配的音乐)
- (9)移除喜欢的某个音乐
- 4.创建一个JavaWeb项目
- (1)创建JDBCUtils类
- (2)创建Dao包和UserDao类
- (3)创建MusicDao类
- 5.Servlet实现与实现
- (1)登陆注册
- (2)查询音乐
- (3)上传音乐
- (4)删除音乐
- (5) 添加喜欢的音乐到喜欢列表
- (6)查找我喜欢的音乐列表
- (7)移除我喜欢的音乐
- 6.前端页面的设计
一、项目任务
实现一款基于Java Servlet 构建的在线音乐服务器。
二、核心功能
- 登录、注册
- 上传音乐
- 删除某一个音乐信息
- 删除选中的音乐信息
- 查询音乐(包含查找指定/模糊匹配的音乐)
- 添加音乐到“喜欢列表”
- 查询喜欢的音乐(包含查找指定/模糊匹配的音乐)
三、整体架构
项目整体基于HTTP协议,前端使用HTML+CSS+JS构建页面整体布局,后端采用分层结构,分为Servlet层,Dao层的设计,以达到在设计上的高内聚低耦合(就是整体架构不变但分层)。本项目先从Dao层开始写,Severlet连接前端和后端。在Servlet和Dao层中间还可以加一个Service层,把Dao层中部分程序整合出来写到Service层。
相关文章推荐:HTTP协议 、Servlet
四、项目步骤
1.数据库的设计
(1)数据库设计框架
数据库设计了music、lovemusic、user三张表。music表用于存放在线音乐服务器的所有音乐,其中包括音乐的id、歌名、歌手名、上传的时间、音乐存放的位置、上传音乐的用户id的信息。lovemusic表用于存放用户喜爱的音乐(一个音乐可以被多个用户喜欢,一个用户可以喜欢多个音乐),其中喜爱的音乐的id、用户id以及音乐的id。user表用于存放用户的信息包括用户id、用户名、密码、年龄、性别和邮箱地址。下图为示例。
(2)数据库操作代码
-- 创建数据库
drop database if exists `musicserver`;
create database if not exists `musicserver` character set utf8;-- 使用数据库
use `musicserver`;-- 创建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(1000) NOT NULL,`userid` int(11) NOT NULL
);-- 创建 user表 输入相关信息
DROP TABLE IF EXISTS `user`;
CREATE 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
);--创建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
);
2.用户+音乐模块设计
创建entity包
(1)创建User类
public class User { private int id; private String username; private String password; private String gender; private int age; private String email;
}
(2)创建Music类
public class Music { private int id; private String title; private String singer;private Date time; private String url; private int userid;
}
3.服务器 API 设计
(1)关于 Json
Json 是一种常见是数据格式组织方式. 源于JavaScript,是一种键值对风格的数据格式. 在Java中我们可以采用Jackson库中的ObjectMapper类来完成 Json 的解析和构造。要去Maven中查找对应依赖并进行json转换导入相关包:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
浏览器请求是通过 ajax 把 json 对象发送出去,服务器把 json对象解析成 java 对象,再通过对应的 servlet 进行处理,结果转换成 json 字符串,返回给浏览器,这样做降低了前端和后端的耦合
(2)登录
请求:
POST /loginServlet
data:{username,password}
响应:
{msg: true}
(3)上传音乐
请求1:上传音乐到服务器目录
POST /upload
请求2:将音乐信息同步插入到数据库当中
POST /uploadsucess
(4) 删除某一个音乐信息
请求:
POST /deleteServlet
data: {“id”: id}
响应:
{msg: true}
(5)删除选中的音乐信息
请求:
POST /deleteSelMusicServlet
data:{“id”:id}//id为数组
响应:
{msg: true}
(6)查询音乐(包含查找指定/模糊匹配的音乐)
请求:
POST /findLoveMusic
data:{musicName:musicName}
(7)添加音乐到“喜欢列表”
请求:
POST /loveMusicServlet
data: {“id”: obj}
响应:
{msg: true}
(8) 查询喜欢的音乐(包含查找指定/模糊匹配的音乐)
请求:
POST /findLoveMusic
data:{musicName:musicName}
(9)移除喜欢的某个音乐
请求:
POST /removeLoveServlet
data: {“id”: obj}
4.创建一个JavaWeb项目
Web项目:B/S:Browse/Server
手机架构都是C/S:client/server 例:客户端/app
(1)创建JDBCUtils类
连接数据库的四大参数是:驱动类、URL、用户名、密码,这些参数都是与特定数据库关联,如果将来想要更改数据库,那么就要去修改这四大参数,那么为了不去修改代码,我们需要写一个JDBCUtils类,让它从配置文件中读取到配置参数,然后创建连接对象。一般是固定格式。
package util;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;public class DBUtils {//编写配置文件的键值private static String url = "jdbc:mysql://127.0.0.1:3306/musicserver?useSSL=false";private static String password = "";private static String username = "root";private static volatile DataSource DATASOURCE;public DBUtils() {}private static DataSource getDataSource() {//双重校验锁if (DATASOURCE == null) {Class var0 = DBUtils.class;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 var1) {var1.printStackTrace();throw new RuntimeException("获取数据库连接失败");}}//关闭连接public static void getClose(Connection connection, PreparedStatement statement, ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (SQLException var6) {var6.printStackTrace();}}if (statement != null) {try {statement.close();} catch (SQLException var5) {var5.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException var4) {var4.printStackTrace();}}}
}
(2)创建Dao包和UserDao类
UserDao类包含登录模块和注册模块以登录模
UserDao. login为例,注册模块UserDao.register相当于给登录中插入数据。
//登录模块
public User login(User loginUser) {
User user = null;//
Connection conn = null; //获取连接
PreparedStatement ps = null; //预编译
ResultSet rs = null;//结果集合try {conn = DBUtils.getConn(); ps = conn.prepareStatement("select*from user where username=? and password=?"); //对sql语句的预编译ps.setString(1, loginUser.getUsername()); ps.setString(2, loginUser.getPassword());//执行SQL语句rs = ps.executeQuery(); while(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 (Exception e) { e.printStackTrace(); throw new RuntimeException(e); }finally { DBUtils.getClose(conn, ps, rs);}return user;}
(3)创建MusicDao类
MusicDao类包括查询全部歌单、根据音乐id查找音乐、根据关键字查询歌单、上传音乐、 删除歌曲、添加音乐到“喜欢”列表中、 移除当前用户喜欢的这首音乐、根据关键字查询该用户喜欢的某个音乐等模块。
1 查询全部歌单
用链表
/*** 查询全部歌单*/public List<Music> findMusic(){List<Music> musics = new ArrayList<>();Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = DBUtils.getConn();ps = conn.prepareStatement("select*from music");rs = ps.executeQuery();//查找while(rs.next()) {Music music = new Music();music.setId(rs.getInt("id"));music.setTitle(rs.getString("title"));music.setSinger(rs.getString("singer"));music.setTime(rs.getDate("time"));music.setUrl(rs.getString("url"));music.setUserid(rs.getInt("userid"));musics.add(music);//整合前面的信息}} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtils.getClose(conn, ps, rs);} return musics;}
2 根据音乐id查找音乐
把1稍作修改
ps = conn.prepareStatement("select * from music where id=?");
3 根据关键字查找音乐
进行like模糊查询,查的歌名只能少于歌名的字或者等于歌名的字。
ps = conn.prepareStatement("select*from music where title like '%"+str+"%'");
4 上传音乐
音乐要具有title, singer, time, url,userid的信息。上传音乐本身给服务器,将音乐信息插入到数据库当中
public int Insert(String title, String singer, String time, String url,int userid) {Connection conn = DBUtils.getConn();PreparedStatement pst=null;int number = 0;try {pst=conn.prepareStatement("insert into music(title,singer,time,url,userid) values(?,?,?,?,?)");pst.setString(1,title);pst.setString(2,singer);pst.setString(3,time);pst.setString(4,url);pst.setInt(5,userid);number=pst.executeUpdate();//返回值代表当前受影响的行数return number;} catch (SQLException e) {e.printStackTrace();}finally{DBUtils.getClose(conn, pst, null);}return 0;}
5 删除歌曲
需要先看该歌曲之前是否被添加到了,喜欢的音乐列表当中,当删除服务器上的音乐时,同时在我喜欢的列表的数据库中进行删除。
public int deleteMusicById(int id) {Connection connection = null;PreparedStatement preparedStatement = null;try {String sql = "delete from music where id=?";connection = DBUtils.getConn();preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,id);int ret = preparedStatement.executeUpdate();if(ret == 1) {//同时删除中间表中的数据//1、看中间表是否有数据,如果有删除if(findLoveMusicOnDel(id)) {int ret2 = removeLoveMusicOnDelete(id);if(ret2 == 1){return 1;}} else {//如果没有找到,说明这首歌,没有被添加到喜欢的列表return 1;}}}catch (SQLException e) {e.printStackTrace();}finally {DBUtils.getClose(connection,preparedStatement,null);}return 0;}/*** 看中间表是否有该id的音乐数据*/public boolean findLoveMusicOnDel(int id) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {String sql = "select * from lovemusic where music_id=?";connection = DBUtils.getConn();preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,id);resultSet = preparedStatement.executeQuery();if(resultSet.next()) {return true;}}catch (SQLException e) {e.printStackTrace();}finally {DBUtils.getClose(connection,preparedStatement,null);}return false;}/*** 当删除服务器上的音乐时,同时在我喜欢的列表的数据库中进行删除。* @param musicId* @return*/public int removeLoveMusicOnDelete(int musicId) {Connection connection = null;PreparedStatement preparedStatement = null;try {String sql = "delete from lovemusic where music_id=?";connection = DBUtils.getConn();preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,musicId);int ret = preparedStatement.executeUpdate();if(ret == 1) {return ret;}}catch (SQLException e) {e.printStackTrace();}finally {DBUtils.getClose(connection,preparedStatement,null);}return 0;}
6 添加音乐到“喜欢”列表中
用户和音乐之间多对多的关系,需要中间表。添加喜欢的音乐的时候,需要先判断该音乐是否存在,也就是说,该用户是否之前添加过这个音乐为喜欢。
public boolean insertLoveMusic(int userId,int musicId) {Connection connection = null;PreparedStatement preparedStatement = null;try {String sql = "insert into lovemusic(user_id, music_id) VALUES (?,?)";connection = DBUtils.getConn();preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,userId);preparedStatement.setInt(2,musicId);int ret = preparedStatement.executeUpdate();if (ret == 1) {return true;}return false;}catch (SQLException e) {e.printStackTrace();}finally {DBUtils.getClose(connection,preparedStatement,null);}return false;}/*** 添加喜欢的音乐的时候,需要先判断该音乐是否存在* @param musicID* @return*/public boolean findMusicByMusicId(int user_id,int musicID) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = DBUtils.getConn();ps = conn.prepareStatement("select * from lovemusic where music_id=? and user_id=?");ps.setInt(1,musicID);ps.setInt(2,user_id);rs = ps.executeQuery();if(rs.next()) {return true;}} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}finally {DBUtils.getClose(conn, ps, rs);}return false;}
7 移除当前用户喜欢的这首音乐
因为同一首音乐可能多个用户喜欢,所以需要传入当前用户的id。
public int removeLoveMusic(int userId,int musicId) {Connection connection = null;PreparedStatement preparedStatement = null;try {String sql = "delete from lovemusic where user_id=? and music_id=?";connection = DBUtils.getConn();preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,userId);preparedStatement.setInt(2,musicId);int ret = preparedStatement.executeUpdate();if(ret == 1) {return ret;}}catch (SQLException e) {e.printStackTrace();}finally {DBUtils.getClose(connection,preparedStatement,null);}return 0;}
8 查询该用户喜欢的全部歌单
只查询一张lovemusic是做不到的。需要联表查询。和1的思路相同。
ps = conn.prepareStatement("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=?");
9 根据关键字查询该用户喜欢的某个音乐
在8的基础上进行like模糊查询
ps = conn.prepareStatement("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+"%'");
5.Servlet实现与实现
首先在项目根目录下创建一个 servlet 包。包装实现如下servlet类。
(1)登陆注册
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");//请求体编码resp.setContentType("application/json;charset=utf-8");//响应体编码响应类型是jsonString username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username:"+username);System.out.println("password:"+password);UserDao dao = new UserDao();Map<String ,Object> return_map = new HashMap<>();//返回前端以map的形式try {User user = dao.login(username);//调用后台数据if(user != null && user.getPassword().equals(password)) {//将该用户的信息写入到session,取得时候就取了req.getSession().setAttribute("user", user);//绑定数据 return_map.put("msg",true);System.out.println("发发发发发 ");}else {System.out.println("密码错误!");return_map.put("msg",false);}} catch (Exception e) {e.printStackTrace();}//如何将return——map返回给前端ObjectMapper mapper = new ObjectMapper(); //利用Jackson将map转化为json对象mapper.writeValue(resp.getWriter(),return_map);//把return_map写到resp.getWriter()传给前端}
}
(2)查询音乐
用户进行登录后,需要先进行查询,将查询结果显示到页面上。
@WebServlet("/findMusic")//通过注解找到servlet类
public class FindMusicServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html; charset=utf-8");String str = req.getParameter("musicName");//没有这个歌曲的话默认找到的是全部的歌曲MusicDao dao = new MusicDao();List<Music> musics = null;if(str!=null) {musics = dao.ifMusic(str);//关键字查询模糊查询}else {musics = dao.findMusic();}for (Music music : musics) {System.out.println(music.getUrl());}
//返回给前端ObjectMapper mapper = new ObjectMapper();mapper.writeValue(resp.getWriter(),musics);}
}
(3)上传音乐
分为2步:
第一步将音乐上传到服务器
@WebServlet("/upload")
//@MultipartConfig
public class UploadMusicServlet extends HttpServlet {private final String SAVEPATH="/home/gaobo/apache-tomcat-8.5.51/webapps/GaoBoMusic/music/";//上传的音乐文件放入的路径// /home/gaobo/apache-tomcat-8.5.51/webapps/GaoBoMusic/music@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html; charset=utf-8");User user = (User) request.getSession().getAttribute("user");//获取当前登录用户的session中的信息if (user == null) {request.setAttribute("Msg", "请登录后再进行上传");/*request.getRequestDispatcher("uploadmusic.jsp").forward(request,response);*/} else {//上传FileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);List<FileItem> items = null;try {items = upload.parseRequest(request);//上传的信息从请求体获得 用list说明有可能批量上传} catch (FileUploadException e) {e.printStackTrace();return;}System.out.println("items:"+items );FileItem item = items.get(0);//一般里面只放一个元素System.out.println("item: "+item);//将文件放入music之下String fileName = item.getName();//获取文件名System.out.println("fileName"+fileName);request.getSession().setAttribute("fileName", fileName);try {item.write(new File(SAVEPATH, fileName));} catch (Exception e) {e.printStackTrace();}response.sendRedirect("uploadsucess.html");//上传到数据库中,上传成功了以后跳转到uploadsucess.html的界面再跳转到uploadsucess界面手动上传}}
}
第二步将音乐信息存放到数据库,输入歌手名点提交了以后跳转到uploadsucess界面.
//将音乐信息写到数据库中
@WebServlet("/uploadsucess")
public class UploadInsertServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html; charset=utf-8");String strings = (String)req.getSession().getAttribute("fileName");//实际传到数据库的是点歌的人.MP3String[] titles = strings.split("\\.");//进行分割 传到数据库中为点歌的人String title = titles[0];//0号下标放的是点歌的人 1号下标放的是.MP3System.out.println("title:" + title);String url = "music/"+title;System.out.println("url:"+url);String singer = req.getParameter("singer");//拿到歌手名SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//年月日2021-1-1String time=sdf.format(new Date());//当前日期格式化MusicDao dao = new MusicDao();User user = (User) req.getSession().getAttribute("user");int user_id = user.getId();int num = dao.Insert(title,singer,time,url,user_id);//上传音乐if(num!=0){resp.sendRedirect("list.html");//跳转页面}}
}
存在问题:已经上传到服务器在这一瞬间断网了,还没写到数据库中,该如何处理?
解决方案:
1.缩短每次请求的数据量,在连接断开之前,发出一次新的请求,使其保持连接状态;
2.不使用“单例模式”的全局Connection对象,在多线程场景中,某个线程使用完连接对象之后,会把连接关闭;当其他线程访问到已被关闭的全局连接对象,也会报错说“该连接已经被关闭”。每次请求方法时,创建一个新的连接,前一个连接用完就释放资源。
(4)删除音乐
分为删除单个音乐和批量删除了两个模块。通过获取前端选中的id数组实现。
1 删除某个音乐
@WebServlet("/deleteServlet")
public class DeleteMusicServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("删除指定音乐!");req.setCharacterEncoding("utf-8");resp.setContentType("application/json;charset=utf-8");Map<String,Object> map=new HashMap<>();//删除成功或者失败要写入map中String strId = req.getParameter("id");//int id = Integer.parseInt(strId);//把id转换为整型idSystem.out.println("id:"+ id);try {MusicDao musicDao = new MusicDao();//1.查找有没有当前idMusic music = musicDao.findMusicById(id);//没有这个id的音乐 直接返回if(music == null) return;//2、如果有就开始删除库中的音乐int delete = musicDao.deleteMusicById(id);System.out.println("delete:"+delete);if(delete == 1){//3、数据库删除完成后,检查还是否存在。如果不存在,那么删除掉磁盘上的文件//File file = new File("E:\\Javaproject\\GaoBoMusic\\web\\"+music.getUrl()+".mp3");File file = new File("/home/gaobo/apache-tomcat-8.5.51/webapps/GaoBoMusic/"+music.getUrl()+".mp3");System.out.println("文件是否存在:"+file.exists());System.out.println("file: "+file);if(file.delete()){//证明删除成功map.put("msg",true);}else {map.put("msg",false);System.out.println("文件名:"+file.getName());System.out.println("删除文件失败!");}}else {map.put("msg",false);}}catch (Exception e) {e.printStackTrace();}//将map转化为jsonObjectMapper mapper=new ObjectMapper();mapper.writeValue(resp.getWriter(),map);}
}
2 删除多组音乐
@WebServlet("/deleteSelMusicServlet")
public class DeleteSelMusicServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("application/json;charset=utf-8");//values数组中存放的是所有需要删除的歌曲的idString[] values = req.getParameterValues("id[]");System.out.println("deleteSelectedServlet:"+Arrays.toString(values));//删除int sum=0;Map<String,Object> map=new HashMap<>();MusicDao musicDao = new MusicDao();for(int i=0;i<values.length;i++){int j = Integer.parseInt(values[i])//需要把id转换成整型System.out.println("j :"+j);//调用Service层方法删除Music music = musicDao.findMusicById(j);//歌曲是否存在int delete = musicDao.deleteMusicById(j);//sum=sum+delete;if(delete == 1) {//3、数据库删除完成后,检查还是否存在。如果不存在,那么删除掉磁盘上的文件//File file = new File("E:\\Javaproject\\GaoBoMusic\\web\\" + music.getUrl() + ".mp3");File file = new File("/home/gaobo/apache-tomcat-8.5.51/webapps/GaoBoMusic/"+music.getUrl()+".mp3");System.out.println("文件是否存在:" + file.exists());System.out.println("file: " + file);if (file.delete()) {//证明删除成功//map.put("msg", true);sum=sum+delete;//删除成功一个加一个} else {//map.put("msg", false);System.out.println("文件名:" + file.getName());System.out.println("删除文件失败!");}}}System.out.println("sum: "+sum);//sum==values.length 说明选中的所有元素已经全部删除了if(sum==values.length){//证明删除成功map.put("msg",true);}else {map.put("msg",false);}//将map转化为jsonObjectMapper mapper=new ObjectMapper();mapper.writeValue(resp.getWriter(),map);}
}
(5) 添加喜欢的音乐到喜欢列表
@WebServlet("/loveMusicServlet")
public class LoveMusicServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("application/json;charset=utf-8");String strId = req.getParameter("id");int musicId = Integer.parseInt(strId);System.out.println("musicID: "+musicId);User user = (User) req.getSession().getAttribute("user");int user_id = user.getId();MusicDao musicDao = new MusicDao();Map<String,Object> map=new HashMap<>();//插入之前需要先查看是否该音乐已经被添加到喜欢列表boolean effect = musicDao.findMusicByMusicId(user_id,musicId);if(effect) {//以前这首歌被你添加过为喜欢,不能重复添加map.put("msg",false);}else {boolean flg = musicDao.insertLoveMusic(user_id,musicId);if(flg) {//添加成功map.put("msg",true);}else {map.put("msg",false);}}//将map返回给前端ObjectMapper mapper=new ObjectMapper();mapper.writeValue(resp.getWriter(),map);}
}
(6)查找我喜欢的音乐列表
@WebServlet("/findLoveMusic")
public class FindLoveMusicServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("application/json;charset=utf-8");String str = req.getParameter("loveMusicName");System.out.println("loveMusicName:"+str);User user = (User) req.getSession().getAttribute("user");int user_id = user.getId();//可能会有音乐被多个人喜欢MusicDao musicDao = new MusicDao();List<Music> musics = null;if(str!=null) {musics = musicDao.ifMusicLove(str,user_id);//关键字查询}else {musics = musicDao.findLoveMusic(user_id);}for (Music music : musics) {System.out.println(music.getUrl());}ObjectMapper mapper = new ObjectMapper();mapper.writeValue(resp.getWriter(),musics);}
}
(7)移除我喜欢的音乐
@WebServlet("/removeLoveServlet")
public class RemoveLoveServlet extends HttpServlet {@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");int user_id = user.getId();Map<String,Object> map=new HashMap<>();String strId = req.getParameter("id");int music_id = Integer.parseInt(strId);MusicDao musicDao = new MusicDao();int delete = musicDao.removeLoveMusic(user_id,music_id);if(delete == 1) {map.put("msg",true);}else {map.put("msg",false);}ObjectMapper mapper=new ObjectMapper();mapper.writeValue(resp.getWriter(),map);}
}
6.前端页面的设计
前端采用HTML+CSS+JS设计。直接在百度上搜索 “免费网页模板”, 能找到很多免费模板网站. 可以直接基于现成的漂亮的页面进行修改.将网页模板解压缩, 拷贝到项目的 webapp 或者 web 目录中.
网址分享:网页模板
前后端服务器数据交互-以登录为例:添加jsjquery库
<!-- 1. 导入CSS的全局样式 --><link href="css/bootstrap.min.css" rel="stylesheet"><!-- 2. jQuery导入,建议使用1.9以上的版本 --><script src="js/jquery-3.1.1.min.js"></script><!-- 3. 导入bootstrap的js文件 --><!--<script src="js/bootstrap.min.js"></script>--><script type="text/javascript"></script><style>#body{background-image: url("images/3.png");/*background-size:100% 100%;background-attachment: fixed;*/}</style><script>//登录请求$(function ()//自动执行 {$("#submit").click(function () {//点击登陆的时候就会触发 id:submit #id是唯一的var username=$("#user").val();//拿到了文本框的值var password=$("#password").val();$.ajax({//方法url:"/loginServlet",//发送请求的地址data:{"username":username,"password":password},//发送给服务器(后端)的数据type:"POST",//请求方式 ("POST" 或 "GET"), 默认为 "GET"dataType:"json",//预期服务器返回的数据类型(后端返回给前端)success:function (data) {//请求成功后的回调函数 data里就是后端返回的数据 jsonconsole.log(data);if(data.msg===true){window.location.href="list.html";//跳转到这个网页}else{/*window.location.reload();数据清空*/$("#message").text("账号或密码错误,请重试!");$("#user").val("");$("#password").val("");$("#verifycode").val("");}}});});});
基于Java Servlet 构建的在线音乐服务器相关推荐
- 基于java协同过滤的在线音乐网站
技术:Java.JSP等 摘要: 互联网飞速的发展,他更多的充当着媒介向人们传递信息,而音乐的传播也在其中.2015年7月以来,国家对在线音乐版权市场的监管力度逐渐增强,使得在线音乐的发展变得井然有序 ...
- [Jetty]基于Java Servlet的支持WebSocket的服务器
1. JDK安装 www.java.com/zh/download 2. Jetty下载与安装 download.eclipse.org/jetty,下载稳定版,解压到目标路径 2.1 启动Jetty ...
- 基于JAVA+SpringMVC+MYSQL的在线音乐网站
项目功能: 系统包括用户登录注册,首页查看歌曲列表,播放选中歌曲,搜索歌曲,上传歌曲,暂停,按分类查找歌曲 页面效果:
- 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调 ...
- 【Java项目实战】在线音乐播放器(从需求到产品完整解析)
准备工作必看:[Java项目实战]在线音乐播放器(前期准备) 核心功能 登录.注册 上传音乐 删除某一个音乐信息 删除选中的音乐信息 查询音乐(包含查找指定/模糊匹配的音乐) 添加音乐到"喜 ...
- java毕业设计——基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码)——网上花店销售系统
基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Servlet+jsp的网上花店销售系统设计与实现,文章末尾附有本毕业设计的 ...
- java毕业设计——基于java+J2EE+sqlserver的在线考试系统设计与实现(毕业论文+程序源码)——在线考试系统
基于java+J2EE+sqlserver的在线考试系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2EE+sqlserver的在线考试系统设计与实现,文章末尾附有本毕业设 ...
- 基于Java开发的分布式在线教育系统,支持考试、直播、问答
一.开源项目简介 知道学习平台是一个基于 Java 开发的分布式在线教育系统 项目采用前后端分离的企业级微服务架构 引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易 注重代码规范,严格控 ...
- 并发型服务器响应方式,基于Java NIO 开发高性能并发型服务器程序的研究
基于Java NIO 开发高性能并发型服务器程序的研究 第8卷%第5期 软件导刊 2009年5月SoftwareGuide Vol.8No.5May.2009 基于JavaNIO开发高性能并发型服务器 ...
- 【测开】在线音乐服务器测试报告
1. 在线音乐播放器测试用例 2. 自动化测试代码 在pom.xml文件中引入selenium和juint依赖 <?xml version="1.0" encoding=&q ...
最新文章
- JVM的XX参数之布尔类型 || KV设值类型
- 删除你的所有计算机文件的英文,《电脑文件英文对照》.doc
- JasperReport学习笔记2-创建简单的报表例子
- 【C++】局部变量、全局变量、静态变量与动态对象的性质
- leetcode —— 40. 组合总和 II
- 中软国际2020年业绩再创新高 归母净利同比增长26.5%
- mysql装了一半卡住了_mysql安装问题:安装到configuration overview卡住了
- 计算机专业的入职动机,大学生学习计算机动机的研究
- Machine Learning and Data Science 教授大师
- 12.2.PHP7.1 狐教程-偶遇 -【PHP 入口】
- Java 实现插入排序算法
- 开源考试系统 -微信小程序开发
- 物联网工程专业考研方向
- 台式计算机的无线上网卡多少线,台式电脑可以用无线上网卡上网吗
- js将docx转换为html,js实现word转换为html
- 工具 | IDEA 设置为护眼的豆沙绿
- C 和 Java 没那么香了,Serverless 时代 Rust 即将称王?
- python工具包--Pandas
- 如何用单片机控制可控硅c语言程序,可控硅的斩波控制的实现--C语言源代码
- 微信计算机控制技术试卷,微型计算机控制技术试卷答案A.doc