SSH自定义分页

这是我自己写的一个简单的自定义分页,基于SSH框架。个人感觉易懂,而且也能够处理所有的问题。本人第一次上传,希望能够帮助大家,如果有什么好的建议可以一起探讨。接下来是我的代码:
[color=red]一:MyTag.tld文件,放在WEB-INF目录下[/color]
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>testOnly tag</description>
<display-name>testTag</display-name>
<tlib-version>2.0</tlib-version>
<short-name>page</short-name>
<uri>http://www.handlewell.com/adp/testTag</uri>

<!-- 系统信息提示标签 -->
<tag>
<!-- 标签库元素 -->
<name>Page</name>
<tag-class>util.PageTagComponent</tag-class>

<!-- 标签元素:如果标签需要有标签体(body)那么这里就要定义body中的内容格式,如JSP标明自定义标签的body内是以JSP格式的内容 -->
<body-content>empty</body-content>

<!-- 标签属性元素 -->
<attribute>
<name>totalRows</name>
<!-- 属性是否必需的,默认为false -->
<required>true</required>
<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>nowPage</name>
<!-- 属性是否必需的,默认为false -->
<required>true</required>
<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageSize</name>
<!-- 属性是否必需的,默认为false -->
<required>true</required>
<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>dataSourceUrl</name>
<!-- 属性是否必需的,默认为false -->
<required>true</required>
<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>form</name>
<!-- 属性是否必需的,默认为false -->
<required>false</required>
<!-- 属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>

</tag>
</taglib>
[color=red]二:接下来就是处理自定义标签的类PageTagComponent.java,这里分页的每一个小功能都是独立的(可以自己重新定义),此处省略get/set方法[/color]
package util;

import java.io.IOException;

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

