java课程设计,图书管理系统,MVC开发模式
![java课程设计,图书管理系统,MVC开发模式](https://img.360docs.net/img8c/047ehr6r9aft8loexol1-c1.webp)
![java课程设计,图书管理系统,MVC开发模式](https://img.360docs.net/img8c/047ehr6r9aft8loexol1-22.webp)
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
目录
一、设计目的 (2)
二、功能介绍 (3)
三、程序流程 (4)
四、设计步骤 (5)
五、设计总结 (6)
六、程序清单 (7)
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
一、设计目的
此次的课程设计是图书管理系统,它的产生可以方便用户进行操作,以减少用户的误操作。作为一个软件,功能是第一要素,所以,我此次的设计以功能为主,在美工和页面的设计并没有什么要求。
通过此次课程设计,增加了我们理论联系实际和解决实际问题的能力,也使我们对JAVA这门语言有了更深的了解,使我们可以用最简单、便捷的语言和方法实现相同的功能,深刻明白了其优越性,同时也提高了我们的学习JAVA的兴趣,给我们以后学习、工作打下坚实的基础。
二、功能介绍
此次设计的要求有如下六个功能:
(1)具有新用户注册功能。
(2)具有注册用户登录功能。
(3)具有图书信息的录入功能。
(4)具有借出和归还登记功能。
(5)具有数据查询功能,可以实现查询全部信息和按条件执行查询。
(6)具有按条件删除数据功能。
首先,我们实现注册和登录功能,进入系统软件后,可以进行一下操作:
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
三、程序流程
此次JAVA课程设计,我采用的是MVC开发模式,具体内容如下图所示:
1)首先,在JSP页面有一个form表单,里面存有需要使用的参数供增删改查使用,当我们通过submit按钮提交表单时,它会寻找action属性值,走到web.xml。在web.xml 中,通过查找到与action属性值相同的
2)然后,在servlet中,把从JSP页面接收到的参数封装到useBean中(为了减少传递给JavaBean的参数),通过实例化一个JavaBean对象,调用其方法,进行一些连接数据库的操作。
3)JavaBean包含一些增删改查的操作,进行业务处理,连接到数据库中,最后把操作的结果返回给servlet中。
4)Servlet判断返回的结果,如果成功就跳转到成功页面所对应的JSP,如果失败,在返回form表单所在的页面,重新进行操作。
四、设计步骤
1)需求分析
在课程设计之初,最重要的是需求分析,要深入了解所有的业务及其流程,才能在编码时减少误区和编码时间。了解完成所要实现的功能之后,
需要考虑设计所需要
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊使用的开发工具,这对不同规模的问题,采取的开发模式、服务器、数据库都是不一样的。
我们的设计相对比较简单,所以,选择了tomcat5.0作为图书管理系统所需要的服务器,mysql作为数据库(mysql是免费的,符合设计真实情况),myeclipse作为开发工具,360浏览器作为测试的工具,同时使用JSP书写web页面,javascript 进行简单的校验,采用ajax提交异步请求,实现一些相对特殊的功能。
这次设计的数据库名称时javacourse,它包含三张数据表,具体如下所示:
https://www.360docs.net/doc/8d14523526.html,er(管理员表):
ii.book(图书表):
iii.borrowbook(借书记录表):
2)详细设计
当已经对业务有了深入的了解之后,开始进行功能流程的详细设计,我们可以通过图纸等工具,策划出设计的功能,如功能介绍所示。
3)编码阶段:准备工作已经完成,我们可以正式进入编码阶段。
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
i.创建一个web project——JavaCourse,并把其发布到tomcat中。
ii.配置连接池:连接池技术可以预先建立一定的连接,当我们进行数据库访问时,直接取得连接池中的空闲链接可以减少对数据库的链接操作,很好的减轻了数据库的负担。
iii.Context ctx = new InitialContext();//实例化上下文对象DataSource ds = (DataSource) ctx.lookup("java:/comp/env/JavaCourse");
//找到JNDI数据源,并且返回数据源对象iv.同时,我们还需要在tomcat服务器下配置JNDI数据源,具体的配置如下图所示:
v.登录功能:
a)书写JSP页面代码:JSP页面是动态的web页面,通过一些提交操
作可以进行数据库访问操作,而form表单又是提交的核心控件,其代码如下:
通过以上代码我们可以观察到,当我们点击登录按钮时,它会使用userlogin 提交请求,到web.xml里面寻找所要使用的servlet。
b)配置web.xml:
web.xml是web project的核心文件,它配置了该工程的一些配置信息,当我们启动服务器时,会首先读取web.xml,了解工程的基本信息。登录的请求配置如下:
此时,服务器就知道登录功能需要跳转到https://www.360docs.net/doc/8d14523526.html,.servlet.login这个servlet文件中。
c)编写servlet:servlet可以接收表单传过来的参数值,进行对数
据库的操作。因为我采用的是MVC的开发模式,所以使用了javabean
单
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
独作为连接数据库的操作,自然需要在servlet中创建一个javabean的
对象,调用其相应的函数,代码如下所示:
String uname = request.getParameter("username");
String pword = request.getParameter("pword");
response.setContentType("text/html; charset=UTF-8");
User user = new User();
user.setUsername(uname);
UserLoginJavaBean login = new UserLoginJavaBean();
ResultSet rs = login.getUser(user);
d)编写javabean:javabean里面封装了调用数据库的方法,可以进
行增删改查操作,其中,使用了连接池进行操作,代码如下:
public class UserLoginJavaBean {
public ResultSet getUser(User user) {
String sql = "select username,password from user where username='" + user.getUsername()+ "'";
Conn conn = new Conn();
ResultSet rs = conn.query(sql);
return rs;
}
}
e)判断结果,实现页面跳转:实现登录功能,我们必须要先判断出
该用户是否存在,以及密码是否正确,javabean中返回的结果是ResultSet
类型的对象,我们通过判断rs.next()是否为true,来查询该用户名是否
存在,若存在,我们再比对其密码是否正确,如果密码正确,提示其登录成功,并且让它跳转到main.jsp(即主页面),否则提示其密码有误,让其重新登录;当rs.next()为false时,说明不存在该用户,则提示给予其提示,让其重新登录。
try {
if (rs.next()) {
session.setAttribute("user", rs.getString("username"));
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
if(rs.getString("username").equals(uname)){
if(rs.getString("password").equals(pword)){
out.println("");
}else{
out.println("");
}
}
} else {
out.println("");
}
} catch (SQLException e) {
e.printStackTrace();
}
vi.
按条件检索并且删除:该功能模块中主要包含按照图书名称、图书类型、
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
图书代码和作者姓名四个条件进行模糊查询,并实现了任意环境下的分页功能,以及任一图书的删除功能。以下该图片是查询全部图书信息的页面:
当然,我们可以查询图书名称包含java并且作者包含j的图书信息,查询结果如下图所示:
vii.代码亮点:
此次设计,我使用了ajax进行了一些简单的校验,从登录页面我们可以看到,当用户名不存在时,会给出我们提示。在注册页面中,我也采用该技术,我们知道,任何两个人的身份证号码是不会出现相同(即便出现也是因为系统出现错误),就设计而言,不能出现两个人的用户名是相同的,当有人使用数据库中已经存在的用户名进行注册时,我们给予其提示,并不让其进行注册;当用户名不存在时,该用户名就可以注册,如下图所示:
4)测试阶段
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
五、设计总结
这学期是我们第一次在学校学习JAVA这门编程语言,因为有以前在培训班学习JAVA的基础,所以对我而言,此次设计相对比较容易。我们所设计的图书管理系统主要实现了登录、注册、录入图书、借书、还书、删除图书以及模糊查询等功能,功能实现起来比较简单。而且,我选用的是MVC的开发模式,程序代码有很大的可重用性和逻辑性,当我们进行维护时,可以更加的便捷。
对我来说,JAVA好像是一根救命稻草,C语言复杂性让我惧怕,从事C语言的编程是一项很大的挑战,学习了JAVA之后,越来越深刻的了解了面向对象的含义,通过学习,慢慢了解了那些构建的JAVA基础之上的开发语言和框架,编程慢慢变成一项相对容易的工作,成为一件趣事。
短短一周的设计马上就要结束了,通过设计,是我可以更深刻的了解JAVA的魅力,熟悉了以前被遗忘的知识,更深刻的认识到其简单性,易用性。以后的学习道路还很长,此次的课程设计为我们开启了一个良好的开端,为我们今后的毕业设计奠定了基础。
以后学习的路还有很长,我们仍需要继续努力,掌握更深刻的知识,以备以后的学习和工作所需。
六、程序清单
1)模糊查询并删除页面代码:
<%@page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.Date,https://www.360docs.net/doc/8d14523526.html,.javaBean.Conn,java.sql.ResultSet" %>
检索图书页面
<% Conn cn=new Conn();
String pagesql; //pagesql表示查询总记录数的SQL语句
String sql; //sql表示查询数据库记录的SQL语句
ResultSet pagers,rst; //pagers=cn.query(pagesql); rst=cn.query(sql)
int i;
int ipage=5; //分页单位 ,每页的记录数
int allpage; //总页数
int pages; //接受的页码变量
int cpage=1; //当前页
int allCol=0; //总记录数
int beginpos=0; //每页开始位置
int endpos=0; //每页的结束位置.
String bookname=request.getParameter("bookname");
String bookcode=request.getParameter("bookcode");
String booktype=request.getParameter("booktype");
String bookwriter=request.getParameter("bookwriter");
if(bookname==null||bookname==""||bookname.equals("")||bookname.equals("null")|| bookname.equals(null)){
sql="selectid,bookname,booktype,bookcode,bookwriter,bookchubanshe,bookprice, booklocation,bookremark from book where 1=1 ";
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
pagesql="select count(id) as id from book WHERE 1=1 ";
}else{
bookname= new String(bookname.getBytes("ISO8859-1"),"UTF-8");
sql="select id,bookname,booktype,bookcode,bookwriter,bookchubanshe,bookprice, booklocation,bookremark from book where bookname like '%"+bookname+"%' ";
pagesql="select count(id) as id from book where bookname like '%"+bookname+"%' ";
}
if(bookcode==null||bookcode==""||bookcode.equals("")||bookcode.equals("null")|| bookcode.equals(null)){
}else{
bookcode= new String(bookcode.getBytes("ISO8859-1"),"UTF-8");
sql=sql+" AND bookcode like '%"+bookcode+"%'";
pagesql=pagesql+" AND bookcode like '%"+bookcode+"%'";
}
if(bookwriter==null||bookwriter==""||bookwriter.equals("")||bookwriter.equals(" null")||bookwriter.equals(null)){
}else{
bookwriter= new String(bookwriter.getBytes("ISO8859-1"),"UTF-8");
sql=sql+" and bookwriter like '%"+bookwriter+"%'";
pagesql=pagesql+" and bookwriter like '%"+bookwriter+"%'";
}
if(booktype==null||booktype==""||booktype.equals("")||booktype.equals("null")|| booktype.equals(null)){
}else{
booktype= new String(booktype.getBytes("ISO8859-1"),"UTF-8");
sql=sql+" and booktype like '%"+booktype+"%'";
pagesql=pagesql+" and booktype like '%"+booktype+"%'";
}
pagers = cn.query(pagesql);
if(pagers.next()){
allCol = pagers.getInt("id"); //获得总记录数
}
allpage = (allCol+ipage-1)/ipage; //求出总页面数
if (request.getParameter("pages")==null){//判断参数pages是否为空
┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊
pages=1;
beginpos=0;
endpos=ipage;
}else{
pages = new Integer(request.getParameter("pages")).intValue();
}
//判断当前页
if(pages > allpage || pages <1){
cpage = 1; //-默认当前要显示的页码
beginpos=0; //-=默认记录开始的位置为0
endpos=ipage; //--默认结束位置为第一页的结尾}else{
cpage = pages; //--当前要显示的页码
beginpos=pages*ipage-ipage; //--得到记录开始的位置
endpos=pages*ipage; //--得到记录结束的位置
}
rst=cn.query(sql);
for(i=0;i rst.next(); //--把结果集的记录数移到要显示的页的记录的开始位置}%> <% int ii=beginpos+1; for(int j=beginpos;j if(rst.next()) {%> ┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊ <%} else break; }%>图书名称 图书类型 图书编号 作者姓名 出版社 图书价格 所在书架 图书备注 删除 <%=rst.getString("bookname")%> <%=rst.getString("booktype")%> <%=rst.getString("bookcode")%> <%=rst.getString("bookwriter")%> <%=rst.getString("bookchubanshe")%> <%=rst.getString("bookprice")%> <%=rst.getString("booklocation")%> <%=rst.getString("bookremark")%> " onclick="return confirm('您确认要删除此书吗?')">删除