程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts1.2實現MySQL數據庫分頁

Struts1.2實現MySQL數據庫分頁

編輯:關於JAVA

我的平台是:Eclipse3.2  MyEclipse5.5 Tomcat5.5 MySql5.0

第一步:創建數據庫:

這沒什麼難的,用下面的腳本就OK了。

CREATE DATABASE page;
use page;
CREATETABLE `product` (
`id` varchar(11) NOTNULL,
`sortid` varchar(11) NOTNULL,
`name` varchar(50) NOTNULL,
`price` doubleNOTNULL,
`saleprice` doubleNOTNULL,
`descript` text NOTNULL,
`contents` text NOTNULL,
`saledate` varchar(255) NOTNULL,
`salecount` int(11) defaultNULL,
`image` text,
PRIMARYKEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

第二步:創建一個項目

創建一個項目,項目名為”strutsPage”,導入Struts1.2 ,Struts的包采用默認,引用MySql的驅動,要是沒有驅動的話,請到http://download.csdn.net/source/400716這下載。

下面設置web.xml和struts-config.xml配置文件,我覺得直接COPY我的就好了。

web.xml:文件裡的內容如下,直接換上就OK了。基本是默認的。

<?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
     <param-name>config</param-name>
     <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
     <param-name>debug</param-name>
     <param-value>3</param-value>
    </init-param>
    <init-param>
     <param-name>detail</param-name>
     <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
   </servlet>
   <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
   </servlet-mapping>
   <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
  </web-app>

struts-config.xml的內容如下:

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
  <struts-config>
   <data-sources />
   <form-beans />
   <global-exceptions />
   <global-forwards />
   <action-mappings >
    <action
     attribute="productShowForm"
     input="/index.jsp"
     name="productShowForm"
     path="/productShow"
     scope="request"
     type="com.yourcompany.struts.action.ProductShowAction">
     <forward name="success" path="/index.jsp" />
    </action>
   </action-mappings>
   <message-resources parameter="com.yourcompany.struts.ApplicationResources" />
  </struts-config>

第三步:創建包和數據庫連接

在SRC下創建 dao , dbtool, vo,factory四個包

在dbtool包裡主要放訪問JDBC數據庫的連接類等。下面提供我用的JavaBean類。

DBConnection.java的內容如下:

package com.yourcompany.dbtool;
  import java.io.InputStream;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.SQLException;
  import java.util.Properties;
  /**
   * 這是一個連接數據的單模式
   * @author 樹下無影
   *
   */
  public class DBConnection {
     private static DBConnection instance;
     private String driver;
     private String url;
     private String user;
     private String password;
     private DBConnection() throws Exception{
      InputStream in=getClass().getClassLoader().getResourceAsStream(
          "com/yourcompany/dbtool/database.properties");
      Properties prop=new Properties();
      prop.load(in);
      driver=prop.getProperty("driver");
      url=prop.getProperty("url");
      user=prop.getProperty("user");
      password=prop.getProperty("password");
      try{
        Class.forName(driver);
      }catch(Exception e)
      {
        System.out.println("數據庫初始化出錯");
         throw e;
      }
      System.out.println(driver+" "+url+" "+user+" "+password);
     }
     public static DBConnection getInstance(){
      try{
        if(instance==null){
          instance=new DBConnection();
        }
        return instance;
      }catch(Exception e){
        System.out.println("實例化單模子出錯");
        return null;
      }
     }
     public Connection getConnection()throws SQLException{
      Connection con;
      try{
        con=DriverManager.getConnection(url, user, password);
      }catch(SQLException e){
       System.out.println("Connection連接出錯");
        throw e;
      }
      return con;
     }
     public void closeConnection(Connection con){
      if(con!=null){
        try{
          con.close();
        }catch(SQLException e)
        {
          System.out.println("關閉Connection連接出錯");
        }
      }
     }
  }

這裡用一個配置文件,database.properties 裡面存放數據庫的URL 、Driver、Username和Password等,修改成你本機的相應數據,能打開數據庫就好。

database.properties內容如下:

driver=org.gjt.mm.mysql.Driver
  url=jdbc:mysql://localhost:3306/page
  user=root
  password=1234

下面是我用的數據庫增刪改查的Bean-> DBbusiness.java

package com.yourcompany.dbtool;
  import java.sql.*;
  /**
   * 這是一個連接數據庫具有增刪改查的Bean
   * @author 樹下無影
   *
   */
  public class DBbusiness {
  /*
   * 定義連接參數等
   */
  Connection conn = null;
  PreparedStatement psps = null;
  ResultSet rs = null;
  public DBbusiness (){
  }
  /*
   * 定義公用的Connection
   */
  public Connection getConn() {
   try {
    DBConnection db=DBConnection.getInstance();
    Connection conx = db.getConnection();
    return conx;
   } catch (Exception e) {
     System.out.println("Connection連接出錯");
   }
   return null;
  }
  /*
   * 獲取數據(查詢)方法
   */
  public ResultSet getData(String sql) {
     try {
    conn = getConn();
    psps = conn.prepareStatement(sql);
    rs = psps.executeQuery();
   } catch (Exception e) {
     System.out.println("查詢數據庫操作出錯");
   }
   return rs;
  }
    /*
     * 定義插入數據和更新的方法
     */
  public boolean insert(String sql) {
     try {
      conn = getConn();
      psps = conn.prepareStatement(sql);
      psps.executeUpdate();
      return true;
     } catch (Exception e) {
       System.out.println("數據庫更新出錯");
     }
     return false;
  }
  /*
   * 定義創建數據庫和表的方法
   */
  public boolean create(String sql) {
     try {
      conn = getConn();
      psps = conn.prepareStatement(sql);
      psps.execute();
      return true;
     } catch (Exception e) {
     }
     return false;
  }
  /*
   * 定義關閉連接的方法
   */
  public void allClose() {
     try {
      if (rs != null)
        rs.close();
      if (psps != null)
        psps.close();
      if (conn != null)
      {
        DBConnection db=DBConnection.getInstance();
        db.closeConnection(conn);
      }
     } catch (Exception e) {
       System.out.println("數據庫關閉操作出錯");
    }
  }
  }

第四步:創建實體類

在vo包裡,創建一個實體類,這步COPY過去就是。

Product.java

package com.yourcompany.vo;
  public class Product {
  String id;
  String sortid;
  String name;
  String price;
  String saleprice;
  String descript;
  String contents;
  String saledate;
  String salecount;
  String image;
  public Product(){}
    public Product(String id,String sortid,String name,String price,
       String saleprice,String descript,String contents,
       String saledate,String salecount,String image){
     this.id=id;
     this.sortid=sortid;
     this.name=name;
     this.price=price;
     this.saleprice=saleprice;
     this.descript=descript;
     this.contents=contents;
     this.saledate=saledate;
     this.salecount=salecount;
     this.image=image;
    }
  public String getContents() {
     return contents;
  }
  public void setContents(String contents) {
     this.contents = contents;
  }
  public String getDescript() {
     return descript;
  }
  public void setDescript(String descript) {
     this.descript = descript;
  }
  public String getId() {
     return id;
  }
  public void setId(String id) {
     this.id = id;
  }
  public String getImage() {
     return image;
  }
  public void setImage(String image) {
     this.image = image;
  }
  public String getName() {
     return name;
  }
  public void setName(String name) {
     this.name = name;
  }
  public String getPrice() {
     return price;
  }
  public void setPrice(String price) {
     this.price = price;
  }
  public String getSalecount() {
     return salecount;
  }
  public void setSalecount(String salecount) {
     this.salecount = salecount;
  }
  public String getSaledate() {
     return saledate;
  }
  public void setSaledate(String saledate) {
     this.saledate = saledate;
  }
  public String getSaleprice() {
     return saleprice;
  }
  public void setSaleprice(String saleprice) {
     this.saleprice = saleprice;
  }
  public String getSortid() {
     return sortid;
  }
  public void setSortid(String sortid) {
     this.sortid = sortid;
  }
  }

第五步:創建接口,並創建相應的實現類

PageDao.java接口裡有兩個方法,第一個方法是讀取指定數據表的行數;第二個方法是讀取數據表,並把信息放入一個ArrayList返回。看代碼

package com.yourcompany.dao;
  import java.util.ArrayList;
  import java.util.List;
  
  public interface PageDao {
    public int getCount(String counSql);
    public ArrayList getProduct(String sql);
  }

創建接口好後,當然要創建實現類,

如下:PageDaoImpl.java

package com.yourcompany.dao;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.util.ArrayList;
  import com.yourcompany.dbtool.DBbusiness;
  import com.yourcompany.vo.Product;
  /**
   * 這是接口的實現類
   * @author 樹下無影
   *
   */
  public class PageDaoImpl implements PageDao {
    /*
     * 獲取數據行數
     * @see com.yourcompany.dao.PageDao#getCount(java.lang.String)
     */
   public int getCount(String counSql){
     int result=0;
     DBbusiness db=new DBbusiness();
     ResultSet rs= db.getData(counSql);
     try {
         rs.next();
         result=rs.getInt(1);
      /*while(rs.next()){
        result=rs.getInt(1);
       }*/
     } catch (SQLException e) {
      // TODO Auto-generated catch block
      System.out.println("讀取數據總數失敗");
     }finally{
      db.allClose();
     }
     return result;
   }
   /*
   * 讀取數據表
   */
   public ArrayList getProduct(String sql){
      ArrayList arrayList=new ArrayList();
      DBbusiness db=new DBbusiness();
      ResultSet rs=db.getData(sql);
      try {
        while(rs.next()){
        String id=rs.getString(1);
        String sortid=rs.getString(2);
        String name=rs.getString(3);
        String price=rs.getString(4);
        String saleprice=rs.getString(5);
        String descript=rs.getString(6);
        String contents=rs.getString(7);
        String saledate=rs.getString(8);
        String salecount=rs.getString(9);
        String image=rs.getString(10);
        Product productForm=new Product( id,sortid ,name, price,
           saleprice ,descript, contents,
           saledate,salecount,image);
        arrayList.add(productForm);
      }
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      System.out.println("數據庫讀取出錯");
    }finally{
      db.allClose();
    }
    return arrayList;
     }
  }

第六步:創建映射的工廠類:

這個類沒什麼解釋,放在factoyr的包裡

PageDaoFactory.java

package com.yourcompany.factory;
  import com.yourcompany.dao.PageDao;
  import com.yourcompany.dao.PageDaoImpl;
  public class PageDaoFactory {
    public static PageDao getPageDaoIntanse(){
     return new PageDaoImpl();
    }
  }
   第七步:分頁處理類

呵呵,這麼多步驟了還沒進入正題,下面就開始講和分頁相關的。

在dbtool包裡創建如下類:

PageBean.java

package com.yourcompany.dbtool;
  import com.yourcompany.factory.PageDaoFactory;
  public class PageBean {
  /**
   * 這是一個分頁的類,因為MySQL數據庫檢索可以使用分頁的SQL指令
   * 所在在這裡主要是處理出這樣的指令
   * 並獲得相應的頁數信息
   *MySql語句如下:select * from test limit 10;這句是從1到10的信息條數
   *select * from test limit 10,5;  這句是第十條以後的五條
   */
  int curr; //當前頁
  int count; //總頁數
  int size; //每頁顯示數據數
  int rows=0; //數據的所有行數
  boolean last; // 是否是最後一頁
  /**
   * 構造器
   * @param counSql
   */
  public PageBean(String counSql) {
     if (this.rows == 0) {//獲取所有的數據條數
      this.rows = PageDaoFactory.getPageDaoIntanse().getCount(counSql);
     }
     this.curr=getCurr();
     this.size = 5;//設定頁面顯示數據大小
     this.count = (int) Math.ceil((double) this.rows / this.size);//獲得頁數
     this.last=isLast();
  }
    public PageBean(String counSql,int size){
     if (this.rows == 0) {//獲取所有的數據條數
      this.rows = PageDaoFactory.getPageDaoIntanse().getCount(counSql);
     }
     this.curr=getCurr();
     this.size = size;//設定頁面顯示數據大小
     this.count = (int) Math.ceil((double) this.rows / this.size);
     this.last=isLast();
    }
    public PageBean(String counSql,int curr,int size){
     if (this.rows == 0) {//獲取所有的數據條數
      this.rows = PageDaoFactory.getPageDaoIntanse().getCount(counSql);
     }
     this.curr=curr;
     this.size = size;//設定頁面顯示數據大小
     this.count = (int) Math.ceil((double) this.rows / this.size);
     this.last=isLast();
    }
  /**
   * 頁面指令處理及返回相應的查詢SQL語句
   */
  public String pageDeal(String pageDo, String sql) {
     String str = " limit ";
     //首頁
     if (pageDo.equals("first")) {
      setCurr(1);
      str += "" + getSize();
     }
     //尾頁
     if (pageDo.equals("end")) {
      setCurr(getCount());
      str += "" + ((getCount() - 1) * getSize());
      str += "," + (getRows() - (getCount() - 1) * getSize());
     }
     //下一頁
     if (pageDo.equals("next")) {
      if(getCurr()<getCount()){
        str += "" + (getCurr() * getSize());
        str += "," + getSize();
        setCurr(getCurr() + 1);
      }else{
        setCurr(getCount());
        str += "" + ((getCount() - 1) * getSize());
        str += "," + (getRows() - (getCount() - 1) * getSize());
      }
     }
    //上一頁
     if (pageDo.equals("prv")) {
      setCurr(getCurr() - 1);
      str += "" + (getCurr() * getSize() - getSize());
      str += "," + getSize();
     }
     return sql + str;
  }
public static void main(String[] args) {
  }
  //返回總頁數,總頁最小也等於1
  public int getCount() {
     return (count == 0) ? 1 : count;
  }
  //設置總頁數
  public void setCount(int count) {
     this.count = count;
  }
  //返回當前頁,當前頁最小也等於1
  public int getCurr() {
     return (curr == 0) ? 1 : curr;
  }
    //設置當前頁
  public void setCurr(int curr) {
     this.curr = curr;
  }
  public int getRows() {
     return rows;
  }
  public void setRows(int rows) {
     this.rows = rows;
  }
  public int getSize() {
     return size;
  }
  public void setSize(int size) {
     this.size = size;
  }
  /**
   * 如果是最後一頁的返回true
   * @return
   */
  public boolean isLast() {
     return (curr==count)?true:false;
  }
  public void setLast(boolean last) {
     this.last = last;
  }
  }

這個類寫了很多的注釋,不過還是要講解一下。由於在Struts的Action裡用到第三個構造器,那就先講這個吧。構造器裡主要的功能是,通過Factory映射的接口類調用讀取數據表的行數,獲得表的所有行數。然後和傳進來的頁面顯示信息數除一下,就獲得頁數的總數了。

當前頁的定義,要是第一次讀取,當前頁當然是第一頁了,要是點了下一頁,當前頁就加一頁,點上一頁,當前頁就減一面,嘿嘿。我這裡主要由頁面傳當前頁進來,再根據傳進來的動作進行處理當前頁。所以“下一頁”這樣的動作除了要傳一個動作外還要傳當時的當前頁。

Action 裡通過調用pageDeal(“”,“”)這方法就就可以獲取相應的分頁處理了,當然還要加上”select * from table”這樣的語句才能實現。

好了,看下一步Action裡是怎樣處理的。

第八步:Action的處理:

在struts.action的包裡創建如下類:

package com.yourcompany.struts.action;
  import java.util.ArrayList;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.apache.struts.action.Action;
  import org.apache.struts.action.ActionForm;
  import org.apache.struts.action.ActionForward;
  import org.apache.struts.action.ActionMapping;
  import com.yourcompany.dbtool.PageBean;
  import com.yourcompany.factory.PageDaoFactory;
  import com.yourcompany.vo.Product;
  
  public class ProductShowAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) {
      ArrayList aList = new ArrayList();
    /*
    * 定義頁面傳過來的動作,如點"下一頁" 並因為這動作而決定處理
    */
    String pageDo = request.getParameter("pageDo");
  
      /*
      * 定義獲取頁面傳過來的當前頁getCurr
      */
      int getCurr;
      String curr_page = request.getParameter("curr_page");
      if (curr_page == null || curr_page.equals("")) {
       getCurr = 1;
      } else {
       getCurr = Integer.parseInt(request.getParameter("curr_page"));
       System.out.println(getCurr);
      }
      /*
      * 實例化PageBean對象
      * PageBean有幾個構造器,不過都要傳送一句獲取數據庫行數的SQL語句
      * getCurr是傳送一個當前頁給PageBean的構造器,
      * 2是定義每頁顯示幾行數據
      */
      PageBean pb = new PageBean("select count(*) from product", getCurr,
         2);
      // 定義查詢數據庫的SQL語句,格式如下
      String sql;
      sql = pb.pageDeal(pageDo, "select * from product ");
      // 定義ArrayList獲取數據庫所查詢得到的數據
      aList = PageDaoFactory.getPageDaoIntanse().getProduct(sql);
      // 把值傳給客戶端
      request.setAttribute("pageInfo", pb);
      request.setAttribute("data", aList);
      return mapping.findForward("success");
      }
  }

