JavaWeb课程设计——图书馆管理系统doc资料

  • 格式:pdf
  • 大小:3.94 MB
  • 文档页数:33

JavaWeb课程设计

实验报告

班级:计算机09-2

实验内容:图书馆管理系统

成员:赵伯涛 44号(组长)

张宝红 42号

黄海清 22号

实验时间:从 2011年12月3日

至 2011年12月9日

指导老师:李启锐

一、实验目的。

1、在实践中巩固本学习所学的JavaWeb技术。

2、在实践中初步使用设计模式(GoF),体验设计模式带来的好处。

3、配合数据库的使用,实现一个功能完善的小型系统。

二、实验内容。

开发一个图书管理系统,实现图书馆的各种管理操作。如图书入库、作

废,借书证提供、挂失处理,图书的借出、归还、续借、丢失以及超期处

理。s

三、业务逻辑。

四、数据库设计。

根据业务逻辑设计出数据库。表结构及关系如下图:

数据库导入文本保存在DataBaseSQL.txt文档中,数据库数据保存在

Data.txt文档中。

五、框架结构。

采用了类似与MVC框架的框架结构,页面端使用了ExtJS技术(包含

AJAX),增加了业务层和,数据库操作层。控制器层调用业务层,业务层调

用数据库操作层。将控制,业务,数据库操作分别分层。

六、技术性代码。

(本实验的代码在Library.zip中)

1、tomcat数据库连接池技术。在tomcat中的配置文件server.xml

文件中配置项目Context标签,再加入Resource标签:

debug="0">

name="jdbc/webdb"

auth="Container"

type="javax.sql.DataSource" driverClassName="org.gjt.mm.mysql.Driver"

url="jdbc:mysql://localhost:3306/LibraryOA"

username="root"

password="root" maxActive="50"

maxIdle="20"

maxWait="10000" />

以上代码配置了数据库驱动,数据库地址,数据库用户名、密码,默认

提供的连接数,最大提供的连接数,最长等待时间等参数。

2、Java中从连接池获取连接的类,使用了单例模式(来自GoF提出的

设计模式):

//DataBaseConnectionPond.java

package library.util;

import java.sql.Connection; import javax.sql.DataSource;

//作者:赵伯涛

public class DataBaseConnectionPond {

private static DataBaseConnectionPond dbcp = null;

private DataSource ds = null;

private DataBaseConnectionPond() throws Exception {

javax.naming.Context ctx = new javax.naming.InitialContext(); ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/webdb");

}

public Connection GetConnettion() throws Exception {

return ds.getConnection();

}

public static Connection getConnection() throws Exception {

Connection conn = null;

if (dbcp == null) {

Thread.sleep((long) (Math.random() * 200));

synchronized (DataBaseConnectionPond.class) { if (dbcp == null) {

dbcp = new DataBaseConnectionPond();

}

} }

try {

conn = dbcp.GetConnettion(); } catch (Exception e) {

}

return conn; }

}

该类在整个项目部署的过程中只实例化了一个对象,故称单例。可以通

过该类的static函数getConnection()获取连接。

3、Dao(Data Access Object)的模板化实现,使用了模板方法模式(来

自GoF提出的设计模式):

//SqlExecute.java

package library.execute;

import java.sql.Connection;

import library.util.*;

//作者:赵伯涛public abstract class SqlExecute {

public Connection conn;

public Object result;

public abstract void setExecute() throws Exception;

public Object execute() {

try {

conn = DataBaseConnectionPond.getConnection();

conn.setAutoCommit(false); setExecute();

conn.commit();

} catch (Exception e) {

try {

conn.rollback(); } catch (Exception ee) {

}

e.printStackTrace();

} finally { try {

conn.close();

} catch (Exception e) { }

}

return result; }

}

该类是一个抽象类,必须通过继承该类来实现具体的功能,其中的

execute()函数是一个模板方法,将try-catch-finaly、获取connection

及connection的事务处理提取出来,具体Dao的功能应该写在setExecute()

函数中,在具体实现Dao的功能的时候可以不用重复这些代码,方便程序

员编码,也方便程序员维护程序。下面举例使用这个模板类:

//ReaderChangePasswordDao.java

package library.dao;

import java.sql.PreparedStatement;

import library.execute.SqlExecute; import library.model.ReaderModel;

//作者:赵伯涛public class ReaderChangePasswordDao extends SqlExecute {

private ReaderModel rm;

// 传入 readerID, password, password2(旧密码)

// 返回影响行数

public ReaderChangePasswordDao(ReaderModel rm) { this.rm = rm;

}

@Override

public void setExecute() throws Exception { String sql = "update Readers set password = ? where readerID = ?

and password = ?";

PreparedStatement ps = conn.prepareStatement(sql);

ps.setString(1, rm.getPassword());

ps.setInt(2, rm.getReaderID()); ps.setString(3, rm.getPassword2());

this.result = ps.executeUpdate(); }

}

上面的类继承了SqlExecute类,重写了它的setExecute()函数,通过

构造函数传入操作时需要的参数,在写代码的时候可以更加专注于数据库

的操作,因为其它操作由模板类做好了。这对写一个数据库操作或许没什

么大不了的,但是一个项目里边数据库操作肯定是几十个,几百个,甚至

几千个,使用模板类减少的编码量是非常客观的。下面举例使用

ReaderChangePasswordDao类:

//来自UserCommonService.java的部分代码

// 读者修改密码

public boolean readerChangePassword(int readerID, String

newPassword, String oldPassword) {

ReaderModel rm = new ReaderModel();

rm.setReaderID(readerID); rm.setPassword(newPassword);

rm.setPassword2(oldPassword);

ReaderChangePasswordDao rcpd = new ReaderChangePasswordDao(rm);

int count = (Integer) rcpd.execute();

if (count > 0) {

return true;

} else { return false;

}

}