中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> Bea专区 > BEA Workshop
深入Beehive标签库系列教程(7) - 数据分页显示标签组
作者:肖菁 时间:2006-08-04 13:07 出处:bea.com.cn 责编:月夜寒箫
              摘要:深入Beehive标签库系列教程(7) - 数据分页显示标签组

  数据的分页显示是Web应用中重点关注的内容之一,NETUI中提供了netui-data:dataGrid标签和一些相关的标签如:netui-data:configurePager 、netui-data: renderPager、netui-data: header、netui-data:rows等,它们组合起来使用可以完成数据分页显示功能。

  • netui-data:dataGrid标签

      用于指定要显示的数据,主要属性包括dataSource和name。

    • dataSource

        dataSource属性用于将netui-data:dataGrid标签绑定到要显示的数据,被绑定的数据可以是数组、Hashtable、Collection等类型的对象。

    • name

        name属性是一个字符串,它是netui-data:dataGrid标签在应用环境中的唯一标识符,我们在实现排序、过滤的功能时需要使用这个属性来查找当前处理的netui-data:dataGrid标签对应的数据模型。

  • netui-data:configurePager标签

  用于设置分页显示的相关信息如默认每页显示的记录数目、导航内容等,主要的属性包括pagerFormat、pageSize、pageAction。

  • pagerFormat

      用于设置导航区要显示的样式,有两个选项:firstPrevNextLast或者prevNext,使用后者在导航区只能看到上一页和下一页的超链接,而使用前者将还包括第一页和最后一页的连接。

  • pageSize

      用于设置每页要显示的记录数目。

  • pageAction

      用于设置生成导航链接的目标地址。默认情况下生成的导航目标地址是当前JSP页面,但是通常情况下页面流的导航目标都是Action,我们可以通过设置pageAction属性将导航连接的目标地址转向Action。

  • netui-data: renderPager标签

      netui-data:configurePager标签的pagerFormat属性仅仅是设置了导航区要显示的样式,并没有设置导航区显示的具体位置,我们需要通过netui-data: renderPager标签设定导航区的位置。

  • netui-data: header标签

      用于显示表格的头信息。

  • netui-data:headerCell

      用于显示表格头的列,如果表格需要排序,排序的参数也通过netui-data:headerCell标签对应的属性提供。支持的主要属性包括value、sortExpression、sortAction。

    • value

        表格中要显示的内容。

    • sortExpression

        排序的表达式。netui-data:dataGrid标签支持嵌入式排序功能,不过他并没有提供默认的排序实现,只是提供了相关的属性和接口。sortExpression属性中可以设置排序时使用的表达式,开发者可以通过接口获得这个表达式,然后自己将内容排序后返回给netui-data:dataGrid标签显示。

    • sortAction

        用于设置生成排序链接的目标地址。默认情况下生成的排序链接目标地址是当前JSP页面,但是通常情况下页面流的目标都是Action,我们可以通过设置sortAction属性将排序链接的目标地址转向Action。

  • netui-data:rows标签

      用于遍历数据的每一条记录。我们可以在netui-data:rows标签下面嵌套netui-data:anchorCell、netui-data:imageAnchorCell、netui-data:imageCell、netui-data:spanCell、netui-data:templateCell标签显示表格的列。

    • netui-data:anchorCell

        该标签用于显示超链接内容的列。主要属性包括value、action、href。Value属性用于指定超链接的显示内容,action属性指定该超链接目标action的名称,如果超链接指向JSP内容,我们需要使用href属性指定超链接的目标。

    • netui-data:imageAnchorCell

        该标签用于显示带超链接的图片。主要属性包括src、action、href。src属性用于指定显示图片的位置,action属性指定该超链接目标action的名称,如果超链接指向JSP内容,我们需要使用href属性指定超链接的目标。

    • netui-data:imageCell

        该标签用于显示简单的图片。主要的属性包括src,用于提供显示图片的位置。

    • netui-data:spanCell

        该标签用于显示简单的文字列。主要属性是value,用于指定该列的显示内容。

    • netui-data:templateCell

        该标签用于需要显示复杂内容的列。在netui-data:templateCell中可以显示任意的HTML内容、NETUI标签或者其他任意内容。

  我们来看一个简单的例子,以前面显示的10个UserBean对象为例,如果我们每页显示5个对象信息,使用netui-data:dataGrid显示这些数据的代码如下。

  1. <netui-data:dataGrid dataSource=“pageInput.users” name=“user”>
  2. <netui-data:configurePager disableDefaultPager=“true”
  3. pagerFormat=“firstPrevNextLast” pageSize=“5”/>
  4. <netui-data:header>
  5. <netui-data:headerCell value=”用户名”/>
  6. <netui-data:headerCell value=”密码”/>
  7. </netui-data:header>
  8. <netui-data:rows>
  9. <netui-data:spanCell value=“${container.item.name}”/>
  10. <netui-data:spanCell value=“${container.item.password}”/>
  11. </netui-data:rows>
  12. <netui-data:footer>
  13. <td colspan=“2”><netui-data:renderPager/></td>
  14. </netui-data:footer>
  15. </netui-data:dataGrid>

  netui-data:dataGrid标签的更多属性的应用请参考清单1,清单3 给出了格式化netui-data:dataGrid标签的css文件的内容。

  需要指出的是,使用netui-data:dataGrid标签分页显示数据仅针对数据量不大的情况,因为netui-data:dataGrid标签中要显示的数据使用Java对象保存,对于大数据量的情况,由于过大的Java对象在多用户访问时很容易引起系统性能问题,严重的话会引起OutOfMemoryError,导致系统无法正常运行,这种情况下,不推荐直接使用netui-data:dataGrid标签完成分页。而是应该由开发者实现数据的逐页提取,借助于netui-data:dataGrid标签来显示当前页的数据,这样才能保证系统平稳运行。

  我们不能在大数据量的情况下完全使用netui-data:dataGrid标签实现数据分页显示,而应该由开发者完成分页逻辑,仅仅借助于netui-data:dataGrid标签显示数据。

  将%NETUI_HOME%目录下的Web应用编译、发布到Tomcat后(上下文路径netui),可以使用http://localhost:8080/netui/dataGridExamples.do访问这个netui:dataGrid标签的例子。

  和分页显示数据相关的JSP文件的完整内容请参考清单1。

  清单1 web\dataGridExample.jsp

  1. <%@ page language="java" contentType="text/html;charset=gb2312"%>
  2. <%@ page import="org.vivianj.beehive.examples.beans.UserBean" %>
  3. <%@ taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0"
  4. prefix="netui-data"%>
  5. <%@ taglib uri="http://beehive.apache.org/netui/tags-html-1.0"
  6. prefix="netui"%>
  7. <%@ taglib uri="http://beehive.apache.org/netui/tags-template-1.0"
  8. prefix="netui-template"%>
  9. <netui:html>
  10. <head>
  11. <title>dataGrid Examples</title>
  12. <netui:base/>
  13. <link rel="stylesheet" href="css/vivianj-datagrid.css" type="text/css" />
  14. </head>
  15. <netui:body>
  16. <center>使用标签分页显示数据的例子</center><BR>
  17. <netui-data:declarePageInput name="userbeans"
  18. type="java.util.ArrayList" required="true" />
  19. <TABLE border="1" align="Center">
  20. <TR>
  21. <TD>简单分页的例子</TD>
  22. <TD>简单分页的例子--在表格中显示复杂内容</TD>
  23. </TR>
  24. <TR>
  25. <TD>
  26. <netui-data:dataGrid dataSource="pageInput.userbeans"
  27. name="user">
  28. <netui-data:configurePager disableDefaultPager="true"
  29. pagerFormat="firstPrevNextLast" pageSize="5"
  30. pageAction="dataGridExamples"/>
  31. <netui-data:header>
  32. <netui-data:headerCell value="用户名"/>
  33. <netui-data:headerCell value="密码"/>
  34. </netui-data:header>
  35. <netui-data:rows>
  36. <netui-data:spanCell value="${container.item.id}"/>
  37. <netui-data:spanCell value="${container.item.name}"/>
  38. </netui-data:rows>
  39. <netui-data:footer>
  40. <td colspan="2"><netui-data:renderPager/></td>
  41. </netui-data:footer>
  42. </netui-data:dataGrid>
  43. </TD>
  44. <TD>
  45. <netui-data:dataGrid dataSource="pageInput.userbeans"
  46. name="user">
  47. <netui-data:configurePager disableDefaultPager="true"
  48. pagerFormat="firstPrevNextLast" pageSize="5"
  49. pageAction="dataGridExamples"/>
  50. <netui-data:header>
  51. <netui-data:headerCell value="用户名"/>
  52. <netui-data:headerCell value="密码"/>
  53. </netui-data:header>
  54. <netui-data:rows>
  55. <netui-data:spanCell value="${container.item.id}"/>
  56. <netui-data:spanCell value="${container.item.name}"/>
  57. </netui-data:rows>
  58. <netui-data:footer>
  59. <td colspan="2"><netui-data:renderPager/></td>
  60. </netui-data:footer>
  61. </netui-data:dataGrid>
  62. </TD>
  63. </TR>
  64. <TR>
  65. <TD>简单分页的例子--应用CSS格式化显示</TD>
  66. <TD> </TD>
  67. </TR>
  68. <TR>
  69. <TD>
  70. <netui-data:dataGrid dataSource="pageInput.userbeans"
  71. name="user" styleClassPrefix="vivianj">
  72. <netui-data:configurePager disableDefaultPager="true"
  73. pagerFormat="firstPrevNextLast" pageSize="5"
  74. pageAction="dataGridExamples"/>
  75. <netui-data:header>
  76. <netui-data:headerCell value="用户名"/>
  77. <netui-data:headerCell value="密码"/>
  78. </netui-data:header>
  79. <netui-data:rows>
  80. <netui-data:spanCell value="${container.item.id}"/>
  81. <netui-data:spanCell value="${container.item.name}"/>
  82. </netui-data:rows>
  83. <netui-data:footer>
  84. <td colspan="2"><netui-data:renderPager/></td>
  85. </netui-data:footer>
  86. </netui-data:dataGrid>
  87. </TD>
  88. <TD>
  89. &nbsp;
  90. </TD>
  91. </TR>
  92. </TABLE>
  93. </netui:body>
  94. </netui:html>

  清单2 web\Controller.java

  1. import javax.servlet.http.HttpSession;
  2. import org.apache.beehive.netui.pageflow.Forward;
  3. import org.apache.beehive.netui.pageflow.PageFlowController;
  4. import org.apache.beehive.netui.pageflow.annotations.Jpf;
  5. import org.vivianj.beehive.examples.beans.UserBean;
  6. import java.util.List;
  7. import java.util.ArrayList;
  8. import org.apache.beehive.netui.databinding.datagrid.api.DataGridState;
  9. import org.apache.beehive.netui.databinding.datagrid.api.DataGridStateFactory;
  10. import org.apache.beehive.netui.databinding.datagrid.api.sort.Sort;
  11. import org.apache.beehive.netui.databinding.datagrid.api.sort.SortDirection;
  12. import java.lang.reflect.Method;
  13. import java.lang.reflect.InvocationTargetException;
  14. import java.beans.Introspector;
  15. import java.beans.BeanInfo;
  16. import java.beans.PropertyDescriptor;
  17. import java.beans.IntrospectionException;
  18. import java.util.Comparator;
  19. import java.util.Collections;
  20. @Jpf.Controller(
  21. simpleActions={
  22. @Jpf.SimpleAction(name="begin", path="index.jsp")
  23. },
  24. sharedFlowRefs={
  25. @Jpf.SharedFlowRef(name="shared",
  26. type=shared.SharedFlow.class)
  27. }
  28. )
  29. public class Controller
  30. extends PageFlowController
  31. {
  32. @Jpf.Action(forwards = {
  33. @Jpf.Forward(name = "success", path = "pageInputExample.jsp") })
  34. public Forward pageInputExamples() {
  35. Forward f = new Forward("success");
  36. /* 向JSP页面传递数据 */
  37. f.addActionOutput("hellostring", "Hello World!");
  38. String[] strings = new String[]{"Hello World!","Hello Beehive!"};
  39. /* 向JSP页面传递数组 */
  40. f.addActionOutput("strings", strings);
  41. /* 向JSP页面传递自定义对象 */
  42. UserBean userBean = new UserBean();
  43. userBean.setId(100);
  44. userBean.setName("UserBean100");
  45. f.addActionOutput("userbean", userBean);
  46. /* 向JSP页面传递List对象 */
  47. List list = new ArrayList();
  48. list.add(userBean);
  49. UserBean userBean1 = new UserBean();
  50. userBean.setId(101);
  51. userBean.setName("UserBean101");
  52. list.add(userBean1);
  53. f.addActionOutput("userbeans", list);
  54. return f;
  55. }
  56. @Jpf.Action(forwards = {
  57. @Jpf.Forward(name = "success", path = "cellRepeaterExample.jsp") })
  58. public Forward cellRepeaterExamples() {
  59. Forward f = new Forward("success");
  60. ArrayList list = new ArrayList();
  61. for( int i = 0;i<10;i++){
  62. UserBean user = new UserBean();
  63. user.setId(i);
  64. user.setName("name" + i);
  65. list.add(user);
  66. }
  67. f.addActionOutput("userbeans", list);
  68. return f;
  69. }
  70. @Jpf.Action(forwards = {
  71. @Jpf.Forward(name = "success", path = "repeaterExample.jsp") })
  72. public Forward repeaterExamples() {
  73. Forward f = new Forward("success");
  74. ArrayList list = new ArrayList();
  75. for( int i = 0;i<10;i++){
  76. UserBean user = new UserBean();
  77. user.setId(i);
  78. user.setName("name" + i);
  79. list.add(user);
  80. }
  81. f.addActionOutput("userbeans", list);
  82. return f;
  83. }
  84. @Jpf.Action(forwards = { @Jpf.Forward(name = "success", path = "dataGridExample.jsp") })
  85. public Forward dataGridExamples() {
  86. Forward f = new Forward("success");
  87. List list = new ArrayList();
  88. for( int i = 0;i<10;i++){
  89. UserBean user = new UserBean();
  90. user.setId(i);
  91. user.setName("name" + i);
  92. list.add(user);
  93. }
  94. DataGridState dataGridState = DataGridStateFactory.getInstance(getRequest()).getDataGridState("user");
  95. final List<Sort> sorts = (List<Sort>)dataGridState.getSortModel().getSorts();
  96. if(sorts != null && sorts.size() < 2) {
  97. Sort sort = (Sort)sorts.get(0);
  98. SortByPropertyComparator sorter = new SortByPropertyComparator(sort);
  99. Collections.sort(list, sorter);
  100. }
  101. f.addActionOutput("userbeans", list);
  102. return f;
  103. }
  104. protected void onCreate()
  105. {
  106. }
  107. protected void onDestroy(HttpSession session)
  108. {
  109. }
  110. private class SortByPropertyComparator
  111. implements Comparator {
  112. private Sort _sort = null;
  113. SortByPropertyComparator(Sort sort) {
  114. _sort = sort;
  115. }
  116. public int compare(Object o1, Object o2) {
  117. int comparison = 0;
  118. Object value1 =
  119. extractPropertyValue(o1, _sort.getSortExpression());
  120. Object value2 =
  121. extractPropertyValue(o2, _sort.getSortExpression());
  122. assert value1 instanceof Comparable;
  123. comparison = ((Comparable) value1).compareTo(value2);
  124. if (_sort.getDirection() == SortDirection.ASCENDING)
  125. return comparison;
  126. else if (_sort.getDirection() ==
  127. SortDirection.DESCENDING)
  128. return -1 * comparison;
  129. else return 0;
  130. }
  131. private Object extractPropertyValue(
  132. Object object, String propertyName) {
  133. assert object != null;
  134. assert propertyName != null && !propertyName.equals("");
  135. Method propAccessor =
  136. lookupPropertyAccessor(object.getClass(), propertyName);
  137. if (propAccessor == null)
  138. throw new IllegalStateException("Unable to find” +
  139. “property accessor matching property name \""
  140. + propertyName + "\"");
  141. Object value = null;
  142. try {
  143. value = propAccessor.invoke(object, (Object[])null);
  144. }
  145. catch (IllegalAccessException e) {
  146. throw new IllegalStateException("Exception occurred “
  147. + ”invoking property getter \""
  148. + propAccessor.getName() + "\"");
  149. }
  150. catch (InvocationTargetException e) {
  151. throw new IllegalStateException("Exception occurred “
  152. + ”invoking property getter \""
  153. + propAccessor.getName() + "\"");
  154. }
  155. return value;
  156. }
  157. private Method lookupPropertyAccessor(
  158. Class clazz, String propertyName) {
  159. BeanInfo beanInfo = null;
  160. try {
  161. beanInfo = Introspector.getBeanInfo(clazz);
  162. }
  163. catch (IntrospectionException e) {
  164. throw new IllegalStateException("Unable to find “
  165. + ”property named \"" + propertyName + "\" on type \""
  166. + clazz.getName() + "\"", e);
  167. }
  168. for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors())
  169. {
  170. if (pd.getName().equalsIgnoreCase(propertyName))
  171. return pd.getReadMethod();
  172. }
  173. return null;
  174. }
  175. }
  176. }

  清单3 web\css\dataGrid.css

  1. .vivianj{
  2. font: 12px;
  3. }
  4. .vivianj-header {
  5. color: #FFFFFF;
  6. background-color: #585858;
  7. }
  8. .vivianj-footer {
  9. color: #0000FF;
  10. background-color: #FFFFFF;
  11. }
  12. .vivianj-even {
  13. background-color: #E1E1E1;
  14. }
  15. .vivianj-odd {
  16. background-color: #C0C0C0;
  17. }

数据分页显示中的中文问题

  使用netui-data:dataGrid标签显示数据时,默认生成导航超链接和其他提示信息都是英文内容,我们需要为它们提供对应的中文内容。NETUI中使用基于资源文件和Local机制的国际化处理策略,我们只需要提供对应的资源文件即可。

  netui-data:dataGrid标签使用的资源文件位于org\apache\beehive\netui\databinding\datagrid\runtime\util\ data-grid-default.properties文件中,我们需要在WEB-INF\classes目录下创建org\apache\beehive\netui\databinding\datagrid\runtime\util\目录,然后在该目录下建立data-grid-default_zh_CN.properties文件,在该文件中提供对应的中文信息即可。下面是提供中文内容的data-grid-default_zh_CN.properties文件的例子。

  清单4 src\org\apache\beehive\netui\databinding\datagrid\runtime\util\

  data-grid-default_zh_CN.properties

  1. datagrid.resource.path=resources/beehive/version1/images
  2. datagrid.msg.nodata=\u6ca1\u6709\u5408\u9002\u7684\u5185\ u5bb9\ u7528\ u4e8e\ u663e\ u793a
  3. sort.asc.img=/sortdown.gif
  4. sort.desc.img=/sortup.gif
  5. sort.none.img=/sortable.gif
  6. pager.msg.first=\ u7b2c\ u4e00\ u9875
  7. pager.msg.previous=\ u4e0a\ u4e00\ u9875
  8. pager.msg.next=\ u4e0b\ u4e00\ u9875
  9. pager.msg.last=\ u6700\ u540e\ u4e00\ u9875
  10. pager.fmt.banner=\ u7b2c{0}\ u9875 \ u5171{1}\ u9875
  11. filter.sql.none= \ u6ca1\ u6709\ u8fc7\ u6ee4\ u5668
  12. filter.sql.equal= \ u7b49\ u4e8e
  13. filter.sql.notequal= \ u4e0d\ u7b49\ u4e8e
  14. filter.sql.greaterthan= \ u5927\ u4e8e
  15. filter.sql.lessthan= \ u5c0f\ u4e8e
  16. filter.sql.greaterthanorequal= \ u5927\ u4e8e\ u7b49\ u4e8e
  17. filter.sql.lessthanorequal= \ u5c0f\ u4e8e\ u7b49\ u4e8e
  18. filter.sql.isoneof= \ u5c5e\ u4e8e
  19. filter.sql.startswith= \ u4ee5\ u5b57\ u7b26\ u5f00\ u59cb
  20. filter.sql.contains= \ u5305\ u542b
  21. filter.sql.isempty= \ u7a7a\ u503c
  22. filter.sql.isnotempty= \ u975e\ u7a7a\ u503c

  资源文件中的中文内容必须以UNICODE编码格式提供,否则无法显示,如何实现中文内容到UNICODE编码的转化请参考《应用页面流开发Web应用》章节中关于国际化部分的内容。

 

 

 

 

 

 

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有