数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Struts1.2实现MySQL数据库分页


发布日期:2023年02月04日
 
Struts1.2实现MySQL数据库分页

我的平台是Eclipse MyEclipse Tomcat MySql

第一步创建数据库

这没什么难的用下面的脚本就OK了

CREATEDATABASEpage;

usepage;

CREATETABLE `product` (

`id` varchar() NOTNULL

`sortid` varchar() NOTNULL

`name` varchar() NOTNULL

`price` doubleNOTNULL

`saleprice` doubleNOTNULL

`descript` text NOTNULL

`contents` text NOTNULL

`saledate` varchar() NOTNULL

`salecount` int() defaultNULL

`image` text

PRIMARYKEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf;

第二步创建一个项目

创建一个项目项目名为strutsPage导入Struts Struts的包采用默认引用MySql的驱动要是没有驱动的话请到这下载

下面设置webxml和strutsconfigxml配置文件我觉得直接COPY我的就好了

webxml文件里的内容如下直接换上就OK了基本是默认的

<?xml version= encoding=UTF?>

<webapp xmlns= xmlns:xsi=instance version= xsi:schemaLocation=; app__xsd>

<servlet>

<servletname>action</servletname>

<servletclass>orgapachestrutsactionActionServlet</servletclass>

<initparam>

<paramname>config</paramname>

<paramvalue>/WEBINF/strutsconfigxml</paramvalue>

</initparam>

<initparam>

<paramname>debug</paramname>

<paramvalue></paramvalue>

</initparam>

<initparam>

<paramname>detail</paramname>

<paramvalue></paramvalue>

</initparam>

<loadonstartup></loadonstartup>

</servlet>

<servletmapping>

<servletname>action</servletname>

<urlpattern>*do</urlpattern>

</servletmapping>

<welcomefilelist>

<welcomefile>indexjsp</welcomefile>

</welcomefilelist>

</webapp>

strutsconfigxml的内容如下

<?xml version= encoding=UTF?>

<!DOCTYPE strutsconfig PUBLIC //Apache Software Foundation//DTD Struts Configuration //EN config__dtd>

<strutsconfig>

<datasources />

<formbeans />

<globalexceptions />

<globalforwards />

<actionmappings >

<action

attribute=productShowForm

input=/indexjsp

name=productShowForm

path=/productShow

scope=request

type=comyourcompanystrutsactionProductShowAction>

<forward name=success path=/indexjsp />

</action>

</actionmappings>

<messageresources parameter=comyourcompanystrutsApplicationResources />

</strutsconfig>

第三步创建包和数据库连接

在SRC下创建 dao dbtool vofactory四个包

在dbtool包里主要放访问JDBC数据库的连接类等下面提供我用的JavaBean类

DBConnectionjava的内容如下

package comyourcompanydbtool;

import javaioInputStream;

import javasqlConnection;

import javasqlDriverManager;

import javasqlSQLException;

import javautilProperties;

/**

* 这是一个连接数据的单模式

* @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/databaseproperties);

Properties prop=new Properties();

propload(in);

driver=propgetProperty(driver);

url=propgetProperty(url);

user=propgetProperty(user);

password=propgetProperty(password);

try{

ClassforName(driver);

}catch(Exception e)

{

Systemoutprintln(数据库初始化出错);

throw e;

}

Systemoutprintln(driver+ +url+ +user+ +password);

}

public static DBConnection getInstance(){

try{

if(instance==null){

instance=new DBConnection();

}

return instance;

}catch(Exception e){

Systemoutprintln(实例化单模子出错);

return null;

}

}

public Connection getConnection()throws SQLException{

Connection con;

try{

con=DriverManagergetConnection(url user password);

}catch(SQLException e){

Systemoutprintln(Connection连接出错);

throw e;

}

return con;

}

public void closeConnection(Connection con){

if(con!=null){

try{

conclose();

}catch(SQLException e)

{

Systemoutprintln(关闭Connection连接出错);

}

}

}

}

这里用一个配置文件databaseproperties 里面存放数据库的URL DriverUsername和Password等修改成你本机的相应数据能打开数据库就好

databaseproperties内容如下

driver=orggjtmmmysqlDriver

url=jdbc:mysql://localhost:/page

user=root

password=

下面是我用的数据库增删改查的Bean> DBbusinessjava

package comyourcompanydbtool;

import javasql*;

/**

* 这是一个连接数据库具有增删改查的Bean

* @author 树下无影

*

*/

public class DBbusiness {

/*

* 定义连接参数等

*/

Connection conn = null;

PreparedStatement psps = null;

ResultSet rs = null;

public DBbusiness (){

}

/*

* 定义公用的Connection

*/

public Connection getConn() {

try {

DBConnection db=DBConnectiongetInstance();

Connection conx = dbgetConnection();

return conx;

} catch (Exception e) {

Systemoutprintln(Connection连接出错);

}

return null;

}

/*

* 获取数据(查询)方法

*/

public ResultSet getData(String sql) {

try {

conn = getConn();

psps = connprepareStatement(sql);

rs = pspsexecuteQuery();

} catch (Exception e) {

Systemoutprintln(查询数据库操作出错);

}

return rs;

}

/*

* 定义插入数据和更新的方法

*/

public boolean insert(String sql) {

try {

conn = getConn();

psps = connprepareStatement(sql);

pspsexecuteUpdate();

return true;

} catch (Exception e) {

Systemoutprintln(数据库更新出错);

}

return false;

}

/*

* 定义创建数据库和表的方法

*/

public boolean create(String sql) {

try {

conn = getConn();

psps = connprepareStatement(sql);

pspsexecute();

return true;

} catch (Exception e) {

}

return false;

}

/*

* 定义关闭连接的方法

*/

public void allClose() {

try {

if (rs != null)

rsclose();

if (psps != null)

pspsclose();

if (conn != null)

{

DBConnection db=DBConnectiongetInstance();

dbcloseConnection(conn);

}

} catch (Exception e) {

Systemoutprintln(数据库关闭操作出错);

}

}

}

第四步创建实体类

在vo包里创建一个实体类这步COPY过去就是

Productjava

package comyourcompanyvo;

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 idString sortidString nameString price

String salepriceString descriptString contents

String saledateString salecountString image){

thisid=id;

thissortid=sortid;

thisname=name;

thisprice=price;

thissaleprice=saleprice;

thisdescript=descript;

ntents=contents;

thissaledate=saledate;

thissalecount=salecount;

thisimage=image;

}

