JSF中dataTable自定义样式

来源:互联网 发布:桂林广电网络营业厅 编辑:程序博客网 时间:2024/06/05 06:14
HtmlDataTable组件属于UIData家族的HTML数据列表实现,组件中提供了rowStyleClass等方法来控制行的显示,,如果你在rowStyleClass中加入两个样式类,并使用逗号分开,那么渲染的每一行会交替使用这两个样式类进行显示,同理多个样式类也会循环交替显示。但是如果我想根据业务的情况具体指定某行显示成特定的样式,HtmlDataTable就 无能为力了,然而这种业务又很常见,比如我想高亮显示列表中时间过期的行等等...... 
    下面是一个例子,显示了我的藏书列表,我想让计算机类书籍的行使用红色背景,文学类书籍的行使用白色背景,经济学类书籍的行使用蓝色列表。 
     1.首先是Book模型 
Java代码  收藏代码
  1. package net.blogjava.fangshun.book;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.faces.model.SelectItem;  
  8.   
  9. /** *//** 
  10.  * 书籍模型 
  11.  * @author shun.fang 
  12.  * 
  13.  */  
  14. public class Book implements Serializable {  
  15.     private int id;    //书籍编号  
  16.     private String name; //书籍名称  
  17.     private int type; //书籍类型  
  18.       
  19.     public Book() {  
  20.           
  21.     }  
  22.       
  23.     /** *//** 
  24.      * type 
  25.      * @param id 
  26.      * @param name 
  27.      * @param type 
  28.      */  
  29.     public Book(int id, String name, int type) {  
  30.         // TODO Auto-generated constructor stub  
  31.         this.id = id;  
  32.         this.name = name;  
  33.         this.type = type;  
  34.     }  
  35.       
  36.     public int getId() {  
  37.         return id;  
  38.     }  
  39.     public void setId(int id) {  
  40.         this.id = id;  
  41.     }  
  42.     public String getName() {  
  43.         return name;  
  44.     }  
  45.     public void setName(String name) {  
  46.         this.name = name;  
  47.     }  
  48.     public int getType() {  
  49.         return type;  
  50.     }  
  51.     public void setType(int type) {  
  52.         this.type = type;  
  53.     }  
  54.       
  55.     public static final int COMPUTER_BOOK = 1;    //计算机类  
  56.       
  57.     public static final int ART_BOOK = 2;        //文学类  
  58.       
  59.     public static final int ECONOMY_BOOK = 3;     //经济类  
  60.       
  61.       
  62.     private List<SelectItem> items;  
  63.       
  64.     /** *//** 
  65.      * 为下拉菜单提供模拟数据 
  66.      * @return 
  67.      */  
  68.     public List<SelectItem> getItems() {  
  69.         if(items == null) {  
  70.             items = new ArrayList<SelectItem>();  
  71.               
  72.             SelectItem item = new SelectItem();  
  73.             item.setLabel("计算机类");  
  74.             item.setValue(COMPUTER_BOOK);  
  75.             items.add(item);  
  76.               
  77.             item = new SelectItem();  
  78.             item.setLabel("文学类");  
  79.             item.setValue(ART_BOOK);  
  80.             items.add(item);  
  81.               
  82.             item = new SelectItem();  
  83.             item.setLabel("经济学类");  
  84.             item.setValue(ECONOMY_BOOK);  
  85.             items.add(item);  
  86.         }  
  87.         return items;  
  88.     }  
  89. }  

           
     2. book的列表模型 

