<1>第一部分
<!--分页实现页面booklist.jsp-->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="/dang/css/common.css"/>
<link rel="stylesheet" type="text/css" href="/dang/css/book.css"/>
<title>图书列表</title>
</head>
<body>
<div class="container">
<!-- 页面顶部开始 -->
<div class="top">
<div class="header"><%@include file="/jsp/header.jsp"%></div>
<div class="menu"><%@ include file="/jsp/menu.jsp"%></div>
</div>
<!-- 页面顶部结束 -->
<!-- 页面中间部分开始 -->
<div class="middle">
<div class="left">
</div>
<div class="right">
<!-- 自定义内容开始 -->
<div class="booklist">
<!-- 在页面作用域中放置一个对象books -->
<c:set var="books" value="${pager.pageResult }"/>
<c:forEach items="${books }" var="book">
<!-- book begin -->
<div class="book">
<div class="cover">
<a href='dang/book/todetail.action?bid=${book.bookId }'>
<img src='/dang/images/bookcovers/${book.isbn }.jpg' alt="${book.introduction }" width="128" height="150" border="0"/></a>
</div>
<div class="detail">
<div class="title em">
<img src="/dang/images/promo.gif" alt="promo" align="middle"/>
<span><a href="/dang/book/todetail.action?bid=${book.bookId }">${book.title }</a></span>
</div>
<div class="more">
<span class="em">${book.author }</span>著/出版时间${book.pubDateString }/<span class="em">${book.publisher.pubName }</span><br/>
<p>
${book.introduction }
</p>
<!-- 操作区域开始 -->
<div class="operate">
<form action="/dang/cart/add.action?bid=${book.bookId }" method="post">
<span class="price1">¥
${book.price }
</span>
<span class="price2">¥
${book.dangPrice }
</span>
<input align="middle" type="image" src="/dang/images/btn_buy.gif" alt="购买">
</form>
</div>
<!-- 操作区域结束 -->
</div>
</div>
</div>
<!-- div book end -->
</c:forEach>
<div>
<div class="pager">
<form action="/dang/book/tolist.action" method="post">
总共-${pager.recordCount}-条记录 当前页:<font color="red">${ pager.pageNo}</font>/${pager.pageCount }
<c:if test="${pager.first }">
首页 上一页
</c:if>
<c:if test="${!pager.first }">
<a href="/dang/book/tolist.action?pageNo=${1}">首页</a>
<a href="/dang/book/tolist.action?pageNo=${pager.pageNo-1 }">上一页</a>
</c:if>
<c:if test="${pager.last }">
下一页 末页
</c:if>
<c:if test="${!pager.last }">
<a href="/dang/book/tolist.action?pageNo=${pager.pageNo+1 }">下一页</a>
<a href="/dang/book/tolist.action?pageNo=${pager.pageCount }">末页</a>
</c:if>
<input size="1" type="text" name="pageNo" id="pageNo" value="${ pager.pageNo}">
<input type="submit" value="go">
</form>
</div>
</div>
<!-- 自定义内容结束 -->
</div>
</div>
<!-- 页面中间部分结束 -->
</div>
</div>
</body>
</html>
<2>用实体类(domain)封装分页对象
package com.tarena.common.page;
import java.io.Serializable;
import java.util.List;
/**
* 分页类,封装与分页有关方法
* @author Jimmy
*
* @param <T> 泛型,用于存放需要进行分页的对象
*/
public class Pager<T> implements Serializable{
/**
*
*/
private static final long serialVersionUID = -916738496189705077L;
private int pageNo;//页码,从1开始
private int pageSize;//每页条数
private int recordCount;//总记录数
private int pageCount;//总页数,只读
private boolean first;//是否为第一页,只读
private boolean last;//是否为最后一页,只读
private List<T> pageResult;//当前分页数据
public Pager(){}
public Pager(int pageSize,int pageNo,int recordCount,List<T> pageResult){
this.pageSize = pageSize;
this.pageNo = pageNo;
this.recordCount = recordCount;
this.pageResult = pageResult;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public List<T> getPageResult() {
return pageResult;
}
public void setPageResult(List<T> pageResult) {
this.pageResult = pageResult;
}
public int getPageCount() {
int a = recordCount%pageSize;
int b = recordCount/pageSize;
pageCount = a==0 ? b : b+1;
return pageCount;
}
public boolean isFirst() {
first = pageNo == 1;
return first;
}
public boolean isLast() {
last = pageNo == pageCount;
return last;
}
}
<3>通过Struts2.0的Action对逻辑进行处理和转发
package com.tarena.dang.book.action;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.tarena.common.constant.Constants;
import com.tarena.common.page.Pager;
import com.tarena.dang.book.service.BookService;
import com.tarena.dang.book.service.BookServiceImpl;
import com.tarena.dang.domain.Book;
/**
* 实现对Book对象的数据处理和转发
* @author JimmyZhang
* @since 2012.5.10
*/
public class BookAction {
private BookService bookService;
private Book book;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public BookAction(){
bookService = new BookServiceImpl();
}
//显示图书列表以及实现分页功能
public String tolist() throws Exception{
System.out.println("调用【tolist】方法:");
//获取ActionContext对象
ActionContext ac = ActionContext.getContext();
//定义Pager对象
Pager<Book> pager = new Pager<Book>();
//接收请求参数pageNo
String[] values =
(String[])ac.getParameters().get("pageNo");
int pageNo = 1;
if(values!=null){
pageNo=Integer.parseInt(values[0]);
};
//获取pageNo的List<Book>,每页两条
List<Book> list = bookService.getBooks(pageNo,Constants.PAGE_SIZE);
//获取总记录数
int recordCount = bookService.getBooksCount();
//设置pager对象
pager.setPageNo(pageNo);//页码
pager.setPageSize(Constants.PAGE_SIZE);//每页大小
pager.setRecordCount(recordCount);//总记录数
pager.setPageResult(list);//分页数据
//将分页数据pager保存在request作用域中
ac.put("pager", pager);
System.out.println("【BookAction-tolist】获取第"+pageNo+"页的分页数据");
return "list";
}
//显示图书详细信息
public String todetail() throws Exception{
System.out.println("【todetail】");
ActionContext ac = ActionContext.getContext();
//接收请求参数bid
//key-请求参数名称, value-String[]
Map<String,Object> values
=ac.getParameters();
Object value=values.get("bid");
String bookId=((String[])value)[0];
//获取对应Book对象
book = bookService.getBookById(Integer.parseInt(bookId));
//将Book对象那个保存在请求作用域中
ac.put("book", book);
return "detail";//请求转发进行跳转
}
}
补充:
struts.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>
<package name="book" namespace="/book" extends="struts-default">
<!-- 配置MyLogInterceptor拦截器 -->
<interceptors>
<interceptor name="mylog2"
class="com.tarena.dang.interceptor.MyLogInterceptor2">
<!-- 只针对todetail方法进行拦截 -->
<param name="includeMethods" >todetail</param>
</interceptor>
<interceptor name="mylog"
class="com.tarena.dang.interceptor.MyLogInterceptor">
<param name="pattern" >yyyy/MM/dd HH:mm:ss</param>
</interceptor>
</interceptors>
<!-- 配置通用BookAction -->
<action name="*" method="{1}"
class="com.tarena.dang.book.action.BookAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="mylog"/>
<interceptor-ref name="mylog2"/>
<result name="list">/jsp/book/booklist.jsp</result>
<result name="detail">/jsp/book/bookdetail.jsp</result>
</action>
</package>
</struts>