public String getContents() {

return contents;

}

public void setContents(String contents) {

ntents = contents;

}

public String getDescript() {

return descript;

}

public void setDescript(String descript) {

thisdescript = descript;

}

public String getId() {

return id;

}

public void setId(String id) {

thisid = id;

}

public String getImage() {

return image;

}

public void setImage(String image) {

thisimage = image;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

public String getPrice() {

return price;

}

public void setPrice(String price) {

thisprice = price;

}

public String getSalecount() {

return salecount;

}

public void setSalecount(String salecount) {

thissalecount = salecount;

}

public String getSaledate() {

return saledate;

}

public void setSaledate(String saledate) {

thissaledate = saledate;

}

public String getSaleprice() {

return saleprice;

}

public void setSaleprice(String saleprice) {

thissaleprice = saleprice;

}

public String getSortid() {

return sortid;

}

public void setSortid(String sortid) {

thissortid = sortid;

}

}

第五步创建接口并创建相应的实现类

PageDaojava接口里有两个方法第一个方法是读取指定数据表的行数第二个方法是读取数据表并把信息放入一个ArrayList返回看代码

package comyourcompanydao;

import javautilArrayList;

import javautilList;

public interface PageDao {

public int getCount(String counSql);

public ArrayList getProduct(String sql);

}

创建接口好后当然要创建实现类

如下PageDaoImpljava

package comyourcompanydao;

import javasqlResultSet;

import javasqlSQLException;

import javautilArrayList;

import comyourcompanydbtoolDBbusiness;

import comyourcompanyvoProduct;

/**

* 这是接口的实现类

* @author 树下无影

*

*/

public class PageDaoImpl implements PageDao {

/*

* 获取数据行数

* @see comyourcompanydaoPageDao#getCount(javalangString)

*/

public int getCount(String counSql){

int result=;

DBbusiness db=new DBbusiness();

ResultSet rs= dbgetData(counSql);

try {

rsnext();

result=rsgetInt();

/*while(rsnext()){

result=rsgetInt();

}*/

} catch (SQLException e) {

// TODO Autogenerated catch block

Systemoutprintln(读取数据总数失败);

}finally{

dballClose();

}

return result;

}

/*

* 读取数据表

*/

public ArrayList getProduct(String sql){

ArrayList arrayList=new ArrayList();

DBbusiness db=new DBbusiness();

ResultSet rs=dbgetData(sql);

try {

while(rsnext()){

String id=rsgetString();

String sortid=rsgetString();

String name=rsgetString();

String price=rsgetString();

String saleprice=rsgetString();

String descript=rsgetString();

String contents=rsgetString();

String saledate=rsgetString();

String salecount=rsgetString();

String image=rsgetString();

Product productForm=new Product( idsortid name price

saleprice descript contents

saledatesalecountimage);

arrayListadd(productForm);

}

} catch (SQLException e) {

// TODO Autogenerated catch block

Systemoutprintln(数据库读取出错);

}finally{

dballClose();

}

return arrayList;

}

}

