我的平台是: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語句做了一下過濾而已。這個分頁功能很簡單,但重在拋磚引玉!