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;
}
}