jsf-后台动态生成richfaces的dataTable(转载)

来源:互联网 发布:linux删除用户附加组 编辑:程序博客网 时间:2024/05/19 12:40

因为项目需要表格的列不固定,所以我想在后台动态生成rich的dataTable
因为我对这个也不是很熟,所以一步一步来
第一步:添加一列从后台取数据。
前台页面:
<rich:dataTable id="fiSalaryDetailTable" var="detail" binding="#{salaryDetailBean.fiSalaryDetailTable}"
                    cellpadding="0" cellspacing="0" style="width:700px;"
                    value="#{salaryDetailBean.detailDataModel}"
                    styleClass="datatable-cellStyle" headerClass="standardTable_Header"
                    footerClass="standardTable_Header" rowKeyVar="index"
                    rowClasses="standardTable_Row1,standardTable_Row2"
                    columnClasses="standardTable_ColumnCentered,standardTable_ColumnLefted,
                                    standardTable_ColumnLefted,standardTable_ColumnLefted,
                                    standardTable_ColumnLefted"
                    onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
                    onRowMouseOut="this.style.backgroundColor='#ffffff'">
                    </rich:dataTable>       
后台方法:
    public ListDataModel getDetailDataModel() {
        if(detailDataModel == null){
            detailDataModel = new ListDataModel();
            List<VSalaryDetail> vSalaryDetail  = salaryDetailSer.queryVSalaryDetailByAccountNo(accountNo);
            System.err.println("vSalaryDetail:"+vSalaryDetail.size());
            detailDataModel.setWrappedData(vSalaryDetail);
        }
        return detailDataModel;
    }
    public HtmlDataTable getFiSalaryDetailTable() {
        System.err.println("vSalaryDetail:=========:"+fiSalaryDetailTable);
        if(fiSalaryDetailTable == null){
            fiSalaryDetailTable = new HtmlDataTable();
        }
        HtmlColumn column = new HtmlColumn();
       
        HtmlOutputText header = new HtmlOutputText();
       
        header.setValueExpression("value", getValueExpression("#{detail.empName}"));
       
        column.getChildren().add(header);
        fiSalaryDetailTable.getChildren().add(column);
        return fiSalaryDetailTable;
    }
/**
     * 获取value expression
     * @param ve
     * @return
     */
    private ValueExpression getValueExpression(String ve){
        return Expressions.instance().createValueExpression(ve).toUnifiedValueExpression();
    }
这样就可以简单的构建 一个了。在构建时报异常:
严重: Servlet.service() for servlet jsp threw exception
java.lang.ClassNotFoundException: org.jboss.el.lang.FunctionMapperImpl
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
我从网上下载了一个jboss-el.jar放到项目中就可以了。

第二步:加带header
页面代码:不变如上
后台代码:仅上面的getFiSalaryDetailTable()方法改变,其它未变.
public HtmlDataTable getFiSalaryDetailTable() {
        System.err.println("vSalaryDetail:=========:"+fiSalaryDetailTable);
        if(fiSalaryDetailTable == null){
            fiSalaryDetailTable = new HtmlDataTable();
        }
        HtmlColumnGroup columnGroup = new HtmlColumnGroup(); //加rich:columnGroup用来放表的列名的列
        HtmlColumn headerColumn = new HtmlColumn(); //定义一列放列名内容
       
        HtmlOutputText headerText = new HtmlOutputText(); //列名的内容
        headerText.setValue("员工名称");
       
        headerColumn.getChildren().add(headerText); //给列加内容
        columnGroup.getChildren().add(headerColumn); //给列组加列     
        HtmlColumn column = new HtmlColumn();
       
        HtmlOutputText header = new HtmlOutputText();
       
        header.setValueExpression("value", getValueExpression("#{detail.empName}"));
       
        column.getChildren().add(header);
       
        fiSalaryDetailTable.setHeader(columnGroup); //给表格加header
        fiSalaryDetailTable.getChildren().add(column);
       
        return fiSalaryDetailTable;
    }
这个也是一个很简单的静态的。
第三步:优化完善以后的,增加了一个自带的分页工具条,并加了一些css样式,都很简单
页面代码:加了一个<h:form>,因为加了分页工具条的原因,否则会报异常
<h:form>
                    <rich:dataTable id="fiSalaryDetailTable" var="detail" binding="#{salaryDetailBean.fiSalaryDetailTable}"
                        cellpadding="0" cellspacing="0" style="width:700px;"
                        value="#{salaryDetailBean.detailDataModel}"
                        styleClass="datatable-cellStyle" headerClass="standardTable_Header"
                        footerClass="standardTable_Header" rowKeyVar="index"
                        rowClasses="standardTable_Row1,standardTable_Row2"
                        columnClasses="standardTable_ColumnCentered,standardTable_ColumnLefted,
                                        standardTable_ColumnLefted,standardTable_ColumnLefted,
                                        standardTable_ColumnLefted"
                        onRowMouseOver="this.style.backgroundColor='#F1F1F1'"
                        onRowMouseOut="this.style.backgroundColor='#ffffff'">
                    </rich:dataTable>   
                </h:form>
后台代码:也仅仅是修改了一下 getFiSalaryDetailTable() 方法。
public HtmlDataTable getFiSalaryDetailTable() {
        System.err.println("vSalaryDetail:=========:"+fiSalaryDetailTable);
        if(fiSalaryDetailTable == null){
            fiSalaryDetailTable = new HtmlDataTable();
            HtmlColumnGroup columnGroup = new HtmlColumnGroup();
            HtmlColumn headerColumn = new HtmlColumn();
           
            HtmlOutputText headerText = new HtmlOutputText();
            headerText.setValue("员工名称");
           
            headerColumn.getChildren().add(headerText);
            columnGroup.setColumnClasses("datatable-cellStyle");
            columnGroup.getChildren().add(headerColumn);
           
           
            HtmlColumn column = new HtmlColumn();
           
            HtmlOutputText header = new HtmlOutputText();
           
            header.setValueExpression("value", getValueExpression("#{detail.empName}"));
            header.setStyleClass("fontStyle"); //给header设置css
           
            column.getChildren().add(header);
           
           
            fiSalaryDetailTable.setHeader(columnGroup);
            fiSalaryDetailTable.getChildren().add(column);
            fiSalaryDetailTable.setRows(15); //设置每页多少行。
           
            HtmlDatascroller dataScroller = new HtmlDatascroller(); //分页工具条
            dataScroller.setFor("fiSalaryDetailTable"); //设置给哪个表加上
            dataScroller.setMaxPages(19); //最大页数
            dataScroller.setAlign("left"); //设置align属性值
           
            fiSalaryDetailTable.setFooter(dataScroller);  //设置底部
           
        }
        return fiSalaryDetailTable;
    }
对于动态生成,只要根据业务条件生成就可以了。
添加时间转换器
HtmlOutputText columnValueText = new HtmlOutputText();
DateTimeConverter dateConvert = new DateTimeConverter();
dateConvert.setPattern("yyyy-MM-dd");
columnValueText.setConverter(dateConvert);
参照:
http://stenlylee.javaeye.com/blog/317180
http://blog.csdn.net/Vanessa219/archive/2009/02/17/3901123.aspx
http://pz0513.blog.51cto.com/443986/113798

原创粉丝点击