分页(struts2+hibernate+标签)

web.xml的配置:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<!-- 配置自定义分页标签类 -->
	<jsp-config>
		<taglib>
			<taglib-uri>ambow</taglib-uri>
			<taglib-location>/WEB-INF/ambow.tld</taglib-location>
		</taglib>
	</jsp-config>

	
</web-app>

 ambow.tld标签的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
   <tlib-version>2.2.3</tlib-version>
   <jsp-version>1.2</jsp-version>
   <short-name>Ambow Common Taglib</short-name>
   <uri>/ambow</uri>
   <tag>
      <name>pagination</name>
        <tag-class>com.anbow.budget.core.util.PaginationTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
           <name>actionName</name>
           <required>true</required>
           <rtexprvalue>false</rtexprvalue>
        </attribute>
	    <attribute>
           <name>total</name>
           <required>true</required>
           <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
           <name>num</name>
           <required>true</required>
           <rtexprvalue>true</rtexprvalue>
        </attribute>
	    <attribute>
           <name>catalogId</name>
           <required>false</required>
           <rtexprvalue>true</rtexprvalue>
        </attribute>
	    <attribute>
           <name>orderByItem</name>
           <required>false</required>
           <rtexprvalue>true</rtexprvalue>
        </attribute>
	    <attribute>
           <name>otherParams</name>
           <required>false</required>
           <rtexprvalue>true</rtexprvalue>
        </attribute>
   </tag>
</taglib>


标签类page.java

package com.anbow.budget.core.util;

import java.util.ArrayList;
import java.util.Collection;

/**
 * 代表一个页面显示数据的类,重点包含
 * 1、每页显示数据条数
 * 2、是否是开始页
 * 3、是否是结束页
 * 4、当前页
 * 5、总页数
 * @author liulili
 */
public class Page {
	
	private static int DEFAULT_PAGE_SIZE = 4;
	private int pageSize;//分页数
	private long start;//开始分页的纪录数
	
	//告诉编译器,不需要对该属性或方法进行警告提示
	@SuppressWarnings("unchecked")
	private Collection data;
	
	private long totalCount;

	@SuppressWarnings("unchecked")
	public Page() {
		this(0L, 0L, DEFAULT_PAGE_SIZE, new ArrayList(0));
	}

	/**
	 * 构造函数,给类的属性赋值
	 * @param start      当前页面数据的数据库开始索引
	 * @param totalSize  数据库表中数据的总数
	 * @param pageSize   一页显示数据的条数
	 * @param data       得到的当前页显示的数据对象
	 */
	@SuppressWarnings("unchecked")
	public Page(long start, long totalSize, int pageSize, Collection data) {
		this.pageSize = DEFAULT_PAGE_SIZE;

		this.pageSize = pageSize;
		this.start = start;
		this.totalCount = totalSize;
		this.data = data;
	}
	public Page(Collection data) {
		this.data = data;
	}

	public long getTotalCount() {
		return this.totalCount;
	}

	/**
	 * 得到当前数据库表中数据,在页面上能够显示多少页
	 * @return
	 */
	public long getTotalPageCount() {
		if (this.totalCount % this.pageSize == 0L)
			return (this.totalCount / this.pageSize);

		return (this.totalCount / this.pageSize + 1L);
	}

	public int getPageSize() {
		return this.pageSize;
	}

	@SuppressWarnings("unchecked")
	public Collection getResult() {
		return this.data;
	}

	@SuppressWarnings("unchecked")
	public void setResult(Collection date) {
		this.data = date;
	}

	public long getCurrentPageNo() {
		return (this.start / this.pageSize + 1L);
	}

	public boolean hasNextPage() {
		return (getCurrentPageNo() < getTotalPageCount());
	}

	public boolean hasPreviousPage() {
		return (getCurrentPageNo() > 1L);
	}

	public long getNextPageNo() {
		if (hasNextPage()) {
			return (getCurrentPageNo() + 1L);
		}

		return getCurrentPageNo();
	}

	public long getPreviousPageNo() {
		if (hasPreviousPage()) {
			return (getCurrentPageNo() - 1L);
		}

		return getCurrentPageNo();
	}

