<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    williamraym

    和我一起學(xué)ExtJS(二)——樹

    ??????????最近在學(xué)習(xí)ExtJS,發(fā)現(xiàn)其服務(wù)器端是php,這一點對我們搞java的有點不厚道啊。昨天學(xué)習(xí)了ExtJS的樹,并做了一棵異步更新的樹出來,后臺的業(yè)務(wù)邏輯及持久層使用JPA+Spring2.5實現(xiàn),發(fā)下面把步驟貼出來與大家分享。

      

    首先準(zhǔn)備樹的域模型,下面是一地區(qū)的域模型對象, Region.java 的代碼如下:

    @Entity
    public ? class ?Region? {
    ????@Id
    ????@GeneratedValue(strategy?
    = ?GenerationType.TABLE)
    ????
    private ?Long?id;

    ????@Field(name
    = " 名稱 " ,validator = @Validator(name = " string " ,value = " min:2;max:50 " ,required = true ))
    ????@Column(length?
    = ? 100 )
    ????
    private ?String?name;
    ????
    ????@Field(name
    = " 編碼 " ,validator = @Validator(name = " string " ,value = " min:2;max:16 " ,required = true ))
    ????@Column(length?
    = ? 100 )
    ????
    private ?String?code;
    ????@POLoad(name
    = " parentId " )
    ????@ManyToOne
    ????
    private ?Region?parent;
    ????@OneToMany(mappedBy?
    = ? " parent " ,fetch = javax.persistence.FetchType.EAGER)
    ????
    private ?List < Region > ?children? = ? new ?java.util.ArrayList < Region > ();
    ????
    public ?Long?getId()? {
    ????????
    return ?id;
    ????}

    ????
    public ? void ?setId(Long?id)? {
    ????????
    this .id? = ?id;
    ????}


    ?

    Region域模型有parent,也有children,這個完全是一個樹的結(jié)構(gòu),如果把樹根砍了話就變成森林了,呵呵這一點跟現(xiàn)實不一樣。其它都是settergetter方法,這里就不多說了。

    ?

    然后我們就要做針對這個地區(qū)信息的添刪除改查了。呵呵,添刪改查我最拿手了,特別是基于EJS(EasyJWeb+JPA+Spring2)構(gòu)架的添刪改查,一個命令搞定了。這里就不多說了,大家可以直接看我前段時間做的視頻演示(http://www.easyjf.com/blog/html/20080102/1015814.html)。當(dāng)然這個示例由于是分級別的,所以生成的添刪改查還要改一改,才支持上下級管理功能。

    ?

    下面進(jìn)入我們重點部分,如何在頁面中得到一棵表示地區(qū)的樹。

    首先準(zhǔn)備一個tree.html,內(nèi)容如下:

    <html>
    <head>
    <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8"?/>
    <title>ExtJS-樹示例</title>
    <link?rel="stylesheet"?type="text/css"?href="/plugins/extjs/ext-2.0/resources/css/ext-all.css"?/>
    <script?type="text/javascript"?src="plugins/extjs/ext-2.0/adapter/ext/ext-base.js"></script>
    <script?type="text/javascript"?src="plugins/extjs/ext-2.0/ext-all.js"></script>
    <script?type="text/javascript"?src="tree.js"></script>
    </head>
    <body>
    <div??align="center">
    ??
    <p>ExtJS-樹的示例</p>?
    </div>
    <div?id="tree-div"></div>??
    </body>
    </html>

    ?

    注意幾個<script>標(biāo)簽,他們是用來引入extjs以及本示例中用到的樹。tree.js的代碼如下:

    Ext.BLANK_IMAGE_URL?=?'plugins/extjs/ext-2.0/resources/images/default/s.gif';
    Ext.onReady(
    function(){?
    ????
    var?tree?=?new?Ext.tree.TreePanel({???
    ????????el:
    "tree-div",???
    ????????autoScroll:
    true,
    ????????animate:
    true,
    ????????width:'100px',
    ????????height:'300px',
    ????????enableDD:
    true,
    ????????containerScroll:?
    true,?
    ????????loader:?
    new?Ext.tree.TreeLoader({
    ????????????dataUrl:'region.ejf
    ?cmd=getRegion'????????????
    ????????}
    )
    ????}
    );
    ????tree.on(
    "click",function(node,event){alert(node.id);});
    ????tree.on('beforeload',
    function(node){????????
    ????????????tree.loader.dataUrl?
    =?'region.ejf?cmd=getRegion&id='+(node.id!='root'?node.id:"");
    ????????}
    );????????
    ????
    var?root?=?new?Ext.tree.AsyncTreeNode({
    ????????text:?'地區(qū)信息',
    ????????draggable:
    false,
    ????????id:'root'
    ????}
    );
    ????tree.setRootNode(root);
    ????tree.render();
    ???????root.expand();
    }
    );

    ?

    其實tree.js的代碼跟ExtJS官方示例中的差別不大,這里就不對這個代碼作詳細(xì)的解釋,如果你感興趣的話,可以在后面留言或給我發(fā)電子郵件。如果需要的人多的話,我看能否補充。這里把重點的代碼強調(diào)一下。


    loader:?new?Ext.tree.TreeLoader({
    ????????????dataUrl:'region.ejf
    ?cmd=getRegion'????????????
    ????????}
    )

    ?

    這個表示通過region.ejf?cmd=getRegion來加載樹的數(shù)據(jù)。另外,由于這里使用的是異步加載,所以還需要加下面一句:


    tree.on('beforeload',function(node){????????
    ????????????tree.loader.dataUrl?
    =?'region.ejf?cmd=getRegion&id='+(node.id!='root'?node.id:"");
    ????????}
    );??

    ?

    那么region.ejf?cmd=getRegion是做什么的呢?就是從數(shù)據(jù)庫中查詢地區(qū)數(shù)據(jù),并把他轉(zhuǎn)換成JSon格式就OK了。下面是RegionAction中的getRegion方法的代碼,如下所示:


    public?Page?doGetRegion(WebForm?form)
    ????
    {
    ????????String?id
    =CommUtil.null2String(form.get("id"));????????
    ????????RegionQuery?query
    =new?RegionQuery();
    ????????query.setPageSize(
    -1);????????
    ????????
    if(!"".equals(id))
    ????????
    {
    ????????Region?parent
    =this.service.getRegion(new?Long(id));
    ????????query.setParent(parent);????????
    ????????}

    ????????IPageList?pageList
    =this.service.getRegionBy(query);
    ????????List
    <Node>?nodes=new?java.util.ArrayList<Node>();
    ????????
    for(int?i=0;i<pageList.getResult().size();i++)
    ????????
    {
    ????????????Region?region
    =(Region)pageList.getResult().get(i);
    ????????????nodes.add(
    new?Node(region));
    ????????}
    ????
    ????????form.addResult(
    "json",AjaxUtil.getJSON(nodes));
    ????????
    return?Page.JSONPage;
    ????}


    ?

    這個代碼說白了,就是根據(jù)客戶端的調(diào)用參數(shù)id值來加載該id下面的地區(qū)節(jié)點。RegionQuery是一個地區(qū)查詢類,主要是我不想寫sqlEJBQL,所以就用他了。大家主要看關(guān)鍵的部分,我們在調(diào)用servicegetRegionBy方法返回的是一個分頁的地區(qū)Entity。所以要把這個地區(qū)Entity轉(zhuǎn)換成與Ext的樹節(jié)點數(shù)據(jù)匹配的方式,因此就有了下面一段代碼:

    List<Node>?nodes=new?java.util.ArrayList<Node>();
    ????????
    for(int?i=0;i<pageList.getResult().size();i++)
    ????????
    {
    ????????????Region?region
    =(Region)pageList.getResult().get(i);
    ????????????nodes.add(
    new?Node(region));
    ????????}
    ????
    ?

    下面我們看看Node這個類的實現(xiàn),代碼如下:


    private?class?Node?{
    ????????
    private?Region?region;
    ????????Node(Region?region)
    ????????
    {
    ????????????
    this.region=region;
    ????????}
    ????
    ????????
    public?String?getId()?{????????
    ????????????
    return?region.getId().toString();
    ????????}

    ????????
    public?boolean?getLeaf()?{????????
    ????????????
    return?region.getChildren().size()<1;
    ????????}
    ????????
    ????????
    public?String?getText()?{????????????
    ????????????
    return?region.getName();
    ????????}
    ????
    ????????
    public?String?getQtip()
    ????????
    {
    ????????????
    return?region.getName();
    ????????}

    ????}


    ?

    Node直接放在RegionAction中的,所以是Private的。這個Node所做的事就是把服務(wù)器的Region這個域模型適配成Ext的樹狀節(jié)點數(shù)據(jù)。在轉(zhuǎn)換完以后,我們再看doGetRegion中的最后兩句代碼,如下所示:

    ??? form.addResult("json",AjaxUtil.getJSON(nodes));

    ??? return Page.JSONPage;

    第一句代碼是調(diào)用EasyJWeb中的AjaxUtil.getJSON方法直接把nodes這個List生成JSON數(shù)據(jù);第二句告訴EasyJWeb這個模板使用的是JSONPage合成模板。呵呵,這個Page.JSONPage是這幾天才加上去的,之前發(fā)布的m3沒有,其實JSONPage模板的內(nèi)容非常簡單,內(nèi)容如下:

    function(){$!json}()

    ?

    完成后,把這個Web應(yīng)用打成war包,然后直接訪問tree.html就能看到這個樹了,大致如下圖所示:

    ?

    ?
    ?

    本示例已經(jīng)被收錄到了EasyJWebajax綜合示例中,里面還有更多的ajax示例,包括一個表格編輯的應(yīng)用。

    EasyJWebajax綜合示例的地址:http://easyjweb.demo.easyjf.com/ajax2/

    本示例War包及源碼:ftp://ftp1.easyjf.com/easyjweb/demo/ajax2.war (13M)
      本示例的源碼:ftp://ftp1.easyjf.com/easyjweb/demo/ajax2-src.zip (665K)

    ?注:請下載后將db.properties里password改為你的密碼。

    你更希望我在“一起學(xué)ExtJS系列”中跟大家分享哪一方面的內(nèi)容,請留言。


    posted on 2008-01-10 13:28 WilliamRaym 閱讀(3181) 評論(27)  編輯  收藏

    評論

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 13:53 beans

    不錯,希望能有更詳細(xì)的介紹。  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 13:58 WilliamRaym

    不知道你所指的更詳細(xì)的介紹是要哪方面的?  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 15:01 xidudui

    不錯的東東  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 16:37 beans

    @WilliamRaym
    關(guān)于ExtJS部分的代碼說明少了,另外我看了你們的示例,我覺得那個客戶檔案表格的應(yīng)用做得不錯,非常有參考價值。  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 17:09 久城

    BZ是EasyJWeb的成員嗎?
    我之前對EasyJWeb并不是很了解,看了看你們的網(wǎng)站,很不錯。

    文中用到AjaxUtil.getJSON(nodes),是調(diào)用EasyJWeb中的AjaxUtil.getJSON方法直接把nodes這個List生成JSON數(shù)據(jù)。

    這幾天學(xué)習(xí)Extjs,一直對如何把List轉(zhuǎn)換成一個JSON對象傳遞給客戶端有些迷惑。下午用JSON-RPC這個包中的JSONObject類實驗了一下,結(jié)合Extjs中的JsonReader總是解析的時候有些偏差。

    很想聽聽BZ對如何把List轉(zhuǎn)換成一個JSON對象傳遞給客戶端的看法,目前好像有很多開源的包都可以實現(xiàn)。以BZ的經(jīng)驗希望指點一二。  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 17:34 WilliamRaym

    EasyJWeb框架中內(nèi)置了一個支持遠(yuǎn)程腳本調(diào)用的引擎,見大峽同學(xué)的一篇文章http://www.easyjf.com/blog/html/20080103/1015816.html,而個AjaxUtil.getJSON這個方法正是那個引擎中提供的一個小具,不像一般簡單的JSON轉(zhuǎn)換,這個轉(zhuǎn)換功能是比較強的,支持深層次的轉(zhuǎn)換。如果轉(zhuǎn)換一個頂級的地區(qū),比如“中國”,假如中國下面有一個子節(jié)點“北京”,那么下面的代碼可以展示這個特點:
    form.addResult("root",AjaxUtil.getJSON(root));
    return Page.JSONPage

    在客戶端使用下面的代碼:
    var o=eval(req.responseText);
    alert(o.children[0].parent.children[1].parent.name) 輸出“中國”
    alert(o.children[0].name) 輸出“北京”
      回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 18:04 久城

    @WilliamRaym
    謝謝指點~!~:)
    問題是我現(xiàn)在需要這樣一個能夠?qū)崿F(xiàn)轉(zhuǎn)換的類包,但是又不想把整個EasyJWeb框架都套過來。不知道AjaxUtil這個類是否可以脫離框架獨立使用?
    而且針對我的這個需求,應(yīng)用AjaxUtil這個類是否合適?(因為我沒有用過其它的,而這個AjaxUtil類我也不是很清楚有多大)
    BZ能再談?wù)剢幔吭俅沃x謝......  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 18:07 WilliamRaym

    AjaxUtil是我們在工作中總結(jié)出來的一些實用的工具,你可以只用它轉(zhuǎn)換的部分代碼,而且可喜的是easyjweb只有幾百K,最好是結(jié)合easyjweb起使用,如果不清楚如何用easyjweb,可以看看這個視頻http://www.easyjf.com/blog/html/20080102/1015814.html。  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 18:09 久城

    @WilliamRaym
    well , thanks again !~  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 18:10 WilliamRaym

    you are welcome!  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-10 20:47 黃狼很暴力

    雖然看到最后就知道是在推廣EasyJWeb,但是這樣比較讓人可以接受,比其他槍手貼好多了  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-11 08:34 sitinspring

    關(guān)注一下。  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-11 11:38 哥哥的弟弟

    最新版本的Easyjweb是1.0-m3版嗎?  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹[未登錄] 2008-01-11 11:44 WilliamRaym

    也可以從SVN上checkout最新代碼http://svn.easyjf.com/repos/easyjweb/trunk/  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-11 11:45 lengyu

    @ 哥哥的弟弟

    對。。  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-12 16:45 小白之家

    ExtJS好象很多語言都可以用啊,也扯上了ajax,blog主是EasyJWeb的大牛?
    看blog寫的文章,還不錯,特別有事例,很開心  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:47 征途私服

    1719  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:47 傳世私服

    6064  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:47 傳奇世界私服

    4989  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:48 魔獸世界私服

    8883  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:48 魔獸世界私服

    3008  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:48 魔獸世界私服

    1813  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:49 魔獸私服

    7046  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:49 魔獸私服

    8256  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 13:49 魔獸私服

    0832  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2008-01-14 15:25 哥哥的弟

    支持就兩個字  回復(fù)  更多評論   

    # re: 和我一起學(xué)ExtJS(二)——樹 2010-06-18 16:10 Rosanu

    有沒有用ASP.NET寫的啊???  回復(fù)  更多評論   


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(6)

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲伦理中文字幕| 一级毛片免费不卡| 免费A级毛片无码A| a在线观看免费视频| 亚洲第一永久在线观看| 国产精品色午夜视频免费看| 日本视频免费观看| 精品免费久久久久国产一区| 亚洲视频免费播放| 亚洲av中文无码| 亚洲免费观看网站| 五月天国产成人AV免费观看| 全亚洲最新黄色特级网站| 久久久久久久岛国免费播放 | 久久香蕉国产线看免费| 亚洲乱色熟女一区二区三区蜜臀| 77777亚洲午夜久久多人| 免费国产黄线在线观看| 国精产品一区一区三区免费视频| 亚洲av无码成人影院一区| 亚洲av成人无码久久精品| 夜色阁亚洲一区二区三区| 日本视频一区在线观看免费| 一本到卡二卡三卡免费高| 亚洲人成综合网站7777香蕉| 国产亚洲成av人片在线观看| 日本媚薬痉挛在线观看免费| 最近2019中文字幕免费大全5| 黄色一级视频免费观看| 亚洲日本VA午夜在线影院| 亚洲精品免费在线观看| 亚洲视频在线一区二区| 日本视频免费在线| 9久9久女女免费精品视频在线观看| 成年女人A毛片免费视频| 国产成人人综合亚洲欧美丁香花 | 国产成人久久精品亚洲小说| 亚洲永久中文字幕在线| 亚洲成a人片在线观看日本| 亚洲精品视频免费观看| 国产成人高清精品免费鸭子|