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

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

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

    隨筆 - 170  文章 - 536  trackbacks - 0
    <2006年1月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    我參與的團隊

    隨筆分類(103)

    搜索

    •  

    積分與排名

    • 積分 - 413987
    • 排名 - 135

    最新評論

    閱讀排行榜

    改變Tree中的內容

    (當展開樹的節點時,在后臺延遲加載)

    在郵件列表中有很多關于這項任務的問題和討論,我(Marcel,一個 JSF 的初學者)在這里總結一下。如果你有更好的解決方案,請更新這些文字。

    在這里存在的一個問題就是我要這樣把“+”圖標去掉:

    ·         <t:tree2 ... showNav="false" ...>

    然后再讓文件夾圖標(代表包含子節點的節點)變的可點擊:

    ·         <h:commandLink action="#{t.toggleExpanded}" actionListener="#{navigationBacker.processAction}">

    然后在 Java 代碼中接受鼠標點擊的事件。在 NavigationBacker.java 文件中的processAction(ActionEvent e) 方法里,我從 EJB3-persistency 中加載子結點的數據。

    不好的是“+”圖標變的不可見,但是我現在沒有辦法獲取點擊“+”圖標的事件。

    看起來在org.apache.myfaces.custom.tree2.HtmlTree.java這個文件里是通過注冊了_expandControl = new HtmlCommandLink(); 從內部獲取“+”的點擊事件,但是我現在沒有辦法從我的代碼中接受到這一事件。

    為了導航,我使用了含有entriesTreeNode.getIdentifier() (參見:#{node.identifier}),看起來就是這個樣子:

    ·         db_id="car_id=7,person_id=2"

    這代表了后臺數據庫表的主鍵(我還沒有找到一個更好的解決方案用于導航)

    程序代碼如下:

    navigation.jsp

      <t:tree2 id="serverTree" value="#{navigationBacker.treeData}"
        var
    ="node" varNodeToggler="t" clientSideToggle="false" showNav="false"
        showRootNode
    ="false">
        
    <f:facet name="project-folder">
          
    <h:panelGroup>
            
    <h:commandLink action="#{t.toggleExpanded}" actionListener="#{navigationBacker.processAction}">
                
    <t:graphicImage value="/images/yellow-folder-open.png"
                    rendered
    ="#{t.nodeExpanded}" border="0" />
                
    <t:graphicImage value="/images/yellow-folder-closed.png"
                    rendered
    ="#{!t.nodeExpanded}" border="0" />
            
    </h:commandLink>
            
    <h:commandLink action="#{navigationBacker.toViewId}"
                styleClass
    ="#{t.nodeSelected ? 'documentSelected':'document'}"
                actionListener
    ="#{navigationBacker.nodeClicked}"
                value
    ="#{node.description}" immediate="true">
                
    <f:param name="db_id" value="#{node.identifier}" />
                
            
    </h:commandLink>
            
    <h:outputText value=" (#{node.childCount})" styleClass="childCount"
                rendered
    ="#{!empty node.children}" />
          
    </h:panelGroup>
        
    </f:facet>
        
    <f:facet name="person-folder">
          
    <h:panelGroup>

    NavigationBacker.java

        /**
         * 攔截節點被展開的事件,并加載額外的數據
         * 
    @param event
         * 
    @throws AbortProcessingException
         
    */

        
    public void processAction(ActionEvent event) throws AbortProcessingException {
                System.out.println(
    "Entering processAction()");
                UIComponent component 
    = (UIComponent) event.getSource();
                
    while (!(component != null && component instanceof HtmlTree)) {
                        component 
    = component.getParent();
                }

                
    if (component != null{
                        HtmlTree tree 
    = (HtmlTree) component;
                        TreeNodeBase node 
    = (TreeNodeBase) tree.getNode();
                        
    if (!tree.isNodeExpanded() && node.getChildren().size() == 0{
                            Map
    <String, String> map = splitKeyValues(node.getIdentifier()); // 一些輔助代碼,用于將 "car_id=7" 或 "car_id=7&person_id=12" 拆分開
                            this.car_id = map.get("car_id");
                            
    if (this.car_id != null{
                                appendPersonsNodes(node); 
    // 參見下面的例子
                            }

                            
    this.person_id = map.get("person_id");
                            
    if (this.person_id != null{
                                appendLicensesNodes(node); 
    // 沒有顯示
                            }

                        }

                }

        }


        
    /** 把當前car_id下的Person子結點加入導航中 */
        
    private void appendPersonsNodes(TreeNodeBase carDetailNode) {
            VariableResolver resolver 
    = FacesContext.getCurrentInstance()
            .getApplication().getVariableResolver();
            PersonsTable personsTable 
    = (PersonsTable) resolver
                    .resolveVariable(FacesContext.getCurrentInstance(),
                            
    "personsTable");
            List
    <Person> personsList = personsTable.getCarPersons();
            
    for (Person o : personsList) {
                List
    <TreeNodeBase> list = carDetailNode.getChildren();
                list.add(
    new TreeNodeBase("person-folder", o.getDescription(),
                                
    "person_id=" + o.getPersonId(), true));
            }

            System.out.println(
    "NavigationBacker fetched " + personsList.size() + " Persons for carId=" + this.car_id);
        }


    這里有一段輔助代碼用于從 h:commandLink 中獲取 f:param 用于多種用途。

        /**
         * 當 JSF 組件 h:commandLink 包含有 f:param 成員, 這些 name-value 對被放到 
    * request 參數表中供后面的action handler使用。不幸的是,這樣的用法不能用在
    * h:commandButton上。我們沒有辦法把通過 button 來傳遞這些參數。
         *
         * 因為 Action Listeners 可以保證在 Action 方法前被執行到,所以 Action Listeners 
    * 可以調用該方法更新 Action 方法所需要的任何上下文。
         *
         * From 
    http://cvs.sakaiproject.org/release/2.0.0/
         * sakai2/gradebook/tool/src/java/org/sakaiproject/tool/gradebook/jsf/FacesUtil.java
         * Educational Community License Version 1.0
         
    */

        
    public static final Map getEventParameterMap(FacesEvent event) {
            Map
    <String, String> parameterMap = new HashMap<String, String>();
            List children 
    = event.getComponent().getChildren();
            
    for (Iterator iter = children.iterator(); iter.hasNext();) {
                Object next 
    = iter.next();
                
    if (next instanceof UIParameter) {
                    UIParameter param 
    = (UIParameter) next;
                    parameterMap.put(param.getName(), 
    "" + param.getValue());
                }

            }

            
    //System.out.println("parameterMap=" + parameterMap);
            return parameterMap;
        }


    注:在上面的例子里,backing bean都存放于 session 作用域里,可以在WEB-INF/examples-config.xml 中進行配置。

     

    很多朋友和我交流了一些有關 Tree2 的問題,我把一些大家經常碰到的問題拿出來,希望剛開始學習的朋友能夠避免再犯一些這樣的錯誤。

    1.首先就是關于 myfaces 包的問題,Myfaces 1.1.1 release 版本的 Tree2 是有 bug 的,大概在十一月份的時候修正了大部分問題,但是由于這以后并沒有 release 版本出來,所以大家可以使用一些較新一點的 Nightly Build,可以去這里找找http://cvs.apache.org/builds/myfaces/nightly/ ,不過從元旦后似乎改用了 Maven 后還沒有一個 Build 出來,我手上有一個12.30 Build的版本,如果需要的話可以和我聯系。因為這些 Nightly Build 不確定可能還會有其它的一些問題,所以用的時候要慎重一點。

    2. 有些朋友就直接把代碼貼上去用,會碰到一些諸如點擊沒有反應或者圖標顯示不出來的問題,很多時候是因為沒有加上MyFaces' Extensions Filter,相關的內容可以參考我前面寫的http://www.tkk7.com/steady/archive/2005/11/17/20170.html

    希望這兩篇介紹 Tree2 的文章能給大家一些新的認識,今后也會努力拿出更多更好的東西來和大家分享。

    posted on 2006-01-13 19:28 steady 閱讀(3079) 評論(1)  編輯  收藏 所屬分類: JSF & Myfaces

    FeedBack:
    # re: 解析Tree2(二)  2007-01-19 12:45 lion
    怎樣保持tree2的當前狀態,在下一個頁面中直接顯示當前頁面中tree2的展開的狀態。  回復  更多評論
      
    主站蜘蛛池模板: 99在线观看精品免费99| 在线免费观看国产视频| 亚洲av永久无码精品三区在线4| 女人18毛片水真多免费播放| 免费人成再在线观看网站| 亚洲无线电影官网| 日本一区免费电影| 久久九九AV免费精品| 亚洲欧洲无码AV不卡在线| 亚洲人精品午夜射精日韩| 无码人妻精品一二三区免费| 好湿好大好紧好爽免费视频| 亚洲国产成人精品激情| 中文字幕第一页亚洲| 亚洲欧洲免费无码| a级毛片免费在线观看| 亚洲老熟女五十路老熟女bbw| 亚洲精品少妇30p| 日韩免费一级毛片| 四虎国产精品永久免费网址| 老司机午夜在线视频免费观| 亚洲国产精品成人精品软件| 国产亚洲精品不卡在线| 妞干网手机免费视频| 免费国产叼嘿视频大全网站| 国产在亚洲线视频观看| 亚洲人成网站日本片| 亚洲成AV人片一区二区密柚| 免费观看四虎精品国产永久| 国色精品卡一卡2卡3卡4卡免费| 国产在线观看免费av站| 老妇激情毛片免费| 亚洲性无码AV中文字幕| 久久久无码精品亚洲日韩按摩| 无码国产亚洲日韩国精品视频一区二区三区 | 亚洲综合无码一区二区三区| 久久久久亚洲AV无码专区桃色| 免费网站看v片在线香蕉| 3344永久在线观看视频免费首页 | 午夜视频在线在免费| 91成人免费观看网站|