程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java實現Web版RSS閱讀器(二)使用dTree樹形加載rss訂閱分組列表

Java實現Web版RSS閱讀器(二)使用dTree樹形加載rss訂閱分組列表

編輯:關於JAVA

在上一邊博客《Web版RSS閱讀器(一)——dom4j讀取xml(opml)文件》中已經講過如何讀取rss訂閱文件了。這次就把訂閱的文件讀取到頁面上,使用樹形結構進行加載顯示。

不打算使用特殊的控件進行樹型顯示,也不想自己寫了,想省勁些,就在

網上找了一個js樹形腳本——dTree。dTree是一個易於使用的JavaScript樹形

菜單控件。支持無限分級,可以在同一個頁面中放置多個dTree,可以為每個

節點指定不同的圖標。

主頁:http://destroydrop.com/javascripts/tree/default.html

下載:http://destroydrop.com/javascripts/tree/dtree.zip

示例:http://destroydrop.com/javascripts/tree/v1/

我使用的是mvc2來實現加載rss分組列表的。mvc2的流程如下:

由於這次是使用jsp來顯示,所以把rss文件夾轉移到WebRoot文件夾下了。對原來的【ReadXML.java】做了部分修改,重新貼出來。

package com.tgb.rssreader.manager;  
      
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
      
import org.dom4j.Document;  
import org.dom4j.DocumentException;  
import org.dom4j.Element;  
import org.dom4j.io.SAXReader;  
      
import com.tgb.rssreader.bean.RssBean;  
import com.tgb.rssreader.bean.RssConfigBean;  
import com.tgb.rssreader.bean.RssTeamBean;  
      
/** 
 * 讀取xml文件 
 * @author Longxuan 
 * 
 */
public class ReadXML {  
      
    // rss分組訂閱列表  
    private List<RssTeamBean> rssTeamBeanList = new ArrayList<RssTeamBean>();  
      
    /** 
     * 讀取rss文件列表 
     * @param directory 
     */
    public void ReadRssTeam(String directory) {  
      
        // rss文件列表配置信息實體  
        RssConfigMgr rssConfigMgr = new RssConfigMgr();  
        List<RssConfigBean> list = rssConfigMgr.getRssConfig();  
      
        String errText = "";// 記錄錯誤信息  
      
        // 循環讀取rss文件列表  
        for (RssConfigBean rssConfig : list) {  
            // System.out.println(rssConfig.getName() + "----" +  
            // rssConfig.getPath());  
      
            try {  
      
                // 讀取rss文件內容  
                //ReadRss(System.getProperty("user.dir")+ rssConfig.getPath());  
                ReadRss(directory + rssConfig.getPath());  
      
            } catch (Exception e) {  
                errText += e.getMessage();  
            }  
        }  
              
        //如果有異常信息,則匯總後拋出  
        if(!"".equals(errText)){  
            throw new RuntimeException(errText);  
        }  
    }  
      