	public static int getStartOfPage(int pageNo, int pageSize) {
		return ((pageNo - 1) * pageSize);
	}

	protected static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
	}
	
	public long getStart() {
		return start;
	}

	public void setStart(long start) {
		this.start = start;
	}

	public Collection getData() {
		return data;
	}

	public void setData(Collection data) {
		this.data = data;
	}
	
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public void setTotalCount(long totalCount) {
		this.totalCount = totalCount;
	}

}


struts.xml和project.xml的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<constant name="struts.devMode" value="true"></constant>
	<constant name="struts.action.extension" value="jhtml"></constant>
				<include file="struts2/project.xml"></include>
	</struts>    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="project" extends="struts-default" namespace="/project">
	<!--project的Action -->
	<action name="projectaAtion" class="com.ambow.budget.action.project.ProjectAction">//actiond 的类
		<result name="project">/index.jsp</result>
	<result name="project_list" type="dispatcher">/project/project_list.jsp</result>//跳转页面
	</action>
	</package>	
</struts>   



projectAction.java:

package com.ambow.budget.action.project;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.ambow.budget.daoOption.depart.DepartmentDaoOption;
import com.ambow.budget.daoOption.project.ProjectDaoOption;
import com.ambow.budget.daoOption.worker.StaffDaoOption;
import com.ambow.budget.model.depart.Department;
import com.ambow.budget.model.project.Project;
import com.ambow.budget.model.staff.Staff;
import com.ambow.budget.service.project.ProjectService;
import com.anbow.budget.core.util.Page;
import com.opensymphony.xwork2.ActionSupport;

public class ProjectAction extends ActionSupport implements SessionAware,
		RequestAware {
	    //设置session和request的
	private Map<String, Object>request;
	private Map<String, Object>session;
	private ProjectService projectService=new ProjectService();
	private  int pageNo;//接收页面传来的当前页码
 	
	public int getPageNo() {
		return pageNo;
	}
	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}



		
		public Map<String, Object> getRequest() {
		return request;
	}
	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}
	public Map<String, Object> getSession() {
		return session;
	}
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}
	
	//分页
	public String pageOne()throws Exception{
		String path="";
		System.out.println("分页开始!");
		Page page=new Page();
		if(this.pageNo==0){
			this.pageNo=1;
		}
		System.out.println("...................pageNo :"+pageNo);
		
		//page=projectService.getProjectByPage(page.getStartOfPage(pageNo,page.getPageSize()), page.getPageSize());
		page=projectService.getProjectByPage(pageNo,page.getPageSize());
		System.out.println("....................data:"+page.getData());
		
		int count=(int) page.getTotalPageCount();
		int pageno=pageNo;
		System.out.println(".....................count="+count);
		System.out.println("pageno="+pageno);
		if(page!=null){
			request.put("project",page.getData());
			request.put("pageSize", 4);//分页显示的条数
			request.put("counts",count );//有多少行
			 request.put("pagesize", pageno );//当前页面
			 path="project_list";
		}
		return path;
		
	            }
	}

list.jsp页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.ambow.budget.model.project.Project"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib uri="ambow" prefix="am"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'project_list.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>

  
   <table width="100%" border="0" cellpadding="3" cellspacing="1">
   <tr>
      <td>项目名称</td>
      <td>负责人</td>
      <td>项目计划开始的时间</td>
      <td>项目计划结束时间</td>
      <td>实际开始时间</td>
      <td>实际结束时间</td>
      <td>预计成本</td>
      <td>项目实际成本</td>
      <td>备注</td>
   </tr>
   <c:forEach items="${requestScope.project}" var="project">
   <tr>
    <td>${project.projectName}</td>
      <td>${project.staff.staffName}</td>
      <td>${project.planStartTime}</td>
      <td>${project.planOverTime}</td>
      <td>${project.pactualStartTime}</td>
      <td>${project.pactualOverTime}</td>
      <td>${project.predictCost}</td>
      <td>${project.pactualCost}</td>
      <td>${project.pdescif}</td>
      </tr>
   </c:forEach>
   </table>
   <!--<table width='100%' class="tex004">
	<tr><td align='left'>
    	<span><a href="project/projectaAtion!page.jhtml">首页</a></span>
        <span><a href="project/projectaAtion!page1.jhtml?page=${pagesize }">上一页</a></span>
       <span><a href="project/projectaAtion!nest.jhtml?page=${pagesize }">下一页</a></span>
        
        
     <a href="project/projectaAtion!fpage.jhtml">  尾页</a>
	</td>
    <td  align='left' >共${counts}项第${pagesize }页
    
    </td></tr>
