论坛首页 入门技术论坛

pager-taglib 使用说明

浏览 4526 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-28   最后修改:2010-03-28

1、拷贝pager-taglib.jar包
2、在JSP页面中使用taglib指令引入pager-taglib标签库
3、使用pager-taglib标签库进行分页处理

 

 

传两个值进去:1、pm.totles总记录数 2、pagesize 每页显示页数 3、<pg:param name="parentId"/>传给后台的变量值对(查询条件)

    <!-- 可以在这里插入分页导航条 -->
            
            
            
<pg:pager url="org.action" items="${pm.totles}"  export="currentPageNumber=pageNumber" maxPageItems="${pagesize}">
					<pg:param name="parentId"/>
					
					 
					<pg:first>
						<a href="${pageUrl}">首页</a>
					</pg:first>
					<pg:prev>
						<a href="${pageUrl}">前页</a>
					</pg:prev>
					<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:next>
						<a href="${pageUrl}">后页</a>
					</pg:next>
					<pg:last>
						<a href="${pageUrl}">尾页</a>
					</pg:last>
</pg:pager>  

 

struts2的配置文件 变量拦截器中添加 pager\.offset 这个值是页面标签传给后台进行分页的

 <interceptor-ref name="params">
                  <param name="excludeParams">dojo\..*,^struts\..*,pager\.offset</param>
                </interceptor-ref>

 

 

 定义一个获取分页所需变量的拦截器 获取pagesize 每页数 与 开始记录数pager.offset

 

public class PagerInterceptor extends AbstractInterceptor{

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		

		SystemContext.setOffset(getOffset());
		SystemContext.setPageSize(getPagesize());
		
		

		try{
			return invocation.invoke();
		}finally{
			SystemContext.removeOffset();
			SystemContext.removePagesize();
		}
		
		
		
	}

	
	private int getOffset(){
		int offset = 0;
		
		try {
			offset = Integer.parseInt(ServletActionContext.getRequest().getParameter("pager.offset"));
		} catch (Exception ignore) {
		}
		return offset;
	}
	
	private int getPagesize(){
	int pagesize = 0;
		
		try {
			pagesize = Integer.parseInt(ServletActionContext.getRequest().getParameter("pagesize"));
		} catch (Exception ignore) {
		}
		
		if(pagesize==0){
			
			pagesize=10;
			
		}
	//	System.out.println(pagesize);
		return pagesize;
	}

}

 

上面使用了两个ThreadLocal 变量 存储上面的两个值

 

public class SystemContext {
	
	public static ThreadLocal offset = new ThreadLocal();
	
	public static ThreadLocal pageSize = new ThreadLocal();
	
	public static int DEFAULT_PAGE_SIZE= 10; 

	public static  void setOffset(int _offset){
		
		offset.set(_offset);
		
	}

	public static int getOffset(){
		
		Integer _offset = (Integer)offset.get();
		
		if( _offset ==null){
			
			_offset=0;
		}
		 
		 return _offset;
	}
	
	public static void removeOffset(){
		offset.remove();
	}
	
	
	public static void setPageSize(int _pageSize){
		
		pageSize.set(_pageSize);
	}
	
	public static int getPageSize(){
		
		Integer _pageSize= (Integer)pageSize.get();
		
		if( _pageSize ==null){
			
			_pageSize=DEFAULT_PAGE_SIZE;
		}
		 
		 return _pageSize;
	 
	}
	
	public static void removePagesize(){
		pageSize.remove();
	}
}

 

 

 

 

  通过从threadlocal 中获取分页所需的变量,就可以在业务类中获取这两个变量,避免了在每个action中传值的麻烦

public class BaseManager extends HibernateDaoSupport {

...



PageMode searchOrgs(String hql, Object[] objects){
...		
		int offset  = SystemContext.getOffset();
		int pageSize = SystemContext.getPageSize();
		
...
	List datas =   query.setFirstResult(offset).setMaxResults(pageSize).list();
...
}


}

 

 

 

 

 

 

 

  为了使用方面将上面的分页标签页面提取出公共的部分

<body>
<pg:pager items="1001" maxPageItems="33" maxIndexPages="20" export="currentPageNumber=pageNumber">
	<pg:first>
		<a href="${pageUrl }">首页</a>
	</pg:first>
	<pg:prev>
		<a href="${pageUrl }">前页</a>
	</pg:prev>
	<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:next>
		<a href="${pageUrl }">下页</a>
	</pg:next>
	<pg:last>
		<a href="${pageUrl }">尾页</a>
	</pg:last>
</pg:pager>
</body>

 

   需要分页的页面只需如下调用:将url 传进去

 

	    <!-- 可以在这里插入分页导航条 -->
   <s:include value="/common/pager.jsp">
  	  <s:set var="url" value="'org.action'"/>
 	   <s:set var="params" value="#{'parentId':null}"/>
   </s:include>

 

 

 

pg:pager【这个标签用来设置分页的总体参数】重要参数说明:
 url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数
 items:总记录数,pager标签正是根据这个值来计算分页参数的
 maxPageItems:每页显示的行数,默认为10
 maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10
 
pg:first【第一页的标签】重要参数说明:
 export变量的意义:
 pageUrl - 分页链接URL地址(最重要的export参数)
 pageNumber - 页码
 firstItem - 首页第一行的索引值
 lastItem - 首页最后一行的索引值
 
pg:pre【上一页标签】重要参数说明:
 export变量的意义:
 pageUrl - 分页链接URL地址(最重要的export参数)
 pageNumber - 页码
 firstItem - 前页第一行的索引值
 lastItem - 前页最后一行的索引值

pg:next【下一页标签】重要参数说明:
 export变量的意义:
 pageUrl - 分页链接URL地址(最重要的export参数)
 pageNumber - 页码
 firstItem - 下页第一行的索引值
 lastItem - 下页最后一行的索引值
 
pg:last重要参数说明:
 export变量的意义:
 pageUrl - 分页链接URL地址(最重要的export参数)
 pageNumber - 页码
 firstItem - 尾页第一行的索引值
 lastItem - 尾页最后一行的索引值
 
pg:pages【这个标签用来循环输出页码信息】重要参数说明:
 export变量的意义:
 pageUrl - 分页链接URL地址(最重要的export参数)
 pageNumber - 页码
 firstItem - pageNumber这个页码指定的那一页的第一行的索引值
 lastItem - pageNumber这个页码指定的那一页的最后一行的索引值

 

 

   发表时间:2010-09-17  
我在使用的时候会报错,请教一下:
(1)如果有maxPageItems="${pagesize}"这句会出现 500 \by 0的错误。
(2)如果删掉后上面那行会出现
Error setting expression 'pager.offset' with value '[Ljava.lang.String;@c7e8af'
ognl.OgnlException: target is null for setProperty(null, "offset", [Ljava.lang.String;@c7e8af)

另外我的配置文件

<interceptors>
      <!-- 定义拦截器 -->
      <interceptor name="pagerInerceptor" class="tsinghua.weblab.common.PagerInterceptor"/>
    </interceptors>

<action name="patentsList" class="struts2.action.PatentsListAction">
  <result name="success">PatentsList.jsp</result>
  <interceptor-ref name="params">
        <param name="excludeParams">dojo\..*,^struts\..*,pager\.offset</param>
      </interceptor-ref>
      <interceptor-ref name="pagerInerceptor"/>
</action>
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics