分页功能学习笔记(Struts2+jsp)

本文介绍了一种基于Struts2框架的分页实现方法,详细讲解了DAO层、Action层及JSP页面的实现过程,并附带示例代码。
这里的分页主要用到了jstl标签,
框架是struts2


个人在做的过程中犯过的错误:
在Action中忘记写totalPage的get和set方法,导致jsp接收不到数据没显示.


个人认为在不理解的时候看图理解流程思路清晰后更好。


下面是图和部分主要代码(老师的):
代码写的顺序:DAO->Action->jsp




//DAO:
public class CostDAOImpl implements ICostDAO{

	public List<Cost> findAll() throws DAOException {
		List<Cost> list = new ArrayList<Cost>();
		String sql = "select * from COST";
		Connection con = DBUtil.getConnection();
		
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			while(rs.next()){
				Cost c = createCost(rs);
				list.add(c);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException("查询全部资费数据失败!", e);
		}finally{
			DBUtil.close(con);
		}
		
		return list;
	}
	
	private Cost createCost(ResultSet rs) throws SQLException{
		
		Cost c = new Cost();
		c.setId(rs.getInt("id"));
		c.setName(rs.getString("name"));
		c.setBaseDuration(rs.getInt("base_duration"));
		c.setBaseCost(rs.getDouble("base_cost"));
		c.setUnitCost(rs.getDouble("unit_cost"));
		c.setStatus(rs.getString("status"));
		c.setDescr(rs.getString("descr"));
		c.setCreateTime(rs.getDate("creatime"));
		c.setStartTime(rs.getDate("startime"));
		c.setCostType(rs.getString("cost_type"));
		
		
		return c;
	}
	
	public List<Cost> findByPage(Integer page, Integer pageSize)
			throws DAOException {
		List<Cost> list = new ArrayList<Cost>();
		String sql = "select * from (" +
				" select c.*, rownum r from cost c" +
				") where r>? and r<?";
		Connection con = DBUtil.getConnection();
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			//小于下一页的最小行
			int nextMin = page*pageSize + 1;
			//大于上一页的最大行
			int lastMax = (page-1)*pageSize;
			ps.setInt(1, lastMax);
			ps.setInt(2, nextMin);
		
			ResultSet rs = ps.executeQuery();
			while(rs.next()){
				Cost c = createCost(rs);
				list.add(c);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException("分页查询资费数据失败!", e);
		}
		return list;
	}

	public Integer findTotalpage(Integer pageSize) throws DAOException {
		//查询总行数
		String sql = "select count(*) from cost";
		Connection con = DBUtil.getConnection();
		
		try {
			PreparedStatement ps = con.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				//根据总行数计算总页数
				int rows = rs.getInt(1);
				if(rows%pageSize == 0){
					return rows/pageSize;
				}else{
					return rows/pageSize + 1;
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException("查询总行数失败", e);
		}finally{
			DBUtil.close(con);
		}
		return 0;
	}
}


//Action:
public class FindCostAction {
	//页容量,默认为5
	private Integer pageSize = 5;
	
	//input
	//页码默认为1
	private Integer page = 1;
	//output
	private List<Cost> costs;
	private Integer totalPage;
	
	/*
	 * 业务方法查询每一页的数据
	 */
	public String execute(){
		ICostDAO dao = DAOFactory.getCostDAO();
		try {
			costs = dao.findByPage(page, pageSize);
			totalPage = dao.findTotalpage(pageSize);
		} catch (DAOException e) {
			e.printStackTrace();
			return "error";
		}
		return "success";
	}

	public List<Cost> getCosts() {
		return costs;
	}

	public void setCosts(List<Cost> costs) {
		this.costs = costs;
	}

	public Integer getPageSize() {
		return pageSize;
	}

	public void setPageSize(Integer pageSize) {
		this.pageSize = pageSize;
	}

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(Integer totalPage) {
		this.totalPage = totalPage;
	}	
}


Jsp:
<c:choose>
                		<c:when test="${page==1 }">
                			<a href="#">上一页</a>
                		</c:when>
                		<c:otherwise>
                			<a href="findCost?page=${page-1 }">上一页</a>
                		</c:otherwise>
                	</c:choose>
        	        
                    <c:forEach begin="1" end="${totalPage}" var="k">
                    	<c:choose>
                    		<c:when test="${k==page }">
                    			<!-- 当连接的地址和浏览器中URL的namespace一致时,namespace及其之前
                    			的内容可以省略,这是相对路径的写法 -->
                    			<a href="findCost?page=${k }" class="current_page">${k }</a>
                    		</c:when>
                    		<c:otherwise>
                    			<a href="findCost?page=${k }">${k }</a>
                    		</c:otherwise>
                    	</c:choose>
                    </c:forEach>
                    
                    <c:choose>
                    	<c:when test="totalPage">
                    		<a href="#">下一页</a>
                    	</c:when>
                    	<c:otherwise>
                    		<a href="findCost?page=${page+1 }">下一页</a>
                    	</c:otherwise>
                    </c:choose>

用OGNL表达式写的Jsp:

注意加标签库

<%@taglib uri="/struts-tags" prefix="s"%>
                       <s:iterator value="costs">           
                        <tr>
                            <td><s:property value="id"/></td>
                            <td><a href="fee_detail.html"><s:property value="name"/></a></td>
                            <td><s:property value="baseDuration"/></td>
                            <td><s:property value="baseCost"/></td>
                            <td><s:property value="unitCost"/></td>
                            <td><s:property value="createTime"/></td>
                            <td><s:property value="startTime"/></td>
                            <td>
								<s:if test="status==0">开通</s:if>
								<s:else>暂停</s:else>
							</td>
                            <td>                                
                                <input type="button" value="启用" class="btn_start" onclick="startFee();" />
                                <input type="button" value="修改" class="btn_modify" onclick="location.href='fee_modi.html';" />
                                <input type="button" value="删除" class="btn_delete" onclick="deleteFee();" />
                            </td>
                        </tr>
                        </s:iterator>

                    <s:if test="page==1"><a href="#">上一页</a></s:if>
                	<s:else>
                		<a href="findCost?page=<s:property value="page-1"/>">上一页</a>
                	</s:else>
        	        
                    <s:iterator begin="1" end="totalPage" var="k">
                    	<s:if test="page==#k"><a href="findCost?page=<s:property value="#k"/>" class="current_page">
                    	<s:property value="#k"/></a></s:if>
                    	<s:else><a href="findCost?page=<s:property value="#k"/>"><s:property value="#k"/></a></s:else>
                    </s:iterator>
                    
                    <s:if test="page==totalPage"><a href="#">下一页</a></s:if>
                    <s:else><a href="findCost?page=<s:property value="page+1"/>">下一页</a></s:else>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值