《JavaWeb---简单应用---服务器向客户端提供音乐资源》---用到的技术dom4j,JSTL,EL表达式

来源:互联网 发布:淘宝代练lol封号赔偿 编辑:程序博客网 时间:2024/06/12 19:06
代码看时候感觉很简单,用起来才觉得很强大

当遇到很难的问题时,不要觉得没有方法解决。其实前人早就遇到过,只是你不知道他们解决的方法。也就是说,再编程的时候遇到的所有难题都可以解决。只是时间问题!


部分代码:

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");//得到文件的documentSAXReader 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算法的MessageDigestMessageDigest 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");//得到文件的documentSAXReader 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");//得到文件的documentSAXReader 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应用,虽然没什么大的功能,但是还是挺开心的。

期间遇到的问题,你懂得、