這個Action裡也寫了好多的注釋,相信一看就明白。

步驟主要是:

1.定義兩個參數,獲取前台傳進來的動作和當前頁

2.實例化分頁的處理類,PageBean.java。在它的構造器裡傳進查詢數據庫行數的SQL語句、當前頁、要在表裡顯示的規格。

3.獲取處理好的分頁SQL語句,主要是調用PageBean裡的pageDeal方法。給它傳進的是頁面傳進來的動作和查詢數據表的SQL語句。

4.用處理好的分布SQL語句去查詢數據。

5.把值傳給前台。主要返回PageBean的對象和所查詢得的數據ArrayList。

第九步:前台處理頁面。

由於後台傳回來的是一個ArrayList的數據表,所以把它讀出來就是。

還返回一個PageBean的對象,這裡包含的數據是當前頁、總頁、是否為最後一頁。

所以要是想弄不同的“上一頁”、“下一頁”這樣的導航條的話,修改傳回的參數,再在Jsp頁面裡做相應的處理就OK了。

看我的Jsp頁面:index.jsp

<%@ page language="java" pageEncoding="utf-8"%>
  <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
  <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
  <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
  <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
  <% if(session.getAttribute("getData")==null)
         {//這裡只是一個跳轉,沒什麼
         session.setAttribute("getData","ok");
         response.setHeader("refresh",
             "1;url=/strutsPage/productShow.do?pageDo=first&curr_page=1");
         }
   %>
  <html>
       <head>
       <title>JSP for ProductShowForm form</title>
       </head>
       <body><font color="#0000ff">
        這裡僅演示分頁,操作部分已經做到獲取ID了,相信直接調用就可以弄修改和刪除</font>
       <table width="80%" border="1">
         <tr>
           <th>
             商品名稱
           </th>
           <th>
             價格
           </th>
           <th>
             商品描述
           </th>
           <th>
             商品詳細信息
           </th>
           <th >
             上架日期
           </th>
           <th colspan="2" align="center">
             操作
           </th>
         </tr>
         <logic:present name="data" scope="request">
           <logic:iterate id="show" name="data"
             type="com.yourcompany.vo.Product">
             <tr>
              <td>
                <bean:write name="show" property="name" />
              </td>
              <td>
                <bean:write name="show" property="saleprice" />
              </td>
              <td>
                <bean:write name="show" property="descript" />
              </td>
              <%--<td>
                <bean:write name="show" property="contents" />
              </td>
              --%><td >
                <bean:write name="show" property="saledate" />
              </td>
              <td>
               <html:link action="/productShow.do?pageDo=updata"
          paramId="up_page" paramName="show" paramProperty="id">
              修改</html:link>
              </td>
              <td>
               <html:link action="/productShow.do?pageDo=dele"
          paramId="dele_page" paramName="show" paramProperty="id">
              刪除</html:link>
              </td>
             </tr>
           </logic:iterate>
         </logic:present>
       </table>
       <logic:present name="pageInfo">
           第<bean:write name="pageInfo" property="curr" />頁/共
         <bean:write name="pageInfo" property="count" />頁.
          <html:link action="/productShow.do?pageDo=first"
          paramId="curr_page" paramName="pageInfo" paramProperty="curr">
            首頁</html:link>
         <logic:notEqual name="pageInfo" property="curr" value="1">
             <html:link action="/productShow.do?pageDo=prv"
             paramId="curr_page" paramName="pageInfo" paramProperty="curr">
             上一頁</html:link>
           </logic:notEqual>
           <logic:equal name="pageInfo" property="last" value="false">
             <html:link action="/productShow.do?pageDo=next"
             paramId="curr_page" paramName="pageInfo" paramProperty="curr">
             下一頁</html:link>
           </logic:equal>
          <html:link action="/productShow.do?pageDo=end"
          paramId="curr_page" paramName="pageInfo" paramProperty="curr">
          尾頁</html:link>
     </logic:present>
       </body>
  </html>

總結:

這個分頁看起來很簡單,做起來也很簡單。只是對SQL語句做了一下過濾而已。這個分頁功能很簡單,但重在拋磚引玉!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved