目录

  • 一、项目任务
  • 二、核心功能
  • 三、整体架构
  • 四、项目步骤
    • 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 构建的在线音乐服务器。

二、核心功能

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

三、整体架构

项目整体基于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 构建的在线音乐服务器相关推荐

  1. 基于java协同过滤的在线音乐网站

    技术:Java.JSP等 摘要: 互联网飞速的发展,他更多的充当着媒介向人们传递信息,而音乐的传播也在其中.2015年7月以来,国家对在线音乐版权市场的监管力度逐渐增强,使得在线音乐的发展变得井然有序 ...

  2. [Jetty]基于Java Servlet的支持WebSocket的服务器

    1. JDK安装 www.java.com/zh/download 2. Jetty下载与安装 download.eclipse.org/jetty,下载稳定版,解压到目标路径 2.1 启动Jetty ...

  3. 基于JAVA+SpringMVC+MYSQL的在线音乐网站

    项目功能: 系统包括用户登录注册,首页查看歌曲列表,播放选中歌曲,搜索歌曲,上传歌曲,暂停,按分类查找歌曲 页面效果:

  4. 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java基于微服务架构的在线音乐平台计算机毕业设计源码+系统+lw文档+mysql数据库+调 ...

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

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

  6. java毕业设计——基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码)——网上花店销售系统

    基于java+Servlet+jsp的网上花店销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Servlet+jsp的网上花店销售系统设计与实现,文章末尾附有本毕业设计的 ...

  7. java毕业设计——基于java+J2EE+sqlserver的在线考试系统设计与实现(毕业论文+程序源码)——在线考试系统

    基于java+J2EE+sqlserver的在线考试系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2EE+sqlserver的在线考试系统设计与实现,文章末尾附有本毕业设 ...

  8. 基于Java开发的分布式在线教育系统,支持考试、直播、问答

    一.开源项目简介 知道学习平台是一个基于 Java 开发的分布式在线教育系统 项目采用前后端分离的企业级微服务架构 引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易 注重代码规范,严格控 ...

  9. 并发型服务器响应方式,基于Java NIO 开发高性能并发型服务器程序的研究

    基于Java NIO 开发高性能并发型服务器程序的研究 第8卷%第5期 软件导刊 2009年5月SoftwareGuide Vol.8No.5May.2009 基于JavaNIO开发高性能并发型服务器 ...

  10. 【测开】在线音乐服务器测试报告

    1. 在线音乐播放器测试用例 2. 自动化测试代码 在pom.xml文件中引入selenium和juint依赖 <?xml version="1.0" encoding=&q ...

最新文章

  1. JVM的XX参数之布尔类型 || KV设值类型
  2. 删除你的所有计算机文件的英文,《电脑文件英文对照》.doc
  3. JasperReport学习笔记2-创建简单的报表例子
  4. 【C++】局部变量、全局变量、静态变量与动态对象的性质
  5. leetcode —— 40. 组合总和 II
  6. 中软国际2020年业绩再创新高 归母净利同比增长26.5%
  7. mysql装了一半卡住了_mysql安装问题:安装到configuration overview卡住了
  8. 计算机专业的入职动机,大学生学习计算机动机的研究
  9. Machine Learning and Data Science 教授大师
  10. 12.2.PHP7.1 狐教程-偶遇 -【PHP 入口】
  11. Java 实现插入排序算法
  12. 开源考试系统 -微信小程序开发
  13. 物联网工程专业考研方向
  14. 台式计算机的无线上网卡多少线,台式电脑可以用无线上网卡上网吗
  15. js将docx转换为html,js实现word转换为html
  16. 工具 | IDEA 设置为护眼的豆沙绿
  17. C 和 Java 没那么香了,Serverless 时代 Rust 即将称王?
  18. python工具包--Pandas
  19. 如何用单片机控制可控硅c语言程序,可控硅的斩波控制的实现--C语言源代码
  20. 微信计算机控制技术试卷,微型计算机控制技术试卷答案A.doc

热门文章

  1. MySql中的minus用法
  2. 数据库设计5-逻辑结构设计
  3. 2014年腾讯实习生招聘最后一题
  4. c语言编程学生活动安排表,C语言作业安排表(18学时-周学时2...).doc
  5. java 画趋势图,java画曲线图
  6. 人类的终极目标是什么?
  7. linux如何禁用独立显卡驱动,Ubuntu中独立显卡不好用如何关闭独立显卡
  8. Windows XP将显示桌面图标放到任务栏
  9. String的intern()方法浅析
  10. 控制反转和依赖注入的个人理解