《JavaWeb—簡單應用—服務器向客戶端提供音樂資源》—用到的技術dom4j,JSTL,EL表達式 – JAVA編程語言程序開發技術文章

代碼看時候感覺很簡單,用起來才覺得很強大

當遇到很難的問題時,不要覺得沒有方法解決。其實前人早就遇到過,隻是你不知道他們解決的方法。也就是說,再編程的時候遇到的所有難題都可以解決。隻是時間問題!

 

部分代碼:

[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應用,雖然沒什麼大的功能,但是還是挺開心的。

期間遇到的問題,你懂得、

發佈留言