小弟又懒又笨所以不是特别熟悉ssh因为觉得hibernate太难上手、spring又没仔细学所以只掌握了struts2,不过应该还是会对大家有很多帮助吧。
OK,言归正传,taglib分页有俩种一种是适合搜索数据量不大的假分页情况,另一种是适合大数据量查询下的真分页。下面将用我的实例进行介绍哈~
一、假分页,加分页就是每次请求所有的检索数据放到jsp里但是由taglib帮你分页控制
1.首先在首页输入查询信息,数据存在model:StandardInformation 里,跳转入querystandards()方法
<img src="https://img-blog.youkuaiyun.com/20141202164835375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWF4bGR3eQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
2.Action中方法1:
private StandardInformation standardInformation;//标准 模板
private List<StandardInformation> standardInformationList;//标准 模板列表
<span style="white-space:pre"> </span>//收集 标准检索信息 后 检索并显示到检索页面
public String querystandards() throws Exception{
String resource = "com/mybatis/configure/configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
try {
ActionContext ac = ActionContext.getContext();
<span style="white-space:pre"> </span>ac.getSession().put("mybean",standardInformation);//在结果页进行分页时保存的初始查询条件
Inter inter=session.getMapper(Inter.class);
standardInformationList = inter.selectListWithoutDate(standardInformation);
System.out.println("查询标所有准信息!");
}
} catch (Exception e) {
e.printStackTrace();
return ERROR;
} finally {
session.close();
}
return "SUCCESSSELECT";
}
3.mybatis的接口inter和struts.xml我就不写了哈,相信大家都懂
4.数据库sql,根据填入条件去数据库检索相对应的数据
<select id="selectListWithoutDate" resultMap="resultListStandards">
SELECT * FROM standards
WHERE StandardNo LIKE CONCAT('%',#{standardInformation.StandardNo},'%')
AND StandardName LIKE CONCAT('%',#{standardInformation.StandardName},'%')
AND ReleaseInstitution LIKE CONCAT('%',#{standardInformation.ReleaseInstitution},'%')
AND DepartmentsUnit LIKE CONCAT('%',#{standardInformation.DepartmentsUnit},'%')
AND DraftUnit LIKE CONCAT('%',#{standardInformation.DraftUnit},'%')
AND ReplaceStandardNo LIKE CONCAT('%',#{standardInformation.ReplaceStandardNo},'%')
AND Remarks LIKE CONCAT('%',#{standardInformation.Remarks},'%')
</select>
5.jsp界面
首先必须放入
<%@taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="/struts-tags" prefix="s" %>
之后是taglib标签
<table class="table table-bordered table-hover" width="980px">
<thead>
<tr style="background-color:#E6E6E6;">
<td class="my_text1" align="center" style="width:7%;">序号</td>
<td class="my_text1" align="center" style="width:15%;">标准号</td>
<td class="my_text1" align="center" style="width:27%;">标准名称</td>
<td class="my_text1" align="center" style="width:43%;">发布机构</td>
<td class="my_text1" align="center" style="width:8%;">查看</td>
</tr>
</thead>
<tbody>
<pg:pager url="" maxPageItems="15" maxIndexPages="7" export="pageOffset,currentPageNumber=pageNumber" scope="request" index="center">
<s:iterator value="standardInformationList" id="sil" status="q">
<pg:item>
<tr style="background-color:#EDEDED;">
<td class="my_text2" align="center" style="width:3%;"><s:property value="#q.count"/></td>
<td class="my_text2" align="center" style="width:15%;"><s:property value="#sil.StandardNo"/></td>
<td class="my_text2" align="center" style="width:30%;"><s:property value="#sil.StandardName"/></td>
<td class="my_text2" align="center" style="width:45%;"><s:property value="#sil.ReleaseInstitution"/></td>
<td class="my_text2" align="center" style="width:7%;">
<a target="_blank" href="checkstandard?standarID=<s:property value="#sil.ID"/>">
<button type="button" style="width:43px;height:23px;background:url(images/chakan.png) no-repeat;border-radius:8px;"></button>
</a>
</td>
</tr>
</pg:item>
</s:iterator>
<tr style="background-color:#fff;">
<td colspan="5" align="center" class="check_text2">
共"<s:property value="standardInformationList.size()"/>"条数据
<pg:index>
<pg:first export="firstPageUrl=pageUrl" unless="current"><a href="javascript:paglib('<%= firstPageUrl %>')">第一页</a></pg:first>
<pg:prev export="prevPageUrl=pageUrl"><a href="javascript:paglib('<%= prevPageUrl %>')">上一页</a></pg:prev>
<pg:pages><%
if (pageNumber == currentPageNumber) {
%> <b>[<%= pageNumber %>]</b> <%
} else {
%> <a href="javascript:paglib('<%= pageUrl %>')">[<%= pageNumber %>]</a> <%
}
%>
<!-- <a href="${pageUrl}">[<%=pageNumber%>]</a> -->
</pg:pages>
<pg:next export="nextPageUrl=pageUrl"><a href="javascript:paglib('<%= nextPageUrl %>')">下一页</a></pg:next>
<pg:last export="lastPageUrl=pageUrl" unless="current"><a href="javascript:paglib('<%= lastPageUrl %>')">最后一页</a></pg:last>
</pg:index>
</td>
</tr>
</pg:pager>
</tbody>
</table>
<form name="form1" id="form1" action="pagerstandards" method="post"></form>
js:
加js的目的是为了在点击分页时跳到action的另一个方法中,所以用js做了链接地址的修改
<script language="javascript" type="text/javascript">
function paglib(pageurl){
document.getElementById("form1").action='pagerstandards'+pageurl;
document.getElementById("form1").submit();
}
</script>
pg:pager中的url就是请求地址,跳转你要去的方法
maxPageItems="15"说明每页显示最多15条
maxIndexPages="7"是当分页数量大于7时当前页面只显示7页
export="pageOffset,currentPageNumber=pageNumber"表示把pageNumber赋值
index="center"是分页栏的样式
scope="request"表示从request中存取
如上,你只要把你要显示的数据放入<pg:item>中,<pg:index>内容复制,然后一起装入<pg:pager>就已经大功告成了
6..Action中方法2:其实和上面一样只不过是从session中取出之前存入的 检索模板//分页时用的 检索 方法
public String pagerstandards() throws Exception{
HttpSession hs=ServletActionContext.getRequest().getSession();//---得到Session
standardInformation =(StandardInformation) hs.getAttribute("mybean");
String resource = "com/mybatis/configure/configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
try {
Inter inter=session.getMapper(Inter.class);
standardInformationList = inter.selectListWithoutDate(standardInformation);
System.out.println("查询标所有准信息!");
}
} catch (Exception e) {
e.printStackTrace();
return ERROR;
} finally {
session.close();
}
return "SUCCESSSELECT";
}
7,检索页面展示
8,.小bug
这是你会发现后台老是报pager.offset null的错误,这是因为传入url为pagerstandards?pager.offset=页码数 而后台没有接受它,实际上也不用管它但是每次都报错真的很烦。
解决方法:建立类Pager,
public class Pager {
private int offset;//当前页面
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
}
action中声明并且getset一下就解决了 private Pager pager;
二、真分页,也就是数据库分页,也是很容易的。
1.页面同上
2.action方法1中加入Offset和pageItems,并通过sql取出索引数据的记录数
private StandardInformation standardInformation;//标准 模板
private List<StandardInformation> standardInformationList;//标准 模板列表
private String standarID;//查询用的 标准ID
private Pager pager;//接收offset参数的类
private int total;//查询数据的总记录数
private int pageItems = 15;//每页查询条数15
//收集 标准检索信息 后 检索并显示到检索页面
public String querystandards() throws Exception{
String resource = "com/mybatis/configure/configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
try {
ActionContext ac = ActionContext.getContext();
ac.getSession().put("mybean",standardInformation);
pager = new Pager();
Inter inter=session.getMapper(Inter.class);
//ReleaseDate
total = inter.countWithoutDate(standardInformation);//索引数据的记录数
standardInformationList = inter.selectListWithoutDate(standardInformation,pager.getOffset(),pageItems);
System.out.println("查询标所有准信息!");
} catch (Exception e) {
e.printStackTrace();
return ERROR;
} finally {
session.close();
}
return "SUCCESSSELECT";
}
3.接口引入了StandardInformation类,和offset、pageItems参数,使用注解
public List<StandardInformation> selectListWithoutDate(@Param("standardInformation")StandardInformation standardInformation,@Param("offset")int offset,@Param("pageItems")int pageItems);
4.数据库sql,带上offset,和pageItems就可以了,由于引入了多个参数,所以要去掉parameterType,参数变成#{standardInformation.StandardNo}、#{offset}、#{pageItems}
<select id="selectListWithoutDate" resultMap="resultListStandards">
SELECT * FROM standards
WHERE StandardNo LIKE CONCAT('%',#{standardInformation.StandardNo},'%')
AND StandardName LIKE CONCAT('%',#{standardInformation.StandardName},'%')
AND ReleaseInstitution LIKE CONCAT('%',#{standardInformation.ReleaseInstitution},'%')
AND DepartmentsUnit LIKE CONCAT('%',#{standardInformation.DepartmentsUnit},'%')
AND DraftUnit LIKE CONCAT('%',#{standardInformation.DraftUnit},'%')
AND ReplaceStandardNo LIKE CONCAT('%',#{standardInformation.ReplaceStandardNo},'%')
AND Remarks LIKE CONCAT('%',#{standardInformation.Remarks},'%')
LIMIT #{offset},#{pageItems}
</select>
<pre name="code" class="sql">//这个用来取出查询出来的总记录数量
<select id="countWithoutDate" parameterType="StandardInformation" resultType="int">
SELECT COUNT(*) FROM standards
WHERE StandardNo LIKE CONCAT('%',#{StandardNo},'%')
AND StandardName LIKE CONCAT('%',#{StandardName},'%')
AND ReleaseInstitution LIKE CONCAT('%',#{ReleaseInstitution},'%')
AND DepartmentsUnit LIKE CONCAT('%',#{DepartmentsUnit},'%')
AND DraftUnit LIKE CONCAT('%',#{DraftUnit},'%')
AND ReplaceStandardNo LIKE CONCAT('%',#{ReplaceStandardNo},'%')
AND Remarks LIKE CONCAT('%',#{Remarks},'%')
</select>
5.jsp界面
标签引入不变,不同的是要加入el表达式来解决传给pager的总条数
所以多加一句
<%@ page isELIgnored="false" %>
taglib标签 <pg:pager>的位置换了大家注意下
<table class="table table-bordered table-hover" width="980px">
<thead>
<tr style="background-color:#E6E6E6;">
<td class="my_text1" align="center" style="width:7%;">序号</td>
<td class="my_text1" align="center" style="width:15%;">标准号</td>
<td class="my_text1" align="center" style="width:27%;">标准名称</td>
<td class="my_text1" align="center" style="width:43%;">发布机构</td>
<td class="my_text1" align="center" style="width:8%;">查看</td>
</tr>
</thead>
<tbody>
<s:iterator value="standardInformationList" id="sil" status="q">
<tr style="background-color:#EDEDED;">
<td class="my_text2" align="center" style="width:3%;"><s:property value="#q.count"/></td>
<td class="my_text2" align="center" style="width:15%;"><s:property value="#sil.StandardNo"/></td>
<td class="my_text2" align="center" style="width:30%;"><s:property value="#sil.StandardName"/></td>
<td class="my_text2" align="center" style="width:45%;"><s:property value="#sil.ReleaseInstitution"/></td>
<td class="my_text2" align="center" style="width:7%;">
<a target="_blank" href="checkstandard?standarID=<s:property value="#sil.ID"/>">
<button type="button" style="width:43px;height:23px;background:url(images/chakan.png) no-repeat;border-radius:8px;"></button>
</a>
</td>
</tr>
</s:iterator>
<pg:pager url="pagerstandards" maxPageItems="15" maxIndexPages="7" items="${total}" export="pageOffset,currentPageNumber=pageNumber" scope="request" index="center">
<tr style="background-color:#fff;">
<td colspan="5" align="center" class="check_text2">
共"<s:property value="total"/>"条数据
<pg:index>
<pg:first export="firstPageUrl=pageUrl" unless="current"><a href="<%= firstPageUrl %>"><font color="gray">第一页</font></a></pg:first>
<pg:prev export="prevPageUrl=pageUrl"><a href="<%= prevPageUrl %>"><font color="gray">上一页</font></a></pg:prev>
<pg:pages><%
if (pageNumber == currentPageNumber) {
%> <b>[<%= pageNumber %>]</b> <%
} else {
%><a href="<%= pageUrl %>"><font color="gray">[<%= pageNumber %>]</font></a> <%
}
%>
</pg:pages>
<pg:next export="nextPageUrl=pageUrl"><a href="<%= nextPageUrl %>"><font color="gray">下一页</font></a></pg:next>
<pg:last export="lastPageUrl=pageUrl" unless="current"><a href="<%= lastPageUrl %>"><font color="gray">最后一页</font></a></pg:last>
</pg:index>
</td>
</tr>
</pg:pager>
</tbody>
</table>
<pg:pager>只要内多加了一条记录数items="${total}"用来给taglib计算分页,然后其内不包括所取数据,因为数据咱们已经通过sql只取出15条了就不需要再加限制了
6.点击分页后跳入action方法2
//分页时用的 检索 方法
public String pagerstandards() throws Exception{
HttpSession hs=ServletActionContext.getRequest().getSession();//---得到Session
standardInformation =(StandardInformation) hs.getAttribute("mybean");
String resource = "com/mybatis/configure/configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = ssf.openSession();
try {
Inter inter=session.getMapper(Inter.class);
total = inter.countWithoutDate(standardInformation);//索引数据的记录数
standardInformationList = inter.selectListWithoutDate(standardInformation,pager.getOffset(),pageItems);
System.out.println("查询标所有准信息!");
System.out.println(pager.getOffset());
} catch (Exception e) {
e.printStackTrace();
return ERROR;
} finally {
session.close();
}
return "SUCCESSSELECT";
}
好了,页面展示同上,只不过通过数据库分页的方法保证了大数据量查询时候的速度
还有,为什么我要写俩个action呢?
因为从主页查询数据后,查询结果页面上就会清空 检索条件StandardInformation,这样在点击分页后我就不能查询出上次的结果了,所以在方法1中把 检索 条件存入session中,再在方法2取出进行检索。
如果有人知道怎么让一个bean在俩个action之间传递记得告诉我哈~谢谢