`
yanzi_happy
  • 浏览: 5884 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

(转载)jsf的dataTable组件自定义控制指定行样式的方法

阅读更多
HtmlDataTable组件属于UIData家族的HTML数据列表实现,组件中提供了rowStyleClass等方法来控制行的显示,,如果你在rowStyleClass中加入两个样式类,并使用逗号分开,那么渲染的每一行会交替使用这两个样式类进行显示,同理多个样式类也会循环交替显示。但是如果我想根据业务的情况具体指定某行显示成特定的样式,HtmlDataTable就 无能为力了,然而这种业务又很常见,比如我想高亮显示列表中时间过期的行等等......
    下面是一个例子,显示了我的藏书列表,我想让计算机类书籍的行使用红色背景,文学类书籍的行使用白色背景,经济学类书籍的行使用蓝色列表。
     1.首先是Book模型
package net.blogjava.fangshun.book;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

/** *//**
 * 书籍模型
 * @author shun.fang
 *
 */
public class Book implements Serializable {
    private int id;    //书籍编号
    private String name; //书籍名称
    private int type; //书籍类型
    
    public Book() {
        
    }
    
    /** *//**
     * type
     * @param id
     * @param name
     * @param type
     */
    public Book(int id, String name, int type) {
        // TODO Auto-generated constructor stub
        this.id = id;
        this.name = name;
        this.type = type;
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    
    public static final int COMPUTER_BOOK = 1;    //计算机类
    
    public static final int ART_BOOK = 2;        //文学类
    
    public static final int ECONOMY_BOOK = 3;     //经济类
    
    
    private List<SelectItem> items;
    
    /** *//**
     * 为下拉菜单提供模拟数据
     * @return
     */
    public List<SelectItem> getItems() {
        if(items == null) {
            items = new ArrayList<SelectItem>();
            
            SelectItem item = new SelectItem();
            item.setLabel("计算机类");
            item.setValue(COMPUTER_BOOK);
            items.add(item);
            
            item = new SelectItem();
            item.setLabel("文学类");
            item.setValue(ART_BOOK);
            items.add(item);
            
            item = new SelectItem();
            item.setLabel("经济学类");
            item.setValue(ECONOMY_BOOK);
            items.add(item);
        }
        return items;
    }
}


          
     2. book的列表模型

package net.blogjava.fangshun.book;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.component.UIData;
import javax.faces.model.ListDataModel;

/** *//**
 * 书籍列表模型
 * @author shun.fang
 *
 */
public class BookList implements Serializable {
    //    绑定使用此BookList作为数据源的UIData组件,常使用的是HtmlDataTable这个实现组件
    //  这样可以通过调用BookList模型来间接访问到HtmlDataTable组件,以便控制组件
    //    内部的状态
    private UIData uiData;    
    
    private ListDataModel books;

    //UIData组件的values属性可以直接读取DataModel家族的对象
    //这里没有返回Collection集合对象,是为了在自定义的BookListDataModel
    //对象中控制UIData组件的状态
    public ListDataModel getBooks() {
        if(books == null) {
            
            books = new BookListDataModel(createBooks());
        }
        return books;
    }

    public void setBooks(ListDataModel books) {
        this.books = books;
    }

    public UIData getUiData() {
        return uiData;
    }

    public void setUiData(UIData uiData) {
        this.uiData = uiData;
    }
    
    /** *//**
     * 创建模拟数据
     * @return    List<Book>
     */
    public List<Book> createBooks() {
        //使用HashMap是为了打乱数据的排序
        Map<Integer, Book> bs = new HashMap<Integer, Book>();
        
        for(int i = 0; i < 50; i++) {
            bs.put(i, new Book(i, "book_" + i, (i%3+1)));
        }
        
        List<Book> lst = new ArrayList<Book>();
        lst.addAll(bs.values());
        return lst;
    }
}


3. 自定义的数据模型
package net.blogjava.fangshun.book;

import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.el.VariableResolver;
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);
    }
    
    /** *//**
     * 覆写了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;
        }
    }
}



4.页面
<?xml version="1.0" encoding="UTF-8"?>
<jsp:root
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    version="2.0">
  <jsp:directive.page session="false"
                      contentType="text/html;charset=UTF-8"
                      pageEncoding="UTF-8"/>
  <jsp:output doctype-public="-//W3C//DTD XHTML 1.1//EN"
              doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
              doctype-root-element="html" omit-xml-declaration="true"/>
  <f:view>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta content="text/html;charset=UTF-8" http-equiv="Content-Type"/>
      <title>特定样式</title>
      <style>
              .computers  {
                  background-color: red;
              }
            .arts {
                  background-color: white;
              }
              
              .economy {
                  background-color: blue;
              }
              
      </style>
    </head>
    <body>
      <h:form>
        <t:dataTable id="book"
                       var="bk"
                       rowStyleClass="computers" 
                       binding="#{booking.uiData}"
                       value="#{booking.books}">
          <t:column>
            <f:facet name="header">
              <h:outputText value="编号"/>
            </f:facet>
            <h:outputText value="#{bk.id}"></h:outputText>          
          </t:column>
          
          <t:column>
            <f:facet name="header">
              <h:outputText value="书名"/>
            </f:facet>
            <h:outputText value="#{bk.name}"></h:outputText>          
          </t:column>
          <t:column>
            <f:facet name="header">
              <h:outputText value="类别"/>
            </f:facet>
            <t:selectOneMenu value="#{bk.type}" displayValueOnly="true" >
                <f:selectItems value="#{book.items}"/>
            </t:selectOneMenu>            
          </t:column>
        </t:dataTable>
    </h:form>
    </body>
    </html>
  </f:view>
</jsp:root>


5.简要配置
<managed-bean>
    <managed-bean-name>book</managed-bean-name>
    <managed-bean-class>net.blogjava.fangshun.book.Book</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean>
  
   <managed-bean>
    <managed-bean-name>booking</managed-bean-name>
    <managed-bean-class>net.blogjava.fangshun.book.BookList</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
  </managed-bean> 

    6.显示效果

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

  • 大小: 5.6 KB
分享到:
评论

相关推荐

    jsf常用文档datatable行样式,frameset及树型目录dtree,jsf滚动组件

    1. **DataTable行样式**:在JSF中,`&lt;h:datatable&gt;`组件用于展示数据表格。我们可以自定义行样式来增强用户体验。通过使用CSS类或者使用`rowStyleClass`属性,我们可以根据特定条件为表格的每一行设置不同的样式。...

    JSF分页组件

    - **集成到JSF生命周期**: 使用JSF的生命周期方法(如`@PostConstruct`、`processAction`等)确保组件与JSF请求处理流程同步。 - **定义属性和事件**: 定义用于存储当前页数、每页显示记录数等属性,并提供事件监听...

    JSF 一些经验 .doc

    然而,该组件存在一些不足之处,例如难以实现特定行样式的自定义显示、回退按钮的风险管理以及数据库分页的优雅解决方案。这些挑战往往会消耗开发者大量的时间和精力。 幸运的是,JSF 1.2 引入了统一的 EL 表达式...

    jsf 分页

    这种方法更加简洁,但可能不如自定义分页那样灵活,例如无法自定义分页按钮的样式或行为。 总之,在JSF中实现分页,我们可以选择利用第三方库如PrimeFaces提供的组件,或者自己编写逻辑处理分页。这两种方法都有其...

    jsf自带分页

    **自定义分页**:如果JSF内置的分页功能不能满足需求,可以通过扩展或自定义组件实现更复杂的功能,如动态加载、跳转到指定页等。 **最佳实践**: 1. 使用懒加载(Lazy Loading):只在用户需要时加载数据,减少...

    JSF+primefaces 网盘实现代码前端

    - 文件列表:展示用户文件和目录,可能需要使用PrimeFaces的Datatable组件来创建可排序和过滤的列表。 - 文件操作:实现文件的下载、删除、重命名和移动功能,这些可能需要通过AJAX调用后端服务来完成。 - 文件夹...

    CDI , JSF2.0 项目兼容性问题总结

    - **Chrome中的Datatable分页问题**:当Datatable包含分页功能时,分页控件可能覆盖Datatable的底线。解决办法是在Datascroller中添加CSS样式`margin-top:1px`,以调整分页控件的位置。 - **Firefox和Chrome中的...

    struts和jsf分页

    4. **事件处理**:当用户点击分页链接时,JSF会触发一个动作事件,Managed Bean中的对应方法会被调用,重新加载指定页的数据。 5. **分页配置**:可以通过调整`p:paginator`的属性,如`rows`和`pageLinks`,来定制...

    Richfaces 常用组件使用手册中文版

    手册还列举了一些常见问题及其解决方法,如处理请求错误、会话过期、自定义样式、用户角色识别、焦点设置等,并对特定组件的特定属性进行了讲解,比如如何阻止验证失败时关闭模态面板等。 由于手册面向的是初学者,...

    《JSF标签》简体中文版.pdf

    JSF提供了强大的表格组件,如`dataTable`,用于显示复杂的数据集。 ```html &lt;h:dataTable value="#{bean.items}" var="item"&gt; &lt;f:facet name="header"&gt;Item ID #{item.id} &lt;f:facet name="header"&gt;Item ...

    richfaces组件说明文档及使用实例

    RichFaces的`&lt;rich:dataTable&gt;`和`&lt;rich:extendedDataTable&gt;`组件提供了强大的数据展示功能,支持分页、排序、过滤等操作。配合`&lt;rich:datascroller&gt;`可以实现数据的动态加载。 6. **国际化与本地化**: ...

    jsf-primefaces:JSF与PrimeFaces

    3. **Chart Component**: 可以生成各种类型的图表,如折线图、柱状图、饼图等,支持动态数据更新和自定义样式。 4. **PrimeFaces Extensions (PFE)**: 除了PrimeFaces官方组件外,PFE提供了更多高级组件,如Gantt图...

    primefaces开发文档

    每个组件都有详细的文档说明,包括组件的使用方法、属性配置、事件处理等,这些信息对开发者来说是至关重要的,因为它们提供了如何将组件集成到JSF应用程序中的具体指导。 PrimeFaces的开发文档是一份宝贵的资源,...

    java server face 教程

    - **组件开发**:概述自定义JSF组件的基本概念和开发流程。 **简单实例** - **组件设计**:通过一个简单的自定义组件开发实例,介绍组件的设计思路。 - **编码与解码**:解释如何实现组件的编码和解码功能。 - **...

    jboss-richfaces-3.0.0

    **JBoss RichFaces 3.0.0:一个强大的AJAX和JSF组件库** **一、RichFaces概述** RichFaces是JBoss公司推出的一款基于JavaServer Faces (JSF) 技术的开源UI组件库,它极大地扩展了JSF的功能,特别是提供了丰富的AJAX...

    primefaces-3.5.zip

    通过查看源码,开发者可以了解组件的工作原理,学习如何扩展或自定义组件,甚至调试可能遇到的问题。对于想要深入了解PrimeFaces内部机制的人来说,这是一个不可或缺的资源。 4. **apidocs**: API文档通常包含...

    my-tiles-richfaces

    自定义组件的开发涉及编写Java后台代码(通常是Managed Bean)和Facelets视图文件,以及可能的CSS和JavaScript来处理样式和交互逻辑。 为了测试和调试,开发者可以使用NetBeans的内置服务器启动应用程序,然后通过...

    Primefaces 参考资料

    - **SkinningCharts**:自定义图表样式,包括颜色、字体等。 - **Real-TimeCharts**:实时更新的数据可视化。 - **InteractiveCharts**:交互式图表,支持鼠标悬停提示等。 - **ChartingTips**:图表设计和优化...

    richfaces参考文档

    2. **组件库**:包括各种富组件,如数据表(DataTable)、下拉树(TreeSelect)、滑块(Slider)和时间选择器(TimePicker)等,这些组件可轻松集成到JSF应用中,提供丰富的用户界面。 3. **事件处理**:提供了一种...

Global site tag (gtag.js) - Google Analytics