使用JSP和SERVLET實現分頁
在網站的建設中,已經需要從數據庫里檢索大量的信息。但由于在internet上一次傳送大里的數據是不可取。所以一般都采用分頁來顯示查詢到的大量數據。當然我們可以按照象asp、php等腳本的方法,在JSP中實現分頁,但這就沒利用到了JSP動態頁面與靜態頁面的分離的優點,使大量運算代碼嵌在頁面中不便于維護。下面將通過一些例程來說明實現JSP頁面翻頁技術的實現。
思路:
首先,在JSP中,通過JAVA servlet 來檢索數據(servlet與數據庫的聯接及使用請看在本頻道中的《Servlet中jdbc應用高級篇》系列文章),所以在這里SERVLET是一個管理器即controlor。并把查詢出來的數據保存到封裝數據結構的對象(class)內,在這里這個對象是一個model。最后用JSP調用結果來顯示,在這里jsp是一個viewer。其上主要就是一個MVC編程模式,如想要如體了解MVC這種模式可以在看相關資料。
1.在服務器端的servlet 中的實現
要點:
*將查詢條件保存到session中,取session中的查詢條件
*設置Statement對象的MaxRows(確定一頁顯示多少行數據)
*順序地通過執行SQL語句查詢數據,按maxRows 來檢索一個maxRows的數據,下一頁再檢索下一maxRows的數據,以此類推。
2. 在JSP中的顯示實現
要點:
* 顯示maxRows條數據
*通過"下一頁"按鈕或超鏈再次調用剛才的servlet查詢下一maxRows的數據
下面通過一個例程來說明(一個servlet程序和一個JSP程序):
querymedicine. java
package Medicine;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import Medicine.medicinelist;
import Medicine.searchData;
public class querymedicine extends HttpServlet {rivate DBConnectionManager connMgr; file://Initialize global variables
public void init(ServletConfig config) throws ServletException { super.init(config);
connMgr = DBConnectionManager.getInstance();
}
file://處理 HTTP Get 請求
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Statement stmt=null;
Connection con = connMgr.getConnection("medicine");
if (con == null) {
response.sendRedirect("/medicine/con_error.html");
return;
}
// 創建數據庫Statement
try {
stmt=con.createStatement();
}
catch (Exception e)
{
connMgr.freeConnection("medicine",con);
response.sendRedirect("/medicine/stmt_error.html");
return;
}
file://--------------------------------------------------------------------------------------------------------------------
long all_count=0; file://存滿足條件的藥品總數
file://===================從request中得到session======================
try{
HttpSession session = request.getSession(false);
if (session == null) {
connMgr.freeConnection("medicine",con);
response.sendRedirect("/medicine/session_error.html");
return;
}
file://從"下一頁"提交來的參數取得前頁最后一條數據的藥品編碼
String ll_pos=request.getParameter("pos"); file://如果pos=-1則表示要從頭開始查
file://=====================查詢用的SQL語句串==========================
String sqlstatment="SELECT medicines.ypbm, medsmalltypes.zlmc, medsupertypes.clmc, medtypes.dlmc, medicines.ypm, medicines.zyyx, medicines.ypzy FROM medicines,medsmalltypes,medsupertypes,medtypes WHERE medicines.ypbm>"+ll_pos+" and (( medsmalltypes.zlbm = medicines.zlbm ) and ( medsupertypes.clbm = medicines.clbm ) and ( medtypes.dlbm = medicines.dlbm ) and ( ( medicines.del_flag = 0 ) ";
file://-------------------------------------------------------------------------------------------------------------
String zlbm;
string dlbm;
String clbm;
String zyyx;
String ypm;
searchData slist=new searchData();
synchronized (session) {
slist=(searchData)session.getAttribute("searchList");
}
if(ll_pos.equals("-1")){
file://表示不是由"下一頁"過來要從頭開始查數據
if(slist!=null){
synchronized (session) {
session.removeAttribute("searchList");
}
}
slist=new searchData();
file://從設置查詢條件頁面取得查詢條件的參數
zlbm=request.getParameter("zlbm");
dlbm=request.getParameter("dlbm");
lbm=request.getParameter("clbm");
yyx=request.getParameter("zyyx");
ypm=request.getParameter("ypm");
file://將查詢條件參數通過Vector存到session
slist.setZlbm (zlbm);
slist.setDlbm (dlbm);
slist.setClbm (clbm);
slist.setZyyx (zyyx);
list.setYpm (ypm);
synchronized (session) {
session.setAttribute ("searchList",slist);
}
}
file://----------------------------------------------------------------------------------------------------------------
else
{
file://取出查詢條件參數
if(slist!=null){
zlbm=slist.getZlbm();
dlbm=slist.getDlbm();
clbm=slist.getClbm();
yyx=slist.getZyyx();
ypm=slist.getYpm();
}
else{
if(stmt!=null) stmt.close();
stmt.setMaxRows(0);
connMgr.freeConnection("medicine",con);
response.sendRedirect("/medicine/session_error.html");
return;
}
}
String sql2="select count(*) from medicines where del_flag=0";
file://根據條件參數設置SQL語句
if(!(zlbm.trim().equals("0"))) {
sqlstatment+=(" and ( medicines.zlbm='"+zlbm.trim()+"' ) ");
sql2+=(" and zlbm='"+zlbm.trim()+"'");
}
if(!(dlbm.trim().equals("0"))) {
sqlstatment+=(" and ( medicines.dlbm='"+dlbm.trim()+"' )");
sql2+=(" and dlbm='"+dlbm.trim()+"'");
}
if(!(clbm.trim().equals("0"))) {
sqlstatment+=(" and ( medicines.clbm='"+clbm.trim()+"' ) ");
sql2+=(" and clbm='"+clbm.trim()+"'");
}
if(!(zyyx.trim().length ()==0)) {
sqlstatment+=(" and ( medicines.zyyx like '%"+zyyx.trim()+"%' ) ");
sql2+=(" and zyyx like '%"+zyyx.trim()+"%'");
}
if(!(ypm.trim().length ()==0)) {
sqlstatment+=(" and ( medicines.ypm like '%"+ypm.trim()+"%' ) ");
sql2+=(" and ypm like '%"+ypm.trim()+"%'");
}
sqlstatment+=" )) ORDER BY medicines.ypbm ASC ";
file://-------------------------------------------------------------------------------------------------------------------
Vector list = new Vector();
file://設置一頁顯示的數據條數(一次檢索出的數據條數)
stmt.setMaxRows(25);
file://執行查詢將結果放到ResultSet中
ResultSet rs = stmt.executeQuery(sqlstatment);
ResultSet rs2 = stmt.executeQuery(sql2);
file://-------------------------------------------------------------------------------------------------------
if(rs==null){ file://如果沒有查詢結果數據
if(stmt!=null) stmt.close();
stmt.setMaxRows(0);
connMgr.freeConnection("medicine",con);
response.sendRedirect("/medicine/no_medicine.html"); file://定向到一個頁面
return;
}
file://將藥品信息填入數據對象并存入Vector中
if(rs2.next()){
all_count=rs2.getLong(1); file://取得總條數
}
if(rs2!=null)rs2.close();
while(rs.next()){
medicinelist m = new medicinelist();
m.setYpbm(rs.getInt("ypbm"));
m.setZlmc(rs.getString("zlmc"));
m.setClmc(rs.getString("clmc"));
m.setDlmc(rs.getString("dlmc"));
m.setYpm(rs.getString("ypm"));
m.setZyyx(rs.getString("zyyx"));
m.setYpzy(rs.getString("ypzy"));
m.setClbm(clbm);
m.setDlbm(dlbm);
m.setZlbm(zlbm);
list.addElement(m);
}
file://-----------------------------------------------------------------------------------------------------------------
if(rs!=null)rs.close();
stmt.setMaxRows(0);
if(stmt!=null)stmt.close();
connMgr.freeConnection("medicine",con);
file://========================存入session中===========================
synchronized (session) {
session.setAttribute("medicinelist",list);
}
file://-------------------------------------------------------------------------------------------------------
}catch (SQLException e){
connMgr.freeConnection("medicine",con);
response.sendRedirect("/Medicine/sql_error.html");
return;}
file://=======================重定向到一個JSP頁面==========================
String url="/medicine/querymedicine.jsp?all_count="+all_count;
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);
rd.forward(request, response);
}
public void destroy() {
// =================== 在Servlet退出時終止數據庫連接,取消Statement對象
if(connMgr!=null) connMgr.release();
file://------------------------------------------------------------------------
}
file://處理HTTP Post 請求
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
file://取得 Servlet 信息
public String getServletInfo() {
return "medicine.querymedicine Information";
}
}
querymedicine.jsp file://[實現查詢結果的顯示
<%@ page language="java" session="true" import="java.util.*,Medicine.method, Medicine.medicinelist" contentType="text/html;charset=gbk" %>
<%
method md = new method();
Vector sklist;
synchronized (session) {
sklist = (Vector) session.getAttribute("medicinelist");
}
%>
<%
if (sklist == null || sklist.size() <= 0)
{
response.sendRedirect("/medicine/no_medicine.html");
return;
}
else
{%>
明細 | 商品名稱 | 超類 | 子類 | 描述 |
<%
String ssll=request.getParameter("all_count");
Long temp=new Long(ssll);
long cou= temp.longValue();
if(sklist.size()==25&&cou>25)
{%>
<%}%>
<%
synchronized (session) {
if(session.getAttribute("medicinelist")!=null){
session.removeValue("medicinelist");
}
}
%>