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