    /** 
     * 讀取ompl文件 
     *  
     * @param filePath 
     */
    private void ReadRss(String filePath) {  
      
        File file = new File(filePath);  
      
        if (!file.exists()) {  
//           System.out.println("找不到【" + filePath + "】文件");  
//           return;  
            throw new RuntimeException("找不到【" + filePath + "】文件");  
        }  
      
        try {  
      
            // 讀取並解析XML文檔  
            // SAXReader就是一個管道,用一個流的方式,把xml文件讀出來  
            SAXReader reader = new SAXReader();  
            FileInputStream fis = new FileInputStream(file);  
      
            // 下面的是通過解析xml字符串的  
            Document doc = reader.read(fis);  
      
            // 獲取根節點  
            Element rootElt = doc.getRootElement(); // 獲取根節點  
            // System.out.println("根節點:" + rootElt.getName()); // 拿到根節點的名稱  
      
            // 獲取head/title節點  
            Element titleElt = (Element) rootElt.selectSingleNode("head/title");// 獲取head節點下的子節點title  
      
            // 獲取分組名稱  
            String title = titleElt.getTextTrim();  
      
            // 獲取body節點  
            Element bodyElt = (Element) rootElt.selectSingleNode("body");  
      
            // 獲取body下的第一個outline節點  
            Element outlineElt = (Element) bodyElt.selectSingleNode("outline");  
      
            // 判斷該outlineElt節點的屬性數量,>2說明是詳細博客訂閱信息,否則則是分組信息。  
            if (outlineElt.attributes().size() > 2) { // 詳細博客訂閱信息  
      
                // 實例化 RSS分組實體  
                RssTeamBean rssTeamBean = new RssTeamBean();  
      
                // 獲取body節點下的outline節點  
                Iterator<?> iter = bodyElt.elementIterator("outline");  
      
                // 輸出分組名稱  
                // System.out.println("分組名稱:" + title);  
      
                // 記錄分組名稱  
                rssTeamBean.setTitle(title);  
                rssTeamBean.setText(title);  
      
                // 實例化訂閱列表  
                List<RssBean> rssBeanList = new ArrayList<RssBean>();  
      
                // 獲取詳細博客訂閱信息  
                ReadBlogsInfo(iter, rssBeanList);  
      
                // 設置訂閱列表到分組中  
                rssTeamBean.setRssBeanList(rssBeanList);  
      
                // 添加分組到rss分組訂閱列表  
                rssTeamBeanList.add(rssTeamBean);  
      
            } else { // 分組信息  
      
                // 獲取body節點下的outline節點
			//
			
		
		

正題終於開始了:在src中新建包com.tgb.rssreader.web,添加RssTeamServlet,繼承HttpServlet,實現doGet和doPost方法。它主要是用來調用com.tgb.rssreader.manager包下的ReadXML 類,以獲取到分組信息,然後將其轉發給left.jsp。源代碼如下:

package com.tgb.rssreader.web;  
      
import java.io.IOException;  
import java.util.List;  
      
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
      
import com.tgb.rssreader.bean.RssTeamBean;  
import com.tgb.rssreader.manager.ReadXML;  
      
/** 
 * 加載Rss分組 
 * @author Longxuan 
 * 
 */
@SuppressWarnings("serial")  
public class RssTeamServlet extends HttpServlet {  
          
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)  
    throws ServletException, IOException {  
              
        //獲取web項目的根目錄的實際目錄  
        String path = this.getServletConfig().getServletContext().getRealPath("/");   
              
        ReadXML readXML = new ReadXML();  
              
        //讀取目錄下的rss文件夾中的所有opml文件
	//
			
		
		

最後一步就是在界面上動工了。界面是自己先簡單的做了個html的模版,已上傳至百度網盤。布局使用frameset分割成3列,樹形結構的Rss分組信息左側,即left.jsp。中間的為某個rss訂閱地址的文章列表,名為middle.jsp,右側則是顯示文章的地方,名為content.jsp。

現在先做成這樣一個效果:左側的left.jsp頁,使用dTree的樹形結構加載rss分組信息。點擊一個訂閱信息節點,在右側顯示出來對應的訂閱內容。修改的是left.jsp,貼出源碼:

<%@ page language="java" contentType="text/html; charset=GB18030"  
    pageEncoding="GB18030"%>  
<%@ page import="com.tgb.rssreader.bean.*"  %>  
<%@ page import="java.util.*" %>  
      
      
<%  
    String path = request.getContextPath();  
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+path+"/";  
%>  
          
<html>  
<head>  
    <base href="<%=basePath %>"  />  
    <link rel="stylesheet" href="style/main.css">  
    <link rel="StyleSheet" href="style/dtree.css" type="text/css"  />  
    <script type="text/javascript" src="js/dtree.js"></script>  
</head>  
<body>  
<div id="leftMenu" style="overflow-y:auto; overflow-x:auto;">  
  <script type="text/javascript">  
        <!--  
        <!--   add(id, pid, name, url, title, target, icon, iconOpen, open);  
        //9個參數說明: id,pid,顯示名稱,打開的url,提示信息,目標框架,閉合時的圖標,展開時的圖標,是否展開(open || false)  
        -->
        d = new dTree('d');  
        d.add(0,-1,'博客分組','','','','','img/blog.png');  
              
<%  
    int i = 0;//當前分組的節點索引值  
    int c = 0;//節點總數  
          
    //獲取所有分組信息  
    List<RssTeamBean> rssTemBeanList = (List)request.getAttribute("rssTemBeanList");  
          
    //遍歷所有分組信息  
    for (RssTeamBean rssTeamBean:rssTemBeanList) {  
        c = c+1;//總個數加1  
%>  
        //添加組節點  
        d.add(<%=c%>,0,'<%=rssTeamBean.getTitle()%>','','','','img/open.png','img/close.png');  
<%  
        i=c;//設定當前節點為分組節點索引值  
        //遍歷分組下的所有訂閱信息  
        for (RssBean rssBean : rssTeamBean.getRssBeanList()) {  
            c = c+1;//總個數加1  
%>  
            //添加訂閱信息節點  
            d.add(<%=c%>,<%=i%>,'<%=rssBean.getTitle()%>','<%=rssBean.getXmlUrl()%>','<%=rssBean.getText()%>','contenthtml');  
<%     
        }  
    }  
%>  
        //在界面上顯示樹形結構  
        document.write(d);  
      
        //-->  
    </script>  
</div>  
</body>  
</html>

暫時的效果圖如下:

至此,讀取rss分組已經完成了。接下來的博文中,會給大家解說一下rss版本以及解析在線的rss訂閱。敬請期待。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved