ECSide是有一个基于jsp tag的开源列表组件.
简单的说,它就是一组可以帮助你快速实现强大的列表的jsp标签.
它的工作原理很简单.
您将要展现的列表的数据集合(Collection),放入request/pagecontext/session内(使用setAttribute方法.这个工作可以在action/servlet里完成,也可以在jsp页面内完成),然后页面跳转到使用ECSide标签的jsp页面,此时ECSide就可以帮助您展现出所需要的列表.

一个简单的流程通常是这样的.

1 客户端请求action/servlet(如 http://10.195.129.101/test/userlist.do)
2 action接受到请求后,调用相应的BO/dao,执行取列表数据的方法.
3 取得数据后(通常是一个vo/map的list),将数据放入request内(使用requset.setAttribute(key,value)方法.)
4 将请求forward到使用ECSide标签的jsp页面.
5 ECSide将展现出列表.

知道了原理,那么让我们一起来完成一个快速而简单的例子吧.
现在有一张用户信息表,如下

  1. 表名称: USER_INFO(用户信息表)
  2. 字段:
  3. USERID   (用户编号)
  4. USERNAME (用户名)
  5. PASSWD   (密码)
  6. USERROLE (角色) 0 被锁定  1 普通  2 高级 3 管理员 4超级管理员
  7. REGDATE  (注册日期)
  8. EMAIL    (EMAIL)
  9. GENDER   (性别) 0 未知 1 男 2女
  10. MEMO     (备注)
表名称: USER_INFO(用户信息表)
字段:
USERID (用户编号)
USERNAME (用户名)
PASSWD (密码)
USERROLE (角色) 0 被锁定 1 普通 2 高级 3 管理员 4超级管理员
REGDATE (注册日期)
EMAIL (EMAIL)
GENDER (性别) 0 未知 1 男 2女
MEMO (备注)

h2db的建表脚本如下:

  1. create table USER_INFO (
  2. USERID int not null identity,
  3. USERNAME varchar(80) not null,
  4. PASSWD varchar(255) not null,
  5. USERROLE varchar(10) default 1,
  6. REGDATE varchar(20) ,
  7. EMAIL varchar(128) ,
  8. GENDER varchar(2) default 0,
  9. MEMO varchar(1024)  ,
  10. constraint PK_USER_INFO primary key (USERID)
  11. );
create table USER_INFO (
USERID int not null identity,
USERNAME varchar(80) not null,
PASSWD varchar(255) not null,
USERROLE varchar(10) default 1,
REGDATE varchar(20) ,
EMAIL varchar(128) ,
GENDER varchar(2) default 0,
MEMO varchar(1024) ,
constraint PK_USER_INFO primary key (USERID)
);

对应VO:

  1. public class UserInfo {
  2. private Integer userId;
  3. private String userName;
  4. private String passwd;
  5. private String userRole;
  6. private String regDate;
  7. private String email;
  8. private String gender;
  9. private String memo;
  10. /* 略去getter setter方法 */
  11. }
public class UserInfo {
private Integer userId;
private String userName;
private String passwd;
private String userRole;
private String regDate;
private String email;
private String gender;
private String memo; /* 略去getter setter方法 */ }

对应DAO如下(假设DAO里只有一个方法,取得全部的用户信息,返回的是VO的List):

  1. public class UserDAO extends BaseDAO  {
  2. public List getAllUsers(){
  3. StringBuffer bufSql = new StringBuffer("SELECT * FROM USER_INFO WHERE 1=1");
  4. Connection conn=null;
  5. PreparedStatement pstmt = null;
  6. ResultSet rest = null;
  7. List allUsers=null;
  8. try {
  9. conn = getConnection();
  10. pstmt = ConnectionUtils.prepareStatement(conn,bufSql.toString());
  11. rest = pstmt.executeQuery();
  12. allUsers=new ArrayList();
  13. UserVO userVO=null;
  14. while (rest.next()) {
  15. userVO=new UserVO();
  16. /* 略去将ResultSet结果放入VO的过程 */
  17. allUsers.add(userVO);
  18. }
  19. } catch (Exception e) {
  20. allUsers=null;
  21. }finally{
  22. close(rest, pstmt, conn);
  23. }
  24. return allUsers;
  25. }
  26. }
public class UserDAO extends BaseDAO  {

	public List getAllUsers(){
StringBuffer bufSql = new StringBuffer("SELECT * FROM USER_INFO WHERE 1=1"); Connection conn=null;
PreparedStatement pstmt = null;
ResultSet rest = null; List allUsers=null; try {
conn = getConnection();
pstmt = ConnectionUtils.prepareStatement(conn,bufSql.toString());
rest = pstmt.executeQuery();
allUsers=new ArrayList();
UserVO userVO=null;
while (rest.next()) {
userVO=new UserVO();
/* 略去将ResultSet结果放入VO的过程 */
allUsers.add(userVO);
}
} catch (Exception e) {
allUsers=null;
}finally{
close(rest, pstmt, conn);
} return allUsers;
} }

该简单例子假设该表数据量不大:500以内,采用ECSide的java内存分页技术(关于java内存分页和数据库层分页的说明请参见:...).

由于此例子实在简单,所以略去BO层.

action(DispatchActionSupport)代码如下:

  1. public class MyTestAction extends DispatchAction {
  2. // java内存分页
  3. public ActionForward getAllUsers(ActionMapping mapping, ActionForm form,
  4. HttpServletRequest request, HttpServletResponse response)
  5. throws Exception {
  6. // 取得DAO,这里是从spring上下文中取得指定DAO,略去spring相关代码
  7. UserDAO userDAO=(UserDAO)getBean("userDAO");
  8. List allUsers = userDAO.getAllUsers();
  9. //将结果集合放入request内,记住键名"allUsers".
  10. request.setAttribute("allUsers", allUsers);
  11. //forward到列表展现页面
  12. return mapping.findForward("userlistPage");
  13. }
  14. }
public class MyTestAction extends DispatchAction {

	// java内存分页
public ActionForward getAllUsers(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception { // 取得DAO,这里是从spring上下文中取得指定DAO,略去spring相关代码
UserDAO userDAO=(UserDAO)getBean("userDAO"); List allUsers = userDAO.getAllUsers(); //将结果集合放入request内,记住键名"allUsers".
request.setAttribute("allUsers", allUsers); //forward到列表展现页面
return mapping.findForward("userlistPage"); }
}

访问该action的URL为
http://localhost:8080/ecsdemo/simpledemo.do?actionMethod=getAllUsers

jsp页面:
引入标签声明

  1. <%@ taglib uri="http://www.ecside.org" prefix="ec" %>
<%@ taglib uri="http://www.ecside.org" prefix="ec" %>

通常jsp页面内取得应用上下文是必须的.

  1. <%
  2. String webapp=request.getContextPath();
  3. %>
<%
String webapp=request.getContextPath();
%>

引入ECSide必要的css js

  1. <link rel="stylesheet" type="text/css" href="<%=webapp%>/common/css/ECSide_style.css" />
  2. <script type="text/javascript" src="<%=webapp%>/common/js/prototype_mini.js" ></script>
  3. <script type="text/javascript" src="<%=webapp%>/common/js/ECSide.js" ></script>
<link rel="stylesheet" type="text/css" href="<%=webapp%>/common/css/ECSide_style.css" />
<script type="text/javascript" src="<%=webapp%>/common/js/prototype_mini.js" ></script>
<script type="text/javascript" src="<%=webapp%>/common/js/ECSide.js" ></script>

ECSide的标签,也是展现列表最关键的环节:

  1. <ec:table items="allUsers" var="user"
  2. retrieveRowsCallback="process"
  3. action="${pageContext.request.contextPath}/simpledemo.do?actionMethod=getAllUsers"
  4. title="用户列表"
  5. width="100%"
  6. classic="true"
  7. >
  8. <ec:row>
  9. <ec:column width="50" property="_0" title="序号" value="${GLOBALROWCOUNT}" />
  10. <ec:column width="80" property="userRole" title="角色"   />
  11. <ec:column             property="userName" title="用户名" />
  12. <ec:column width="100" property="passwd" title="密码"  />
  13. <ec:column width="120" property="email" title="电子信箱" />
  14. <ec:column width="70" property="gender" title="性别"  />
  15. </ec:row>
  16. </ec:table>
<ec:table items="allUsers" var="user"
retrieveRowsCallback="process"
action="${pageContext.request.contextPath}/simpledemo.do?actionMethod=getAllUsers"
title="用户列表" width="100%"
classic="true"
>
<ec:row>
<ec:column width="50" property="_0" title="序号" value="${GLOBALROWCOUNT}" />
<ec:column width="80" property="userRole" title="角色" />
<ec:column property="userName" title="用户名" />
<ec:column width="100" property="passwd" title="密码" />
<ec:column width="120" property="email" title="电子信箱" />
<ec:column width="70" property="gender" title="性别" />
</ec:row>
</ec:table>

<ec:table> ECSide的主标签,可以理解为 html里的table标签

items指明列表集合在request的属性表里的键名, var指明迭代列表集合时,单条记录所用的变量名.此处类似jstl里的c:forEach标签.
retrieveRowsCallback="process"  指明采用ECSide的java内存分页技术(关于java内存分页和数据库层分页的的详细说明参见....).
action指明翻页排序等操作时,所要调用的action的url,在这里你可以继续使用展现列表所使用的action
title="用户列表"  列表的标题
width="100%"  列表的宽度
classic="true"  使用传统方式列表 (传统方式与ECSide方式区别的详细说明参见....)

<ec:row> 行标签,可以理解为类似html里的tr标签

<ec:column> 列标签,可以理解为类似html里的td标签

width列的宽度, 类似td的 width属性 (关于 ec:column 的 width属性的详细说明参见....)
property 该列所要显示的数据在VO中对应的属性字段的名字(如果每条数据是存放在VO里的话),或MAP里对应的key的名字(如果每条数据是存放在MAP里的话)
title 表头中该列所要显示的名称
value 该列所要显示的内容.当你要显示的内容默认不是VO/MAP里的值的时候,你才需要使用value属性,为该列手动的指定一个值.
${GLOBALROWCOUNT}为ECSide内置的一个特殊变量,表示的数据所在的行号,针对全部数据而言,${ROWCOUNT}是针对当前页面而言

ecside进阶参考文章:http://hubenben.iteye.com/blog/1155988

ecside入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. CalendarHelper日期计算工具,各种日期的获取和计算

    今天分享一个日期获取和计算的工具类,这个最初是用在项目中获取每周每月日期用的. <Attention> 之后逛帖子的时候发现了这个专门处理日期的库,java上也有,android上还为了避 ...

  2. 用JQuery实现表格隔行变色和突出显示当前行

    用JQuery实现表格隔行变色和突出显示当前行 上源码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "htt ...

  3. python基础:映射和集合类型

    python字典的迭代器遍历 字典有一个方法可以返回该字典的迭代器,这个方法就是: dict. iteritems() 当在字典中增加或者删除字典entry的时候,迭代器会失效的,类似于C++的stl ...

  4. Activity关闭另一个Acitivity

    1.ActivityA跳转到ActivityB 2.ActivityB跳转到ActivityC 3.ActivityC结束掉自己的同时结束ActivityB 在ActivityB中声明一个自己的参数i ...

  5. 【git】error: Your local changes to the following files

    今天在服务器上git pull是出现以下错误: error: Your local changes to the following files would be overwritten by mer ...

  6. 异步操作AsycnTask类

    1.  首先执行onPreExecute方法,进行UI的初步设置 2.  其次执行doInBackground方法,此时将不在UI中线程中进行了 3.  然后如果要进行中的数据的话可以通过publis ...

  7. Catalog和Schema

    http://www.codeweblog.com/database-schema-and-catalog/ http://blog.sina.com.cn/s/blog_515015800100et ...

  8. [置顶] CSDN博客第四期移动开发最佳博主评选

    CSDN博客第三期最佳移动开发博主评选圆满结束,恭喜所有上榜用户,为继续展示移动开发方向优秀博主,发掘潜力新星,为移动开发方向的博客用户提供平台,CSDN博客第四期移动开发最佳博主评选开始.同时,获奖 ...

  9. MATLAB介绍

    MATLAB MATLAB[1]  是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink ...

  10. C语言的本质(10)——指针本质

    指针,大概是C语言中最难理解的概念之一了.指针这个东西是C语言中的一个基本概念,C99中对于指针的定义是: 1. 指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的 ...