</table>
--><table width="100%" border="0" cellpadding="0" cellspacing="0"
				class="tablb">
				<tr class="titletop">
					<td>
					<!-- 对应的struts2的命名空间/对应的Action!对应的方法 -->
					<!--total是对应的是总的数据行数  -->
					<!-- num是当前页 -->
						<am:pagination actionName="project/projectaAtion!pageOne"
							
							 total="${counts}" 
        	                                                        num="${pagesize }" 
							otherParams="" />
					</td>
				</tr>
			</table>

  </body>
</html>


daoOption的部分代码:

public Page getProjectByPage(int page, int pageSize) {
		// TODO Auto-generated method stub
		page1.setData(gm.getMultiple(Project.class, page, pageSize));//从数据库得到数据放入page里
		page1.setTotalCount(gm.getMaxCount(Project.class));
		
		System.out.println(page);
		System.out.println(pageSize);
		gm.closeSession();
		return page1 ;
	}


分页的逻辑处理    :

package com.anbow.budget.core.util;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

@SuppressWarnings( { "serial", "unused" })
public class PaginationTag extends TagSupport {

	/** 处理分页的action path */
	private String actionName;

	/** 页面数 */
	private Integer total;

	/** 当前页码 */
	private Integer num;

	/** 分类的id */
	private Integer catalogId;

	/** 降序排序字段 */
	private String orderByItem;

	/** 其他参数,格式 &key1=value1&key2=value2 */
	private String otherParams;

	public void setActionName(String actionName) {
		this.actionName = actionName;
	}

	public void setOtherParams(String params) {
		this.otherParams = params;
	}

	public void setOrderByItem(String orderByItem) {
		this.orderByItem = orderByItem;
	}