第六步创建映射的工厂类

这个类没什么解释放在factoyr的包里

PageDaoFactoryjava

package comyourcompanyfactory;

import comyourcompanydaoPageDao;

import comyourcompanydaoPageDaoImpl;

public class PageDaoFactory {

public static PageDao getPageDaoIntanse(){

return new PageDaoImpl();

}

}

第七步分页处理类

呵呵这么多步骤了还没进入正题下面就开始讲和分页相关的

在dbtool包里创建如下类

PageBeanjava

package comyourcompanydbtool;

import comyourcompanyfactoryPageDaoFactory;

public class PageBean {

/**

* 这是一个分页的类因为MySQL数据库检索可以使用分页的SQL指令

* 所在在这里主要是处理出这样的指令

* 并获得相应的页数信息

*MySql语句如下:select * from test limit ;这句是从的信息条数

*select * from test limit ; 这句是第十条以后的五条

*/

int curr; //当前页

int count; //总页数

int size; //每页显示数据数

int rows=; //数据的所有行数

boolean last; // 是否是最后一页

/**

* 构造器

* @param counSql

*/

public PageBean(String counSql) {

if (thisrows == ) {//获取所有的数据条数

thisrows = PageDaoFactorygetPageDaoIntanse()getCount(counSql);

}

thiscurr=getCurr();

thissize = ;//设定页面显示数据大小

unt = (int) Mathceil((double) thisrows / thissize);//获得页数

thislast=isLast();

}

public PageBean(String counSqlint size){

if (thisrows == ) {//获取所有的数据条数

thisrows = PageDaoFactorygetPageDaoIntanse()getCount(counSql);

}

thiscurr=getCurr();

thissize = size;//设定页面显示数据大小

unt = (int) Mathceil((double) thisrows / thissize);

thislast=isLast();

}

public PageBean(String counSqlint currint size){

if (thisrows == ) {//获取所有的数据条数

thisrows = PageDaoFactorygetPageDaoIntanse()getCount(counSql);

}

thiscurr=curr;

thissize = size;//设定页面显示数据大小

unt = (int) Mathceil((double) thisrows / thissize);

thislast=isLast();

}

/**

* 页面指令处理及返回相应的查询SQL语句

*/

public String pageDeal(String pageDo String sql) {

String str = limit ;

//首页

if (pageDoequals(first)) {

setCurr();

str += + getSize();

}

//尾页

if (pageDoequals(end)) {

setCurr(getCount());

str += + ((getCount() ) * getSize());

str += + (getRows() (getCount() ) * getSize());

}

//下一页

if (pageDoequals(next)) {

if(getCurr()<getCount()){

str += + (getCurr() * getSize());

str += + getSize();

setCurr(getCurr() + );

}else{

setCurr(getCount());

str += + ((getCount() ) * getSize());

str += + (getRows() (getCount() ) * getSize());

}

}

//上一页

if (pageDoequals(prv)) {

setCurr(getCurr() );

str += + (getCurr() * getSize() getSize());

str += + getSize();

}

return sql + str;

}

public static void main(String[] args) {

}

//返回总页数总页最小也等于

public int getCount() {

return (count == ) ? : count;

}

//设置总页数

public void setCount(int count) {

unt = count;

}

//返回当前页当前页最小也等于

public int getCurr() {

return (curr == ) ? : curr;

}

//设置当前页

public void setCurr(int curr) {

thiscurr = curr;

}

public int getRows() {

return rows;

}

public void setRows(int rows) {

thisrows = rows;

}

public int getSize() {

return size;

}

public void setSize(int size) {

thissize = size;

}

/**

* 如果是最后一页的返回true

* @return

*/

public boolean isLast() {

return (curr==count)?true:false;

}

public void setLast(boolean last) {

thislast = last;

}

}

这个类写了很多的注释不过还是要讲解一下由于在Struts的Action里用到第三个构造器那就先讲这个吧构造器里主要的功能是通过Factory映射的接口类调用读取数据表的行数获得表的所有行数然后和传进来的页面显示信息数除一下就获得页数的总数了

当前页的定义要是第一次读取当前页当然是第一页了要是点了下一页当前页就加一页点上一页当前页就减一面嘿嘿我这里主要由页面传当前页进来再根据传进来的动作进行处理当前页所以下一页这样的动作除了要传一个动作外还要传当时的当前页

Action 里通过调用pageDeal()这方法就就可以获取相应的分页处理了当然还要加上select * from table这样的语句才能实现

好了看下一步Action里是怎样处理的

第八步Action的处理

在strutsaction的包里创建如下类

package comyourcompanystrutsaction;

import javautilArrayList;

import javaxservlethttpHttpServletRequest;

import javaxservlethttpHttpServletResponse;

import orgapachestrutsactionAction;

