资源描述
实 验 报 告
实验课程: Web应用开发
学生姓名:
学 号:
专业班级:
2018年6月18日
南昌大学实验报告
学生姓名: 学 号: 专业班级:
实验类型:□ 验证 ■ 综合 □ 设计 □ 创新 实验日期: 实验成绩:
一、实验项目名称
《Web应用开发》综合训练
二、实验目的和要求
使用Java+JSP+Servlet技术,选用EL、JSTL、Struts、Hibernate、myBatis、jQuery等技术,开发一个基本Web的应用程序,以达到掌握Web应用开发的基本原理、具备使用Java+JSP+Servlet技术结合流行框架技术开发Web应用程序的能力,从而提升学生的Web编程能力。
要求学生自选题目,开发一个模拟的Web应用程序。可以一人一题,也可以多人一题.但是每人必须单独完成动态Web页面10页以上。
要求学生根据需求描述独自完成需求分析,软件设计、程序模块设计以及程序的编写、调试和测试。
设计和程序完成后,要求根据指定的格式要求,独自完成设计报告的撰写。
三、实验基本情况
本实训要求根据下述需求陈述写出需求分析文本并进行软件开发,并列出源代码和运行结果.
四、需求分析
项目介绍
这是一个简单的图书管理系统,由一个管理员来实现对用户的删除,图书的增加,修改和图书的删除功能,用户注册登录后可以实现对图书的借阅和归还。由于时间关系在设计项目时有很多不好的地方,未来得及修改,在管理员登录界面采用了图形验证码,由于是同样的技术,在用户登录界面就没有采用图形验证技术.
功能需求
1. 用户注册
2. 图书添加
3. 图书修改
4. 用户管理
5. 图书借阅
6. 归还图书
五、软件设计
ER图
程序流程
数据库设计
模块设计及运行结果
项目整体采用MVC 模式,整体上运用jsp+javabean+servlet+jdbc+dao,每个jsp页面采用jQuery技术作为背景,实现简单的动态背景,部分页面运用EL、JSTL、js中的点击事件、Bootsrap、图形验证码、分页技术以及邮箱页面.
六、源代码
1。用户类User.Java
package vo;
public class User {
private String name,pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this。pwd = pwd;
}
}
2。图书类bookinfo。java
package vo;
public class bookinfo
{
private String bno,bname,author,price,other;
public String getBno() {
return bno;
}
public void setBno(String bno) {
this.bno = bno;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this。bname = bname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this。author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
}
3.借书信息类lendbook.info
package vo;
public class lendbook
{
private String username, bno,bname,author,price,other;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this。username = username;
}
public String getBno() {
return bno;
}
public void setBno(String bno) {
this.bno = bno;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this。author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
}
4。用户功能UserDao.java
package dao;
import java。util.List;
import java.sql.*;
import java。util.ArrayList;
import vo.bookinfo;
import vo.User;
import vo.lendbook;
import dbc.JdbcUtil;
public class UserDao
{
public void add(User user) throws Exception{//添加用户
Connection conn=null;
PreparedStatement ps=null;
try
{
conn=JdbcUtil。getConnection();
String sql=”insert into user values(?,?)";
ps=conn。prepareStatement(sql);
ps.setString(1, user。getName());
ps.setString(2, user。getPwd());
ps。executeUpdate();
}
finally
{
JdbcUtil。free(null, ps, conn);
}
}
public void add_book(bookinfo book) throws Exception{//添加图书
Connection conn=null;
PreparedStatement ps=null;
try
{
conn=JdbcUtil。getConnection();
String sql="insert into book_info values(?,?,?,?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1, book.getBno());
ps。setString(2, book。getBname());
ps。setString(3, book.getAuthor());
ps.setString(4, book。getPrice());
ps。setString(5, book。getOther());
ps.executeUpdate();
}
finally
{
JdbcUtil.free(null, ps, conn);
}
}
public void lend_book(lendbook book) throws Exception{//借出图书
Connection conn=null;
PreparedStatement ps=null;
try
{
conn=JdbcUtil.getConnection();
String sql="insert into lendbook values(?,?,?,?,?,?)";
ps=conn.prepareStatement(sql);
ps。setString(1, book。getUsername());
ps。setInt(2, Integer。parseInt(book.getBno()));
ps.setString(3, book.getBname());
ps.setString(4, book.getAuthor());
ps。setString(5, book。getPrice());
ps。setString(6, book。getOther());
ps.executeUpdate();
}
finally
{
JdbcUtil。free(null, ps, conn);
}
}
public List<User> QueryAll() throws Exception//列出全部用户
{
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
List〈User〉 userList=new ArrayList〈User>();
try
{
conn=JdbcUtil.getConnection();
String sql="select * from user";
ps=conn.prepareStatement(sql);
rs=ps。executeQuery();
while(rs。next()){
User user=new User();
user.setName(rs.getString(1));
user。setPwd(rs.getString(2));
userList。add(user);
}
}
finally
{
JdbcUtil.free(rs, ps, conn);
}
return userList;
}
public void delete(String bookno) throws Exception//删除图书
{
Connection conn=null;
PreparedStatement ps=null;
try{
conn=JdbcUtil。getConnection();
String sql=”delete from book_info where bno=?";
ps=conn.prepareStatement(sql);
ps.setString(1, bookno);
ps。executeUpdate();
}
finally{
JdbcUtil.free(null, ps, conn);
}
}
public void returnbook(String bno,String username) throws Exception//归还图书
{
Connection conn=null;
PreparedStatement ps=null;
try{
conn=JdbcUtil.getConnection();
String sql=”delete from lendbook where bno=? and username=?";
ps=conn。prepareStatement(sql);
ps。setString(1, bno);
ps。setString(2, username);
ps。executeUpdate();
}
finally{
JdbcUtil.free(null, ps, conn);
}
}
public void delete_user(String username) throws Exception//删除用户
{
Connection conn=null;
PreparedStatement ps=null;
try{
conn=JdbcUtil。getConnection();
String sql="delete from user where name=?”;
ps=conn.prepareStatement(sql);
ps.setString(1, username);
ps。executeUpdate();
}
finally{
JdbcUtil.free(null, ps, conn);
}
}
public int getPageCount() throws Exception{//分页
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
int recordCount=0,t1=0,t2=0;
try
{
conn=JdbcUtil.getConnection();
String sql=”select count(*) from book_info”;
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
rs。next();
recordCount=rs。getInt(1);
t1=recordCount%5;
t2=recordCount/5;
}
finally
{
JdbcUtil.free(null, ps, conn);
}
return t1==0?t2:t2+1;
}
public List〈bookinfo〉 QueryAll_book(int pageNo) throws Exception//列出全部图书
{
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
int pageSize=5;
int startRecno=(pageNo-1)*pageSize;
List<bookinfo> bookList=new ArrayList〈bookinfo〉();
try
{
conn=JdbcUtil.getConnection();
String sql="select * from book_info order by bno limit ?,?";
ps=conn。prepareStatement(sql);
ps.setInt(1, startRecno);
ps.setInt(2, pageSize);
rs=ps。executeQuery();
while(rs。next()){
bookinfo book=new bookinfo();
book。setBno(rs.getString(1));
book.setBname(rs。getString(2));
book.setAuthor(rs。getString(3));
book.setPrice(rs。getString(4));
book。setOther(rs.getString(5));
bookList。add(book);
}
}
finally
{
JdbcUtil。free(rs, ps, conn);
}
return bookList;
}
public List〈lendbook〉 QueryAll_lendbook(String username) throws Exception//列出已借图书
{
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
List〈lendbook〉 bookList=new ArrayList〈lendbook〉();
try
{
conn=JdbcUtil.getConnection();
String sql="select * from lendbook where username=?";
ps=conn。prepareStatement(sql);
ps。setString(1,username );
rs=ps。executeQuery();
while(rs。next()){
lendbook book=new lendbook();
book。setUsername(rs。getString(1));
book。setBno(rs。getString(2));
book。setBname(rs。getString(3));
book.setAuthor(rs.getString(4));
book.setPrice(rs。getString(5));
book。setOther(rs。getString(6));
bookList.add(book);
}
}
finally
{
JdbcUtil。free(rs, ps, conn);
}
return bookList;
}
public void modify_book(bookinfo book) throws Exception{//修改图书
Connection conn=null;
PreparedStatement ps=null;
try
{
conn=JdbcUtil.getConnection();
String sql="update book_info set bname=?,author=?,price=?,other=? where bno=?”;
ps=conn.prepareStatement(sql);
ps。setString(1, book.getBname());
ps。setString(2, book.getAuthor());
ps.setString(3, book。getPrice());
ps.setString(4, book。getOther());
ps.setString(5, book.getBno());
ps。executeUpdate();
}
finally
{
JdbcUtil.free(null, ps, conn);
}
}
}
5.获取表格值代码:
function getTableContent(node) {
var tr1 = node。parentNode.parentNode;
var name=tr1.cells[0].innerText;
window.location.href="〈%=path%〉/delete_user?name=”+name;
alert(name);
}
7. 背景jQuery代码
由于代码过长,不展示;
七、运行结果
1.管理员登录页面:管理员登录界面采用简单的CSS、jQuery、以及图形验证码,当图形验证码输入不正确以及账号密码输入不正确会出现相相应提示,同时点击相信的输入框,提示输入对应类型的背景字体会消失,当鼠标点击其他地方时会相应出现,采用的是placeholder属性,我们平时单纯的html的输入框以及提交的按钮,让人感觉不是很舒适,采用简单的CSS将他们的边框去除,然后加上相应的边框。
2。登录主界面:
导航栏感谢bootstrap开源,运用了始终悬浮在顶部的导航栏,奈何页面长度有限不能向下滚动,无法看出这一功能,页面内容由于思维过于局限,暂时没有想出用什么内容来填充,只想到类似于积分的东西,这一内容在以后会作出改进,目前只有一个大概的模板,同时在改变页面的分辨率时导航栏中的功能选项会变成一个按钮,用一个<nva>便签来装载,本页也有一个亮点便是响应式,在改变分辨率时板块并不会发生错乱的现象,运用栅格系统思想,在第二张图张可以看到效果,由于调各种分辨率国语繁琐,所以这一技术只在两个页面运用到,以后有时间会加以改善。
3。管理用户页面:
点击管理用户的小便签会出现用户的列表,点击删除用户可以将用户从数据库中删除,同时页面中的几个小符号也是运用bootstrap中的组件,给人以更直观清楚的描述功能,在本页面我并没有采用分页技术,但是在后面几个页面中有采用分页技术,在做页面的时候并没有考虑到有很多的用户,只是用几个来验证,所以就没有用分页技术,在这个点击就删除的技术上一开始遇到了难题,并不知道怎么样去些控制的后台,后来在页面中运用了js的技术,可以利用表格的结点来获取每个 表格单元格的内容,再将按键设置为this,点击便是获取当前行的值,并传到servlet中调用dao中删除用户的函数,便实现了。同时利用js的鼠标事件,鼠标移动到当前行时会改变颜色。
4.添加图书页面:
添加图书的页面并没有多么的新奇,同样还导航栏加动态背景,同样输入框也运用了placeholder属性,点击出现相应的字体和消失,将输入框中的字符串传到servlet并调用DAO中的插入图书方法;
5.展示所有图书页面:
在本页面运用到了分页技术,同样单击删除图书可以得到表格内容,通过js传到servlet中再调用删除用户的功能,就实现了删除用户,同时在列出图书时用到了EL和JSTL标签来循环输出;还有一个问题就是我并没有考虑到大量图书的问题,没有用用单独的页面去实现查找功能,但是相对很简单,所以并没有写。
8. 修改图书页面:
本页面和添加图书页面几乎相同,只有调用的方法不同,调用的是更新的方法
9. 用户注册及登录:
登录和注册页面大体相同,也只有调用的方法不一样
10. 用户登录页面:
在此页面运用了一个session将用户名存进去,进入登录页面,会出现欢迎提示,同时也是响应式的栅格系统,由于没有完善积分系统,所以就是一些空白的框架。
11. 借书页面:
在借书页面先用EL和JSTL标签输出可借的图书,其实在图书号前一栏还隐藏了一个用户名,点击借阅图书可以获取用户名和图书号,将值传到servlet调用插入的方法,将用户名和图书号作为主键,来区分不同的用户所借的图书,同时也运用了bootstrap中的组件来使得功能键更加明显。
12. 还书页面:
由于没有点击很多本书,所以只出现了一本,原理在上个功能页面说了,与之类似,采用EL和JSTL标签循环输出,获取用户名和图书号来归还图书.
13. 联系和建议页面:
由于现在的管理员是我,所以将收件人地址设置为默认邮箱,刚开始没有找到合适的jar包,所以一直报错,这个只是最简单的邮件页面,以后会更新成更高级一点的邮件发送,可以联系我们和用来采纳用户的意见
八、体会和建议
通过此次的项目,熟练掌握了基本的MVC开发模式,并熟悉了一些其他内容,包括对js和jQuery的使用,解决了部分以前不懂的问题,为以后的开发提供了些许便利。
参考图书:《javaweb 应用开发技术与案例教程》张继军 董卫 编著
展开阅读全文