ADF 11g: 表(af: table)分页
来源:互联网 发布:怎么打开企业淘宝店铺 编辑:程序博客网 时间:2024/05/17 23:43
当页面需要显示的数据量比较大的时候,可以使用分页来简化用户的操作。但是在ADF 11g中,af:table并没有默认的分页功能,我们可以custom出JSPX页面的分页逻辑。
本例子使用的表是HR Sechema中的Employees。
2011/11/25 卢玉双 追加:
类似的实现方式,可以使用af:iterator,Table数据取自ADF BC的VO,也能够实现分页功能。
主要使用af:iterator这个tag,页面中数据的展示如同af:table,并且af:iterator可以基于table绑定进行循环显示数据集合。
1,基于Employees表创建entities,然后创建一个stateless session bean,以及data control,代码片段如下:
public List<Employees> employeesByLimit(int firstRow, int maxRow) { String queryString = "select * from Employees order by employee_id ASC"; return em.createNativeQuery(queryString, Employees.class).setMaxResults(maxRow).setFirstResult(firstRow).getResultList(); } /** * Returns total amount of rows in table. * @return Total amount of rows in table. */ public int employeesTotalRows() { String queryString = "select * from Employees order by employee_id ASC"; Query query = em.createNativeQuery(queryString); List results = query.getResultList(); return results.size(); }
2,在ViewController层创建JSPX页面CustomPagination.jspx
3,创建页面对应的sessionScope级别的managed bean
代码片段:
private int firstRow = 0; private int rowsPerPage = 10; private int totalRows; private int totalPages; private int currentPage = 1; public CustomPagination() { this.loadList(); } public void loadList() { /** * Returns total amount of rows in table. * @return Total amount of rows in table. */ BindingContainer bindings = BindingContext.getCurrent().getCurrentBindingsEntry(); AttributeBinding attr = (AttributeBinding)bindings.getControlBinding("EmployeesTotalRowCount"); String val = attr.getInputValue().toString(); int rows = Integer.parseInt(val); this.setTotalRows(rows); double val1 = ((double)this.getTotalRows() / this.getRowsPerPage()); int totalPagesCal = (int)Math.ceil(val1); this.setTotalPages((totalPagesCal != 0) ? totalPagesCal : 1); } public void firstActionListener(ActionEvent actionEvent) { this.setCurrentPage(1); this.setFirstRow(0); } public void previousActionListener(ActionEvent actionEvent) { this.setCurrentPage(this.getCurrentPage() - 1); this.setFirstRow(this.getFirstRow() - this.getRowsPerPage()); } public void nextActionListener(ActionEvent actionEvent) { this.setCurrentPage(this.getCurrentPage() + 1); this.setFirstRow(this.getFirstRow() + this.getRowsPerPage()); } public void lastActionListener(ActionEvent actionEvent) { this.setCurrentPage(this.getTotalPages()); this.setFirstRow(this.getTotalRows() - ((this.getTotalRows() % this.getRowsPerPage() != 0) ? this.getTotalRows() % this.getRowsPerPage() : this.getRowsPerPage())); } public boolean isBeforeDisabled() { return this.getFirstRow() == 0; } public boolean isAfterDisabled() { return this.getFirstRow() >= this.getTotalRows() - this.getRowsPerPage(); } public void setFirstRow(int firstRow) { this.firstRow = firstRow; } public int getFirstRow() { return firstRow; } public void setRowsPerPage(int rowsPerPage) { this.rowsPerPage = rowsPerPage; } public int getRowsPerPage() { return rowsPerPage; } public void setTotalRows(int totalRows) { this.totalRows = totalRows; } public int getTotalRows() { return totalRows; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public int getTotalPages() { return totalPages; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getCurrentPage() { return currentPage; }
4,打开CustomPagination页面的数据绑定
1)创建Action绑定
2)在variableIterator标签下添加下面代码
<variable Type="int" Name="employeesTotalRows_Return" IsQueriable="false" IsUpdateable="0" DefaultValue="${bindings.employeesTotalRows.result}"/>
3)创建引用employeesTotalRows_Return的属性绑定
4)创建调用employeesByLimit的Action绑定
5)创建Tree绑定给af:iterator使用
6)创建invokeAction,在页面的prepareMode阶段调用employeesTotalRows Action
7)最终,页面绑定如下图
5,修改页面代码
1)表的Title部分
<af:panelGroupLayout id="pgl9" layout="horizontal"><af:spacer width="10" height="10" id="s9"/><af:panelGroupLayout id="pgl10" inlineStyle="width:75px;" layout="horizontal"><af:outputText value="Employeed Id" id="ot1" inlineStyle="font-weight:bold;"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s7"/><af:panelGroupLayout id="pgl7" inlineStyle="width:75px;" layout="horizontal"><af:outputText value="First Name" id="ot6" inlineStyle="font-weight:bold;"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s10"/><af:panelGroupLayout id="pgl11" inlineStyle="width:75px;" layout="horizontal"><af:outputText value="Last Name" id="ot4" inlineStyle="font-weight:bold;"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s11"/><af:panelGroupLayout id="pgl12" inlineStyle="width:75px;" layout="horizontal"><af:outputText value="Email" id="ot7" inlineStyle="font-weight:bold;"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s12"/><af:panelGroupLayout id="pgl15" inlineStyle="width:75px;" layout="horizontal"><af:outputText value="Salary" id="ot10" inlineStyle="font-weight:bold;"/></af:panelGroupLayout></af:panelGroupLayout>
2)表的数据
<af:iterator id="i1" value="#{bindings.result.collectionModel}" var="row"><af:panelGroupLayout id="pgl2" layout="horizontal"><af:spacer width="10" height="10" id="s3"/><af:panelGroupLayout id="pgl3" layout="horizontal" inlineStyle="width:75px;"><af:outputText value="#{row.employeeId}" id="ot8"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s13"/><af:panelGroupLayout id="pgl13" layout="horizontal" inlineStyle="width:75px;"><af:outputText value="#{row.firstName}" id="ot11"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s4"/><af:panelGroupLayout id="pgl4" layout="horizontal" inlineStyle="width:75px;"><af:outputText value="#{row.lastName}" id="ot9"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s6"/><af:panelGroupLayout id="pgl5" layout="horizontal" inlineStyle="width:75px;"><af:outputText value="#{row.email}" id="ot2"/></af:panelGroupLayout><af:spacer width="10" height="10" id="s8"/><af:panelGroupLayout id="pgl8" inlineStyle="width:75px;" layout="horizontal"><af:outputText value="#{row.salary}" id="ot3"/></af:panelGroupLayout></af:panelGroupLayout><af:spacer width="10" height="10" id="s1"/></af:iterator>
3)控制按钮
<af:panelGroupLayout id="pgl6"><af:commandButton text="First" id="cb1"actionListener="#{CustomPagination.firstActionListener}"partialTriggers="i1" disabled="#{CustomPagination.beforeDisabled}"/><af:commandButton text="Prev" id="cb2"actionListener="#{CustomPagination.previousActionListener}"partialTriggers="i1" disabled="#{CustomPagination.beforeDisabled}"/><af:commandButton text="Next" id="cb3"actionListener="#{CustomPagination.nextActionListener}"partialTriggers="i1" disabled="#{CustomPagination.afterDisabled}"/><af:commandButton text="Last" id="cb4"actionListener="#{CustomPagination.lastActionListener}"partialTriggers="i1" disabled="#{CustomPagination.afterDisabled}"/></af:panelGroupLayout>
6,运行代码
首页:
第三页:
尾页:
- ADF 11g: 表(af: table)分页
- ADF 11g: 表(af: table)分页
- af:table 分页
- ADF(UI)--<af:table>在使用分页是如何固定高度
- ADF 11g: 选择ADF table中的所有行
- Oracle adf af:table can not scroll page
- ADF(UI)--<af:table>数据的延迟加载(一)
- ADF(UI)--<af:table>数据的延迟加载(二)
- ADF(UI)--<af:table>数据的延迟加载(三)
- ADF(UI)--别忘了<af:table>中<af:column>中的headerClass属性
- ADF(UI)--在<af:table>里多行编辑时去掉必填字段的验证提示
- ADF(BC)--当使用绑定VO的<af:table>时可能会导致的内存问题
- ADF中的小知识点——给af:table加序号
- ADF Mobile 11g 架构
- ADF实现多选框及分页的Table组件
- ADF中af:forEach和af:iterator标签的区别
- Oracle ADF af:selectManyShuttle的使用
- 【深入浅出ADF】<af:richTextEditor>富文本编辑组件
- CSS Sprites: Image Slicing’s Kiss of Death
- Cannot create HTML wrapper. Right-click here to recreate folder html-template
- Linux下的程序调试——GDB
- 策略模式(Strategy)
- Linux下5步搭建Tomcat
- ADF 11g: 表(af: table)分页
- 冷清
- 原来黑客长这样(中国大陆篇)
- HDFS------datanode的初始化
- 在VC2008下使用 Log4cxx 配置步骤说明:
- Android入门之TimePicker(纯java)
- c/c++中const用法总结
- Winscok API
- 下拉提示(GoogleSuggest)