<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 方順 閱讀(1936) 評論(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
    怎么搞
    謝謝  回復  更多評論
      

    主站蜘蛛池模板: 亚洲精品tv久久久久久久久| 浮力影院第一页小视频国产在线观看免费 | 国产成人免费手机在线观看视频 | 亚洲变态另类一区二区三区 | 一区二区在线视频免费观看| 波多野结衣免费视频观看| 亚洲国产成人综合精品| 国产精品酒店视频免费看| 亚洲乱妇老熟女爽到高潮的片| 免费看无码自慰一区二区| 亚洲精品无码mⅴ在线观看| 日韩免费观看一级毛片看看| 亚洲国产AV一区二区三区四区 | 国产成人亚洲精品影院| 国产精品永久免费| 亚洲AV日韩精品久久久久久久| 69视频在线观看免费| 四虎亚洲精品高清在线观看| 成人免费无码大片a毛片| 在线91精品亚洲网站精品成人| 亚洲国产婷婷综合在线精品| 免费看成人AA片无码视频吃奶| 亚洲AV美女一区二区三区| AV无码免费永久在线观看| 国产亚洲精彩视频| 在线播放亚洲第一字幕| 91精品国产免费入口| 亚洲xxxx视频| 亚洲综合色在线观看亚洲| 无码中文字幕av免费放dvd| 亚洲一区二区三区在线| 国产福利免费在线观看| a级黄色毛片免费播放视频| 亚洲一级大黄大色毛片| 亚洲国产高清精品线久久| 无码日韩精品一区二区免费暖暖| 亚洲一区二区三区亚瑟| 亚洲精品无码AV中文字幕电影网站| 无码少妇精品一区二区免费动态| 亚洲国产无线乱码在线观看 | 永久免费av无码不卡在线观看 |