JavaEE企业架构与设计实验报告

《Java EE架构与程序设计》课程设计报告

学号:
姓名:

一、项目总体说明
1.1 项目总体说明
此项目意在帮助图书馆管理员和普通用户管理和使用图书馆。普通用户可以通过本网站简洁高效的查询借阅所需书籍和快速还书,管理员可以通过本网站监控图书馆整体状态,上架或下架书籍,查看会员情况等。

1.2 开发环境的选择、安装与配置

开发环境配置
Eclipse4.5.1Eclipse中创建javaEE项目时,在容器中创建index.html作为项目主页,创建文件夹将html和jsp文件分开存放,方便维护
Tomcat6.0在Eclipse中的sever中配置Tomcat服务器
JDK1.8配置环境变量classpath
MySQL8.0(1)下载mysql之后不能直接在Eclipse中配置,如果想在进入命令行直接运行需要进行如下操作:在目录运行的情况下设置(创建数据库):alter user ‘root’@‘localhost’ identified with mysql_native_password by ‘123456’;flush privileges;
MySQL8.0(2)在Eclipse中连接数据库时候出现时区错误,修正方法是在url路径跟上:?serverTimezone=UTC
MySQL8.0(3)MySQL数据库中出现乱码,需要设置编码方式,在命令行mysql>下输入 SET NAMES GBK;
MySQL8.0(4)在Eclipse中添加数据库驱动程序

二、项目设计概要
2.1 项目需求分析
(1)用例图
用例图

(2)数据库表关系图
数据库表关系图
2.2 系统总体设计
本系统针对图书馆管理中的书籍入库出库,借书还书建立了三个数据库表,分别存储用户,书籍和借书信息。分别对用户和书籍数据库表编写了对应的Java类,执行特定的增加删除查询修改等一些列操作。之后按照业务逻辑编写对应的JSP(动态)和HTML(静态)页面,这些页面通过调用JavaBean实现对数据库操作,从而实现系统功能。本系统编写过程中,对输入信息进行测试,有效避免输入为空和错误信息对系统的破坏,有较好的鲁棒性。

2.3 数据库设计
1.customer表包含四种属性:username,password,name,telephone_number
用于存储用户的登录用户名,密码,姓名,电话等个人信息
2.book表包含四种属性:book_id,book_name,author,is_in用于存储书籍的编号信息, 书名,作者和状态信息
3.relation表包含两种属性:username,book_id用于存储借书记录信息,借书成功时将 借书用户名和书籍编码写入此表,还书时则删除对应信息
4.数据库操作:插入,删除,查询,修改,自然连接

2.4 系统工作流程设计
(1)普通用户业务逻辑图
普通用户业务逻辑图
(2)管理员用户业务逻辑图

管理员用户业务逻辑图
2.5 资源清单和说明
JSP页面19个
HTML页面9个
Bean类2个
数据库1个
数据库表3个
类中实用方法(不包含构造方法,setter,getter方法)10个

2.6 主要界面设计效果截图和说明
(1)注册页面(两次密码需一致方可注册成功)
注册
(2)注册成功进入登录页面
注册成功
(3)登录成功进入主页面
登录
(4)借书页面(可按书名,作者或同时查询)
借书
(5)根据作者查询书籍结果(输入id码借书)
查询
(6)还书页面(输入id码还书)
还书
(7)管理员主页面
管理员
(8)上架书籍页面(若编码重复上架失败)
上架
(9)下架书籍页面(输入编码下架书籍)
下架
(10)书籍信息页面(显示和统计书籍信息)
书籍信息
(11)会员信息页面(显示和统计会员信息)
会员信息
2.7 主要程序代码
(1)上架书籍
先确定上架书籍信息是否完成,如果书籍编码已存在则上架失败,否则上架成功返回true

