代碼看時候感覺很簡單,用起來才覺得很強大
當遇到很難的問題時,不要覺得沒有方法解決。其實前人早就遇到過,隻是你不知道他們解決的方法。也就是說,再編程的時候遇到的所有難題都可以解決。隻是時間問題!
部分代碼:
[java]
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);
}
}
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);
}
}
[html]
<%@ 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>
<%@ 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>
[java]
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);
}
}
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應用,雖然沒什麼大的功能,但是還是挺開心的。
期間遇到的問題,你懂得、