图书管理系统JSP课程设计报告Word文档格式.docx
- 文档编号:21944671
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:63
- 大小:453.47KB
图书管理系统JSP课程设计报告Word文档格式.docx
《图书管理系统JSP课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《图书管理系统JSP课程设计报告Word文档格式.docx(63页珍藏版)》请在冰豆网上搜索。
书名、ISBN、价格、出版社、出版时间
numberRandom.jsp
用于生成随机验证码图片
down.html
显示图书管理系统主界面的下半部分
up.html
显示图书管理系统主界面的上半部分
index.html
图书系统主界面,其中内嵌down.html、up.html和login.jsp等页面
login.jsp
图书管理系统登录主界面
logindo.jsp
检验用户输入用户名、密码及验证码是否合法;
合法则显示所有图书信息,否则提示用户输入错误
logout.jsp
注销,提示用户已经退出系统,2秒后跳转到登录主界面
三、核心功能模块说明
1、查看图书详细信息(源代码来自admbkinfo.jsp)
首先我们要获取到数据库中相应字段的值:
StringstrBname=rs.getString("
Bname"
);
//省略部分代码…
然后我们用JSP语言让他们显示出来:
<
TR>
TD>
%=strBname%>
/TD>
<
TDalign="
center"
>
%=strBisbn%>
!
--省略部分代码…-->
%=strBpubtime%>
buttononclick="
{location.href='
bookshow.jsp?
Bisbn=<
'
}"
查看<
/button>
/TR>
2、添加新图书(源代码来自bookaddok.jsp)
首先获取到bookadd.jsp传过来的图书信息,为了防止乱码,我们对字符串进行了编码方式的处理:
StringBpub=newString(request.getParameter("
Bpub"
).getBytes("
ISO-8859-1"
));
然后编辑SQL语句,利用JavaBean进行处理,这里使用了预处理语句:
Stringsql="
insertintoBook1values(?
?
)"
;
myBean.getConnection(dbName,userName007,userPsw007);
//使用JavaBean获取连接
Connectioncon=myBean.getCon();
PreparedStatementstm=con.prepareStatement(sql);
stm.setString(1,Bname);
stm.setString(2,Bisbn);
stm.setString(3,Bprice);
stm.setString(10,Bnotes);
if((Bname!
=null&
&
Bisbn.equals("
"
))&
(Bisbn!
))){
try{stm.execute();
}
catch(SQLExceptionex){
out.println("
p>
center>
来自数据库的错误信息:
+ex.getMessage()+"
/center>
flag=false;
//flag表示插入成功还是失败,便于系统提示
}
if(flag){out.println("
+"
图书表添加记录成功!
else{out.println("
图书表添加记录失败!
else{
图书名和ISBN码不允许为空值!
3、对图书进行修改、删除(源代码来自bkmdfok.jsp和bookdeleteok.jsp)
对图书进行修改与添加图书类似,不同之处在于执行的SQL语句不同:
Stringsql=
UPDATEBook1SETBname=?
Bprice=?
Bpub=?
Bpubtime=?
Bwrtr1=?
Bwrtr2=?
Bclassno=?
Babout=?
Bnotes=?
whereBisbn=?
//修改图书的SQL语句
Stringsql=
deletefrom"
+tableName+"
whereBisbn="
+isbn+"
//删除图书的SQL语句
4、注销及页面验证
我们在用户登录时就用session对象把用户的姓名存储到了userid变量中(源代码来自logindo.jsp):
session.setAttribute("
userid"
name);
在注销的链接中,我们将所有针对该用户的session对象销毁(源代码来自logout.jsp):
session.invalidate();
//注销
我们在每个页面都添加了认证操作,如果发现没有登录系统就会提示用户进行登录,界面友好(源代码来自admbkinfo.jsp):
if(session.getAttribute("
)!
=null){
欢迎<
%=session.getAttribute("
)%>
光临本系统,<
ahref="
logout.jsp"
注销!
/a>
catch(NullPointerExceptione){
out.println("
+"
请登录!
%>
login.jsp"
登录<
%
else{%>
h3>
请先进行系统的<
/h3>
%}
5、分页显示(源代码来自admbkinfo.jsp)
intintPageSize;
//一页显示的记录数intintRowCount;
//记录总数
intintPageCount;
//总页数intintPage;
//待显示页码StringstrPage=null;
intPageSize=15;
//设置一页显示的记录数
strPage=request.getParameter("
page"
//取得待显示页码
ResultSetrs=myBean.executeQuery(sql);
rs.absolute
(1);
//将指针移动到结果集对象的第一行
rs.last();
//获取记录总数
intRowCount=rs.getRow();
intPageCount=(intRowCount+intPageSize-1)/intPageSize;
//记算总页数
if(intPage>
intPageCount)intPage=intPageCount;
//调整待显示的页码
if(intPageCount>
0){
//将记录指针定位到待显示页的第一条记录上
rs.absolute((intPage-1)*intPageSize+1);
inti=0;
while(i<
intPageSize&
!
rs.isAfterLast()){
//这里省略的是显示图书信息模块
rs.next();
i++;
TABLE>
--这里显示的是页面导向栏,显示是第几页、记录个数等-->
tr>
tdheight="
22"
align="
第<
%=intPage%>
页共<
%=intRowCount%>
条记录/共<
%=intPageCount%>
页
%if(intPage<
2){
out.print("
首页|上一页"
}else{
<
admbkinfo.jsp?
page=<
%=1%>
首页<
|<
a
href="
%=intPage-1%>
上一页<
/TABLE>
6、验证码输入(源代码来自numberRandom.jsp)
OutputStreamos=response.getOutputStream();
response.setHeader("
Pragma"
"
No-cache"
Cache-Contorol"
"
no-cache"
//设置页面缓存
response.setDateHeader("
Expires"
0);
intwidth=75,height=20;
BufferedImageimage=
newBufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
//创建图像
Graphicsg=image.getGraphics();
//获取图形
Randomrandom=newRandom();
//生成随机类
g.setColor(getRandColor(50,250));
//设置背景色
g.fillRect(0,0,width,height);
g.setFont(newFont("
TimesNewRoman"
Font.PLAIN,18));
//设置字体
g.setColor(Color.gray);
//设置边框
g.drawRect(0,0,width-1,height-1);
g.setColor(getRandColor(150,200));
//随机产生干扰线
for(inti=0;
i<
200;
i++){
intx=random.nextInt(width);
inty=random.nextInt(height);
intx1=random.nextInt(12);
inty1=random.nextInt(12);
g.drawLine(x,y,x+x1,y+y1);
StringsRand="
//图像显示验证码
5;
Stringrand=String.valueOf(random.nextInt(10));
sRand+=rand;
g.setColor
(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(rand,13*i+6,16);
random"
sRand);
//验证码存入session
g.dispose();
//图像生效
ImageIO.write(image,"
JPEG"
os);
//页面显示图像
os.flush();
os.close();
os=null;
response.flushBuffer();
out.clear();
out=pageContext.pushBody();
7、图片循环滚动(源代码来自down.html)
图片滚动采用JavaScript来实现,关键代码如下
script>
//使用div时,请保证colee_left2与colee_left1是在同一行上.
varspeed=30;
//速度数值越大速度越慢
varcolee_left2=document.getElementById("
colee_left2"
varcolee_left1=document.getElementById("
colee_left1"
varcolee_left=document.getElementById("
colee_left"
colee_left2.innerHTML=colee_left1.innerHTML
functionMarquee3(){
if(colee_left2.offsetWidth-colee_left.scrollLeft<
=0)//offsetWidth是对象的可见宽度
colee_left.scrollLeft-=colee_left1.offsetWidth
//scrollWidth是对象的实际内容的宽,不包边线宽度
else{
colee_left.scrollLeft++
varMyMar3=setInterval(Marquee3,speed)
colee_left.onmouseover=function(){clearInterval(MyMar3)}
colee_left.onmouseout=function(){MyMar3=setInterval(Marquee3,speed)}
/script>
8、CSS样式表(源代码来自up.html和down.html)
主要控制网页头和尾显示的样式,如文字字体颜色大小等,以及导航栏的鼠标访问的样式。
以下是页面logo中文标题和英文标题的样式控制。
styletype="
text/css"
.logo{
height:
100px;
width:
padding:
3px;
margin:
.ch_title{
font-size:
60px;
color:
#36F;
font-weight:
bolder;
.en_title{
24px;
#FFF;
background-color:
padding-left:
20px;
/style>
四、效果图
长安大学图书管理系统登录主界面:
说明:
整个页面采用了CSS样式,使跳转后的页面全部采用该风格,在之后的页面跳转中整个网页的上半部分和下半部分不改变。
登录窗口能够进行验证码验证,在登录窗口下能够进行图片滚动。
图一
登录后进入的主页面:
我们可以看到该页面最下面有翻页功能,能够显示记录的总个数、页码等。
图二
添加图书主界面:
图三
图书记录添加成功:
图四
查看图书详细信息界面:
图五
图书信息修改主界面:
图六
图书删除主界面:
图七
图书信息增删改查操作成功(没有了平凡世界这个条目):
图八
五、运行测试时发现的问题及解决方法的描述
1、乱码问题
规定文件编码方式为UTF-8,并指定字符编码为GBK,设置request字符编码方式为GBK。
2、异常接收
在测试过程中我们发现出现了Tomcat服务器错误页面,但我们不能将异常抛给用户。
于是我们在程序语句中增加了try-catch块,增加程序健壮性,当出现错误时在网页上给出相应的提示。
3、防止插入空值
在增加新书时,我们发现在什么都没有输入的条件下,仍能正常执行插入操作,而且显示出来的全部都是空白。
首先我们在数据库中规定了isbn字段是不允许为空值的,但插入竟然成功。
通过查看网上的资料,我们了解到SQLServer2008中的空字符串和NULL是不一样的两个值,它不能识别空字符串为NULL。
为此,我们在JSP程序中加入了如下语句来判断(源代码来自bookaddok.jsp,详见第三部分的第2点):
)))
{//省略部分代码…}
else
那么当用户什么都没有输入时,就不会执行插入操作。
4、页面导向错误
当管理员翻到图书目录第二页进行相关操作后,点击返回图书目录页面,总是导向第一页,为解决这个问题,我们将管理员正在操作的图书目录的页数存储在session对象中(源代码来自admbkinfo.jsp):
if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage=1;
1"
//管理员在第一页修改图书后提交后能够返回至第一页
strPage);
//这个是为了管理员在某一页修改图书后提交后能够返回至他那个操作页面
intPage=java.lang.Integer.parseInt(strPage);
//将字符串转换成整型
if(intPage<
1){
intPage=1;
5、翻页显示时在控制台显示ResultsettypeisTYPE_FORWARD_ONLY的错误信息
查看数据库连接的Bean:
MyBean.ExSql,里面对Statement对象的创建是默认方。
这样在返回的Statement对象创建的结果集在默认情况下类型为TYPE_FORWARD_ONLY,并带有CONCUR_READ_ONLY并发级别。
因此不允许用last()方法,一旦调用这个方法就会出现上述错误。
对statement创建修改如下(源代码来自ExSql.java):
stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
//建立statement类对象
再运行程序,分页成功实现。
6、翻页后用户姓名不能正常显示
我们在最开始,翻页时通过超链接将姓名变量传给下一个页面。
然而,这样出现了很多问题,经过了多次跳转之后,自己都不知道到底是否传递了这个参数,出现用户姓名不能显示或者显示为null的情况。
因此,在用户登录时,我们就将用户的姓名查出来,并存储到session对象中。
(相关代码详见第三部分的第4点)
六、附录:
完整的源程序代码和注释
/*功能:
导入JDBC标准库,注册数据库驱动程序,建立与数据库的连接*/
packageMyBean;
importjava.sql.*;
publicclassLinkDB{
publicConnectiongetConnection(StringdbName,StringuserName,StringuserPsw){
StringdriverName="
sun.jdbc.odbc.JdbcOdbcDriver"
Stringconurl="
jdbc:
odbc:
+dbName;
Connectioncon=null;
try{
Class.forName(driverName);
con=DriverManager.getConnection(conurl,userName,userPsw);
}catch(Exceptione){
System.err.println("
con"
+e.getMessage());
}
returncon;
publicConnectiongetConnection(StringdbName){
con=DriverManager.getConnection(conurl);
操作(查询、插入、更新、删除)数据库中的数据;
*完成了所要执行的操作后,关闭各种连接*/
import
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书管理系统 JSP课程设计报告 图书 管理 系统 JSP 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)