基于javaweb+mysql的jsp+servlet精美风在线音乐网站(java+jdbc+c3p0+servlet+mysql+jsp)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的JSP+Servlet精美风在线音乐网站(java+jdbc+c3p0+servlet+mysql+jsp)
1.运行环境
环境配置:
Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)
项目技术:
JSP + C3P0+ Servlert + html+ css + JavaScript + JQuery + Ajax + Fileupload等等
*/
public class ServletUtils {
private static SongService songService = new SongServiceImpl();
private static CommentService commentService = new CommentServiceImpl();
private static TypeService typeService = new TypeServiceImpl();
private static SingerService singerService = new SingerServiceImpl();
private static UserService userService = new UserServiceImpl();
/**
* 将数据发送给前端界面
* @param resp
* @param jsonStr
* @throws IOException
*/
public static void sendToPage(HttpServletResponse resp, String jsonStr) throws IOException {
resp.setCharacterEncoding("utf-8");
resp.setContentType("application/json; charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print(jsonStr);
}
/**
* 设置用户数量、专辑数量、歌手数量、歌曲数量的 session
* @param session
*/
public static void setNumber(HttpSession session) {
// 更新Type的数量信息
for(Type type : typeService.getAllTypes()) {
type.setSongCount((int) songService.getAllSongsCountByType(type.getName()));
typeService.updateTypeById(type);
}
session.setAttribute("singerNumber", singerService.getAllSingersCount(new HashMap<>()));
session.setAttribute("songNumber", songService.getAllSongsCount(new HashMap<>()));
session.setAttribute("commentNumber", commentService.getAllCommentsCount(new HashMap<>()));
session.setAttribute("userNumber", userService.getAllUsersCount(new HashMap<>()));
}
/**
* 清空session
* @param request
singer.setName(value);
System.out.println(singer);
} else if ("sex".equals(name)) {
singer.setSex(Integer.parseInt(value));
System.out.println("歌手的性别:" + value);
} else if ("birth".equals(name)) {
singer.setBirth(value);
} else if ("location".equals(name)) {
singer.setLocation(value);
} else if ("introduction".equals(name)) {
System.out.println(name);
singer.setIntroduction(value);
} else if ("debutDate".equals(name)) {
singer.setDebutDate(value);
} else if ("accessCount".equals(name)) {
singer.setAccessCount(Integer.parseInt(value));
} else if ("englishName".equals(name)) {
singer.setEnglishName(value);
}
} else {
fileItem = item;
}
}
//如果fileitem中封装的是上传文件
savePath = savePath + singerName;
System.out.println("savePath: " + savePath);
File savefile = new File(savePath);
if (!savefile.exists()) {
//创建临时目录
savefile.mkdir();
}
//得到上传的文件名称,
filename = fileItem.getName();
System.out.println("上传的文件名称为:"+filename);
if(filename==null || filename.trim().equals("")){
// 允许长传的文件为空,所以这里直接跳出
realSavePath = null;
// request.setAttribute("message", "上传的文件名称为空!!!");
// request.getRequestDispatcher("/page/manager/message.jsp").forward(request, response);
// return;
}else {
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
String filename_1 = filename.substring(filename.lastIndexOf("\\") + 1);
//得到上传文件的扩展名
String fileExtName = filename_1.substring(filename_1.lastIndexOf(".") + 1);
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传的文件的扩展名是:" + fileExtName);
//获取item中的上传文件的输入流
InputStream in = fileItem.getInputStream();
//得到文件保存的名称
/**
* @description: TODO
* @version: 1.0
*/
@WebServlet("/homePageServlet")
public class HomePageServlet extends HttpServlet {
private SongService songService = null;
private SingerService singerService = null;
private CommentService commentService = null;
private TypeService typeService = null;
@Override
public void init() throws ServletException {
songService = new SongServiceImpl();
singerService = new SingerServiceImpl();
commentService = new CommentServiceImpl();
typeService = new TypeServiceImpl();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
// 获取10条数量的新更新的音乐
List<Song> songList = songService.getNewMusic(10);
// 存入map,并获取相应的歌手信息
// 新发行音乐栏 的信息
Map<Singer, Song> singerSongMap = new HashMap<>();
for(Song song : songList) {
Singer singer = singerService.getSingerBySingerId(song.getSingerId());
*
* 上传文件
*/
@WebServlet("/admin/uploadFileServlet")
public class UploadFileServlet extends HttpServlet {
private SingerService singerService = null;
private SongService songService = null;
private TypeService typeService = null;
@Override
public void init() throws ServletException {
singerService = new SingerServiceImpl();
songService = new SongServiceImpl();
typeService = new TypeServiceImpl();
}
@SuppressWarnings("unchecked")
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
BigDecimal price = null;
Song song = new Song();
HttpSession session = request.getSession();
request.setAttribute("page", "music");
String path_save = "/other/upload/";
String path_temp = "/other/temp/";
String realSavePath = null;
String filename = null;
String saveFilename = null;
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
// String savePath = new File("").getCanonicalPath() + "\\web" + path_save;
String savePath = PathUtils.getProjectURL() + "" + path_save;
//上传时生成的临时文件保存目录
// String tempPath = new File("").getCanonicalPath() + "\\web" + path_temp;
String tempPath = PathUtils.getProjectURL() + "" + path_temp;
System.out.println("savePath: " + savePath);
System.out.println("tempPath: " + tempPath);
File tmpFile = new File(tempPath);
if (!tmpFile.exists()) {
//创建临时目录
tmpFile.mkdir();
}
//消息提示
String message = "";
String singerName = "";
try{
//使用Apache文件上传组件处理文件上传步骤:
// value该文件夹内可以上传文件的后缀名
extMap.put("images", "gif,jpg,jpeg,png,bmp");
extMap.put("flashs", "swf,flv");
extMap.put("medias", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("files", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
}
/**
* 文件上传
*
* @param request
* @return infos
* info[0] 验证文件域返回错误信息
* info[1] 上传文件错误信息
* info[2] savePath 文件保存目录路径
* info[3] saveUrl 文件保存目录url
* info[4] fileUrl 文件最终的url包括文件名
*/
@SuppressWarnings("unchecked")
public String[] uploadFile(HttpServletRequest request) {
String[] infos = new String[5];
// 验证
infos[0] = this.validateFields(request);
// 初始化表单元素
Map<String, Object> fieldsMap = new HashMap<String, Object>();
if (infos[0].equals("true")) {
fieldsMap = this.initFields(request);
}
// 上传
List<FileItem> fiList = (List<FileItem>) fieldsMap.get(UploadUtils.FILE_FIELDS);
if (fiList != null) {
for (FileItem item : fiList) {
infos[1] = this.saveFile(item);
}
infos[2] = savePath;
infos[3] = saveUrl;
infos[4] = fileUrl;
}
return infos;
}
/**
* 上传验证,并初始化文件目录
*
* @param request
*/
private String validateFields(HttpServletRequest request) {
String errorInfo = "true";
// boolean errorFlag = true;
// 获取内容类型
String contentType = request.getContentType();
@Override
public void init() throws ServletException {
adminService = new AdminServiceImpl();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
// 获取前端传过来的数据
String login = req.getParameter("login");
String pwd = req.getParameter("pwd");
String inputCode = req.getParameter("code");
System.out.println(inputCode);
// 获取session中存入的验证码
HttpSession session = req.getSession();
String code = (String) session.getAttribute("code");
System.out.println(code);
// 定义json格式的返回数据
JSONObject jsonObject = new JSONObject();
// 判断验证码输入是否正确
if(code != null && code.equalsIgnoreCase(inputCode)){
// 判断用户名是否存在
if(adminService.usernameIsExit(login) != null){
Admin admin = adminService.getAdmin(login, pwd);
if(admin != null){
jsonObject.put("Status", "ok");
jsonObject.put("Text", "登录成功<br /><br />欢迎回来");
session.setAttribute("admin", admin);
// 设置用户数量、专辑数量、歌手数量、歌曲数量的 session
ServletUtils.setNumber(session);
}else {
jsonObject.put("Status", "Erro");
jsonObject.put("Erro", "密码错误");
}
}else {
jsonObject.put("Status", "Erro");
jsonObject.put("Erro", "用户名不存在");
}
}else {
// 验证码错误
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String receiveMail, String userRemarks,
String senderName, String subjectText, String MailText, String EmailAccount) throws Exception {
// 1. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(EmailAccount, senderName, "UTF-8"));
// 3. To: 收件人(可以增加多个收件人、抄送、密送)
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, userRemarks, "UTF-8"));
// 4. Subject: 邮件主题
message.setSubject(subjectText, "UTF-8");
// 5. Content: 邮件正文(可以使用html标签)
message.setContent(MailText, "text/html;charset=UTF-8");
// 6. 设置发件时间
message.setSentDate(new Date());
// 7. 保存设置
message.saveChanges();
return message;
}
/**
* * 创建一封只包含文本的简单邮件
*
* @param EmailAccount
* 发件人邮箱账户 -- 需开通POP3、IMAP服务
* @param EmailPassword
* 发件人邮箱密码
* @param receiveMail
* 收件人邮箱
* @param userRemarks
* 用户备注
* @param senderName
* 发件人昵称
* @param subjectText
* @param email 注册填写的邮箱
*/
public static void sendMessage(HttpServletRequest request, String username, String code, String email) {
String url = "http://" + request.getServerName() + ":" + request.getServerPort() + "" + request.getContextPath() + "/user/activeServlet?username=" + username + "&code=" + code;
String mailText = "<html><head></head><body><h1>这是一封激活邮件,激活请点击以下链接</h1><h3><a href='" + url +
"'>" + url + "</a></h3></body></html>";
System.out.println(mailText);
Send("chenloveyouabc@163.com", "IPPZGCBOAEPQEYIE", email, "备注", "个人音乐网站", "个人音乐网站激活", mailText);
}
public static void main(String[] args) {
Send("chenloveyouabc@163.com", "IPPZGCBOAEPQEYIE", "2929836014@qq.com", "备注", "个人音乐网站", "个人音乐网站激活", "444");
}
}
/**
* @ClassName: CheckCodeServlet
* @Description: TODO
*/
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
Random ran = new Random();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
StringBuilder code = new StringBuilder();
// 初始化表单元素
Map<String, Object> fieldsMap = new HashMap<String, Object>();
if (infos[0].equals("true")) {
fieldsMap = this.initFields(request);
}
// 上传
List<FileItem> fiList = (List<FileItem>) fieldsMap.get(UploadUtils.FILE_FIELDS);
if (fiList != null) {
for (FileItem item : fiList) {
infos[1] = this.saveFile(item);
}
infos[2] = savePath;
infos[3] = saveUrl;
infos[4] = fileUrl;
}
return infos;
}
/**
* 上传验证,并初始化文件目录
*
* @param request
*/
private String validateFields(HttpServletRequest request) {
String errorInfo = "true";
// boolean errorFlag = true;
// 获取内容类型
String contentType = request.getContentType();
int contentLength = request.getContentLength();
// 文件保存目录路径
savePath = request.getSession().getServletContext().getRealPath("/") + basePath + "/";
// 文件保存目录URL
saveUrl = request.getContextPath() + "/" + basePath + "/";
File uploadDir = new File(savePath);
if (contentType == null || !contentType.startsWith("multipart")) {
// TODO
System.out.println("请求不包含multipart/form-data流");
errorInfo = "请求不包含multipart/form-data流";
} else if (maxSize < contentLength) {
// TODO
System.out.println("上传文件大小超出文件最大大小");
errorInfo = "上传文件大小超出文件最大大小[" + maxSize + "]";
} else if (!ServletFileUpload.isMultipartContent(request)) {
// TODO
errorInfo = "请选择文件";
} else if (!uploadDir.isDirectory()) {// 检查目录
// TODO
/**
* @description: TODO
* @version: 1.0
*/
@WebServlet("/albumSingleServlet")
public class AlbumSingleServlet extends HttpServlet {
private SongService songService = null;
private SingerService singerService = null;
@Override
public void init() throws ServletException {
songService = new SongServiceImpl();
singerService = new SingerServiceImpl();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取参数
String singerName = request.getParameter("singerName");
String _currentPage = request.getParameter("currentPage");// 当前页码
String _rows = request.getParameter("rows");// 每页显示条数
// 增加该歌手的热度
singerService.updateSingerAccessCountBySingerName(singerName);
if(_currentPage == null || "".equals(_currentPage)){
_currentPage = "1";
}
if(_rows == null || "".equals(_rows)){
_rows = "10";
}
int currentPage = Integer.parseInt(_currentPage);
int rows = Integer.parseInt(_rows);
PageBean<Song> songPage = new PageBean<>();
int totalCount = Math.toIntExact(songService.getAllSongsCountBySingerName(singerName));
// 计算总页码
int totalPage = (totalCount % rows) == 0 ? (totalCount / rows) : (totalCount/rows) + 1;
songPage.setTotalPage(totalPage);
// 计算当前页码
if(currentPage <= 0){
singerService.updateSingerAccessCountBySingerName(singerName);
if(_currentPage == null || "".equals(_currentPage)){
_currentPage = "1";
}
if(_rows == null || "".equals(_rows)){
_rows = "10";
}
int currentPage = Integer.parseInt(_currentPage);
int rows = Integer.parseInt(_rows);
PageBean<Song> songPage = new PageBean<>();
int totalCount = Math.toIntExact(songService.getAllSongsCountBySingerName(singerName));
// 计算总页码
int totalPage = (totalCount % rows) == 0 ? (totalCount / rows) : (totalCount/rows) + 1;
songPage.setTotalPage(totalPage);
// 计算当前页码
if(currentPage <= 0){
currentPage = totalPage;
} else if(currentPage > totalPage) {
currentPage = 1;
}
songPage.setCurrentPage(currentPage);
int start = (currentPage - 1) * rows;
// 获取该歌手的所有歌曲
List<Song> allSongs = songService.getSongBySingerName(start, rows, singerName);
Singer singer = singerService.getSingerBySingerName(singerName);
songPage.setList(allSongs);
songPage.setTotalCount(totalCount);
songPage.setRows(rows);
songPage.setTotalPage(totalPage);
// 添加到session
HttpSession session = request.getSession();
session.setAttribute("songPage", songPage);
session.setAttribute("singer", singer);
// 重定向到album-single页面
response.sendRedirect(request.getContextPath() + "/page/user/album-single.jsp");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
/**
* @description: TODO 修改歌曲信息
* @version: 1.0
*/
@WebServlet("/admin/updateSongServlet")
public class UpdateSongServlet extends HttpServlet {
private SongService songService = null;
private TypeService typeService = null;
@Override
public void init() throws ServletException {
songService = new SongServiceImpl();
typeService = new TypeServiceImpl();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取修改表单
String songId = request.getParameter("songId");
String playerCount = request.getParameter("update_playerCount_" + songId);
String downloadCount = request.getParameter("update_downloadCount_" + songId);
String collectionCount = request.getParameter("update_collectionCount_" + songId);
String type = request.getParameter("update_songType_" + songId);
String initialType = request.getParameter("initialType_" + songId);
String lyric = request.getParameter("updateLyric_" + songId);
System.out.println(type);
// 封装数据
Song song = new Song();
song.setSongId(Integer.parseInt(songId));
song.setPlayCount(Integer.parseInt(playerCount));
song.setDownloadCount(Integer.parseInt(downloadCount));
song.setCollectionCount(Integer.parseInt(collectionCount));
song.setType(type);
song.setLyric(lyric);
song.setUpdateDate(DateUtils.getDateString());
System.out.println(song);
// 调用service执行修改操作
int flag = songService.updateSong(song);
// 设置上传用户
Admin admin = (Admin) request.getSession().getAttribute("admin");
User user = (User) request.getSession().getAttribute("user");
if(admin != null) {
song.setUploader(admin.getAdminName());
} else if(user != null) {
song.setUploader(user.getName());
}
System.out.println(song.getTime());
int flag = songService.addSong(song);
System.out.println(flag);
if(flag > 0) {
// 歌曲添加成功,修改该歌曲类别的歌曲数目
for(String type : song.getType().split(",")){
// 如果有该类别,则修改该类别歌曲数目,如果没有该类别,则添加该类别,再修改歌曲数目
if(typeService.getTypeByName(type) != null) {
typeService.updateTypeByName(type, true);
} else {
typeService.addType(new Type(null, type, 1));
}
}
request.setAttribute("message", "歌曲添加成功!");
} else {
request.setAttribute("message", "歌曲添加失败!");
}
}
//生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
public String mkFileName(String fileName){
return UUID.randomUUID().toString()+"_"+fileName;
}
}
/**
* @ClassName: UploadFileServlet
* @Description: TODO
*
* 上传文件
*/
@WebServlet("/admin/addSingerServlet")
public class AddSingerServlet extends HttpServlet {
private SingerService singerService = null;
private SongService songService = null;
/**
* * 创建一封只包含文本的简单邮件
*
* @param EmailAccount
* 发件人邮箱账户 -- 需开通POP3、IMAP服务
* @param EmailPassword
* 发件人邮箱密码
* @param receiveMail
* 收件人邮箱
* @param userRemarks
* 用户备注
* @param senderName
* 发件人昵称
* @param subjectText
* 主题
* @param mailText
* 邮件正文
* @return
* @throws Exception
*/
public static void Send(String EmailAccount, String EmailPassword, String receiveMail, String userRemarks,
String senderName, String subjectText, String mailText) {
try {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
// 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
// 取消下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
/*
* // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, // 需要改为对应邮箱的 SMTP
* 服务器的端口, 具体可查看对应邮箱服务的帮助, // QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看) final String
* smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort);
* props.setProperty("mail.smtp.socketFactory.class",
* "javax.net.ssl.SSLSocketFactory");
* props.setProperty("mail.smtp.socketFactory.fallback", "false");
* props.setProperty("mail.smtp.socketFactory.port", smtpPort);
*/
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
// 设置为debug模式, 可以查看详细的发送 log
session.setDebug(true);
// 3. 创建一封邮件
MimeMessage message = createMimeMessage(session, receiveMail, userRemarks, senderName, subjectText,
mailText, EmailAccount);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
* fileName-->若不指定文件名,默认为yyyyMMddHHmmss_xyz
* extMap-->允许的扩展名,默认见代码中的构造方法
* 注:extMap中的key中必须含有dirName
*/
public class UploadUtils {
/**
* 表单字段常量
*/
public static final String FORM_FIELDS = "form_fields";
/**
* 文件域常量
*/
public static final String FILE_FIELDS = "file_fields";
// 最大文件大小
private long maxSize = 1000000;
// 定义允许上传的文件扩展名
private Map<String, String> extMap = new HashMap<String, String>();
// 文件保存目录相对路径
private String basePath = "upload";
// 文件的目录名
private String dirName = "song";
// 上传临时路径
private static final String TEMP_PATH = "/temp";
private String tempPath = basePath + TEMP_PATH;
// 若不指定则文件名默认为 yyyyMMddHHmmss_xyz
private String fileName;
// 文件保存目录路径
private String savePath;
// 文件保存目录url
private String saveUrl;
// 文件最终的url包括文件名
private String fileUrl;
public UploadUtils() {
// 其中images,flashs,medias,files,对应文件夹名称,对应dirName
// key文件夹名称
// value该文件夹内可以上传文件的后缀名
extMap.put("images", "gif,jpg,jpeg,png,bmp");
extMap.put("flashs", "swf,flv");
extMap.put("medias", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("files", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
}
/**
* 文件上传
*
* @param request
* @return infos
* info[0] 验证文件域返回错误信息
/**
* 处理上传内容
*
* @param request
* @return
*/
@SuppressWarnings("unchecked")
private Map<String, Object> initFields(HttpServletRequest request) {
// 存储表单字段和非表单字段
Map<String, Object> map = new HashMap<String, Object>();
// 第一步:判断request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// 第二步:解析request
if (isMultipart) {
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// 阀值,超过这个值才会写到临时目录,否则在内存中
factory.setSizeThreshold(1024 * 1024 * 10);
factory.setRepository(new File(tempPath));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
// 最大上传限制
upload.setSizeMax(maxSize);
/* FileItem */
List<FileItem> items = null;
// Parse the request
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 第3步:处理uploaded items
if (items != null && items.size() > 0) {
Iterator<FileItem> iter = items.iterator();
// 文件域对象