smile 开发类库—— JSP 分页标签
本文章将对 smile 中对 jsp 分页标签的支持进行一个详细的介绍:
首先来看一个简单的分页的例子:
Action 中的代码:
import org.smile.pager.jsptags.JspTagsPager;
public String queryAllUser() throws Exception{
userService .queryAllUser( new JspTagsPager( request ));
return "success" ;
}
Dao 中的代码:
public PageModel queryAllUser(Pager pager) throws SQLException {
StringBuffer sql= new StringBuffer( "select id,name,age from Test where 1=1 " );
String name=pager.getRequest().getParameter( "name" );
if (name!= null &&! "" .equals(name.trim())){
sql.append( " and name like '" +name+ "'" );
}
return PagerQueryUtils.queryPageSQL ( ds .getConnection(),sql.toString(),pager,Dialect. HSQL );
}
至于 action 中是怎么调用 dao 的在这里就没有必要详细描述了。
Jsp 中的主要代码 :
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<%@ taglib uri = "http://smile.org/jsp/jstl/tag/pager" prefix = "pg" %>
< table >
< tr >< td > ID </ td >< td > 名称 </ td >< td > 年龄 </ td ></ tr >
< c:forEach items = "${pageModel.rows} " var = "v" >
< tr >
< td > ${v.id } </ td >< td > ${v.name } </ td >< td > ${v.age } </ td >
</ tr >
</ c:forEach >
</ table >
< pg:pager url = "${path} /jsp/queryAllUserAction.do " maxPageItems = "${pageModel.size} " items = "${pageModel.total} ">
每页显示 < pg:sizes /> 条
< pg:common />
</ pg:pager >
结果:
现在来分析一下这个例子:
JspTagsPager是实现接口
package org.smile.pager;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.smile.db.PageModel;
/**
* 分页参数
* @author strive
*
*/
public interface Pager {
public HttpServletRequest getRequest();
public int getPage();
public int getSize();
public void commitResult(PageModel pageModel);
public Map getParameterMap();
}
这里我使用的数据库是HSQL 所以数据查询的方言指定Dialect.HSQL;
return PagerQueryUtils.queryPageSQL ( ds .getConnection(),sql.toString(),pager,Dialect. HSQL );
JspTagsPager只是指定了一个request,所以此查询的每页显示的数据也是跟据request中的参数改变的
userService .queryAllUser( new JspTagsPager( request ));
如果不想让每页显示的条数随着request中提交参数改变 ,那么就为它指定一个每页显示条数,那么就使用:
userService .queryAllUser( new JspTagsPager( request ,20));
<pg:common /> 是提供了一个通用的分页工具条 :
可以通过参数来配置哪此是要显示的内容(此例子的结果是显示了所有的内容)
参数有以下几个:
/**
* 是否存在首页和末页
*/
private boolean hasFirstLast=true;
/**
* 是否存在前一页和后一页
*/
private boolean hasPrevNext=true;
/**
* 是否存在页码
*/
private boolean hasPages=true;
/**
* 第一个页面、最后一个页码 与中间页面集合 的省略间距
*/
private int omitCount=0;
/**
* 是否存在第一个页码和最后一个页码
*/
private boolean hasPageFirstLast=true;
/**
* 是否存在详细信息
*/
private boolean hasDescript=true;
private String firstHtml="首页";
private String lastHtml="末页";
private String prevHtml="上一页";
private String nextHtml="下一页";
private String currentHtml="<font color=\"red\">{0}</font>";
private String description=" 当前是{0}/{1}页 共{2}条数据 每页显示{3}条 当前显示第{4}至第{5}条";
/**
* 是否动态隐藏 首页、前一页 ……
*/
private boolean dynamicHide=false;
比如 要让首页显示的是一个图片,而不是文字 刚可以 :
<pg:common firstHtml="<img src='${path}/images/table_buttom_first.gif'/>" />
这样就可以把首页这个链接变成一个图片了。
如果不要显示首页和末页的链接:
<pg:common hasFirstLast="false" />
设置descript 来改变描述文字:
<pg:common descript="total:{2} show{4} to {5}" />
可以通过参数设置,和多种标签灵活运用,可以构建出自己想要的分页条。
当然我们还可以不使用common这个标签而使用定制页面:
<pg:pager url="${path} /jsp/queryAllUserAction.do" maxPageItems="${pageModel.size}" items="${pageModel.total}" export="currentPageNumber=pageNumber" maxIndexPages="7">
<pg:first>
<a href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }"><img src="${path}
/images/tzgg_page_left.gif" alt="前一页" /></a>
</pg:prev>
<pg:pageFirst>
<a href="${pageUrl}">${pageNumber }</a>...
</pg:pageFirst>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber eq pageNumber }">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:pageLast >
...<a href="${pageUrl }">${pageNumber }</a>
</pg:pageLast>
<pg:next>
<a href="${pageUrl }"><img src="${path}
/images/tzgg_page_right.gif" alt="后一页" /></a>
</pg:next>
<pg:last>
<a href="${pageUrl }">尾页</a>
</pg:last>
当前是第 ${pageModel.page}/${pageModel.totalPages } 页 共 ${pageModel.totals} 条数据
</pg:pager>
有时候我们需求传递一些查询参数到后台,可以使用 <pg:param /> 和<pa:params /> 标签来实现
<pg:pager url="${path} /jsp/queryAllUserAction.do" maxPageItems="${pageModel.size}" items="${pageModel.total}">
<pg:param name="name" value="${name}"/>
<pg:common />
</pg:pager>
或者
<pg:pager url="${path} /jsp/queryAllUserAction.do" maxPageItems="${pageModel.size}" items="${pageModel.total}">
<pg:params paramMap="${queryParam}"/>
<pg:common />
</pg:pager>
queryParam 是一个封闭了查询参数的map 如 {name=胡,age=14}
【smile-1.0.jar下载】http://hzs0502030128.iteye.com/blog/1471505