pager taglib+struts2+mybatis真假分页的实现

小弟又懒又笨所以不是特别熟悉ssh因为觉得hibernate太难上手、spring又没仔细学所以只掌握了struts2,不过应该还是会对大家有很多帮助吧。

OK,言归正传,taglib分页有俩种一种是适合搜索数据量不大的假分页情况,另一种是适合大数据量查询下的真分页。下面将用我的实例进行介绍哈~

一、假分页,加分页就是每次请求所有的检索数据放到jsp里但是由taglib帮你分页控制

1.首先在首页输入查询信息,数据存在model:StandardInformation 里,跳转入querystandards()方法

<img src="https://img-blog.csdn.net/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之间传递记得告诉我哈~谢谢







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值