public boolean add_book(String book_id,String book_name,String author){//上架书籍方法
		boolean Flag=true;
		try{
			Class.forName(DBDRIVER) ;//加载驱动程序
			conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;//取得数据库连接
			String sql1 ="insert into book (book_id,book_name,author,is_in) values ('"+book_id+"','"+book_name+"','"+author+"','yes')";
			String sql2="select book_id from book";
			stmt=conn.createStatement();
			rs=stmt.executeQuery(sql2);
			while(rs.next()){
				String id=rs.getString("book_id");
				if(id.equals(book_id)){
					Flag=false;
				}
			}
			if(Flag){
			stmt.executeUpdate(sql1);
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			stmt.close();
			conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return Flag;
	}

(2)下架书籍方法
通过书籍编码下架,如果下架成功范围true,如果书籍已经借出或输入错误则返回false

public boolean reduce_book(String book_id){//下架书籍
		boolean flag=false;
		try{
			Class.forName(DBDRIVER) ;//加载驱动程序
			conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;//取得数据库连接
			String sql1="select book_id,is_in from book";
			String sql2="delete from book where book_id="+book_id;
			stmt=conn.createStatement();
			rs=stmt.executeQuery(sql1);
			while(rs.next()){
				String id=rs.getString("book_id");
				String is_in=rs.getString("is_in");
				if(id.equals(book_id)&& (is_in.equals("yes"))){
					stmt.executeUpdate(sql2);
					flag=true;
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			stmt.close();
			conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return flag;
	}

(3)根据指定书籍编码查询对应的书籍账号
通过执行数据库连接操作查询username,之后页面中通过此方法返回的username获得会员信息一并输出

public String getUsername(String book_id){//根据指定书籍编码查询对应借书的账号,如若没有借出,则返回空
		String username=null;
		try{
			Class.forName(DBDRIVER) ;//加载驱动程序
			conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;//取得数据库连接
			String sql1="  select  book_id,book_name,author,username,is_in from book natural join relation";//查找现已借用的书籍
			stmt=conn.createStatement();
			rs=stmt.executeQuery(sql1);
			while(rs.next()){
				String id=rs.getString("book_id");
					if(book_id.equals(id)){
						username=rs.getString("username");
					}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			stmt.close();
			conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return username;
	}
}

(4)根据用户名查找会员信息,返回customer对象

public Customer select_single_customer(String username){//查找单个会员用户
		Customer c=new Customer();
		try{
			Class.forName(DBDRIVER) ;//加载驱动程序
			conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;//取得数据库连接
			String sql1="  select username,name,telephone_number from customer";//查找现已借用的书籍
			stmt=conn.createStatement();
			rs=stmt.executeQuery(sql1);
			while(rs.next()){
				if(rs.getString("username").equals(username)){
				String uname=rs.getString("username");
				String real_name=rs.getString("name");
				String telephone_number=rs.getString("telephone_number");
				c.setUsername(uname);
				c.setName(real_name);
				c.setTelephone_number(telephone_number);
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			stmt.close();
			conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		return c;
	}
	}

三、项目关键性问题分析及技术解决方案
3.1 借书查询过程中,根据书名,作者或者同时查询
在查询过程中为了方便用户使用书名查询,使用作者查询和同时查询,设置嵌套判断语句和flag标记,利用rs.next()方法循环输出数据库信息,使得书籍信息一目了然。
3.2 获取书籍和会员总体信息
在查询方法中添加全局计数器,在页面中读取计数器,从而获得书籍已借出和在库 中的数目。方便图书馆管理员实时掌握图书馆的书籍状态数目和会员数目。
3.3 查询单个书籍和单个会员
为了减少JSP页面可执行代码量,修改查询方法,使得传入参数为对应String类型 返回为Customer对象,在通过返回对象调用对应于的setter方法和getter方法来获得属性, 输出信息。
四、项目测试及结论
4.1 项目鲁棒性分析
在项目测试过程中,输入各种类型数据及空数据,测试系统性能,均可正确回应。 故此系统拥有较强的鲁棒性
4.2 项目实用性测试
在实际使用系统过程中发现,页面之间的调用关系需要更加细化,在二级页面加入 必要的超链接用于页面间跳转,方便用户根据自己需求使用系统。

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页