這裡實現能夠實現輸入歌曲名與歌手名,最後找到該歌曲的播放地址,並通過超連結的形式開啟或播放。以下是實現過程:
(1)、首先是一個JSP,接收歌曲名與歌手名,並提交給Servlet處理。
- <%@ page contentType="text/html;charset=GBK" pageEncoding="GBK"%>
- <html>
- <body>
- <center>
- <h3><font color="green">輸入歌手和歌曲名找歌曲</font></h3>
- <form action="music.do" method="post">
- 歌手名:<input type="text" name="person_name"><br>
- 歌曲名:<input type="text" name="music_name"><br>
- <input type="submit" value="下載歌曲">
- </form>
- </center>
- </body>
- </html>
(2)、編寫解析DOM的工具類,這個類有一個靜態方法 String dom(File file),傳遞的參數是要解析的XML檔案,傳回值是百度音樂的地址。
- package cn.guet.hj.servlet;
- import javax.xml.parsers.*;
- import org.w3c.dom.*;
- import java.io.*;
- /**
- * 解析百度音樂掌門的XML
- **/
- public class MusicDom{
- //解析DOM
- public static String dom(File file){
-
- String address="";//歌曲的實際地址
- try{
- //建立工廠類
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- //建立Builder對象
- DocumentBuilder builder = factory.newDocumentBuilder();
- //將制定內容解析為XML文檔,返回一個Document對象
- Document doc = builder.parse(file);
- //建立NodeList
- NodeList url_list = doc.getElementsByTagName("url");//取得url標籤列表
- //取得url標籤下的所有子標籤
-
- //取得encode標籤內容
- Element e1 = (Element)url_list.item(0);
- address = e1.getElementsByTagName("encode").item(0).getFirstChild().getNodeValue();//加歌曲地址
- //取得decode標籤內容
- Element e2 = (Element)url_list.item(0);
- address += "/"+e2.getElementsByTagName("decode").item(0).getFirstChild().getNodeValue();//加歌曲名
- }catch(Exception e){
- e.printStackTrace();
- }
- return address;
- }
- }
(3)、編寫Servlet,處理JSP傳遞來的請求,這裡主要覆寫HttpServlet的doGet與doPost方法。我們將擷取JSP的參數並傳遞到百度音樂介面中,將這個字串建立URL並串連,然後通過IO流儲存XML檔案,最後調用前面的工具類得到播放地址。最後請求轉寄到另一個JSP中。
- package cn.guet.hj.servlet;
- import javax.servlet.*;
- import javax.servlet.http.*;
- import java.io.*;
- import java.net.*;
- /**
- ** 接收歌曲名與歌手名 處理請求
- **/
- public class MusicServlet extends HttpServlet{
- //處理Get請求
- public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
- request.setCharacterEncoding("GBK");
- String person_name = request.getParameter("person_name");
- String music_name = request.getParameter("music_name");
- //將會返回歌曲資訊的XML
- String url_str = "http://box.zhangmen.baidu.com/x?op=12&count=1&title="+music_name+"$$"+person_name+"$$$$";
-
- URL url = new URL(url_str);//建立URL對象
- URLConnection conn = url.openConnection();//連線物件
- conn.connect();//發送串連
-
- InputStream input = conn.getInputStream();//擷取目的的輸入資料流
- File file = new File("D:"+File.separator+music_name+".xml");
- OutputStream output = new FileOutputStream(file);//輸出資料流
- byte []b = new byte[20240];
- int len = input.read(b);
- output.write(b,0,len);
- //Dom解析
- String address = MusicDom.dom(file);//播放地址 調用解析Dom解析的類
- request.setAttribute("address",address);//設定屬性
- //System.out.println(address);
- output.close();
- input.close();
- //請求轉寄
- RequestDispatcher view = request.getRequestDispatcher("music_play.jsp");
- view.forward(request,response);
- }
-
- //處理Post請求
- public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
- this.doGet(request,response);
- }
- }
(4)、寫JSP頁面,這裡主要是一個超連結,串連到音樂地址。
- <%@ page language="java" contentType="text/html;charset=GBK" pageEncoding="GBK"%>
- <%@ page import="java.net.*"%>
- <%@ page import="java.io.*"%>
- <html>
- <body>
- <a href="${address}" target="_blank"><h4><font color="red">播放音樂</font></h4></a>
- </body>
- </html>
總結:上面的例子實現了輸入歌曲名與歌手名來找到歌曲的地址。這個例子主要綜合了前面學過的XML檔案解析,IO流,Servlet,JSP等知識,雖然實現過程不複雜,但是還是遇到很多問題,比如串連URL對象,擷取XML檔案這是以前沒有接觸,但是還是邊學邊做的寫完了程式。此外,最後一步超連結還是有一些問題,會出現403錯誤,還是要通過地址欄輸入地址才能訪問,這一步暫時還沒解決。
原文連結:http://hepershade.iteye.com/blog/1488580