一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

利用Dojo和JSON建立無限級AJAX動態加載的功能模塊樹

 看了“使用hibernate實現樹形結構無限級分類”這篇文章后,我也想將自己在所有開發的項目中使用的功能模塊樹的實現方法以及完整DEMO(含源碼)貼出來和大家分享。其實在我的博客里是老早貼出來的,由于時間關系沒好好整理。
       功能模塊樹是幾乎在每個項目里都要用到的東西,利用Dojo的好處就是可以實現樹的子節點的動態加載,這在樹節點很多的情況下是很有用的。
        下載附件二dojotree.rar,解壓后將dist/dojotree.war部署到應用服務器即可瀏覽DEMO,DEMO中內置HSQLDB數據庫,啟動時自動加載。DEMO運行截圖見附件一。 
一、tree.jsp主要代碼
1、首先在head中導入Dojo庫(dojo.js)和TreeWidget
<script>"text/Javascript" src="ajax/dojo/dojo.js">   
<script>"text/Javascript">   
dojo.require("dojo.widget.Tree");   
dojo.require("dojo.widget.TreeNode");   
dojo.require("dojo.widget.TreeSelector");   
dojo.require("dojo.widget.TreeRPCController");   
dojo.require("dojo.widget.TreeLoadingController");   
dojo.require("dojo.widget.TreeContextMenu");   
</script>   
2、在body中放置TreeWidget,TreeLoadingController中的RPCUrl="treeServlet"為從后臺獲取數據的servlet名稱,TreeNode中的expandLevel表示樹初始張開級別
<div dojoType="TreeLoadingController" RPCUrl="treeServlet" widgetId="treeController" DNDController="create"><!--</span-->div>   
<div dojoType="TreeSelector" widgetId="treeSelector"><!--</span-->div>   
<div dojoType="Tree" DNDMode="between" selector="treeSelector" widgetId="bandTree" controller="treeController">   
<div dojoType="TreeNode" title="root" widgetId="root" objectId="root" isFolder="true" childIconSrc="images/comm.gif" expandLevel="1"/>   
3、建立TreeSelector事件處理函數
function treeSelectFired() {   
    // get a reference to the treeSelector and get the selected node    
    var treeSelector = dojo.widget.manager.getWidgetById('treeSelector');   
    var treeNode = treeSelector.selectedNode;   
    // get a reference to the songDisplay div   
    var hostDiv = document.getElementById("songDisplay");   
    var isFolder = treeNode['isFolder'];   
    //alert(isFolder);   
    if ( !isFolder) {   
       var song = treeNode['title'];   
       var url = treeNode['url'];   
       link(url);   
    } else {    
    }   
}   
4、將select事件處理函數關聯到treeSelector
function init() {    
    //get a reference to the treeSelector   
    var treeSelector = dojo.widget.manager.getWidgetById('treeSelector');   
    //connect the select event to the function treeSelectFired()   
    dojo.event.connect(treeSelector,'select','treeSelectFired');    
}   
dojo.addOnLoad(init);   
二、主要Java代碼及數據結構
1、Gnmk.Java中tree的屬性
 private String id;     
 private String gnmkdm;  //功能模塊代碼   
private String gnmksm;  //功能模塊說明   
private String gnmktb;  //功能模塊圖標   
 private String gnmklj;  //功能模塊路徑   
 private String gnmkmc;  //功能模塊名稱   
