以前写的那个[jsp中实现分页显示数据 ] 方法不通用,得找个分页标签。关于pager-taglib的使用方法网上虽说一大堆,但是同样费我不少脑细胞去看。有的代码不齐全,有的根本就是错误的,有的写的很潦草,看的我是云里雾里的,经过本人耗费大量的脑细胞奋战N个小时终于搞出了点猫腻。 想明白了,写出来运行成功了,我才发现其实用法很简单,没那些人写的那么麻烦。 首先当然还是要导pager-taglib.jar包了,可以去http://jsptags.com/tags/navigation/pager/index.jsp 下载,从下载下来的war文件中找到pager-taglib.jar包以及pager-taglib.tld文件。将pager-taglib.tld文件放在WEB-INF目录下,将pager-taglib.jar放在WEB-INF/lib目录下(JBuilder中的导入方法可以参考[Servlet中实现文件上传 ] )。 新建一个bean文件定义如下两个方法(不一定非要这个样子):
* 该方法用于获得数据总数
* @return int
*/
public int getArticlesCount() {
String sql = "SELECT COUNT(*) FROM blog_Article" ;
dbc = new DataSource();
stmt = dbc.getPreparedStatement(sql);
rs = dbc.getResultSet(stmt);
int count = 0 ;
try {
if (rs.next()){
count = rs.getInt( 1 );
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
dbc.closeConnection();
}
return count;
}
* 该方法用于数据分页
* @param begin int
* @param end int
* @return ArrayList
*/
public ArrayList getArticlesAll( int begin, int end) {
String sql = "select top " +end+ " * from blog_Article where (log_ID <= (select min(log_ID) from (select top " +begin+ " log_ID from blog_Article order by log_PostTime desc) as t)) order by log_PostTime desc" ;
ArrayList list = new ArrayList();
dbc = new DataSource();
stmt = dbc.getPreparedStatement(sql);
rs = dbc.getResultSet(stmt);
try {
while (rs.next()) {
ArticleBean article = new ArticleBean();
article.setId(rs.getInt( 1 ));
article.setTag(rs.getString( 10 ));
article.setIsTop(rs.getByte( 11 ));
list.add(article);
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
dbc.closeCon
nection();
}
return list;
}
/** * 该方法用于获得数据总数 * @return int */public int getArticlesCount() { String sql = "SELECT COUNT(*) FROM blog_Article"; dbc = new DataSource(); stmt = dbc.getPreparedStatement(sql); rs = dbc.getResultSet(stmt); int count = 0; try { if(rs.next()){ count = rs.getInt(1); } } catch (SQLException ex) { ex.printStackTrace(); } finally { dbc.closeConnection(); } return count; } /** * 该方法用于数据分页 * @param begin int * @param end int * @return ArrayList */public ArrayList getArticlesAll(int begin,int end) { String sql = "select top "+end+" * from blog_Article where (log_ID <= (select min(log_ID) from (select top "+begin+" log_ID from blog_Article order by log_PostTime desc) as t)) order by log_PostTime desc"; ArrayList list = new ArrayList(); dbc = new DataSource(); stmt = dbc.getPreparedStatement(sql); rs = dbc.getResultSet(stmt); try { while (rs.next()) { ArticleBean article = new ArticleBean(); article.setId(rs.getInt(1)); //赋值操作... article.setTag(rs.getString(10)); article.setIsTop(rs.getByte(11)); list.add(article); } } catch (SQLException ex) { ex.printStackTrace(); } finally { dbc.closeConnection(); } return list; }
接下来新建一个JSP页面(需要JSTL):
<%@ page contentType= "text/html; charset=GBK" import = "java.util.*,com.nkblog.bean.ArticleBean,com.nkblog.dbc.*" %>
<%@ taglib uri= "http://java.sun.com/jsp/jstl/core" prefix= "c" %>
<%@ taglib uri= "WEB-INF/pager-taglib.tld" prefix= "pg" %>
<%
request.setCharacterEncoding( "GBK" );
String offset = request.getParameter( "pager.offset" );
int page = 0 ;
if (offset == null ){
page= 1 ;
} else {
page = Integer.parseInt(offset)+ 1 ;
}
int dataTotal = ArticleManager.getArticlesCount();
ArrayList articles = ArticleManager.getArticlesAll(page, 10 );
%>
<%
for ( int i= 0 ;i<articles.size();i++)
{
}
%>
<pg:pager scope= "request" maxIndexPages= "5" index= "center" maxPageItems= "10" url= "index.jsp" items= "<%=dataTotal%>" %> " export=" currentPageNumber=pageNumber">
<pg:first><a href= "${pageUrl}" >首页</a></pg:first>
<pg:prev><a href= "${pageUrl}" >前页</a></pg:prev>
<pg:page>
</pg:page>
<pg:pages>
<c:choose>
<c:when test= "${pageNumber eq currentPageNumber }" >
<font color= "red" >${pageNumber }</font>
</c:when>
<c:otherwise>
<a href= "${pageUrl }" >${pageNumber}</a>
</c:
otherwise>
</c:choose>
</pg:pages>
<pg:next><a href= "${pageUrl}" >下页</a></pg:next>
<pg:last><a href= "${pageUrl}" >尾页</a></pg:last>
</pg:pager>
<%@ page contentType="text/html; charset=GBK" import="java.util.*,com.nkblog.bean.ArticleBean,com.nkblog.dbc.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="WEB-INF/pager-taglib.tld" prefix="pg" %><%request.setCharacterEncoding("GBK");String offset = request.getParameter("pager.offset");//pager.offset为此分页标签内置变量用于传递页数 int page = 0; if(offset == null){ //若offset为null则是第一次访问,所以显示第一页 page= 1; }else{ //反之,则按照传递来的页数来分 page = Integer.parseInt(offset)+1; }//获取数据总数 int dataTotal = ArticleManager.getArticlesCount();//查询分页数据,10为每页要显示的数据量,可自定义ArrayList articles = ArticleManager.getArticlesAll(page,10);%><%for(int i=0;i<articles.size();i++){//输出取出的10条数据...}%><pg:pager scope="request" maxIndexPages="5" index="center" maxPageItems="10" url="index.jsp" items="<%=dataTotal%>" %>" export="currentPageNumber=pageNumber"> <pg:first><a href="${pageUrl}">首页</a></pg:first> <pg:prev><a href="${pageUrl}">前页</a></pg:prev> <pg:page> </pg:page> <pg:pages> <c:choose> <c:when test="${pageNumber eq currentPageNumber }"> <font color="red">${pageNumber }</font> </c:when> <c:otherwise> <a href="${pageUrl }">${pageNumber}</a> </c:otherwise> </c:choose> </pg:pages> <pg:next><a href="${pageUrl}">下页</a></pg:next> <pg:last><a href="${pageUrl}">尾页</a></pg:last></pg:pager>
接下来具体说明上面的分页标签<pg:pager> maxIndexPages为分页条个数,形如:< << 1 2 3 4 5 >> > maxPageItems为每页要显示的数据量 url为处理分页请求的文件,可以是JSP或Servlet。当程序运行起来后,会以index.jsp?pager.offset=5的形式传递页数。 items为数据总数,pager-taglib会自动根据以上参数进行分页。 需要进行修改的也就上面这几个参数,起初看别人写的方法,我以为只要导入这个标签然后给定一个List数据集合,它就完全自动的跟也并显示数据了,汗~~也不知道我这么写会有几个看得懂的,估计懂的人有,但是能看明白我写的就少了…我发现原来代码写起来简单,但是要给别人将明白了真的好难啊。
虽然也学了这么久的J2EE了(基础型),但是我一直都搞不明白:MVC模式是要分三层的,显示层、控制层(业务逻辑层)及数据层,业务逻辑层才能访问数据层,而显示层不能够直接访问数据层。既然如此,那么网站的首页所需要的数据都是来自数据库的,是要动态读取的,这就要在jsp中直接访问数据层,岂不是相互矛盾了吗? 去了几个技术论坛看了看,有人说那只是一个高效的框架模型,不一定非要遵守,可以直接在首页jsp中调用数据层的方法,活人岂能被尿憋死?话虽说有那么点道理,不过我还是不想这么试。 我是这么想的: 方法1.能不能打开网站地址时候访问的第一个文件是一个Servlet,在Servlet中获得首页用于显示所需要的所有数据,然后将它放在request中,接着在使用 request.getRequestDispatcher("index.jsp").forward(request, response); 跳转到真实的首页,如此即可在index.jsp中从request中获得所要的数据了。那么,如何才能打开网址就直接访问Servlet呢?在网站的根目录下WEB-INF中的web.xml中有这么一对标签: <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> 类似于配置IIS中的默认首页 ,我们把这里的index.jsp改为对应的Servlet即可。
方法2.创建一个过滤器,专门用来过滤首页文件,当请求首页文件时就在过滤器中取数据。过滤器本身其实也是Servlet。 我就晕了,无论用这里面哪一个方法,那这里面的Servlet到底属于哪一层啊?是不是我太钻牛角尖了?
在上一篇[jsp中实现分页显示数据 ] 中,我们提到了这段代码 import = "java.util.ArrayList,com.dbc.DBC,com.jobs.JobsBean" 其中ArrayList是java自己本身的util包中的,DBC和JobsBean是我们自己创建的,下面我们来创建他们。 在我们上次创建的工程中,右键单击Project Source选择:new->package。写入我们的包名,例如:com.jobs 右键我们刚才创建的com.jobs包,选择:new->class->输入类名(如:JobsBean)->ok。接下来对JobsBean进行编码。双击JobsBean.java文件,选择:Bean->Properties->Add Property.Property Name中输入变量名,Type中输入变量的数据类型,输入完成之后单击ok按钮。回到Source中我们可以看到生成的代码如下:
package com . jobs ;
public class JobsBean { private int id ; private String desc ; private int min ; private int max ; public int getId () { return id ; }
public String getDesc () { return desc ; }
public int getMin () { return min ; }
public int getMax () { return max ; }
public void setId ( int id ) { this . id = id ; }
public void setDesc ( String desc ) { this . desc = desc ; }
public void setMin ( int min ) { this . min = min ; }
public void setMax ( int max ) { this . max = max ; } }
创建dbc数据库连
2008.05.08 / 标签:
javabean ,
jsp url重写技术 / 分类:
J2EE技术
本例目的:实现分页查询mssql中自带的pubs数据库中的jobs表。 首先打开JBuilder2006创建一个web模块。新建一个jsp文件,例如:list.jsp用于显示数据。
<% @page contentType = "text/html; charset=GBK" import = "java.util.ArrayList,com.dbc.DBC,com.jobs.JobsBean" %> < html > < head > < title > list </ title > </ head > < body bgcolor = "#ffffff" > <% int pageNum = 0 ; try { pageNum = Integer . parseInt ( request . getParameter ( "page" )); //接收url重写参数 } catch ( Exception ex ) { pageNum = 0 ; } int a = 0 ; if ( pageNum <= 0 ) { //判断是否小于最小页数 a = 1 ; pageNum = 0 ; } else { a = pageNum * 10 + 1 ; } ArrayList array = new ArrayList (); JobsBean job = new JobsBean (); DBC db = new DBC (); int count = db . getCount (); //获取最大页数 if ( pageNum > count ){ //判断是否超过最大页数 &nbs
p; a = count * 10 + 1 ; pageNum = count ; } array = db . getJobs ( a ); //查询数据 %> < center > < table border = "1" bgcolor = "green" > < tr > < td > id </ td > < td > desc </ td > < td > min </ td > < td > max </ td > < td colspan = "2" > 操 & nbsp ; 作 </ td > <% for ( int i = 0 ; i < array . size (); i ++) { //迭代array job = ( JobsBean ) array . get ( i ); //强制转换成JobsBean类型 %>
<tr > //使用get()方法取值 < td ><%= job . getId () %> </ td > < td ><%= job . getDesc () %> </ td > < td ><%= job . getMin () %> </ td > < td ><%= job . getMax () %> </ td > < td > //以下用于url重写实现后面将要实现的修改,删除等操作 < a href = "edit.jsp?id=<%=job.getId()%>" > 修改 </ a > </ td > < td > < a href = "del.jsp?id=<%=job.getId()%>" > 删除 </ a > </ td > </ tr > <%} %> < tr > < td > < a href = "list.jsp?page=0" > 首页 </ a > </ td > < td > < a href = "list.jsp?page=<%=pageNum-1%>" > 上一页 </ a > </ td > < td > < a href = "list.jsp?page=<%=pageNum+1%>" > 下一页 </ a > </ td > < td > < a href = "list.jsp?page=<%=count%>" > 末页 </ a > </ td > </ tr > </ table > </ center > </ body > </ html >
接下来我们对上面这段代码进行分析。 import="java.util.ArrayList,com.dbc.DBC,com.jobs.JobsBean" 用于导入我们需要的包和bean
,具体将在下一篇讲到。
int pageNum = 0 ; try { pageNum = Integer . parseInt ( request . getParameter ( "page" )); } catch ( Exception ex ) { pageNum = 0 ; } int a = 0 ; if ( pageNum <= 0 ) { a = 1 ; pageNum = 0 ; } else { a = pageNum * 10 + 1 ; } ArrayList array = new ArrayList (); JobsBean job = new JobsBean (); DBC db = new DBC (); int count = db . getCount (); if ( pageNum > count ){ a = count * 10 + 1 ; pageNum = count ; } array = db . getJobs ( a );
上面这段代码中我们声明一个int型的pageNum并使用pageNum = Integer.parseInt(request.getParameter("page"))来接收list.jsp在进行url重写的时候传递来的参数。int型的a用于计算出我们要查询从第几条记录开始的10条记录。 int count = db.getCount(); if(pageNum > count){ a = count*10+1; pageNum = count; } array = db.getJobs(a); db.getCount()将返回数据按每10条一页可分出的页数,并将其与url重写时传递的参数进行比较,若pageNum大于count(即:所要查看的页数超过最大页数)则始终查询最后1页数据。使用array存储查询出的数据。
<table border ="1" bgcolor ="green" > <tr> <td> id </td> <td> desc </td> <td> min </td> <td> max </td> <td colspan ="2" > 操作 </td> <% for ( int i = 0 ; i < array.size(); i++) { job = (JobsBean) array.get(i); %>
<tr> <td><%=job.getId() %> </td> <td><%= job.getDesc() %> </td> <td><%= job.getMin() %> </td> <td><%= job.getMax() %> </td> <td> <a href ="edit.jsp?id= <%= job.getId() %> " > 修改 </a> </td> <td> <a href ="del.jsp?id= <%= job.getId() %> " > 删除 </a> </td> </tr> <% } %> <tr> <td> <a href ="list.jsp?page=0" > 首页 </a> </td> <td> <a href ="list.jsp?page= <%= pageNum- 1 %> " > 上一页 </a> </td> <td> <a href ="list.jsp?page= <%= pageNum+ 1 %> " > 下一页 </a> </td> <td> <a href ="list.jsp?page= <%= count %> " > 末页 </a> </td> </tr> </table> 上面这段代码使用for循环输出array中存储的数据。下面的首页,上一页等均使用url重写进行查询。