public class PageTagComponent extends SimpleTagSupport{


private int totalRows;//总的记录
private int nowPage;//当前页数
private int pageSize;//容量大小
private int jumpPage;//跳转页面
private String dataSourceUrl;//请求地址
private String form;
int allPage = 0;//总的页数
@Override
public void doTag() throws JspException, IOException {

JspWriter out = getJspContext().getOut();
//<a>首页</a><a>上一页</a><a>3</a><a>下一页</a><a>尾页</a> 跳至<a>34</a>
//总的页数
if (totalRows%pageSize ==0) {
allPage = totalRows/pageSize;
}else {
allPage = totalRows/pageSize+1;
}
//处理URL
dataSourceUrl += "?pageSize="+pageSize;

//处理首页
StringBuffer firstPage = new StringBuffer();
firstPage.append("<a href='"+dataSourceUrl+"&nowPage=1'>首页</a>");
//处理尾页
StringBuffer endPage = new StringBuffer();
endPage.append("<a href='"+dataSourceUrl+"&nowPage="+allPage+"'>尾页</a>");
//处理当前页数
StringBuffer totalPageStr = new StringBuffer();
if (allPage <= 1 ) {
totalPageStr.append("<a href='#'>"+totalRows+"</a>");
}
if (allPage > 1) {
for (int j = nowPage-2; j <= nowPage+2; j++) {

if (j >= 1 && j<=allPage) {
if (nowPage == j) {
totalPageStr.append("<a class='currentPage' href='"+dataSourceUrl+"&nowPage="+j+"'>"+"<font color='red'>"+j+"</font></a>");
}else {
totalPageStr.append("<a class='currentPage' href='"+dataSourceUrl+"&nowPage="+j+"'>"+j+"</a>");
}
}

}
}

//处理上一页
StringBuffer prePage = new StringBuffer();
if (hasPre()) {
prePage.append("<a href='"+dataSourceUrl+"&nowPage="
+ (nowPage-1)+"'" + ">上一页</a>");
}
//处理下一页
StringBuffer nextPage = new StringBuffer();
if (hasNext()) {
nextPage.append("<a href='"+dataSourceUrl+"&nowPage="
+ (nowPage+1)+"'>下一页</a>");
}
//处理跳页
StringBuffer jumpPage = new StringBuffer();
StringBuffer js = new StringBuffer();
if(form!=null){
if(!form.trim().equals("")){
jumpPage.append("<input size='4' id='jump' name='jump'><input type='button' οnclick='doJump()' value='跳至'>");
//处理javascript
js.append("<script>");
js.append("function doJump(){ ");
js.append("var num = document.getElementById('jump').value;");
js.append("if(isNaN(num) || num > "+allPage+" || num < 1){");
js.append("num="+nowPage+";}");
js.append("var form1 = document.getElementById("+form+");");
js.append("form1.action=\""+dataSourceUrl+"&nowPage=\"+num;");
js.append("form1.submit();}");
js.append("</script>");
}
}else{
jumpPage.append("<form id='MyTagForm' method='post'><input size='4' id='jump' name='jump'><input type='button' οnclick='doJump()' value='跳至'></form>");
//处理javascript

js.append("<script>");
js.append("function doJump(){ ");
js.append("var num = document.getElementById('jump').value;");
js.append("if(isNaN(num) || num > "+allPage+" || num < 1){");
js.append("num="+nowPage+";}");
js.append("var form1 = document.getElementById('MyTagForm');");
js.append("form1.action=\""+dataSourceUrl+"&nowPage=\"+num;");
js.append("form1.submit();}");
js.append("</script>");
}



StringBuffer html = new StringBuffer();
defaultCss(html);
html.append("<div id='TagDiv'>");
html.append("<div id='TagDiv2'>");
html.append(firstPage);
html.append(prePage);
html.append(totalPageStr);
html.append(nextPage);
html.append(endPage);
html.append("总共"+allPage+"页");
html.append(jumpPage);
html.append("</div>");
html.append("</div>");
html.append(js);

out.append(html.toString());
}

private void defaultCss(StringBuffer html){
html.append("<style type='text/css'>");
html.append("a{text-decoration: none;padding: 3px 6px;}");
html.append("a.currentPage{background: #FFF;border: #89bdd8 solid 1px;color: #067db5;}");
html.append("#MyTagForm{float:right;}");
html.append("#TagDiv{width:100%;position: absolute;bottom: 80px; }");
html.append("#TagDiv2{width:500px;margin:0 auto; }");
html.append("</style>");
}

public boolean hasNext(){
return nowPage < allPage ;
}

public boolean hasPre(){
return nowPage > 1;
}

[color=red]三:接下来就是看如何在页面上用了[/color]
<%@ taglib prefix="page" uri="/Web-INF/myTag.tld" %> 导入自定义标签的配置
<page:Page dataSourceUrl="goodsTypeAction" pageSize="3" totalRows="${totalRows }" nowPage="${nowPage }"/> 这句就是分页的标签了。
如totalRows,nowPage 这些是在Action当中获取的。
[color=red]四:看看效果如何:[/color]
不会添加图片,附件有一个截图
[color=red]五:接下来就是我要解释一下myTag.tld下的所有属性:[/color]
totalRows;//总的记录
nowPage;//当前页数
pageSize;//容量大小
dataSourceUrl;//请求地址
[color=red]form[/color]属性比较特殊,因为分页功能其实就是处理hql语句,如果hql不带条件查询分页,那么form是可以缺省的,但是如果是带条件查询分页,那么这里的form就是当前表单的form的id,然后在页面的标签上写上;不过竟然说到处理按条件查询分页,那么接下来我就说下应该添加的一些内容;
(1)[color=red]首先用到的一个别人写好的类COMMON.java[/color],在这里我就不贴代码了,可以在附件下载;这里说下COMMON的用法:首先它接收一个request,然后返回一个字符串,例如 and 条件1 and 条件2;然后在页面表单的搜索框中的name要符合SQ_规范,再然后就是这个类放在Action当中运用;代码如下:

/**
* HttpServletRequest request = ServletActionContext.getRequest();
* String str =COMMON.getQuerySql(request);
* String hql ="from goodsProduceType"; //不加条件的查询语句,返回所有的记录
* String hql2 ="select count(*) from goodsProduceType"; //不加条件的查询语句,返回记录的行数
* if(!str.trim().equals("")){ hql += "where "+str; hql2 += "where "+str; }//加上条件后的查询语句
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值