TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
很少自己写分页标签,又不想用现成框架。所以自己参考了些资料,写了个分页例子测试了一下。
(代码完整,可以参考。只是应该用jsp2.0规范)
代码主要分为三个类:
PageTag 分页标签类
Page 分页bean
Constant 设置常量
Page代码:
/**
*
* @author byyang
*
*/
public class Page
{
private int current = 0; //当前页,默认为第一页
private int size; //记录总数
private int length; //每页的长度
private String url; //访问路径
public Page(int offset, int size, int length) {
super();
this.current = offset;
this.size = size;
this.length = length;
}
/**
* 获取总页数
* @return
*/
public int pageCount(){
int pagecount = 0;
if(this.size % this.length == 0){
pagecount = this.size / this.length;
}else{
pagecount = this.size / this.length + 1;
}
return pagecount;
}
//最后一页开始条数
public int lastPageOffset(){
return this.size - lastPageSize();
}
//最后一页页大小
public int lastPageSize(){
int lastpagesize = 0;
if(this.size % this.length == 0){
lastpagesize = this.length;
}else{
lastpagesize = this.size % this.length;
}
return lastpagesize;
}
//获取起始页
public int getOffset() {
return current;
}
//总记录数
public int getSize() {
return size;
}
//每页大小
public int getLength() {
return length;
}
//获取访问路径
public String getUrl() {
return url;
}
//上一页
public int getLastOffset(){
int offset = this.getOffset() - this.getLength();
if(offset > 0){
return offset;
}else{
return 0;
}
}
//下一页
public int getNextOffset(){
int offset = this.getOffset() + this.getLength();
if(offset > this.getSize()){
return getLastOffset();
}else{
return offset;
}
}
public String getPageNavigation(){
String pageNavigation = "";
return pageNavigation;
}
public void setOffset(int offset) {
this.current = offset;
}
public void setSize(int size) {
this.size = size;
}
public void setLength(int length) {
this.length = length;
}
public void setUrl(String url) {
this.url = url;
}
}[/code]
现在我们要实现PageTag标签类,自定义标签有两种实现TagSupport和SimpleTagSupport,两个都能实现这个功能,这个看个人选择了。
import java.io.IOException;
import javax.Servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import com.byyang.util.Constants;
/**
* doStartTag()和doEndTag()返回值处理:
* SKIP_BODY (0) :跳过了开始和结束标签之间的代码。
* EVAL_BODY_INCLUDE(1):将body的内容输出到存在的输出流中
* SKIP_PAGE(5): 忽略剩下的页面。
* EVAL_PAGE隐含(6):继续执行下面的页
* @author yangby
*
*/
public class PageTag extends TagSupport{
private String url;
public String getUrl(){
return this.url;
}
public void setUrl(String url) {
this.url = url;
}
public int doEndTag()throws JspException{
return EVAL_PAGE;
}
public int doStartTag() throws JspException{
HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
//获取分页bean
Page page = (Page)request.getAttribute("pager");
JspWriter out = this.pageContext.getOut();
//拼接分页信息
StringBuilder s = new StringBuilder();
s.append("共 " + ((page.getSize() - 1) / page.getLength() + 1) + " 页 ");
//设置当前页第一条记录索引
String current = request.getParameter("current");
if(current != null && !"".equals(current)){
page.setOffset(Integer.parseInt(current));
}
if (page.getSize() > page.getLength()){
//获取连接符pref
String pref;
if (this.url.indexOf("?") > -1){
pref = "&";
}else {
pref = "?";
}
this.doStart(s, page, pref);
this.doBody(s, page, pref);
this.doEnd(s,page,pref);
}else{
s.append(" ");
}
s.append(" 共 " + page.getSize() + " 条记录");
try{
out.println(s.toString());
}catch (IOException e){
e.printStackTrace();
}
return SKIP_BODY;
}
/**
* //拼接"首页"和"<"
* @param s
* @param page
* @param pref
*/
public void doStart(StringBuilder s,Page page,String pref){
if (page.getOffset() > 0){
s.append("<a href="" + this.url + pref +
"current=0">[首页]</a>
" + "<a href="" + this.url + pref +
"current=" + page.getLastOffset() + "">[<]</a>
");
}else{
s.append("<a href="" + this.url + pref + "current=0">[首页]</a>
" );
}
}
/**
* 拼接"尾页"和">"
* @param s
* @param page
* @param pref
*/
public void doEnd(StringBuilder s,Page page,String pref){
if (page.getOffset() < page.getSize() - page.getLength()) {
s.append("<a href="" + this.url + pref + "current=" + page.getNextOffset()
+ "">[>]</a>
" + "<a href="" +
this.url + pref + "current=" + page.lastPageOffset() + "">[尾页]</a>
");
}else{
s.append("
"+ "<a href="" + this.url + pref +
"current=" + page.lastPageOffset() + "">[尾页]</a>
");
}
}
/**
* 数字连接
* @param s
* @param page
* @param pref
*/
public void doBody(StringBuilder s,Page page,String pref){
//显示半径
int radius = Constants.MAX_PAGE_INDEX / 2 * page.getLength();
//显示数字的连接从第几条开始
int startOffset;
if ((page.getOffset() < radius) || (page.pageCount() <= Constants.MAX_PAGE_INDEX)){
startOffset = 0;
}else{
if (page.getOffset() < page.getSize() - radius){
startOffset = page.getOffset() - radius;
}else{
startOffset = (page.getSize() / page.getLength() - Constants.MAX_PAGE_INDEX) *
page.getLength();
}
}
for (int i = startOffset; (i < page.getSize()) && (i < startOffset
+ Constants.MAX_PAGE_INDEX * page.getLength()); ){
if (i == page.getOffset()){
s.append("<b>" + (i / page.getLength() + 1) + "</b>
");
}else{
s.append("<a href="" + this.url + pref + "current=" + i +
"">" + (i / page.getLength() + 1) + "</a>
");
}
i += page.getLength();
}
}
}
[/code]
编写tld文件mypage.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.5</tlib-version>
- <jsp-version>1.2</jsp-version>
- <short-name>mypage</short-name>
- <uri> ag-page</uri>
- <tag>
- <name>page</name>
- <tag-class>com.byyang.tag.PageTag</tag-class>
- <body-content>pg</body-content>
- <attribute>
- <name>url</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
复制代码
配置web.xml
<!-- 自定义标签 -->
<jsp-config>
<taglib>
<taglib-uri>/tag-page</taglib-uri>
<taglib-location>/WEB-INF/mypage.tld</taglib-location>
</taglib>
</jsp-config>[/code]
在jsp页面中添加如下代码:
<%@ taglib uri="/tag-page" prefix="pg"%>[/code]
你可以放到一个公共jsp里面一块引。现在咱们可以测试一下了:
在jsp页面代码:
<div align="center">
<h2>图书列表</h2>
<table border=1>
<s:iterator var="book" status="index" value="books">
<s:if test="#index.odd == true">
<tr style="background-color: yellow">
</s:if>
<s:else>
<tr>
</s:else>
<td align="right">图书名称:</td>
<td align="left"><s:property value="book"/></td>
</tr>
</s:iterator>
</table>
<pg:page url="getBookList.action"></pg:page>
</div>
[/code]
Action中咱们设一个测试数据:
public class BookAction extends BaseAction {
private String[] books;
private BookService bookService = new BookService();
public String execute() throws Exception {
setBooks(bookService.getBookList());
Page page = new Page(1,65,5);
request.setAttribute("pager", page);
return SUCCESS;
}
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
}
[/code]
好的,接下来启动tomcat,查看页面效果.
源码下载:http://file.javaxxz.com/2014/10/2/100150641.zip |
|