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

代码看时候感觉很简单,用起来才觉得很强大

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


部分代码:

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.在音乐库中新添加资源

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

2.点击mp3后进行数据更新

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

3.点击下载(此处不是我们想要的怎么将文件再改回歌曲名?希望高手指教)

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

4.点击播放

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

5.播放列表数据

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


这是自己完成的第一小小的web应用,虽然没什么大的功能,但是还是挺开心的。

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

你可能感兴趣的:(xml,String,服务器,File,音乐,import)