Java代码  收藏代码
  1. package net.blogjava.fangshun.book;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.ArrayList;  
  5. import java.util.Collection;  
  6. import java.util.HashMap;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. import javax.faces.component.UIData;  
  11. import javax.faces.model.ListDataModel;  
  12.   
  13. /** *//** 
  14.  * 书籍列表模型 
  15.  * @author shun.fang 
  16.  * 
  17.  */  
  18. public class BookList implements Serializable {  
  19.     //    绑定使用此BookList作为数据源的UIData组件,常使用的是HtmlDataTable这个实现组件  
  20.     //  这样可以通过调用BookList模型来间接访问到HtmlDataTable组件,以便控制组件  
  21.     //    内部的状态  
  22.     private UIData uiData;      
  23.       
  24.     private ListDataModel books;  
  25.   
  26.     //UIData组件的values属性可以直接读取DataModel家族的对象  
  27.     //这里没有返回Collection集合对象,是为了在自定义的BookListDataModel  
  28.     //对象中控制UIData组件的状态  
  29.     public ListDataModel getBooks() {  
  30.         if(books == null) {  
  31.               
  32.             books = new BookListDataModel(createBooks());  
  33.         }  
  34.         return books;  
  35.     }  
  36.   
  37.     public void setBooks(ListDataModel books) {  
  38.         this.books = books;  
  39.     }  
  40.   
  41.     public UIData getUiData() {  
  42.         return uiData;  
  43.     }  
  44.   
  45.     public void setUiData(UIData uiData) {  
  46.         this.uiData = uiData;  
  47.     }  
  48.       
  49.     /** *//** 
  50.      * 创建模拟数据 
  51.      * @return    List<Book> 
  52.      */  
  53.     public List<Book> createBooks() {  
  54.         //使用HashMap是为了打乱数据的排序  
  55.         Map<Integer, Book> bs = new HashMap<Integer, Book>();  
  56.           
  57.         for(int i = 0; i < 50; i++) {  
  58.             bs.put(i, new Book(i, "book_" + i, (i%3+1)));  
  59.         }  
  60.           
  61.         List<Book> lst = new ArrayList<Book>();  
  62.         lst.addAll(bs.values());  
  63.         return lst;  
  64.     }  
  65. }  


3. 自定义的数据模型 
Java代码  收藏代码
  1. package net.blogjava.fangshun.book;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.faces.context.FacesContext;  
  6. import javax.faces.el.VariableResolver;  
  7. import javax.faces.model.ListDataModel;  
  8.   
  9. import org.apache.myfaces.component.html.ext.HtmlDataTable;  
  10.   
  11. /** *//** 
  12.  * 集成了ListDataModel为Book模型提供自定义样式的支持 
  13.  * @author shun.fang 
  14.  * 
  15.  */  
  16. public class BookListDataModel extends ListDataModel {  
  17.       
  18.     public BookListDataModel(List<Book> books) {  
  19.         super(books);  
  20.     }  
  21.       
  22.     /** *//** 
  23.      * 覆写了DataModel对象的getRowData方法,每次uiData组件从模型列表获取新一行记录 
  24.      * 的时候,是从这里发起的,所以在这里可以通过获取uiData组件,来对uiData组件的状态进行 
  25.      * 调整。目前的调整就是根据业务的需要对uiData组件的每一行样式进行特殊指定。 
  26.      */  
  27.     @Override  
  28.     public Object getRowData() {  
  29.         // TODO Auto-generated method stub  
  30.           
  31.         /////////////////////////////////////////////////////////////  
  32.         //通过变量解析获取request scope中的BookList列表模型  
  33.         FacesContext facesContext = FacesContext.getCurrentInstance();  
  34.         VariableResolver vr = facesContext.getApplication().getVariableResolver();  
  35.         BookList bookList = (BookList)vr.resolveVariable(facesContext, "booking");      
  36.         /////////////////////////////////////////////////////////////  
  37.           
  38.         //间接得到绑定BookList列表模型的uiData组件,并向下转型成HtmlDataTable(myfaces扩展类型)组件  
  39.         HtmlDataTable table = (HtmlDataTable)bookList.getUiData();  
  40.           
  41.         //获取当前行的Book实例  
  42.         Book book = (Book)super.getRowData();  
  43.           
  44.         //根据当前行Book实例的业务特征为HtmlDataTable组件设置渲染行样式  
  45.         setCurrentRowStyle(table, book.getType());  
  46.           
  47.         return book;  
  48.     }  
  49.       
  50.     /** *//** 
  51.      * 根据不同的类型,设置当前行的样式 
  52.      * @param table 
  53.      * @param type 
  54.      */  
  55.     private void setCurrentRowStyle(HtmlDataTable table, int type) {  
  56.         switch (type) {  
  57.             case Book.COMPUTER_BOOK:  
  58.                 //System.out.println("computers");  
  59.                 table.setRowStyleClass("computers");    //设置计算机书籍样式  
  60.                 break;  
  61.             case Book.ART_BOOK:  
  62.                 //System.out.println("arts");  
  63.                 table.setRowStyleClass("arts");        //设置文学书籍样式  
  64.                 break;  
  65.             case Book.ECONOMY_BOOK:  
  66.                 //System.out.println("C");  
  67.                 table.setRowStyleClass("economy");        //设置经济书籍样式  
  68.                 break;  
  69.             default:  
  70.                 break;  
  71.         }  
  72.     }  
  73. }  


