接触J2EE 也有一段时间了,想用jsp + servlet + javabean + jdbc 做一个分页例子,在网上找了一下,想参考一下别人做的思路,可能这个太简单了,没找到理想的代码,大部分都是转发别人的代码的网站,也许已经有了现成的组件了。今天好像学了 jstl 标签库,决定把它用上了,但对于初学者来说,必须一步一步来的,急不来!!
好吧,今天决定做一个完整的分页例子来玩玩顺便分享一下,学习编程没有成就感是不行的,毕竟学习与工作是不同的。不过,我还是刚过20岁的学生,菜鸟一个。希望前辈们不要见笑哦!
操作系统:window xp
开发语言:jsp + html
开发工具:MyEclipse 6.0
服务器:Tomcat 6.0
数据库:SQL server 2005
示例数据库:SQL server 2000 里的 pubs
效果图:
/**
*
* 分页类
*
*/
public class PageBean {
// 定义每页显示的记录数
private int pagesize = 10;
// 定义当前页数
private int currentPage;
// 定义总记录数
private int rowCount;
// 定义总页数
private int pageCount;
// 当前页面的数据
private ArrayList data = new ArrayList();
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}
public int getPageCount() {
return rowCount % pagesize == 0 ? rowCount / pagesize : rowCount
/ pagesize + 1;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public ArrayList getData() {
return data;
}
public void setData(ArrayList data) {
this.data = data;
}
}
/**
* 数据类
*
*/
public class Title {
private String titleid;
private String title;
private String type;
private String pubid;
private float price;
public String getTitleid() {
return titleid;
}
public void setTitleid(String titleid) {
this.titleid = titleid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPubid() {
return pubid;
}
public void setPubid(String pubid) {
this.pubid = pubid;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
/**
* 数据库连接类
*/
public class DbConn {
/**
* 通过建数据源连接数据库方法
*
* @return Connection
*/
public Connection getConn() {
Connection conn = null;
try {
// 加载驱动 jdbc-odbc
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// 获得连接 abc 是配置的数据源的名称
conn = DriverManager.getConnection("jdbc:odbc:abc");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
}
return conn;
}
/**
* 通过Jar包连接数据库
*
* @return Connection
*/
public Connection getConnByJar() {
Connection conn = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(
"jdbc:sqlserver://localhost:1433;databasename=pubs", "sa",
"sa2005");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
/**
* 数据库操作类
*/
public class DbOper {
private Connection conn = null;
private Statement stat = null;
private PreparedStatement pstat = null;
private ResultSet rs = null;
ArrayList al = new ArrayList();
DbConn db = new DbConn();
/**
* 按照传过来的页数查询数据
*
* @param currentPage
* @return PageBean
*/
public PageBean selectByPage(int currentPage) {
PageBean pb = new PageBean();
conn = db.getConnByJar();
int pageSize = pb.getPagesize();
String sql = "select count(*) from tab1";
int rowCount = 0;
try {
pstat = conn.prepareStatement(sql);
rs = pstat.executeQuery();
if (rs.next()) {
// 总记录数
rowCount = rs.getInt(1);
pb.setRowCount(rowCount);
}
// 当前页面数据
String sql2 = "select top "
+ pageSize
+ " title_id,title,type,pub_id,price from tab1 where"
+ " title_id not in (select top "
+ +(currentPage - 1)
* pageSize
+ " title_id from tab1 order by title_id) order by title_id";
pstat = conn.prepareStatement(sql2);
rs = pstat.executeQuery();
while (rs.next()) {
Title t = new Title();
t.setTitleid(rs.getString(1));
t.setTitle(rs.getString(2));
t.setType(rs.getString(3));
t.setPubid(rs.getString(4));
t.setPrice(rs.getFloat(5));
pb.getData().add(t);
pb.setCurrentPage(currentPage);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstat != null) {
try {
pstat.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return pb;
}
}
/**模块功能:
*
* 1、获取表单数据
* 2、创建操作类对象
* 3、通过调用操作类对象方法,得到 PageBean 对象
* 4、把分页类对象设置到 session 范围
* 5、重定向页面
*/
public class QueryServlet extends HttpServlet {
/**
* 处理 Post 的 URL 请求
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取当前页数
int currentPage = request.getParameter("currentPage") == null ? 1 : Integer
.parseInt(request.getParameter("currentPage"));
DbOper oper = new DbOper();
PageBean pb = null;
// 查询
pb = oper.selectByPage(currentPage);
// 将 PageBean 对象设置到 Session 范围
request.getSession().setAttribute("pb", pb);
// 重定向页面到 index.jsp
request.getRequestDispatcher("index.jsp").forward(request, response);
}
/**
* 处理 Post 的 URL 请求
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException,IOException {
/* 重定向到 Post 请求处理方法 */
this.doPost(request, response);
}
}
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<body>
<h1>jsp + servlet + jdbc + jstl 分页例子</h1>
<form action="query.do" name="frm" method="post" >
<table border="1">
<tr>
<th>编号</th>
<th>名称</th>
<th>类型</th>
<th>出版商ID</th>
<th>单价</th>
</tr>
<c:choose>
<c:when test="${empty pb}">
<%-- 如果 pb 对象为空不作任何处理--%>
</c:when>
<c:otherwise>
<c:forEach items="${pb.data}" var="t">
<tr>
<td>${t.titleid }</td>
<td>${t.title }</td>
<td>${t.type }</td>
<td>${t.pubid }</td>
<td>${t.price }</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<%-- 添加分页控制 begin --%>
<c:choose>
<c:when test="${pb.currentPage <= 1}">
首页 上一页
</c:when>
<c:otherwise>
<a href="javascript:gopage(1)">首页</a>
<a href="javascript:gopage(${pb.currentPage-1 })">上一页</a>
</c:otherwise>
</c:choose>
<%-- 添加分页数字 --%>
<c:forEach var="i" begin="1" end="${pb.pageCount}" step="1" varStatus="s">
<c:choose>
<c:when test="${pb.currentPage == s.index}">
${s.index }
</c:when>
<c:otherwise>
<a href="javascript:gopage(${s.index })">${s.index }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:choose>
<c:when test="${pb.currentPage >= pb.pageCount}">
下一页 末页
</c:when>
<c:otherwise>
<a href = "javascript:gopage(${pb.currentPage+1 })">下一页</a>
<a href = "javascript:gopage(${pb.pageCount })">末页</a>
</c:otherwise>
</c:choose>
<%-- 添加分页控制 end --%>
</form>
<form action="" name="frm2" method="post">
<input type="hidden" name="currentPage">
</form>
</body>
</html>
<script type="text/javascript">
// 利用js间接提交表单
function gopage( x ) {
// 给表单frm1的隐藏域currentPage的值赋为当前页数
document.frm2.currentPage.value = x
document.frm2.action = "query.do";
document.frm2.submit();
}
</script>
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<html>
<body>
<center>
<form action="query.do" method="post">
<input type="submit" value="查询数据">
</form>
</center>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>query.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>QueryServlet</servlet-name> <servlet-class>cn.pa.servlet.QueryServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>QueryServlet</servlet-name> <url-pattern>/query.do</url-pattern> </servlet-mapping> </web-app>
今天做了两个版本:一个是 jsp + servlet + javabean + jdbc; 另一个是 jsp + servlet + javabean + jdbc + jstl
其实学习到 jstl 标签库,我已经经过一个系统学习过程了,
a:什么功能都写在同一个jsp页面;
b:jsp显示页面到jsp功能页面;
c:学习了javabean,也就是以前学习的实体类;
d:学习了servlet,把控制代码都放到 servlet
e:学习了 jstl 标签库,可以完全代码<% … %>真正实现显示页面与功能的分开
也就是 MVC 模式了。
到目前为止都是基础,也就是玩玩罢了,学习的重点是框架,不过学习框架必须要把基础学好。
这两种分页的例子我已经用工程的形式做好了,如有需要可以下载了