private String gnmksj;  //功能模塊上級代碼   
private String gnmkbz;  //功能模塊標志(‘N'為葉節點)   
2、HSQLDB內存數據庫加載SQL(db.sql)
CREATE TABLE GNMK (ID VARCHAR, GNMKDM VARCHAR, GNMKMC VARCHAR, GNMKLJ VARCHAR, GNMKTB VARCHAR, GNMKBZ VARCHAR, GNMKSJ VARCHAR);     
INSERT INTO GNMK VALUES ('d098a59f0b765c30010b765d6b780001', '01', '一級目錄1', null, 'system.gif', 'Y', '');     
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830001', '0101', '二級目錄1', 'cxtjAction.do', 'system.gif', 'N', '01');     
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830001', '0102', '二級目錄2', 'cxtjAction.do', 'system.gif', 'N', '01');     
INSERT INTO GNMK VALUES ('d098a59f0b765c30010b765d6b780002', '02', '一級目錄2', null, 'system.gif', 'Y', '');     
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002', '0201', '二級目錄1', 'cxtjAction.do', 'system.gif', 'N', '02');     
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002', '0202', '二級目錄2', 'cxtjAction.do', 'system.gif', 'Y', '02');     
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002', '020201', '三級目錄1', 'cxtjAction.do', 'system.gif', 'N', '0202');     
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002', '020202', '三級目錄2', 'cxtjAction.do', 'system.gif', 'N', '0202');    
3、TreeServlet .Java主要代碼,在getGnmkByParent(String gnmksj)方法中可以實現自己的業務,DEMO中使用GnmkDAO
public class TreeServlet extends HttpServlet {   
    private static final long serialVersionUID = 1L;   
    protected void doGet(HttpServletRequest request,   
            HttpServletResponse response) throws ServletException, IOException {   
        String action = request.getParameter("action");   
        System.out.println("action b=>" + action);   
        System.out.println("action b=>" + action);   
        String data = request.getParameter("data");   
        if (action.equalsIgnoreCase("getChildren")) {   
            JSONTokener jsonTokener = new JSONTokener(data);   
            JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();   
            JSONObject parentNodeObject = (JSONObject) jsonObject.get("node");   
            response.setContentType("text/json; charset=gb2312");   
            PrintWriter out = response.getWriter();   
            out.write(getChildren(parentNodeObject));   
        } else {   
        }   
    }   
    private String getChildren(JSONObject parentNodeObject) {   
        JSONArray result = new JSONArray();   
        String parentObjectId = parentNodeObject.getString("objectId");// id 唯一   
        // String parentWidgetId = parentNodeObject.getString("widgetId");// dm   
        parentObjectId = parentObjectId.equalsIgnoreCase("root") ? ""   
                : parentObjectId;   
        System.out.println("parentObjectId=>" + parentObjectId);   
        // 獲取子功能模塊   
        List listGnmk = this.getGnmkByParent(parentObjectId);   
        System.out.println("listGnmk=>" + listGnmk.size());   
        if (listGnmk != null) {   
            Iterator itGnmk = listGnmk.iterator();   
            while (itGnmk.hasNext()) {   
                Gnmk qxgnmk = (Gnmk) itGnmk.next();   
                try {   
                    JSONObject jsonGnmkObject = new JSONObject();   
                    String gnmkbz = qxgnmk.getGnmkbz();   
                    boolean isFolder = gnmkbz.equalsIgnoreCase("Y") ? true   
                            : false;   
                    jsonGnmkObject.put("title", qxgnmk.getGnmkmc());   
                    jsonGnmkObject.put("isFolder", isFolder);   
                    jsonGnmkObject.put("widgetId", qxgnmk.getGnmkdm());   
                    jsonGnmkObject.put("objectId", qxgnmk.getGnmkdm());   
                    jsonGnmkObject.put("childIconSrc", "images/"   
                            + qxgnmk.getGnmktb());   
                    jsonGnmkObject.put("url", qxgnmk.getGnmklj());   
                    result.put(jsonGnmkObject);   
                } catch (JSONException e) {   
                    e.printStackTrace();   
                }   
            }   
        }   
        return result.toString();   
    }   
    private List getGnmkByParent(String gnmksj) {   
        GnmkDAO gnmkDao = new GnmkDAO();   
        return gnmkDao.getGnmkByParent(gnmksj);   
    }   
}   
三、關于DEMO的其它配置說明
1、實現Javax.servlet.ServletContextListener接口的contextInitialized方法來加載HSQLDB及其數據,ContextListener.Java主要代碼 
public void contextInitialized(ServletContextEvent event) {   
    try {   
        // load the driver   
        Class.forName("org.hsqldb.jdbcDriver");   
        // create the table and add sample data   
        InputStreamReader in = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("db.sql"));   
        BufferedReader reader = new BufferedReader(in);   
        DBUtils.setupDatabase(reader);   
    } catch (ClassNotFoundException e) {   
        e.printStackTrace();   
    }   
}   
2、web.xml相關配置
<listener>   
    <listener-class>   
       dojo.sample.ContextListener   
    <!--<span class="tag"--><!--</span-->listener-class>   
<!--</span-->>  
dojotree.jpg 
下載

JavaScript技術利用Dojo和JSON建立無限級AJAX動態加載的功能模塊樹,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久久久99| 蜜月aⅴ免费一区二区三区 免播放器在线观看 | 视频在线亚洲 | 一菊综合网成人综合网 | 国产激情网 | 国产精品久久久久免费视频 | 五月天999| 欧美一卡2卡3卡4卡无卡网老狼 | 99在线视频免费 | 亚洲人人视频 | jjzz亚洲亚洲女人 | 国产swag在线 | 牛牛本精品99久久精品88m | 97超级碰久久久久香蕉人人 | 波多野结衣一区二区三区高清在线 | 中文字幕一区二区在线视频 | 综合成人 | 91麻豆精品国产综合久久久 | 免费国产在线观看不卡 | 欧美在线视频播放 | 欧美成人免费午夜影视 | 久插视频 | 一级做a爰片性色毛片男 | 国产精品酒店视频 | 欧美激情视频在线免费观看 | 一区三区三区不卡 | 91最新在线视频 | 色偷偷尼玛图亚洲综合 | 色婷婷久久久swag精品 | 欧美在线黄 | 五月在线观看 | 欧美精品免费一区欧美久久优播 | 久久久久久久久中文字幕 | 免费视频91 | 91麻豆国产自产 | 精品999久久久久久中文字幕 | 成人观看的视频三级 | 日韩视频在线观看一区 | 国产精品一区不卡 | 国产成人精品福利网站在线观看 | 美女胸免费视频网站 |