4.页面 
Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <jsp:root  
  3.     xmlns:f="http://java.sun.com/jsf/core"  
  4.     xmlns:h="http://java.sun.com/jsf/html"  
  5.     xmlns:jsp="http://java.sun.com/JSP/Page"  
  6.     xmlns:t="http://myfaces.apache.org/tomahawk"  
  7.     version="2.0">  
  8.   <jsp:directive.page session="false"  
  9.                       contentType="text/html;charset=UTF-8"  
  10.                       pageEncoding="UTF-8"/>  
  11.   <jsp:output doctype-public="-//W3C//DTD XHTML 1.1//EN"  
  12.               doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"  
  13.               doctype-root-element="html" omit-xml-declaration="true"/>  
  14.   <f:view>  
  15.     <html xmlns="http://www.w3.org/1999/xhtml">  
  16.     <head>  
  17.       <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>  
  18.       <title>特定样式</title>  
  19.       <style>  
  20.               .computers  {  
  21.                   background-color: red;  
  22.               }  
  23.             .arts {  
  24.                   background-color: white;  
  25.               }  
  26.                 
  27.               .economy {  
  28.                   background-color: blue;  
  29.               }  
  30.                 
  31.       </style>  
  32.     </head>  
  33.     <body>  
  34.       <h:form>  
  35.         <t:dataTable id="book"  
  36.                        var="bk"  
  37.                        rowStyleClass="computers"   
  38.                        binding="#{booking.uiData}"  
  39.                        value="#{booking.books}">  
  40.           <t:column>  
  41.             <f:facet name="header">  
  42.               <h:outputText value="编号"/>  
  43.             </f:facet>  
  44.             <h:outputText value="#{bk.id}"></h:outputText>            
  45.           </t:column>  
  46.             
  47.           <t:column>  
  48.             <f:facet name="header">  
  49.               <h:outputText value="书名"/>  
  50.             </f:facet>  
  51.             <h:outputText value="#{bk.name}"></h:outputText>            
  52.           </t:column>  
  53.           <t:column>  
  54.             <f:facet name="header">  
  55.               <h:outputText value="类别"/>  
  56.             </f:facet>  
  57.             <t:selectOneMenu value="#{bk.type}" displayValueOnly="true" >  
  58.                 <f:selectItems value="#{book.items}"/>  
  59.             </t:selectOneMenu>              
  60.           </t:column>  
  61.         </t:dataTable>  
  62.     </h:form>  
  63.     </body>  
  64.     </html>  
  65.   </f:view>  
  66. </jsp:root>  


5.简要配置 
Java代码  收藏代码
  1. <managed-bean>  
  2.     <managed-bean-name>book</managed-bean-name>  
  3.     <managed-bean-class>net.blogjava.fangshun.book.Book</managed-bean-class>  
  4.     <managed-bean-scope>request</managed-bean-scope>  
  5.   </managed-bean>  
  6.     
  7.    <managed-bean>  
  8.     <managed-bean-name>booking</managed-bean-name>  
  9.     <managed-bean-class>net.blogjava.fangshun.book.BookList</managed-bean-class>  
  10.     <managed-bean-scope>request</managed-bean-scope>  
  11.   </managed-bean>   

    6.显示效果 
 
总结:主要是靠自定义的DataModel对象,在获取每一行记录的开始,来根据业务为绑定的uiData组件设置自己的样式,这样就可以自由灵活的控制数据列表每一行记录产生时的状态。上面的代码在jdk1.5下需要myfaces支持,完全测试通过,希望可以为大家在使用jsf上得到更多的提示和技巧! 
原创粉丝点击