	public String getActionName() {
		//user/userAction?id=22&name=sss
		int pos = actionName.indexOf("?");
		if (pos > 0) {
			actionName = actionName.substring(0, pos - 1);
		}
		System.out.println(actionName);
		return actionName+".jhtml";
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public void setCatalogId(Integer id) {
		catalogId = id;
	}

	public void setNum(Integer num) {
		this.num = num;
	}

	public int getPreviousPage() {
		if (num - 1 <= 0) {
			return 1;
		} else {
			return (num - 1);
		}
	}

	public int getNextPage() {
		if (num + 1 >= total) {
			return total;
		} else {
			return (num + 1);
		}
	}

	/**
	 * 产生类似如下的html代码 <div class="turn"><b><a href="#"><< 上一页</a></b><span>1</span>
	 * <a href="#">2</a><a href="#">3</a><b>...</b><a href="#">4</a> <a
	 * href="#">5</a><a href="#">6</a><a href="#">7</a><a href="#">8</a>
	 * <a href="#">9</a><a href="#">10</a><b><a href="#">下一页 >></a></b>
	 * </div>
	 * 
	 */
	public int doStartTag() throws JspException {
		StringBuffer sb = new StringBuffer();
		/*
		 * if (total > 1) { sb.append("<div class='turn'>"); sb.append("<b><a
		 * href='").append(getActionName())
		 * .append("?pageNo=").append(getPreviousPage()); if (catalogId != null) {
		 * sb.append("&catalogId=").append(catalogId); } if (orderByItem !=
		 * null) { sb.append("&orderByItem=").append(orderByItem); } if
		 * (otherParams != null) { sb.append(otherParams); } sb.append("'><<
		 * 上一页</a>"); } for (int i = 1; i <= total; i++) { if (total == 1) {
		 * break; } if (i == num) { sb.append("<span>").append(i).append("</span>");
		 * continue; }
		 * 
		 * if (num < 10 && i <= 10) { sb.append("<a
		 * href='").append(getActionName()).append( "?pageNo=").append(i); if
		 * (catalogId != null) { sb.append("&catalogId=").append(catalogId); }
		 * if (orderByItem != null) {
		 * sb.append("&orderByItem=").append(orderByItem); } if (otherParams !=
		 * null) { sb.append(otherParams); } sb.append("'>");
		 * sb.append(i).append("</a>"); if (i == 10) { break; } } else { if (i <=
		 * 2 || (i > num - 5 && i <= num + 4) || i > total - 2) { sb.append("<a
		 * href='").append(getActionName()).append( "?pageNo=").append(i); if
		 * (catalogId != null) { sb.append("&catalogId=").append(catalogId); }
		 * if (orderByItem != null) {
		 * sb.append("&orderByItem=").append(orderByItem); } if (otherParams !=
		 * null) { sb.append(otherParams); } sb.append("'>");
		 * sb.append(i).append("</a>"); } else { if (i > 2 && i < num) {
		 * sb.append("<b>...</b>"); i = num - 5; } else { if (i > num + 4 && i <=
		 * total - 2) { sb.append("<b>...</b>"); i = total - 2; } } } } } if
		 * (total > 1) { sb.append("<b><a href='").append(getActionName())
		 * .append("?pageNo=").append(getNextPage()); if (catalogId != null) {
		 * sb.append("&catalogId=").append(catalogId); } if (orderByItem !=
		 * null) { sb.append("&orderByItem=").append(orderByItem); } if
		 * (otherParams != null) { sb.append(otherParams); } sb.append("'>下一页 >></a></b>"); }
		 */
		if (total > 1) {
			sb.append("<tr class='titletop'> ");
			sb.append("<td width='1%'> </td>");
			sb.append("<td>");	
			sb.append("<form id='pageForm' action='" + getActionName()+ "' method='post'>");
			sb.append("<table width='100%' border='0' cellspacing='0' cellpadding='0'>");
			sb.append("<tr>");
			sb.append("<td bgcolor='#FFFFFF' class='TdRight'>");
			sb.append("<a href='javascript:page(1)'  class='tex04'");
			sb.append(">首页</a> | ");
			sb.append("<a href='javascript:page(" + getPreviousPage() + ") '  class='tex04'");
			sb.append(">上一页</a> | ");
			sb.append("<a href='javascript:page(" + getNextPage() + ")'  class='tex04'");
			sb.append(">下一页</a> | ");
			sb.append("<a href='javascript:page(" + total + ")'  class='tex04'");
			sb.append(">末页</a> ");
			sb.append("<input id='pageNo' name='pageNo' type='text' style='width:30px;' align='absmiddle' maxlength='3' value='"+num+"'>");
			sb.append("<input name='go' type='button' id='go' value='GO' align='absmiddle' οnclick='page(-1)'>");

			if (otherParams != null && !otherParams.equals("")) {
				String[] params = otherParams.split("&");
				String name = "";
				String value = "";
				for (String param : params) {
					name = param.split("=")[0];
					if (param.split("=").length > 1) {
						value = param.split("=")[1];
					}

					sb.append("<input type='hidden' name='" 
							+ name + "' value='" + value + "'>");
				}
			}
			sb.append("</td></tr></table></form></td></tr>");
			sb.append("<script>");
			sb.append("function page(toPageNo){");
			sb.append("if(toPageNo!='-1'){document.getElementById('pageNo').value = toPageNo;}");
			sb.append("if(!isPlus(document.getElementById('pageNo').value)){alert('请您输入大于0的数字');return;}");
			sb.append("if(document.getElementById('pageNo').value > " + total + "){alert('您输入的页数已经超过最大页数,最大页数是" + total + "');return;}");
			sb.append("document.getElementById('pageForm').submit();}");
			
			sb.append("function isPlus(value){");
			sb.append("ValidationExpression=/^[0-9]+$/;");
			sb.append("if (ValidationExpression.test(value))return true;");
			sb.append("return false;");
			sb.append("}");
			
			sb.append("</script>");
		}

		try {
			JspWriter out = pageContext.getOut();
			out.write(sb.toString());
			return EVAL_PAGE;
		} catch (IOException e) {
			throw new JspException(e);
		}

	}

	public String getOtherParams() {
		return otherParams;
	}

	
	
	
	
}



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值