import orgapachestrutsactionActionForm;

import orgapachestrutsactionActionForward;

import orgapachestrutsactionActionMapping;

import comyourcompanydbtoolPageBean;

import comyourcompanyfactoryPageDaoFactory;

import comyourcompanyvoProduct;

public class ProductShowAction extends Action {

public ActionForward execute(ActionMapping mapping ActionForm form

HttpServletRequest request HttpServletResponse response) {

ArrayList aList = new ArrayList();

/*

* 定义页面传过来的动作如点下一页 并因为这动作而决定处理

*/

String pageDo = requestgetParameter(pageDo);

/*

* 定义获取页面传过来的当前页getCurr

*/

int getCurr;

String curr_page = requestgetParameter(curr_page);

if (curr_page == null || curr_pageequals()) {

getCurr = ;

} else {

getCurr = IntegerparseInt(requestgetParameter(curr_page));

Systemoutprintln(getCurr);

}

/*

* 实例化PageBean对象

* PageBean有几个构造器不过都要传送一句获取数据库行数的SQL语句

* getCurr是传送一个当前页给PageBean的构造器

* 是定义每页显示几行数据

*/

PageBean pb = new PageBean(select count(*) from product getCurr

);

// 定义查询数据库的SQL语句格式如下

String sql;

sql = pbpageDeal(pageDo select * from product );

// 定义ArrayList获取数据库所查询得到的数据

aList = PageDaoFactorygetPageDaoIntanse()getProduct(sql);

// 把值传给客户端

requestsetAttribute(pageInfo pb);

requestsetAttribute(data aList);

return mappingfindForward(success);

}

}

这个Action里也写了好多的注释相信一看就明白

步骤主要是

定义两个参数获取前台传进来的动作和当前页

实例化分页的处理类PageBeanjava在它的构造器里传进查询数据库行数的SQL语句当前页要在表里显示的规格

获取处理好的分页SQL语句主要是调用PageBean里的pageDeal方法给它传进的是页面传进来的动作和查询数据表的SQL语句

用处理好的分布SQL语句去查询数据

把值传给前台主要返回PageBean的对象和所查询得的数据ArrayList

第九步前台处理页面

由于后台传回来的是一个ArrayList的数据表所以把它读出来就是

还返回一个PageBean的对象这里包含的数据是当前页总页是否为最后一页

所以要是想弄不同的上一页下一页这样的导航条的话修改传回的参数再在Jsp页面里做相应的处理就OK了

看我的Jsp页面indexjsp

<%@ page language=java pageEncoding=utf%>

<%@ taglib uri=bean prefix=bean %>

<%@ taglib uri=html prefix=html %>

<%@ taglib uri=logic prefix=logic %>

<%@ taglib uri=tiles prefix=tiles %>

<% if(sessiongetAttribute(getData)==null)

{//这里只是一个跳转没什么

sessionsetAttribute(getDataok);

responsesetHeader(refresh

;url=/strutsPage/productShowdo?pageDo=first&curr_page=);

}

%>

<html>

<head>

<title>JSP for ProductShowForm form</title>

</head>

<body><font color=#ff>

这里仅演示分页操作部分已经做到获取ID了相信直接调用就可以弄修改和删除</font>

<table width=% border=>

<tr>

<th>

商品名称

</th>

<th>

价格

</th>

<th>

商品描述

</th>

<th>

商品详细信息

</th>

<th >

上架日期

</th>

<th colspan= align=center>

操作

</th>

</tr>

<logic:present name=data scope=request>

<logic:iterate id=show name=data

type=comyourcompanyvoProduct>

<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=/productShowdo?pageDo=updata

paramId=up_page paramName=show paramProperty=id>

修改</html:link>

</td>

<td>

<html:link action=/productShowdo?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=/productShowdo?pageDo=first

paramId=curr_page paramName=pageInfo paramProperty=curr>

首页</html:link>

<logic:notEqual name=pageInfo property=curr value=>

<html:link action=/productShowdo?pageDo=prv

paramId=curr_page paramName=pageInfo paramProperty=curr>

上一页</html:link>

</logic:notEqual>

<logic:equal name=pageInfo property=last value=false>

<html:link action=/productShowdo?pageDo=next

paramId=curr_page paramName=pageInfo paramProperty=curr>

下一页</html:link>

</logic:equal>

<html:link action=/productShowdo?pageDo=end

paramId=curr_page paramName=pageInfo paramProperty=curr>

尾页</html:link>

</logic:present>

</body>

</html>

总结

这个分页看起来很简单做起来也很简单只是对SQL语句做了一下过滤而已这个分页功能很简单但重在抛砖引玉!

               

上一篇:如何在JBoss+MySQL环境下运行obe

下一篇:配置JBoss 4 JDBC连接