南昌大学javaweb大作业报告书_第1页
南昌大学javaweb大作业报告书_第2页
南昌大学javaweb大作业报告书_第3页
南昌大学javaweb大作业报告书_第4页
南昌大学javaweb大作业报告书_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南昌大学软件学院 java web大作业 实验报告软件学院大作业实验报告题 目: 基于Struts的图书管理系统 专 业: 软件工程 班 级: 122班(java方向) 学 号: 学生姓名: 王冠 完成人数: 1 人 起讫日期: 2015/05/20 任课教师: 周兴斌 职称: 副教授 部分管主任: 刘晓强 完成时间: 2015/05/30 27 / 27目录1.前言31.1 实验目的31.2 实验的基本要求32. 系统分析与设计32.1 系统功能描述(简单需求分析)32.2 系统功能流程32.3数据库设计42.3.1数据表的构建43.系统的实现与测试53.1系统采用的关键技术53.2 关键程序流程63.3 关键代码分析73.4 出现的问题及解决183.4.1向数据库中插入数据出现乱码以及界面显示有中文乱码问题:183.4.2弹出提示框问题194. 系统界面194.1 进入系统界面 (登录界面)194.2 管理员模块界面:194.3 添加图书界面:204.4 罚金设置界面:204.5 用户管理界面:204.6 用户模块界面:214.7 图书检索、借阅界面:214.8 续借图书界面:224.9 归还界面:224.9 安全退出界面:235.操作方法235.1 登录235.2 图书检索,借阅235.3图书归还,续借235.4图书,用户的添加235.5 图书,用户的删除操作245.6 图书,用户的更新操作246.分析与总结246.1实验分析与总结247.附录:257.1 参考文献:257.3 MVC架构模式的认识251.前言 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:用于记录用户信息数据表字段名类型长度是否为主键可否为空说明IDnchar10是否用户IDusernamenchar10否否用户姓名passwordnchar10否否用户密码cardnumint10否否卡号信息userlevelint10否否用户级别coaterint10否否借阅限额borrowedint10否否已借阅数can_borrowint10否否可借阅数图书信息表books: (用于存储图书相关信息)字段名类型长度是否为主键可否为空说明b_IDint10是否图书IDb_namenvarchar50否否图书名称b_authornchar10否否图书作者b_publishnvarchar50否否图书出版社b_typenchar10否否图书类型b_countint10否否拥有数量b_hotint10否否欢迎度借阅表 borrowbook: (用于表示借阅信息)字段名类型长度是否为主键可否为空说明bridint10是否借阅表idcardnumint10是否用户表外键b_IDint10是否图书表外键borrowdaynchar10否否借阅日期shouldreturnnchar10否否应还日期罚金表fine: (用于设置罚金)字段名类型长度是否为主键可否为空说明finefloat10是否罚金3.系统的实现与测试 3.1系统采用的关键技术本系统采用的是Model2模型,Model2表示的是基于MVC模式的框架。MVC是ModelViewController的简写。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数据库的连接,函数里封装了几个操作。public boolean query(String s) (用于查询数据表操作);public ResultSet getlist(String s) (用于获取数据的可以滚动结果集) ;public int update(String s)(用于简单的数据更新操作)public boolean executebatch(String a)(批处理,用于处理多条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中实现的):package com.wk.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class DataBase private Connection conn = null;private Statement stmt;ResultSet rs = null;/数据库的urlprivate String url = jdbc:sqlserver:/localhost:1433;DatabaseName=Book;/数据库的用户名密码String user = sa;String pass = 123;/用于验证查询操作public boolean query(String s) throws SQLExceptiontry/加载驱动Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);catch(ClassNotFoundException e)System.out.println(加载驱动器类时异常);try/创建链接conn = DriverManager.getConnection(url, user, pass);stmt = conn.createStatement();rs = stmt.executeQuery(s);catch(SQLException e)System.out.println(query连接数据库的过程中出现SQL异常);return(rs.next();/用于结果集可滚动的操作public ResultSet getlist(String s) throws SQLExceptiontry/加载驱动Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);catch(ClassNotFoundException e)System.out.println(加载驱动器类时异常);try/建立连接conn = DriverManager.getConnection(url, user, pass);/得到statement对象stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);/得到一个可滚动但不可以更新的结果集rsrs = stmt.executeQuery(s);catch(SQLException e)System.out.println(更新操作连接数据库的过程中出现SQL异常);return rs;/用于对数据库的更新public int update(String s) throws SQLExceptionint msg=0;try/加载驱动Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);catch(ClassNotFoundException e)System.out.println(加载驱动器类时异常);try/创建链接conn = DriverManager.getConnection(url, user, pass);stmt = conn.createStatement(); msg = stmt.executeUpdate(s);catch(SQLException e)System.out.println(连接数据库的过程中出现SQL异常);return(msg);/批处理,用于处理多条sqlpublic boolean executebatch(String a)try /创建链接conn = DriverManager.getConnection(url, user, pass);conn.setAutoCommit(false);/关闭自动提交,进行事物处理stmt = conn.createStatement();for(int i=0;ia.length;i+)stmt.addBatch(ai);int number = stmt.executeBatch();/开始批处理,返回被执行的sql语句的序号mit();System.out.println(共有+number.length+条sql语句被执行);stmt.clearBatch();/清空batchconn.close();return true; catch (SQLException e) / TODO Auto-generated catch blocktry conn.rollback();return false; catch (SQLException e1) / TODO Auto-generated catch blocke1.printStackTrace();e.printStackTrace();return false;/关闭数据流public void close() throws SQLExceptionconn.close();stmt.close();rs.close(); 管理员操作用户(在文件UserService.java中实现的)/管理员对用户的添加操作public boolean adduser(String a) throws SQLException/将密码明文转换为密文存入数据库a2 = ead.encrypt(a2);/利用字符串的拼接组成sql语句sql = insert into users values(+a0+,+a1+,+a2+,+a3+,+a4+,+a5+,+a6+);System.out.println(添加的sql+sql);/调用数据库的更新数据的操作函数int result = db.update(sql);if(result!=0)return true;return false;/管理员对用户的删除操作public boolean deluser(String id) throws SQLExceptionsql = delete from users where ID=+id+;System.out.println(del sql=+sql);int result = db.update(sql);if(result!=0)return true;return false;/管理员对用户的更新操作public boolean updateusers(String a) throws SQLExceptionsql = update users set username=+a1+,userlevel=+a2+ where ID=+a0+;System.out.println(更新sql=+sql);int result = db.update(sql);if(result!=0)return true;return false;这里管理员对图书的操作和对用户的操作很类似,这里就不再赘述了。 用户对图书的查询,借阅和续借和归还(主要在BooksService.java和borrowbookService.java实现的)BooksService.java部分代码:/模糊查询,获取用户的关键词,以此为查询条件进行搜索,默认按人气高至低排列public ArrayList getbook(String a) throws SQLExceptionArrayList al = new ArrayList();for(int i=0;ia.length;i+)System.out.println(ai);if(a0.equals()sql = select * from books where +a2+ LIKE %+a1+% order by b_hot desc;elsesql = select * from books where +a2+ LIKE %+a0+% order by b_hot desc;System.out.println(sql:+sql);/调用DataBase.java的函数,获取相应的图书列表rs = db.getlist(sql);while (rs.next() Books bk = new Books();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中return al;borrowbookService.java部分代码:/归还图书,public boolean returnbook(String brid,String cardnum,String b_ID) throws SQLExceptionString sql1 = update users set borrowed = borrowed-1 , can_borrow = can_borrow+1 where cardnum = +cardnum;String sql2 = update books set b_count = b_count+1 where b_ID=+b_ID;String sql3 = delete from borrowbook where brid=+brid;String a = sql1,sql2,sql3;/处理多条语句时,使用事务处理和使用批处理进行处理。if(db.executebatch(a)return true;return false;/续借图书public boolean renewbook(String brid) throws SQLException/将当前时间获得,拼接之sql,进行数据库表的更新操作sql = update borrowbook set borrowday =+new Day().getnowdate()+,shouldreturn = +new Day().getdate()+ where brid=+brid;System.out.println(sql=+sql);int r = db.update(sql);if(r!=0)return true;return false; 管理员对罚金的设置(主要由FineService.java和Resetfine.java完成的)FineService.java代码:package com.wk.service;import java.sql.ResultSet;import java.sql.SQLException;import com.wk.util.DataBase;public class FineService DataBase db = new DataBase();ResultSet rs = null;String sql = ;/管理员设定罚金金额public boolean setfine(float f)/字符拼接将设置的金额拼接成sqlsql = update fine set fine =+f;System.out.println(sql);try /调用database.java的更新函数进行数据库操作int r = db.update(sql);if(r!=0)System.out.println(设置罚金成功!);return true;elseSystem.out.println(设置罚金失败!); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return false;/获取上一次设定的罚金金额public float getlastfine()float m = 0;sql = select fine from fine;try /获取当前设定的金额rs = db.getlist(sql);while(rs.next()m = rs.getFloat(1); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return m;Resetfine.java部分代码:/设置罚金if(y.equals(isfirst)f.setFine(fs.getlastfine();request.setAttribute(oldfine, f.getFine();return mapping.findForward(success);elsef.setFine(fs.getlastfine();System.out.println(oldfine=+f.getFine();request.setAttribute(oldfine, f.getFine();/获取表单输入的罚金金额,转为float类型fs.setfine(Float.parseFloat(fineForm.getFine();f.setFine(fs.getlastfine();System.out.println(newfine=+f.getFine();request.setAttribute(newfine, f.getFine();/跳转至成功界面return mapping.findForward(success); 辅助工具包(实现用户密码的加密和时间的计算转换问题)Day.java/* * 换算时间 * 计算两个日期之间相差的天数 * 计算一个日期在n天之后的日期字符串 */package com.wk.util;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class Day /传入两个时间字符串,计算其中相差的天数public int getlaterday(String d1,String d2) throws ParseExceptionDate a = new SimpleDateFormat(yyyy-MM-dd).parse(d1);Date b = new SimpleDateFormat(yyyy-MM-dd).parse(d2);/获取相减后天数long day = (a.getTime()-b.getTime()/(24*60*60*1000);System.out.println(day+);return (int) day;/获取两个月后时间字符串public String getdate()SimpleDateFormat formatDate = new SimpleDateFormat(yyyy-MM-dd); /字符串转换 Calendar c = Calendar.getInstance(); /new Date().getTime();这个是获得当前电脑的时间,你也可以换成一个随意的时间 c.setTimeInMillis(new Date().getTime(); c.add(Calendar.DATE, 60);/天后的日期 Date date= new Date(c.getTimeInMillis(); /将c转换成Date System.out.println(date=+formatDate.format(date); return formatDate.format(date);/获取当前的时间public String getnowdate() Date dt=new Date(); SimpleDateFormat matter1=new SimpleDateFormat(yyyy-MM-dd); System.out.println(matter1.format(dt); return matter1.format(dt);EncryptAndDecrypt.javapackage com.wk.util;public class EncryptAndDecrypt /* * 加密String明文输入,String密文输出 * * param * return */public String encrypt(String sourceString)char p = 图书管理.toCharArray();int n = p.length;char c = sourceString.toCharArray();int m = c.length;for(int k = 0;km;k+)int mima = ck+pk%n;ck = (char)mima;/加密return new String (c);/返回密文/* * 输入加密后的String,返回原本的String * * param * return */public String decrypt(String sourceString)char p = 图书管理.toCharArray();int n = p.length;char c = sourceString.toCharArray();int m = c.length;for(int k = 0;km;k+)int mima = ck-pk%n;ck = (char)mima;/解密return new String (c);/返回明文3.4 出现的问题及解决3.4.1向数据库中插入数据出现乱码以及界面显示有中文乱码问题:问题描述:当需要将数据插入数据库时,会发现插入的数据有乱码。在界面的表单进行数据输入时,传出传入的中文数据也会出现乱码。1、JSP显示中文乱码的问题,一般都是没有设置页面编码,注意添加以下这样一段代码 pageEncoding指定了当前jsp文件存储使用的编码方式,“contentType”用来指定响应头消息中的Content-Type当服务端的响应头消息中没有指定charset时,客户端会依据上面代码中的charset指定的编码方式解码页面。 并且JSP都以UTF-8的编码方式保存,把所有可能出现的问题通通抹杀。如果你使用Myeclipse,可以设置Myeclipse的默认参数,使Myeclipse新建JSP文件时,可以自动是用UTF-8的编码方式。方法:Windows-Preference-Myeclipse-File and Editor-JSP-Encoding,选择ISO 10646/Unicode(UTF-8)。2、从表单获取的数据有中文乱码,在Struts里面,一般都使用过滤器进行数据的过滤,保证数据的编码格式与你自己页面设置的一致。关键代码如下:public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException / TODO Auto-generated method stub/这里设置接受编码arg0.setCharacterEncoding(utf-8);/继续让它前进,这句话必须要有arg2.doFilter(arg0, arg1); 值得一提的是,arg0.doFilter(arg0,arg1);这句话一定要有,不然过滤器不会向前执行,会停止不前,这样程序就没法运行了!3、读取数据时,在Servlet中添加request.setCharacterEncoding(UTF-8);可以很好地解决从JSP页面接受中文参数乱码。3.4.2弹出提示框问题问题描述:由于对Struts还不是完全的熟悉,对于其该怎样使用弹出框还是有点困扰,其不能再action里弹出一个弹出框后再进行return mapping 的操作,这样写并不会有提示框,而是直接执行了return mapping语句。解决方法:使用servlet和jsp结合来弹出提示框,即在servlet里给jsp传递一个参数,然后在jsp里进行该参数的判断,然后根据判断结果看是否弹出提示框,因为在jsp里可以直接写js代码,这样弹出框会方便很多,只要用alert(“我是弹出框!”);这一句就可以了。4. 系统界面 4.1 进入系统界面 (登录界面) 4.2 管理员模块界面: 4.3 添加图书界面: 4.4 罚金设置界面: 4.5 用户管理界面: 4.6 用户模块界面: 4.7 图书检索、借阅界面: 4.8 续借图书界面: 4.9 归还界面: 4.9 安全退出界面:5.操作方法 5.1 登录首先,输入正确网址即可打开系统登录界面,输入正确账号密码,系统会根据账号的级别,相应的进入不同的操作界面。 5.2 图书检索,借阅登录成功,点击左侧导航栏的检索、借阅,即可进入相应界面。输入关键词,或选择类别,点击搜索,会出现相应内容。 5.3图书归还,续借登录成功后,点击左侧相应的归还或续借菜单,即可进入相关界面,点击归还或续借按钮即可完成操作。 5.4图书,用户的添加管理员界面,点击左侧菜单的添加用户和添加图书,输入相关信息,点击添加即可。 5.5 图书,用户的删除操作管理员界面,点击左侧菜单的删除用户和删除图书,找到想要删除的用户或图书,当然也可以通过id号或卡号进行搜索,然后进行操作。 5.6 图书,用户的更新操作管理员界面,点击左侧菜单的更新用户和更新图书,找到想要更新的用户或图书,当然也可以通过id号或卡号进行搜索,然后在该用户的这一条记录的相应位置填写修改后的数据(当然有些字段是不能修改的),点击更新按钮即可。6.分析与总结 6.1实验分析与总结在这一节中,我主要讨论了两个问题,一个是系统的联机文档,另一个是系统的测试,下面我们分别加以说明。作为一个完整的系统,联机文档是其中不可缺少的部分也是相当重要的部分。好的文档能够使用户快速了解并准确的使用系统的各项功能。减少误操作,减少错误产生的可能,这对用户和开发人员都有很多的好处。所以在开发本系统中,也加入了不少的文档,除了对于几大模块的详细说明外,对于易出错和不易操作的地方(如多条件查询部分)又作了详细的说明。由于本身能力的局限性,所以做编写的代码,即使经过反复检查也难免出错所以在本阶段力求使用有限的时间找出尽可能多的错误,力求系统尽量正确。我们在本系统的测试中使用了黑盒法(即不关心程序内部的逻辑结构,而是根据程序的功能来设计是检测)请一位不熟悉本系统的人来进行随意性的操作,打破习惯的操作顺序,从中发现错误,在此阶段系统的大量错误得到了改正.信息管理系统所涉及的数据库设计的重要步骤加载测试。加载测试工作贯穿于程序测试工作的全过程,整个录入、修改、查询、处理工

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论