南昌大学javaweb大作业报告书.docx
《南昌大学javaweb大作业报告书.docx》由会员分享,可在线阅读,更多相关《南昌大学javaweb大作业报告书.docx(28页珍藏版)》请在冰豆网上搜索。
南昌大学javaweb大作业报告书
软件学院大作业实验报告
题目:
基于Struts的图书管理系统
专业:
软件工程
班级:
122班(java方向)
学号:
**********
******
完成人数:
1人
起讫日期:
2015/05/20
任课教师:
周兴斌职称:
副教授
部分管主任:
刘晓强
完成时间:
2015/05/30
1.前言
1.1实验目的
学习Web应用程序的开发,以B/S方式,JSP编程技术开发图书管理系统;
通过编程实践掌握JSP的动态网页与sql2012数据库相结合的技术;
通过MVC(模型-视图-控制)架构模式,使其在开发过程中得以应用,并了解Web编程模式下的Model1和Model2的区别;了解Struts框架的具体含义及在Struts模式下的开发。
1.2实验的基本要求
数据库表不少于3个,且表之间必须存在关联。
页面设计布局合理,颜色使用恰当,风格统一,页面应不少于10个。
系统功能不少于6个,且能正确运行。
系统采用面向对象的方式设计,尽量使界面、业务、数据之间的耦合关系降低。
代码实现尽量使用事件处理、事务处理。
系统应对一些常见的异常进行适当的处理。
数据的操作以事务的方式实现,要求处理并发问题。
2.系统分析与设计
2.1系统功能描述(简单需求分析)
图书管理系统是典型的信息管理系统(MIS),本系统是根据现代化校园的发展而设计的基于jsp的图书管理系统,本系统就是为了管理好图书信息和借阅等一系列操作而设计的。
图书管理系统需要满足来自两方面的需求,这三个方面分别是学生和管理员。
学生的需求是查询图书馆的藏书,借阅图书,和退换图书等功能;管理员的功能最为复杂,包括对学生、图书进行管理,及系统状态的查看、维护并。
学生要使用图书管理系统,需要进行登陆,登陆之后则可以进行一系列的操作,例如:
查询图书,借阅图书,归还图书等功能。
而作为管理员,则可以对学生进行添加,只有已添加有卡号的学生才可以进行图书管理系统的登陆,管理员还可以对图书进行增,删,改,查。
亦可以对用户进行增,删,改查等功能。
2.2系统功能流程
为了满足以上的需求,系统分成了两大模块,普通用户模块和管理员模块。
功能模块图如图所示。
相应Struts页面流程如下所示(电子版可自行放大):
2.3数据库设计
2.3.1数据表的构建
本系统采用如下的数据表:
用户信息表users:
用于记录用户信息数据表
字段名
类型
长度
是否为主键
可否为空
说明
ID
nchar
10
是
否
用户ID
username
nchar
10
否
否
用户姓名
password
nchar
10
否
否
用户密码
cardnum
int
10
否
否
卡号信息
userlevel
int
10
否
否
用户级别
coater
int
10
否
否
借阅限额
borrowed
int
10
否
否
已借阅数
can_borrow
int
10
否
否
可借阅数
图书信息表books:
(用于存储图书相关信息)
字段名
类型
长度
是否为主键
可否为空
说明
b_ID
int
10
是
否
图书ID
b_name
nvarchar
50
否
否
图书名称
b_author
nchar
10
否
否
图书作者
b_publish
nvarchar
50
否
否
图书出版社
b_type
nchar
10
否
否
图书类型
b_count
int
10
否
否
拥有数量
b_hot
int
10
否
否
欢迎度
借阅表borrowbook:
(用于表示借阅信息)
字段名
类型
长度
是否为主键
可否为空
说明
brid
int
10
是
否
借阅表id
cardnum
int
10
是
否
用户表外键
b_ID
int
10
是
否
图书表外键
borrowday
nchar
10
否
否
借阅日期
shouldreturn
nchar
10
否
否
应还日期
罚金表fine:
(用于设置罚金)
字段名
类型
长度
是否为主键
可否为空
说明
fine
float
10
是
否
罚金
3.系统的实现与测试
3.1系统采用的关键技术
本系统采用的是Model2模型,Model2表示的是基于MVC模式的框架。
MVC是Model-View-Controller的简写。
"Model"代表的是应用的业务逻辑(通过JavaBean,),"View"是应用的表示面(由JSP页面产生),"Controller"是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。
这些组件可以进行交互和重用。
从而弥补了Model1的不足。
Model2具有组件化的优点从而更易于实现对大规模系统的开发和管理,但是开发MVC系统比简单的JSP开发要复杂许多,它需要更多的时间学习和掌握。
同时新东西的引入会带来新的问题(这让我想起来关于"自动计算"的一篇文章,中间提到为了降低系统的复杂度,却导致更高的复杂度)。
必须基于MVC组件的方式重新思考和设计应用结构。
原来通过建立一个简单的JSP页面就能实现的应用现在变成了多个步骤的设计和实现过程。
所有的页面和组件必须在MVC框架中实现,所以必须进行附加地开发工作。
MVC本身就是一个非常复杂的系统,所以采用MVC实现Web应用时,最好选一个现成的MVC框架,在此之下进行开发,从而取得事半功倍的效果。
现在有很多可供使用的MVC框架,由于Struts有完整的文档并且相对来讲比较简单,所以用它开发MVC系统还是比较方便地。
3.2关键程序流程
本实验的总体流程如下:
本系统应用3层架构模型,现分别对其进行阐述:
第一层架构为数据库层,也是程序的最底层(主要由DataBase.java实现),它的功能实现sql2012数据库的连接,函数里封装了几个操作。
publicbooleanquery(Strings)(用于查询数据表操作);
publicResultSetgetlist(Strings)(用于获取数据的可以滚动结果集);
publicintupdate(Strings)(用于简单的数据更新操作)
publicbooleanexecutebatch(Stringa[])(批处理,用于处理多条sql);
第二层为JavaBean层和DAO层,主要实现对数据表的信息及对其进行操作的信息进行封装(主要由文件Books.java、Fine.java、borrowbook.java、Users.java、BookService.java、borrowbookSevice.java、FineService.java和UserService.java来实现的)。
在相应的JavaBean层封装了所有数据表的信息,在上述的实体类中(Books.java、Fine.java、borrowbook.java、Users.java)仅包含对属性的set和get方法,在相应的DAO层主要包含对数据表的相关操作,如获得该数据表的全部信息或部分信息,增加、删除、修改、查询相应的数据表;
第三层为业务逻辑层,主要由Struts和其的action来实现,实现页面的控制和跳转到相应的jsp页面,其中action主要包括BooksAction.java、LoginAction.java、ResetfineAction.java、UserAction.java。
相应的程序架构如图所示:
3.3关键代码分析
Ø数据库的连接和相关一些操作函数(在文件DataBase.java中实现的):
packagecom.wk.util;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
publicclassDataBase{
privateConnectionconn=null;
privateStatementstmt;
ResultSetrs=null;
//数据库的url
privateStringurl="jdbc:
sqlserver:
//localhost:
1433;DatabaseName=Book";
//数据库的用户名密码
Stringuser="sa";
Stringpass="123";
//用于验证查询操作
publicbooleanquery(Strings)throwsSQLException{
try{
//加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch(ClassNotFoundExceptione){
System.out.println("加载驱动器类时异常");
}
try{
//创建链接
conn=DriverManager.getConnection(url,user,pass);
stmt=conn.createStatement();
rs=stmt.executeQuery(s);
}catch(SQLExceptione){
System.out.println("query连接数据库的过程中出现SQL异常
");
}
return(rs.next());
}
//用于结果集可滚动的操作
publicResultSetgetlist(Strings)throwsSQLException{
try{
//加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch(ClassNotFoundExceptione){
System.out.println("加载驱动器类时异常");
}
try{
//建立连接
conn=DriverManager.getConnection(url,user,pass);
//得到statement对象
stmt=conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//得到一个可滚动但不可以更新的结果集rs
rs=stmt.executeQuery(s);
}catch(SQLExceptione){
System.out.println("更新操作连接数据库的过程中出现SQL异常
");
}
returnrs;
}
//用于对数据库的更新
publicintupdate(Strings)throwsSQLException{
intmsg=0;
try{
//加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch(ClassNotFoundExceptione){
System.out.println("加载驱动器类时异常");
}
try{
//创建链接
conn=DriverManager.getConnection(url,user,pass);
stmt=conn.createStatement();
msg=stmt.executeUpdate(s);
}catch(SQLExceptione){
System.out.println("连接数据库的过程中出现SQL异常
");
}
return(msg);
}
//批处理,用于处理多条sql
publicbooleanexecutebatch(Stringa[]){
try{
//创建链接
conn=DriverManager.getConnection(url,user,pass);
conn.setAutoCommit(false);//关闭自动提交,进行事物处理
stmt=conn.createStatement();
for(inti=0;istmt.addBatch(a[i]);
}
int[]number=stmt.executeBatch();//开始批处理,返回被执行的sql语句的序号
mit();
System.out.println("共有"+number.length+"条sql语句被执行");
stmt.clearBatch();//清空batch
conn.close();
returntrue;
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
try{
conn.rollback();
returnfalse;
}catch(SQLExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
e.printStackTrace();
}
returnfalse;
}
//关闭数据流
publicvoidclose()throwsSQLException{
conn.close();
stmt.close();
rs.close();
}
}
Ø管理员操作用户(在文件UserService.java中实现的)
//管理员对用户的添加操作
publicbooleanadduser(Stringa[])throwsSQLException{
//将密码明文转换为密文存入数据库
a[2]=ead.encrypt(a[2]);
//利用字符串的拼接组成sql语句
sql="insertintousersvalues('"+a[0]+"','"+a[1]+"','"+a[2]+"',"+a[3]+","+a[4]+","+a[5]+","+a[6]+")";
System.out.println("添加的sql"+sql);
//调用数据库的更新数据的操作函数
intresult=db.update(sql);
if(result!
=0)
returntrue;
returnfalse;
}
//管理员对用户的删除操作
publicbooleandeluser(Stringid)throwsSQLException{
sql="deletefromuserswhereID='"+id+"'";
System.out.println("delsql="+sql);
intresult=db.update(sql);
if(result!
=0)
returntrue;
returnfalse;
}
//管理员对用户的更新操作
publicbooleanupdateusers(Stringa[])throwsSQLException{
sql="updateuserssetusername='"+a[1]+"',userlevel="+a[2]+"whereID='"+a[0]+"'";
System.out.println("更新sql="+sql);
intresult=db.update(sql);
if(result!
=0)
returntrue;
returnfalse;
}
这里管理员对图书的操作和对用户的操作很类似,这里就不再赘述了。
Ø用户对图书的查询,借阅和续借和归还(主要在BooksService.java和borrowbookService.java实现的)
BooksService.java部分代码:
//模糊查询,获取用户的关键词,以此为查询条件进行搜索,默认按人气高至低排列
publicArrayListgetbook(Stringa[])throwsSQLException{
ArrayListal=newArrayList();
for(inti=0;iSystem.out.println(a[i]);
}
if(a[0].equals("")){
sql="select*frombookswhere"+a[2]+"LIKE'%"+a[1]+"%'orderbyb_hotdesc";
}else{
sql="select*frombookswhere"+a[2]+"LIKE'%"+a[0]+"%'orderbyb_hotdesc";
}
System.out.println("sql:
"+sql);
//调用DataBase.java的函数,获取相应的图书列表
rs=db.getlist(sql);
while(rs.next()){
Booksbk=newBooks();
bk.setB_ID(rs.getInt
(1));
bk.setB_name(rs.getString
(2));
bk.setB_author(rs.getString(3));
bk.setB_publish(rs.getString(4));
bk.setB_type(rs.getString(5));
bk.setB_count(rs.getInt(6));
bk.setB_hot(rs.getInt(7));
al.add(bk);//将al放到arrayList中
}
returnal;}
borrowbookService.java部分代码:
//归还图书,
publicbooleanreturnbook(Stringbrid,Stringcardnum,Stringb_ID)throwsSQLException{
Stringsql1="updateuserssetborrowed=borrowed-1,can_borrow=can_borrow+1wherecardnum="+cardnum;
Stringsql2="updatebookssetb_count=b_count+1whereb_ID="+b_ID;
Stringsql3="deletefromborrowbookwherebrid="+brid;
Stringa[]={sql1,sql2,sql3};
//处理多条语句时,使用事务处理和使用批处理进行处理。
if(db.executebatch(a))
returntrue;
returnfalse;
}
//续借图书
publicbooleanrenewbook(Stringbrid)throwsSQLException{
//将当前时间获得,拼接之sql,进行数据库表的更新操作
sql="updateborrowbooksetborrowday='"+newDay().getnowdate()+"',shouldreturn='"+newDay().getdate()+"'wherebrid="+brid;
System.out.println("sql="+sql);
intr=db.update(sql);
if(r!
=0){
returntrue;
}
returnfalse;
}
Ø管理员对罚金的设置(主要由FineService.java和Resetfine.java完成的)
FineService.java代码:
packagecom.wk.service;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importcom.wk.util.DataBase;
publicclassFineService{
DataBasedb=newDataBase();
ResultSetrs=null;
Stringsql="";
//管理员设定罚金金额
publicbooleansetfine(floatf){
//字符拼接将设置的金额拼接成sql
sql="updatefinesetfine="+f;
System.out.println(sql);
try{
//调用database.java的更新函数进行数据库操作
intr=db.update(sql);
if(r!
=