代码看时候感觉很简单,用起来才觉得很强大
运行结果:
当遇到很难的问题时,不要觉得没有方法解决。其实前人早就遇到过,只是你不知道他们解决的方法。也就是说,再编程的时候遇到的所有难题都可以解决。只是时间问题!
部分代码:
package com.fenghuo.music;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import sun.misc.BASE64Encoder;
public class LinkMusic extends HttpServlet {
/**
* Title:获取资源,对xml文件中的数据进行修整
* Copyright: Copyright (c) 2012
* @author: 烽火
* @version 1.0 2012-09
*/
private static final long serialVersionUID = -2863941298564252276L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取所有音乐资源的名字
String[] resnames = getResNames();
//得到xml文件中提供的资源名及对应的歌曲名
Map<String,String> musmap = getMusmap();
//遍历所有的资源名
for (int i = 0; i < resnames.length; i++){
//判断xml文件中是否存在次资源名,如果不存在则在xml文件中添加此资源
if (!musmap.containsKey(resnames[i])){
//得到对歌曲重命名后的资源名
String rename = getRename(resnames[i]);
//对歌曲进行重命名
setResname(resnames[i], rename);
//将重名的歌曲资源添加到xml文件中
addresname(rename,resnames[i]);
}else{
System.out.println(resnames[i] + "资源存在");
}
}
//xml文件中多余的垃圾信息未清除
//音乐文件从music目录下移除,xml中的信息还存在
//重新获取xml文件中的数据存到session域中
musmap = getMusmap();
request.getSession().setAttribute("musmap", musmap);
//得到音乐的集合,Map.entry里有getKey,getValue为下面用EL表达式获取数据提供便利
Set<Entry<String, String>> musics = musmap.entrySet();
request.setAttribute("musics", musics);
//转发。转到jsp展示音乐信息
request.getRequestDispatcher("/WEB-INF/jsp/linkmusic.jsp").forward(request, response);
}
/**
* Description : 将歌曲信息添加到xml文件中
* @param:resname 资源名称
* @param: name 歌曲名称
*/
public void addresname(String resname, String name){
String xmlrealpath = this.getServletContext().getRealPath("/resource/musiclist.xml");
//得到文件的document
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(new File(xmlrealpath));
if (document == null){
System.out.println("没有得到xml文件");
return;
}else{
System.out.println("得到xml文件!");
}
//得到根节点
Element root = document.getRootElement();
//给根节点增加一个子节点,即添加一首歌曲的信息
root.addElement("music")
.addElement("resname").addText(resname).getParent()
.addElement("name").addText(name);
//得到输出document的输出样式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(new FileOutputStream(xmlrealpath),format);
// 将document写出,关流
writer.write(document);
writer.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Description : 对资源歌曲名重新命名
* @param:resname 将要命名的资源名称
* @param: rename 资源新名称
*/
public void setResname(String resname, String rename){
//得到存放音乐文件夹的绝对地址
String realpath = this.getServletContext().getRealPath("/resource/music");
File resfile = new File(realpath +"/"+ resname);
File refile = new File(realpath +"/"+ rename);
resfile.renameTo(refile);
}
/**
* Description : 获取资源的新命名
* @param:resname 资源名称
* @return:String 资源新名称
*/
public String getRename(String resname){
try {
//得到MD5算法的MessageDigest
MessageDigest dm = MessageDigest.getInstance("md5");
byte[] md5 = dm.digest(resname.getBytes());
//对用MD5处理后的数据进行计算,得到处理后的字符串
BASE64Encoder encoder = new BASE64Encoder();
String baset64 = encoder.encode(md5);
String name = baset64 + resname.substring(resname.lastIndexOf("."));
//将影响文件地址的字符替换
String rename = name.replace('/', '0').replace('\\', '0').replace('?', '0');
return rename;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
/**
* Description : 获取xml文件中的信息
* @return:Map<String,String> 存有资源信息的Map集合
*/
public Map<String,String> getMusmap(){
Map<String,String> musmap = new LinkedHashMap<String,String>();
String xmlrealpath = this.getServletContext().getRealPath("/resource/musiclist.xml");
//得到文件的document
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(new File(xmlrealpath));
} catch (DocumentException e) {
e.printStackTrace();
}
if (document == null){
System.out.println("没有得到xml文件<br/>");
return null;
}else{
//System.out.println("得到xml文件!<br/>");
}
//得到根节点
Element root = document.getRootElement();
List<Element> musics = root.elements("music");
for (int i = 0; i < musics.size(); i++){
//分别获取name节点,resname节点的文本信息
String name = (musics.get(i)).element("name").getText();
String resname = (musics.get(i)).element("resname").getText();
//将获取的信息存到musmap集合中
musmap.put(resname, name);
}
return musmap;
}
/**
* Description : 获取资源名称
* @return:String[] 存有资源名称的字符串数组
*/
public String[] getResNames() {
String[] resnames = null;
//得到存放音乐文件夹的绝对地址
String realpath = this.getServletContext().getRealPath("/resource/music");
//得到存有音乐的文件夹对象
File dir = new File(realpath);
//判断是否存在一个目录文件
if (dir.exists() && dir.isDirectory()) {
//得到目录下所有文件的名称
resnames = dir.list();
}
return resnames;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="java.io.File"%>
<%@ page import="java.net.URL"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>音乐列表</title>
<style>
body {
text-align: center;
}
</style>
</head>
<body>
<font color="red">本站提供下列音乐:</font>
<br />
<%-- 利用JSTL结合EL表达式,将域中歌曲信息展现给用户 --%>
<c:forEach var="music" items="${musics }" varStatus="i">
${music.value }
<a href='${pageContext.request.contextPath }/resource/music/${music.key }'>下载</a>
<a href='${pageContext.request.contextPath }/servlet/PlayMusic?resname=${music.key }' target='_blank'> 播放</a><br/>
</c:forEach>
</body>
</html>
package com.fenghuo.music;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class PlayMusic extends HttpServlet {
/**
* Title:从请求中获取信息,修改播放器的播放列表
* Copyright: Copyright (c) 2012
* @author: 烽火
* @version 1.0 2012-09
*/
private static final long serialVersionUID = 2187049797370378307L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//解决乱码问题
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//得到歌曲的资源名称
String resname = request.getParameter("resname");
//从session域中得到存有歌曲信息的Map集合
Map<String, String> musmap = (Map<String, String>)request.getSession().getAttribute("musmap");
String name = musmap.get(resname);
//获取播放器播放列表存放的绝对路径
String xmlrealpath = this.getServletContext().getRealPath("/resource/musicplayer/xml/list0.xml");
//得到文件的document
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(new File(xmlrealpath));
} catch (DocumentException e) {
e.printStackTrace();
}
if (document == null){
out.write("没有得到xml文件<br/>");
return;
}else{
out.write("得到xml文件!<br/>");
}
Element root = document.getRootElement();
Element music = (Element) root.elements("music").get(0);
music.element("name").setText(name);
//将资源的路径添加的music中
music.element("url").setText(request.getContextPath() + "/resource/music/" + resname);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer = new XMLWriter(new FileOutputStream(xmlrealpath), format);
writer.write(document);
writer.close();
//重定向到播放器
//这种播放器在网上可以找到下一个用就行
response.sendRedirect(request.getContextPath() + "/resource/musicplayer/index.htm");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
运行结果:
1.在音乐库中新添加资源
2.点击mp3后进行数据更新
3.点击下载(此处不是我们想要的怎么将文件再改回歌曲名?希望高手指教)
4.点击播放
5.播放列表数据
这是自己完成的第一小小的web应用,虽然没什么大的功能,但是还是挺开心的。
期间遇到的问题,你懂得、