转自http://zhangjunji111.iteye.com/blog/582899
最近看见网上有不少基于Struts2+spring分页的东西,自己感觉都不是很适合,许多都只是对一个列表进行了分页,而没有考虑到查询条件等。个人认为,分页就是从前台把查询条件输入进去然后返回查询结果列表。这个问题的难点就是查询条件的传递,因为第一次查询时候需要输入查询条件,而以后点下一页时候,就不需要再次输入查询条件了。所以,第一次查询时候,需要把查询条件保存到某个地方,再次查询时候,把条件取出来,同时,这些要做的通用,等有许多查询页面时候,能最大限度的重用代码,好了,废话少说,下面展示我的分页代码
首先写一个Pages类,用来保存分页的一些信息,包括当前页码、记录总数、总页数、每页显示的记录数、查询条件等。代码如下:
Java代码
public class Pages {
private int pageNo = 1; // 当前页码
private int totalNum = -1;// 记录总数
private int totalPage = -1; // 总页数
int perPageNum = 10; // 每页显示记录数
private String queryParames;// 查询条件
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public Pages() {
}
public Pages(int pageNo, int totalNum, int perPageNum) {
this.pageNo = pageNo;
this.totalNum = totalNum;
this.perPageNum = perPageNum;
this.executeCount();
}
public void executeCount() {
this.totalPage = (int) Math.ceil((this.totalNum + this.perPageNum - 1)
/ this.perPageNum);
if (this.totalPage <= 0) {
this.totalPage = 1;
}
int intPage = this.pageNo;
if (intPage > this.totalPage) {
this.pageNo = this.totalPage;
} else {
this.pageNo = intPage;
}
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPerPageNum() {
return perPageNum;
}
public void setPerPageNum(int perPageNum) {
this.perPageNum = perPageNum;
}
public int getTotalNum() {
return totalNum;
}
public void setTotalNum(int totalNum) {
this.totalNum = totalNum;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public Map transQueryCondition() {
Map<String, String> map = new HashMap<String, String>();
if (StringUtils.isNull(queryParames)) {
return map;
}
String[] condtions = queryParames.split(";");
for (int i = 0; i < condtions.length; i++) {
if (StringUtils.isNull(condtions[i])) {
continue;
}
map.put(condtions[i].split(",")[0], condtions[i].split(",")[1]);
}
return map;
}
public class Pages {
private int pageNo = 1; // 当前页码
private int totalNum = -1;// 记录总数
private int totalPage = -1; // 总页数
int perPageNum = 10; // 每页显示记录数
private String queryParames;// 查询条件
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public Pages() {
}
public Pages(int pageNo, int totalNum, int perPageNum) {
this.pageNo = pageNo;
this.totalNum = totalNum;
this.perPageNum = perPageNum;
this.executeCount();
}
public void executeCount() {
this.totalPage = (int) Math.ceil((this.totalNum + this.perPageNum - 1)
/ this.perPageNum);
if (this.totalPage <= 0) {
this.totalPage = 1;
}
int intPage = this.pageNo;
if (intPage > this.totalPage) {
this.pageNo = this.totalPage;
} else {
this.pageNo = intPage;
}
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPerPageNum() {
return perPageNum;
}
public void setPerPageNum(int perPageNum) {
this.perPageNum = perPageNum;
}
public int getTotalNum() {
return totalNum;
}
public void setTotalNum(int totalNum) {
this.totalNum = totalNum;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public Map transQueryCondition() {
Map<String, String> map = new HashMap<String, String>();
if (StringUtils.isNull(queryParames)) {
return map;
}
String[] condtions = queryParames.split(";");
for (int i = 0; i < condtions.length; i++) {
if (StringUtils.isNull(condtions[i])) {
continue;
}
map.put(condtions[i].split(",")[0], condtions[i].split(",")[1]);
}
return map;
} 下面写一个通用的Action类,用来初始化查询参数:
Java代码
public abstract class ListAction extends ActionSupport {
protected static final String LIST = "list";
Logger logger = Logger.getLogger(ListAction.class);
/*
* 当前页
*/
private int pageNo = 1;
/*
* 总页数
*/
private int totalPage = -1;
/*
* 总记录数
*/
private int totalNum = -1;
/*
* 查询参数
*/
private String queryParames;
private PageList pageList;
public final String execute() {
initQuerycondition();
Pages pages = new Pages();
pages.setPageNo(this.getPageNo());
pages.setPerPageNum(10);
pages.setTotalNum(totalNum);
pages.executeCount();
this.setTotalPage(pages.getTotalPage());
pages.setQueryParames(queryParames);
queryPageList(pages);
this.setTotalPage(pages.getTotalPage());
this.setTotalNum(pages.getTotalNum());
return LIST;
}
/**
* 实现每个查询结果列表,依据查询结果的不同而不同
* @param pages
*/
protected abstract void queryPageList(Pages pages);
/**
* 初始化查询参数的配置
*/
protected void initQuerycondition() {
/*
*如果不是第一次查询,直接返回,否则设置查询参数,拼装成 queryParames
*/
if (totalNum >= 0) {
return;
}
Map map = ActionContext.getContext().getParameters();
Iterator iter = map.keySet().iterator();
StringBuffer query = new StringBuffer();
while (iter.hasNext()) {
String key = (String) iter.next();
Object keyValue = ((Object[]) map.get(key))[0];
String value = "";
if (!StringUtils.isObjNull(keyValue)) {
query.append(";").append(key);
if (keyValue instanceof Date) {
value = DateUtils.trunsDateToString((Date) keyValue);
} else {
value = String.valueOf(keyValue);
}
query.append(",").append(value);
}
}
this.setQueryParames(query.toString());
}
//get.....set...方法
}
public abstract class ListAction extends ActionSupport {
protected static final String LIST = "list";
Logger logger = Logger.getLogger(ListAction.class);
/*
* 当前页
*/
private int pageNo = 1;
/*
* 总页数
*/
private int totalPage = -1;
/*
* 总记录数
*/
private int totalNum = -1;
/*
* 查询参数
*/
private String queryParames;
private PageList pageList;
public final String execute() {
initQuerycondition();
Pages pages = new Pages();
pages.setPageNo(this.getPageNo());
pages.setPerPageNum(10);
pages.setTotalNum(totalNum);
pages.executeCount();
this.setTotalPage(pages.getTotalPage());
pages.setQueryParames(queryParames);
queryPageList(pages);
this.setTotalPage(pages.getTotalPage());
this.setTotalNum(pages.getTotalNum());
return LIST;
}
/**
* 实现每个查询结果列表,依据查询结果的不同而不同
* @param pages
*/
protected abstract void queryPageList(Pages pages);
/**
* 初始化查询参数的配置
*/
protected void initQuerycondition() {
/*
*如果不是第一次查询,直接返回,否则设置查询参数,拼装成 queryParames
*/
if (totalNum >= 0) {
return;
}
Map map = ActionContext.getContext().getParameters();
Iterator iter = map.keySet().iterator();
StringBuffer query = new StringBuffer();
while (iter.hasNext()) {
String key = (String) iter.next();
Object keyValue = ((Object[]) map.get(key))[0];
String value = "";
if (!StringUtils.isObjNull(keyValue)) {
query.append(";").append(key);
if (keyValue instanceof Date) {
value = DateUtils.trunsDateToString((Date) keyValue);
} else {
value = String.valueOf(keyValue);
}
query.append(",").append(value);
}
}
this.setQueryParames(query.toString());
}
//get.....set...方法
}再写一个Page类,继承Component,用来获取ValueStack中的参数值。
Java代码
public class Page extends Component {
private static final Log logger = LogFactory.getLog(Page.class);
public Page(ValueStack stack) {
super(stack);
}
private String pageNo; // 当前页码
private String totalPage; // 总页数
private String totalNum; // 总记录数
private String styleClass; // 分页的样式
private String theme; // 分页的主题
private String url; // action的路径
private String urlType; // 路径的类型,主要用于URL重写的扩展
private String queryParames;
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
Object obj = this.getStack().findValue(pageNo);
pageNo = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalPage);
totalPage = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalNum);
totalNum = String.valueOf((Integer) obj);
StringBuilder str = new StringBuilder();
Map cont = this.getStack().getContext();
StrutsRequestWrapper req = (StrutsRequestWrapper) cont
.get(StrutsStatics.HTTP_REQUEST);
if (url == null || "".equals(url)) {
url = (String) req
.getAttribute("javax.servlet.forward.request_uri");
}
String pageStr = "?totalNum=" + totalNum + "&pageNo=";
if ("dir".equals(urlType)) {
pageStr = "";
if ("1".equals(pageNo)) {// 第一页时
if (url.lastIndexOf("/") != url.length() - 1) {
if (url.lastIndexOf("1") == url.length() - 1) {// 如果有页码1,则去掉1
url = url.substring(0, url.length() - 1);
} else if (url.lastIndexOf("/") != url.length() - 1) {// 如果没有页码1,并且最后不是'/'时,加上'/'
url = url + "/";
}
}
} else {
url = url.substring(0, url.lastIndexOf("/") + 1);
}
}
// 下面这段处理主要是用来处理动态查询的参数,并拼接成url
StringBuffer perUrl = new StringBuffer("");
obj = this.getStack().findValue(queryParames);
if (!StringUtils.isObjNull(obj)) {
perUrl.append("&").append("queryParames").append("=").append(
StringUtils.decode((String) obj));
}
//当前页
Integer cpageInt = Integer.valueOf(pageNo);
str.append("<span> ");
// 文本样式
if (theme == null || "text".equals(theme)) {
// 当前页与总页数相等
if (pageNo.equals(totalPage)) {
// 如果total = 1,则无需分页,显示“[第1页] [共1页]”
if ("1".equals(totalPage)) {
str.append("[第 " + pageNo + " 页]");
str.append(" [共 " + totalPage + " 页]");
} else {
// 到达最后一页,显示“[首页] [上一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("[下一页]");
str.append(" <a href='" + url + pageStr + totalPage
+ perUrl + "'>[末 页]</a> ");
}
} else {
// 当前页与总页数不相同
if ("1".equals(pageNo)) {
// 第一页,显示“[首 页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("[上一页]");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
} else {
// 不是第一页,显示“[首页] [上一页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
}
}
} else if ("number".equals(theme)) { // 数字样式 [1 2 3 4 5 6 7 8 9 10 > // >>]
Integer totalInt = Integer.valueOf(totalPage);
// 如果只有一页,则无需分页
str.append("[ ");
if (totalInt == 1) {
str.append("<strong>1</strong> ");
} else {
//当前页
if (cpageInt > 1) {
// 当前不是第一组,要显示“<< <”
// <<:返回前一组第一页
// <:返回前一页
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'> << </a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl);
str.append("'><</a> ");
} else {
str.append("<< < ");
}
int v = (cpageInt - 4) > 0 ? (cpageInt - 4) : 1;
int v1 = (cpageInt + 4) < totalInt ? (cpageInt + 4) : totalInt;
if (v1 == totalInt) {
v = totalInt - 10;
v = (v <= 0 ? 1 : v); // 如果为负数,则修改为1
} else if (v == 1 && v1 < totalInt) {
v1 = totalInt > 10 ? 10 : totalInt;
}
// 10个为一组显示
for (int i = v; i <= v1; i++) {
if (cpageInt == i) { // 当前页要加粗显示
str.append("<strong>" + i + "</strong> ");
} else {
str.append("<a href='" + url + pageStr + i + perUrl
+ "'>" + i + "</a> ");
}
}
// 如果多于1组并且不是最后一组,显示“> >>”
if (cpageInt < totalInt) {
// >>:返回下一组最后一页
// >:返回下一页
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl);
str.append("'>></a> ");
str.append("<a href='" + url + pageStr + totalInt + perUrl);
str.append("'> >> </a> ");
} else {
str.append("> >> ");
}
}
str.append("]");
}
str.append("</span>");
try {
writer.write(str.toString());
} catch (IOException e) {
logger.error(e);
}
return result;
}
//get set 方法区
}
public class Page extends Component {
private static final Log logger = LogFactory.getLog(Page.class);
public Page(ValueStack stack) {
super(stack);
}
private String pageNo; // 当前页码
private String totalPage; // 总页数
private String totalNum; // 总记录数
private String styleClass; // 分页的样式
private String theme; // 分页的主题
private String url; // action的路径
private String urlType; // 路径的类型,主要用于URL重写的扩展
private String queryParames;
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
Object obj = this.getStack().findValue(pageNo);
pageNo = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalPage);
totalPage = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalNum);
totalNum = String.valueOf((Integer) obj);
StringBuilder str = new StringBuilder();
Map cont = this.getStack().getContext();
StrutsRequestWrapper req = (StrutsRequestWrapper) cont
.get(StrutsStatics.HTTP_REQUEST);
if (url == null || "".equals(url)) {
url = (String) req
.getAttribute("javax.servlet.forward.request_uri");
}
String pageStr = "?totalNum=" + totalNum + "&pageNo=";
if ("dir".equals(urlType)) {
pageStr = "";
if ("1".equals(pageNo)) {// 第一页时
if (url.lastIndexOf("/") != url.length() - 1) {
if (url.lastIndexOf("1") == url.length() - 1) {// 如果有页码1,则去掉1
url = url.substring(0, url.length() - 1);
} else if (url.lastIndexOf("/") != url.length() - 1) {// 如果没有页码1,并且最后不是'/'时,加上'/'
url = url + "/";
}
}
} else {
url = url.substring(0, url.lastIndexOf("/") + 1);
}
}
// 下面这段处理主要是用来处理动态查询的参数,并拼接成url
StringBuffer perUrl = new StringBuffer("");
obj = this.getStack().findValue(queryParames);
if (!StringUtils.isObjNull(obj)) {
perUrl.append("&").append("queryParames").append("=").append(
StringUtils.decode((String) obj));
}
//当前页
Integer cpageInt = Integer.valueOf(pageNo);
str.append("<span> ");
// 文本样式
if (theme == null || "text".equals(theme)) {
// 当前页与总页数相等
if (pageNo.equals(totalPage)) {
// 如果total = 1,则无需分页,显示“[第1页] [共1页]”
if ("1".equals(totalPage)) {
str.append("[第 " + pageNo + " 页]");
str.append(" [共 " + totalPage + " 页]");
} else {
// 到达最后一页,显示“[首页] [上一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("[下一页]");
str.append(" <a href='" + url + pageStr + totalPage
+ perUrl + "'>[末 页]</a> ");
}
} else {
// 当前页与总页数不相同
if ("1".equals(pageNo)) {
// 第一页,显示“[首 页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("[上一页]");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
} else {
// 不是第一页,显示“[首页] [上一页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
}
}
} else if ("number".equals(theme)) { // 数字样式 [1 2 3 4 5 6 7 8 9 10 > // >>]
Integer totalInt = Integer.valueOf(totalPage);
// 如果只有一页,则无需分页
str.append("[ ");
if (totalInt == 1) {
str.append("<strong>1</strong> ");
} else {
//当前页
if (cpageInt > 1) {
// 当前不是第一组,要显示“<< <”
// <<:返回前一组第一页
// <:返回前一页
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'> << </a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl);
str.append("'><</a> ");
} else {
str.append("<< < ");
}
int v = (cpageInt - 4) > 0 ? (cpageInt - 4) : 1;
int v1 = (cpageInt + 4) < totalInt ? (cpageInt + 4) : totalInt;
if (v1 == totalInt) {
v = totalInt - 10;
v = (v <= 0 ? 1 : v); // 如果为负数,则修改为1
} else if (v == 1 && v1 < totalInt) {
v1 = totalInt > 10 ? 10 : totalInt;
}
// 10个为一组显示
for (int i = v; i <= v1; i++) {
if (cpageInt == i) { // 当前页要加粗显示
str.append("<strong>" + i + "</strong> ");
} else {
str.append("<a href='" + url + pageStr + i + perUrl
+ "'>" + i + "</a> ");
}
}
// 如果多于1组并且不是最后一组,显示“> >>”
if (cpageInt < totalInt) {
// >>:返回下一组最后一页
// >:返回下一页
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl);
str.append("'>></a> ");
str.append("<a href='" + url + pageStr + totalInt + perUrl);
str.append("'> >> </a> ");
} else {
str.append("> >> ");
}
}
str.append("]");
}
str.append("</span>");
try {
writer.write(str.toString());
} catch (IOException e) {
logger.error(e);
}
return result;
}
//get set 方法区
} PageTag类,继承Struts2标签的 ComponentTagSupport。
Java代码
public class PageTag extends ComponentTagSupport {
private static final long serialVersionUID = -5371048231966321759L;
private String pageNo;
private String totalPage;
private String totalNum;
private String styleClass;
private String theme;
private String url;
private String urlType;
private String queryParames;
@Override
protected void populateParams() {
super.populateParams();
Page page = (Page) component;
page.setPageNo(pageNo);
page.setTotalPage(totalPage);
page.setTotalNum(totalNum);
page.setStyleClass(styleClass);
page.setTheme(theme);
page.setUrl(url);
page.setUrlType(urlType);
page.setQueryParames(queryParames);
}
@Override
public Component getBean(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
return new Page(stack);
}
// get set 方法.......
}
public class PageTag extends ComponentTagSupport {
private static final long serialVersionUID = -5371048231966321759L;
private String pageNo;
private String totalPage;
private String totalNum;
private String styleClass;
private String theme;
private String url;
private String urlType;
private String queryParames;
@Override
protected void populateParams() {
super.populateParams();
Page page = (Page) component;
page.setPageNo(pageNo);
page.setTotalPage(totalPage);
page.setTotalNum(totalNum);
page.setStyleClass(styleClass);
page.setTheme(theme);
page.setUrl(url);
page.setUrlType(urlType);
page.setQueryParames(queryParames);
}
@Override
public Component getBean(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
return new Page(stack);
}
// get set 方法.......
} 自定义分页的tld文件:
Xml代码
<?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>fly</short-name>
<uri>/fly</uri>
<display-name>"fly Tags"</display-name>
<tag>
<name>pages</name>
<tag-class>com.fly.web.taglib.PageTag</tag-class>
<body-content>jsp</body-content>
<description>分页标签</description>
<attribute>
<name>pageNo</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>totalPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总页数</description>
</attribute>
<attribute>
<name>totalNum</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总记录数。</description>
</attribute>
<attribute>
<name>styleClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页标签的样式,不配置此项将采用默认的样式</description>
</attribute>
<attribute>
<name>theme</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页的主题,现支持number|text两种主题</description>
</attribute>
<attribute>
<name>url</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页提交的路径,默认不用配置该项,自动获取系统访问路径。</description>
</attribute>
<attribute>
<name>urlType</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>queryParames</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<description>
查询参数
</description>
</attribute>
</tag>
</taglib>
<?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>fly</short-name>
<uri>/fly</uri>
<display-name>"fly Tags"</display-name>
<tag>
<name>pages</name>
<tag-class>com.fly.web.taglib.PageTag</tag-class>
<body-content>jsp</body-content>
<description>分页标签</description>
<attribute>
<name>pageNo</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>totalPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总页数</description>
</attribute>
<attribute>
<name>totalNum</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总记录数。</description>
</attribute>
<attribute>
<name>styleClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页标签的样式,不配置此项将采用默认的样式</description>
</attribute>
<attribute>
<name>theme</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页的主题,现支持number|text两种主题</description>
</attribute>
<attribute>
<name>url</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页提交的路径,默认不用配置该项,自动获取系统访问路径。</description>
</attribute>
<attribute>
<name>urlType</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>queryParames</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<description>
查询参数
</description>
</attribute>
</tag>
</taglib>
我们在jsp页面直接写
Html代码
<td align="center" nowrap>
记录总数
<s:property value="%{totalNum}" />条 每页显示10条
第<s:property value="pageNo" />页 <fly:pages pageNo="pageNo" totalPage="totalPage" totalNum="totalNum" styleClass="page" theme="text" queryParames="queryParames"> </fly:pages>
</td>
最近看见网上有不少基于Struts2+spring分页的东西,自己感觉都不是很适合,许多都只是对一个列表进行了分页,而没有考虑到查询条件等。个人认为,分页就是从前台把查询条件输入进去然后返回查询结果列表。这个问题的难点就是查询条件的传递,因为第一次查询时候需要输入查询条件,而以后点下一页时候,就不需要再次输入查询条件了。所以,第一次查询时候,需要把查询条件保存到某个地方,再次查询时候,把条件取出来,同时,这些要做的通用,等有许多查询页面时候,能最大限度的重用代码,好了,废话少说,下面展示我的分页代码
首先写一个Pages类,用来保存分页的一些信息,包括当前页码、记录总数、总页数、每页显示的记录数、查询条件等。代码如下:
Java代码
public class Pages {
private int pageNo = 1; // 当前页码
private int totalNum = -1;// 记录总数
private int totalPage = -1; // 总页数
int perPageNum = 10; // 每页显示记录数
private String queryParames;// 查询条件
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public Pages() {
}
public Pages(int pageNo, int totalNum, int perPageNum) {
this.pageNo = pageNo;
this.totalNum = totalNum;
this.perPageNum = perPageNum;
this.executeCount();
}
public void executeCount() {
this.totalPage = (int) Math.ceil((this.totalNum + this.perPageNum - 1)
/ this.perPageNum);
if (this.totalPage <= 0) {
this.totalPage = 1;
}
int intPage = this.pageNo;
if (intPage > this.totalPage) {
this.pageNo = this.totalPage;
} else {
this.pageNo = intPage;
}
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPerPageNum() {
return perPageNum;
}
public void setPerPageNum(int perPageNum) {
this.perPageNum = perPageNum;
}
public int getTotalNum() {
return totalNum;
}
public void setTotalNum(int totalNum) {
this.totalNum = totalNum;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public Map transQueryCondition() {
Map<String, String> map = new HashMap<String, String>();
if (StringUtils.isNull(queryParames)) {
return map;
}
String[] condtions = queryParames.split(";");
for (int i = 0; i < condtions.length; i++) {
if (StringUtils.isNull(condtions[i])) {
continue;
}
map.put(condtions[i].split(",")[0], condtions[i].split(",")[1]);
}
return map;
}
public class Pages {
private int pageNo = 1; // 当前页码
private int totalNum = -1;// 记录总数
private int totalPage = -1; // 总页数
int perPageNum = 10; // 每页显示记录数
private String queryParames;// 查询条件
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public Pages() {
}
public Pages(int pageNo, int totalNum, int perPageNum) {
this.pageNo = pageNo;
this.totalNum = totalNum;
this.perPageNum = perPageNum;
this.executeCount();
}
public void executeCount() {
this.totalPage = (int) Math.ceil((this.totalNum + this.perPageNum - 1)
/ this.perPageNum);
if (this.totalPage <= 0) {
this.totalPage = 1;
}
int intPage = this.pageNo;
if (intPage > this.totalPage) {
this.pageNo = this.totalPage;
} else {
this.pageNo = intPage;
}
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPerPageNum() {
return perPageNum;
}
public void setPerPageNum(int perPageNum) {
this.perPageNum = perPageNum;
}
public int getTotalNum() {
return totalNum;
}
public void setTotalNum(int totalNum) {
this.totalNum = totalNum;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public Map transQueryCondition() {
Map<String, String> map = new HashMap<String, String>();
if (StringUtils.isNull(queryParames)) {
return map;
}
String[] condtions = queryParames.split(";");
for (int i = 0; i < condtions.length; i++) {
if (StringUtils.isNull(condtions[i])) {
continue;
}
map.put(condtions[i].split(",")[0], condtions[i].split(",")[1]);
}
return map;
} 下面写一个通用的Action类,用来初始化查询参数:
Java代码
public abstract class ListAction extends ActionSupport {
protected static final String LIST = "list";
Logger logger = Logger.getLogger(ListAction.class);
/*
* 当前页
*/
private int pageNo = 1;
/*
* 总页数
*/
private int totalPage = -1;
/*
* 总记录数
*/
private int totalNum = -1;
/*
* 查询参数
*/
private String queryParames;
private PageList pageList;
public final String execute() {
initQuerycondition();
Pages pages = new Pages();
pages.setPageNo(this.getPageNo());
pages.setPerPageNum(10);
pages.setTotalNum(totalNum);
pages.executeCount();
this.setTotalPage(pages.getTotalPage());
pages.setQueryParames(queryParames);
queryPageList(pages);
this.setTotalPage(pages.getTotalPage());
this.setTotalNum(pages.getTotalNum());
return LIST;
}
/**
* 实现每个查询结果列表,依据查询结果的不同而不同
* @param pages
*/
protected abstract void queryPageList(Pages pages);
/**
* 初始化查询参数的配置
*/
protected void initQuerycondition() {
/*
*如果不是第一次查询,直接返回,否则设置查询参数,拼装成 queryParames
*/
if (totalNum >= 0) {
return;
}
Map map = ActionContext.getContext().getParameters();
Iterator iter = map.keySet().iterator();
StringBuffer query = new StringBuffer();
while (iter.hasNext()) {
String key = (String) iter.next();
Object keyValue = ((Object[]) map.get(key))[0];
String value = "";
if (!StringUtils.isObjNull(keyValue)) {
query.append(";").append(key);
if (keyValue instanceof Date) {
value = DateUtils.trunsDateToString((Date) keyValue);
} else {
value = String.valueOf(keyValue);
}
query.append(",").append(value);
}
}
this.setQueryParames(query.toString());
}
//get.....set...方法
}
public abstract class ListAction extends ActionSupport {
protected static final String LIST = "list";
Logger logger = Logger.getLogger(ListAction.class);
/*
* 当前页
*/
private int pageNo = 1;
/*
* 总页数
*/
private int totalPage = -1;
/*
* 总记录数
*/
private int totalNum = -1;
/*
* 查询参数
*/
private String queryParames;
private PageList pageList;
public final String execute() {
initQuerycondition();
Pages pages = new Pages();
pages.setPageNo(this.getPageNo());
pages.setPerPageNum(10);
pages.setTotalNum(totalNum);
pages.executeCount();
this.setTotalPage(pages.getTotalPage());
pages.setQueryParames(queryParames);
queryPageList(pages);
this.setTotalPage(pages.getTotalPage());
this.setTotalNum(pages.getTotalNum());
return LIST;
}
/**
* 实现每个查询结果列表,依据查询结果的不同而不同
* @param pages
*/
protected abstract void queryPageList(Pages pages);
/**
* 初始化查询参数的配置
*/
protected void initQuerycondition() {
/*
*如果不是第一次查询,直接返回,否则设置查询参数,拼装成 queryParames
*/
if (totalNum >= 0) {
return;
}
Map map = ActionContext.getContext().getParameters();
Iterator iter = map.keySet().iterator();
StringBuffer query = new StringBuffer();
while (iter.hasNext()) {
String key = (String) iter.next();
Object keyValue = ((Object[]) map.get(key))[0];
String value = "";
if (!StringUtils.isObjNull(keyValue)) {
query.append(";").append(key);
if (keyValue instanceof Date) {
value = DateUtils.trunsDateToString((Date) keyValue);
} else {
value = String.valueOf(keyValue);
}
query.append(",").append(value);
}
}
this.setQueryParames(query.toString());
}
//get.....set...方法
}再写一个Page类,继承Component,用来获取ValueStack中的参数值。
Java代码
public class Page extends Component {
private static final Log logger = LogFactory.getLog(Page.class);
public Page(ValueStack stack) {
super(stack);
}
private String pageNo; // 当前页码
private String totalPage; // 总页数
private String totalNum; // 总记录数
private String styleClass; // 分页的样式
private String theme; // 分页的主题
private String url; // action的路径
private String urlType; // 路径的类型,主要用于URL重写的扩展
private String queryParames;
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
Object obj = this.getStack().findValue(pageNo);
pageNo = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalPage);
totalPage = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalNum);
totalNum = String.valueOf((Integer) obj);
StringBuilder str = new StringBuilder();
Map cont = this.getStack().getContext();
StrutsRequestWrapper req = (StrutsRequestWrapper) cont
.get(StrutsStatics.HTTP_REQUEST);
if (url == null || "".equals(url)) {
url = (String) req
.getAttribute("javax.servlet.forward.request_uri");
}
String pageStr = "?totalNum=" + totalNum + "&pageNo=";
if ("dir".equals(urlType)) {
pageStr = "";
if ("1".equals(pageNo)) {// 第一页时
if (url.lastIndexOf("/") != url.length() - 1) {
if (url.lastIndexOf("1") == url.length() - 1) {// 如果有页码1,则去掉1
url = url.substring(0, url.length() - 1);
} else if (url.lastIndexOf("/") != url.length() - 1) {// 如果没有页码1,并且最后不是'/'时,加上'/'
url = url + "/";
}
}
} else {
url = url.substring(0, url.lastIndexOf("/") + 1);
}
}
// 下面这段处理主要是用来处理动态查询的参数,并拼接成url
StringBuffer perUrl = new StringBuffer("");
obj = this.getStack().findValue(queryParames);
if (!StringUtils.isObjNull(obj)) {
perUrl.append("&").append("queryParames").append("=").append(
StringUtils.decode((String) obj));
}
//当前页
Integer cpageInt = Integer.valueOf(pageNo);
str.append("<span> ");
// 文本样式
if (theme == null || "text".equals(theme)) {
// 当前页与总页数相等
if (pageNo.equals(totalPage)) {
// 如果total = 1,则无需分页,显示“[第1页] [共1页]”
if ("1".equals(totalPage)) {
str.append("[第 " + pageNo + " 页]");
str.append(" [共 " + totalPage + " 页]");
} else {
// 到达最后一页,显示“[首页] [上一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("[下一页]");
str.append(" <a href='" + url + pageStr + totalPage
+ perUrl + "'>[末 页]</a> ");
}
} else {
// 当前页与总页数不相同
if ("1".equals(pageNo)) {
// 第一页,显示“[首 页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("[上一页]");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
} else {
// 不是第一页,显示“[首页] [上一页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
}
}
} else if ("number".equals(theme)) { // 数字样式 [1 2 3 4 5 6 7 8 9 10 > // >>]
Integer totalInt = Integer.valueOf(totalPage);
// 如果只有一页,则无需分页
str.append("[ ");
if (totalInt == 1) {
str.append("<strong>1</strong> ");
} else {
//当前页
if (cpageInt > 1) {
// 当前不是第一组,要显示“<< <”
// <<:返回前一组第一页
// <:返回前一页
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'> << </a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl);
str.append("'><</a> ");
} else {
str.append("<< < ");
}
int v = (cpageInt - 4) > 0 ? (cpageInt - 4) : 1;
int v1 = (cpageInt + 4) < totalInt ? (cpageInt + 4) : totalInt;
if (v1 == totalInt) {
v = totalInt - 10;
v = (v <= 0 ? 1 : v); // 如果为负数,则修改为1
} else if (v == 1 && v1 < totalInt) {
v1 = totalInt > 10 ? 10 : totalInt;
}
// 10个为一组显示
for (int i = v; i <= v1; i++) {
if (cpageInt == i) { // 当前页要加粗显示
str.append("<strong>" + i + "</strong> ");
} else {
str.append("<a href='" + url + pageStr + i + perUrl
+ "'>" + i + "</a> ");
}
}
// 如果多于1组并且不是最后一组,显示“> >>”
if (cpageInt < totalInt) {
// >>:返回下一组最后一页
// >:返回下一页
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl);
str.append("'>></a> ");
str.append("<a href='" + url + pageStr + totalInt + perUrl);
str.append("'> >> </a> ");
} else {
str.append("> >> ");
}
}
str.append("]");
}
str.append("</span>");
try {
writer.write(str.toString());
} catch (IOException e) {
logger.error(e);
}
return result;
}
//get set 方法区
}
public class Page extends Component {
private static final Log logger = LogFactory.getLog(Page.class);
public Page(ValueStack stack) {
super(stack);
}
private String pageNo; // 当前页码
private String totalPage; // 总页数
private String totalNum; // 总记录数
private String styleClass; // 分页的样式
private String theme; // 分页的主题
private String url; // action的路径
private String urlType; // 路径的类型,主要用于URL重写的扩展
private String queryParames;
public String getQueryParames() {
return queryParames;
}
public void setQueryParames(String queryParames) {
this.queryParames = queryParames;
}
public boolean start(Writer writer) {
boolean result = super.start(writer);
Object obj = this.getStack().findValue(pageNo);
pageNo = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalPage);
totalPage = String.valueOf((Integer) obj);
obj = this.getStack().findValue(totalNum);
totalNum = String.valueOf((Integer) obj);
StringBuilder str = new StringBuilder();
Map cont = this.getStack().getContext();
StrutsRequestWrapper req = (StrutsRequestWrapper) cont
.get(StrutsStatics.HTTP_REQUEST);
if (url == null || "".equals(url)) {
url = (String) req
.getAttribute("javax.servlet.forward.request_uri");
}
String pageStr = "?totalNum=" + totalNum + "&pageNo=";
if ("dir".equals(urlType)) {
pageStr = "";
if ("1".equals(pageNo)) {// 第一页时
if (url.lastIndexOf("/") != url.length() - 1) {
if (url.lastIndexOf("1") == url.length() - 1) {// 如果有页码1,则去掉1
url = url.substring(0, url.length() - 1);
} else if (url.lastIndexOf("/") != url.length() - 1) {// 如果没有页码1,并且最后不是'/'时,加上'/'
url = url + "/";
}
}
} else {
url = url.substring(0, url.lastIndexOf("/") + 1);
}
}
// 下面这段处理主要是用来处理动态查询的参数,并拼接成url
StringBuffer perUrl = new StringBuffer("");
obj = this.getStack().findValue(queryParames);
if (!StringUtils.isObjNull(obj)) {
perUrl.append("&").append("queryParames").append("=").append(
StringUtils.decode((String) obj));
}
//当前页
Integer cpageInt = Integer.valueOf(pageNo);
str.append("<span> ");
// 文本样式
if (theme == null || "text".equals(theme)) {
// 当前页与总页数相等
if (pageNo.equals(totalPage)) {
// 如果total = 1,则无需分页,显示“[第1页] [共1页]”
if ("1".equals(totalPage)) {
str.append("[第 " + pageNo + " 页]");
str.append(" [共 " + totalPage + " 页]");
} else {
// 到达最后一页,显示“[首页] [上一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("[下一页]");
str.append(" <a href='" + url + pageStr + totalPage
+ perUrl + "'>[末 页]</a> ");
}
} else {
// 当前页与总页数不相同
if ("1".equals(pageNo)) {
// 第一页,显示“[首 页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("[上一页]");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
} else {
// 不是第一页,显示“[首页] [上一页] [下一页] [末页]”
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'>[首 页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl + "'>[上一页]</a>");
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl + "'>[下一页]</a>");
str.append("<a href='" + url + pageStr + totalPage + perUrl
+ "'>[末 页]</a>");
}
}
} else if ("number".equals(theme)) { // 数字样式 [1 2 3 4 5 6 7 8 9 10 > // >>]
Integer totalInt = Integer.valueOf(totalPage);
// 如果只有一页,则无需分页
str.append("[ ");
if (totalInt == 1) {
str.append("<strong>1</strong> ");
} else {
//当前页
if (cpageInt > 1) {
// 当前不是第一组,要显示“<< <”
// <<:返回前一组第一页
// <:返回前一页
str.append("<a href='" + url + pageStr + "1" + perUrl
+ "'> << </a> ");
str.append("<a href='" + url + pageStr + (cpageInt - 1)
+ perUrl);
str.append("'><</a> ");
} else {
str.append("<< < ");
}
int v = (cpageInt - 4) > 0 ? (cpageInt - 4) : 1;
int v1 = (cpageInt + 4) < totalInt ? (cpageInt + 4) : totalInt;
if (v1 == totalInt) {
v = totalInt - 10;
v = (v <= 0 ? 1 : v); // 如果为负数,则修改为1
} else if (v == 1 && v1 < totalInt) {
v1 = totalInt > 10 ? 10 : totalInt;
}
// 10个为一组显示
for (int i = v; i <= v1; i++) {
if (cpageInt == i) { // 当前页要加粗显示
str.append("<strong>" + i + "</strong> ");
} else {
str.append("<a href='" + url + pageStr + i + perUrl
+ "'>" + i + "</a> ");
}
}
// 如果多于1组并且不是最后一组,显示“> >>”
if (cpageInt < totalInt) {
// >>:返回下一组最后一页
// >:返回下一页
str.append("<a href='" + url + pageStr + (cpageInt + 1)
+ perUrl);
str.append("'>></a> ");
str.append("<a href='" + url + pageStr + totalInt + perUrl);
str.append("'> >> </a> ");
} else {
str.append("> >> ");
}
}
str.append("]");
}
str.append("</span>");
try {
writer.write(str.toString());
} catch (IOException e) {
logger.error(e);
}
return result;
}
//get set 方法区
} PageTag类,继承Struts2标签的 ComponentTagSupport。
Java代码
public class PageTag extends ComponentTagSupport {
private static final long serialVersionUID = -5371048231966321759L;
private String pageNo;
private String totalPage;
private String totalNum;
private String styleClass;
private String theme;
private String url;
private String urlType;
private String queryParames;
@Override
protected void populateParams() {
super.populateParams();
Page page = (Page) component;
page.setPageNo(pageNo);
page.setTotalPage(totalPage);
page.setTotalNum(totalNum);
page.setStyleClass(styleClass);
page.setTheme(theme);
page.setUrl(url);
page.setUrlType(urlType);
page.setQueryParames(queryParames);
}
@Override
public Component getBean(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
return new Page(stack);
}
// get set 方法.......
}
public class PageTag extends ComponentTagSupport {
private static final long serialVersionUID = -5371048231966321759L;
private String pageNo;
private String totalPage;
private String totalNum;
private String styleClass;
private String theme;
private String url;
private String urlType;
private String queryParames;
@Override
protected void populateParams() {
super.populateParams();
Page page = (Page) component;
page.setPageNo(pageNo);
page.setTotalPage(totalPage);
page.setTotalNum(totalNum);
page.setStyleClass(styleClass);
page.setTheme(theme);
page.setUrl(url);
page.setUrlType(urlType);
page.setQueryParames(queryParames);
}
@Override
public Component getBean(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
return new Page(stack);
}
// get set 方法.......
} 自定义分页的tld文件:
Xml代码
<?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>fly</short-name>
<uri>/fly</uri>
<display-name>"fly Tags"</display-name>
<tag>
<name>pages</name>
<tag-class>com.fly.web.taglib.PageTag</tag-class>
<body-content>jsp</body-content>
<description>分页标签</description>
<attribute>
<name>pageNo</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>totalPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总页数</description>
</attribute>
<attribute>
<name>totalNum</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总记录数。</description>
</attribute>
<attribute>
<name>styleClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页标签的样式,不配置此项将采用默认的样式</description>
</attribute>
<attribute>
<name>theme</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页的主题,现支持number|text两种主题</description>
</attribute>
<attribute>
<name>url</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页提交的路径,默认不用配置该项,自动获取系统访问路径。</description>
</attribute>
<attribute>
<name>urlType</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>queryParames</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<description>
查询参数
</description>
</attribute>
</tag>
</taglib>
<?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>fly</short-name>
<uri>/fly</uri>
<display-name>"fly Tags"</display-name>
<tag>
<name>pages</name>
<tag-class>com.fly.web.taglib.PageTag</tag-class>
<body-content>jsp</body-content>
<description>分页标签</description>
<attribute>
<name>pageNo</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>totalPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总页数</description>
</attribute>
<attribute>
<name>totalNum</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>总记录数。</description>
</attribute>
<attribute>
<name>styleClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页标签的样式,不配置此项将采用默认的样式</description>
</attribute>
<attribute>
<name>theme</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页的主题,现支持number|text两种主题</description>
</attribute>
<attribute>
<name>url</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description>分页提交的路径,默认不用配置该项,自动获取系统访问路径。</description>
</attribute>
<attribute>
<name>urlType</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>queryParames</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
<description>
查询参数
</description>
</attribute>
</tag>
</taglib>
我们在jsp页面直接写
Html代码
<td align="center" nowrap>
记录总数
<s:property value="%{totalNum}" />条 每页显示10条
第<s:property value="pageNo" />页 <fly:pages pageNo="pageNo" totalPage="totalPage" totalNum="totalNum" styleClass="page" theme="text" queryParames="queryParames"> </fly:pages>
</td>
相关推荐
本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...
该文档详细描述了struts2版本的分页显示,值得一读
在探讨Struts2框架下的增删改查以及分页查询功能时,我们首先需要理解Struts2框架本身。Struts2是Apache软件基金会的一个开源Web应用框架,它继承了Struts1的一些特性,并在此基础上进行了大量的改进和扩展,提供了...
用Struts2+mysql实现的简单信息录入,分页查询
下面是我用Struts2做的一个分页显示实例,基本的思路是:把数据库表中的每一行数据封装成一个对象,用一个返回类型为List的方法返回这些对象,接着在Struts2的action里面定义一个List属性,用这个List来接收从数据库...
在分页场景下,Struts2的拦截器可以用来处理分页参数,如当前页数和每页显示条数,而动作类则负责根据这些参数从数据库获取对应的数据。 分页的核心在于如何计算出正确的查询范围,这涉及到SQL语句的编写。通常我们...
本实践项目旨在展示如何在Struts2中实现分页功能,适用于初学者学习和提升技能。 首先,我们来了解分页的基本原理。分页是将大量数据分成若干小部分,每次只加载一部分到页面上,用户可以通过导航按钮来浏览其他...
在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...
本文将详细介绍Struts2实现分页效果的第二种方法。 在Struts2中,实现分页通常涉及以下几个关键步骤: 1. **模型(Model)**:首先,我们需要一个实体类来存储待分页的数据,例如`User`。然后,创建一个`PageBean`类...
在Struts2中,我们通常会定义一个PageTool类来封装分页所需的信息,例如当前页码、每页显示记录数等。 2. **DAO接口定义** 提供的代码片段中展示了`KindEntityDao`接口的部分定义,其中包括了获取单个实体、保存...
【hibernate+struts2分页代码】是关于如何在Java Web开发中结合Hibernate ORM框架和Struts2 MVC框架实现数据分页的功能。在Web应用程序中,分页是提高用户体验的重要手段,它允许用户逐步浏览大量数据,而无需一次性...
### Struts2 实现分页及 `<s:bean>` 标签详解 #### 一、Struts2 分页概述 在 Java Web 开发中,为了提高用户体验并减轻服务器负担,通常采用分页技术来展示数据。Struts2 框架提供了一套强大的工具和标签库来帮助...
MyBatis增 删 改 查 struts2分页
经典Struts2分页方法是Java Web开发者需要掌握的核心技能之一。 分页的实现通常涉及到以下几个关键知识点: 1. **Action类**:在Struts2中,Action类是处理用户请求的中心。为了实现分页,我们需要创建一个包含...
在JSP页面上,我们可以使用Struts2的标签库来显示分页链接。Struts2提供了`s:url`和`s:a`标签来生成URL并触发链接事件。例如: ```jsp <!-- 显示数据列表 --> ${dataList}"> <tr><td>${item.property}</td></tr...
Struts2分页是Web开发中的一个重要概念,它主要用于处理大量数据时,避免一次性加载所有数据导致页面响应慢或者浏览器崩溃。在这个场景中,我们提到的是使用自定义标签实现类似于百度分页的效果,这是一种常见的用户...
Struts2实现分页功能,代码完整简洁易懂,可以直接拿去使用,欢迎拍砖
在Struts2中,分页是常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要将结果分成多页显示。本文将详细介绍如何在Struts2中实现分页标签,并提供一个简洁易懂的项目示例。 1. **Struts2分页概念**:...
这是struts的一个练习 这是struts的一个练习这是struts的一个练习这是struts的一个练习
2. **Action类**:在Struts框架中,Action类是控制器层的核心,它负责接收用户的请求,根据请求参数执行相应的业务逻辑,并返回一个表示结果的ActionForward对象,这个对象指定了视图的跳转方向。 3. **.struts-...