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

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

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

    征服jsf

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      6 隨筆 :: 0 文章 :: 27 評論 :: 0 Trackbacks
            ‘jsf的dataTable組件自定義控制指定行樣式的方法’  這篇文章我主要通過覆寫DataModel對象的getRowData()方法來控制DataTable每一行的行為,其實還有個標準的方式,也更加優雅,那就是使用DataModelListener,典型的監聽事件,jsf內置了數據模型監聽機制以便開發者對于數據模型每一行的控制,而且這種監聽可以無限增加,使得對每一行控制的方式變成一個個監聽對象,非常好用,下面就是更改過得樣例:
         
    package net.blogjava.fangshun.book;

    import java.util.List;

    import javax.faces.context.FacesContext;
    import javax.faces.el.VariableResolver;
    import javax.faces.model.DataModelEvent;
    import javax.faces.model.DataModelListener;
    import javax.faces.model.ListDataModel;

    import org.apache.myfaces.component.html.ext.HtmlDataTable;

    /**
     * 集成了ListDataModel為Book模型提供自定義樣式的支持
     * 
    @author shun.fang
     *
     
    */

    public class BookListDataModel extends ListDataModel {
        
        
    public BookListDataModel(List<Book> books) {
            
    super(books);
            
    super.addDataModelListener(new BookListDataModelListener());
        }

        
        
    /**
         * 覆寫了DataModel對象的getRowData方法,每次uiData組件從模型列表獲取新一行記錄
         * 的時候,是從這里發起的,所以在這里可以通過獲取uiData組件,來對uiData組件的狀態進行
         * 調整。目前的調整就是根據業務的需要對uiData組件的每一行樣式進行特殊指定。
         
    */

    //    @Override
    //    public Object getRowData() {
    //        // TODO Auto-generated method stub
    //        
    //        /////////////////////////////////////////////////////////////
    //        //通過變量解析獲取request scope中的BookList列表模型
    //        FacesContext facesContext = FacesContext.getCurrentInstance();
    //        VariableResolver vr = facesContext.getApplication().getVariableResolver();
    //        BookList bookList = (BookList)vr.resolveVariable(facesContext, "booking");    
    //        /////////////////////////////////////////////////////////////
    //        
    //        //間接得到綁定BookList列表模型的uiData組件,并向下轉型成HtmlDataTable(myfaces擴展類型)組件
    //        HtmlDataTable table = (HtmlDataTable)bookList.getUiData();
    //        
    //        //獲取當前行的Book實例
    //        Book book = (Book)super.getRowData();
    //        
    //        //根據當前行Book實例的業務特征為HtmlDataTable組件設置渲染行樣式
    //        setCurrentRowStyle(table, book.getType());
    //        
    //        return book;
    //    }
        
        
    /**
         * 根據不同的類型,設置當前行的樣式
         * 
    @param table
         * 
    @param type
         
    */

        
    private void setCurrentRowStyle(HtmlDataTable table, int type) {
            
    switch (type) {
                
    case Book.COMPUTER_BOOK:
                    
    //System.out.println("computers");
                    table.setRowStyleClass("computers");    //設置計算機書籍樣式
                    break;
                
    case Book.ART_BOOK:
                    
    //System.out.println("arts");
                    table.setRowStyleClass("arts");        //設置文學書籍樣式
                    break;
                
    case Book.ECONOMY_BOOK:
                    
    //System.out.println("C");
                    table.setRowStyleClass("economy");        //設置經濟書籍樣式
                    break;
                
    default:
                    
    break;
            }

        }

        
        
    class BookListDataModelListener implements DataModelListener {

            
    public void rowSelected(DataModelEvent event) {
                
    // TODO Auto-generated method stub
                
                
    /////////////////////////////////////////////////////////////
                
    //通過變量解析獲取request scope中的BookList列表模型
                FacesContext facesContext = FacesContext.getCurrentInstance();
                VariableResolver vr 
    = facesContext.getApplication().getVariableResolver();
                BookList bookList 
    = (BookList)vr.resolveVariable(facesContext, "booking");    
                
    /////////////////////////////////////////////////////////////
                
                
    //間接得到綁定BookList列表模型的uiData組件,并向下轉型成HtmlDataTable(myfaces擴展類型)組件
                HtmlDataTable table = (HtmlDataTable)bookList.getUiData();
                
                
    //獲取當前行的Book實例
                Book book = (Book)event.getRowData();
                
    if(book != null{
                    
    //根據當前行Book實例的業務特征為HtmlDataTable組件設置渲染行樣式
                    setCurrentRowStyle(table, book.getType());
                }

            }

            
        }

    }

     我把監聽器BookListDataModelListener作為我的自定義模型的一個內部類來增強業務聚合性,大家在使用的時候可以直接使用一些標準的DataModel,例如ListDataModel等,可以為每個監聽器新建一個對象,然后在jsf業務層去實例化調用,不一定要向樣例那樣放在一起。但是一定要記住,event.getRowData()可能有空值(最后一行的終結處),所以要向樣例那樣,進行非空判斷!

     

    posted on 2007-09-21 16:28 方順 閱讀(1923) 評論(2)  編輯  收藏 所屬分類: jsf

    評論

    # re: 使用DataModelListener對‘jsf的dataTable組件自定義控制指定行樣式的方法 ’的改進 2007-09-21 17:17 千里冰封
    呵呵,樓主的名字很有氣勢,以后要學JSF,就來這里了  回復  更多評論
      

    # re: 使用DataModelListener對‘jsf的dataTable組件自定義控制指定行樣式的方法 ’的改進[未登錄] 2008-05-17 12:36 steve
    你好
    我想問你一個Datatable的問題
    我想一個list多列顯示
    本來是:
    1
    2
    3
    4
    顯示成:
    1 2
    3 4
    怎么搞
    謝謝  回復  更多評論
      

    主站蜘蛛池模板: 亚洲av无码不卡私人影院| 国产大片91精品免费观看男同| 亚洲精品无码专区久久久| 免费精品国自产拍在线播放| 日本特黄特黄刺激大片免费| 亚洲精品V天堂中文字幕| 无码人妻精品一二三区免费| 亚洲日韩看片无码电影| 日韩精品免费一区二区三区| 自拍偷自拍亚洲精品播放| 国产极品美女高潮抽搐免费网站| 国产精品亚洲综合网站| 国产中文字幕免费观看| 本道天堂成在人线av无码免费| 国产AV无码专区亚洲AWWW| a在线观看免费网址大全| 亚洲av色影在线| 美女视频黄的全免费视频| 亚洲第一男人天堂| 在线观看亚洲免费| 人人爽人人爽人人片av免费| 亚洲乱码国产一区三区| **aaaaa毛片免费| 亚洲性无码一区二区三区| www.亚洲精品.com| 国产婷婷成人久久Av免费高清| 久久亚洲私人国产精品| 成人免费毛片观看| 一级毛片**免费看试看20分钟 | 亚洲国产综合精品| 日韩免费福利视频| 国产又黄又爽又大的免费视频| 国产又黄又爽胸又大免费视频| 亚洲AV美女一区二区三区| 97无码免费人妻超级碰碰碰碰 | 亚洲最大福利视频| 亚洲精品无码日韩国产不卡?V| 91高清免费国产自产拍2021| 亚洲av成人一区二区三区在线播放| 久久亚洲高清观看| 永久免费看bbb|