当遇到很难的问题时,不要觉得没有方法解决。其实前人早就遇到过,只是你不知道他们解决的方法。也就是说,再编程的时候遇到的所有难题都可以解决。只是时间问题!
部分代码:
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应用,虽然没什么大的功能,但是还是挺开心的。
期间遇到的问题,你懂得、