JAVAWEB大作业报告书及源码——基于 Struts 的图书管理系统

本网站是个人网站,设计目的展现个人风采,设计风格是根据个人喜好设计,简约唯美的风格图片以及图标现个人特色。主要功能要注册登录、个人简介、个人爱好、个人收藏、留言管理,完善个人信息等功能模块

其他主要模块的定义

页面作用
Login.jsp登录,检验用户名是否为空,Ajax网页的异步刷新
Do.jsp验证账号密码是否和数据库相同,显示错误信心
Index.jsp指引页面
Customer.java用户的用户名,密码
CustomerDao.java链接数据库 ,获得数据库里用户的密码
EncodingFilter.java文字过滤器
ValidateServlet.Java检查验证码是否正确
validateMix.jsp验证码生成页面
ftz.java。该页面用于防止用户绕过登录直接跳转到其他页面进行操作

  • 素材的创作与编辑

网站图片来源:wps画报,百度,web实验,表情包图片

音乐:酷狗音乐下载,通过audacity剪辑其中部分

  • 开发环境及使用技术

开发环境搭建

Myeclipse2018和mysql和navicat for mysql(可视化mysql工具)

运行工具

2345加速浏览器(IE模式 超速模式) chrome浏览器均可运行

使用主要技术

  1. 前端采用HTML+CSS+JavaScript+bootsrap实现。

javaScript技术:表单验证关键字,滚动字幕 逐字显示(index2.jsp),显示日期时间JavaScript HTML DOM 事件(collection.jsp index.jsp等)

Boostrap实现响应式布局

(2)作品后端要求采用JSP、JavaBean、Servlet以及数据库等技术实现

JSP内置对象:本网站主要运用了 request, response, session三个。request主要用来获取用户输入的基本信息以及具体页面进行的操作中需要的数据。利用response来进行重定向,以及实现目的页面跳转用法为 response.setHeader("refresh","刷新时间间隔;目的页面地址");

验证码技术的使用:避免重复登录。是服务器随机产生验证码字符串,保存在session中,并写入图片,将图片连同表单发给客户端。用户输入账号密码验证码,将获取的验证码与随机产生的验证码进行比较,相同则继续进行,不同将错误信息返回客户端,避免程序的继续运行。

JavaBean:将用户登录的信息封装在JavaBean中,在需要时从JavaBean中读出。DAO本次主要用CustomerDao.java链接数据库 ,获得数据库里用户的密码

servlet这里主要用的是doGet()和doPost()。本实例主要用来验证验证码是否准确。以及使用Filter来解决常常会出现中文乱码情况。ftz.java:该页面用于防止用户绕过登录直接跳转到其他页面进行操作。该页面主要用了Filter过滤器来实现防止跳转的功能。该过滤器进行跳转页面之前进行判断是否有用户名,若有用户名则代表用户进行登录操作,过滤器放行;若用户名为NULL,则过滤器不放行,直接跳转到登录页面。

Ajax用于网页的异步刷新和只刷新网页的一小部分,可以带来更好的用户体验,减轻服务器负担,

MYSQL数据库:用JDBC将JAVAWEB和数据库连接,在数据库中创建一个用户登录信息表来判断是否存在该登录用户以及实现用户注册功能。

  • 功能实现

数据库设计 用户密码表和留言信息表

目录

1.前言 3

  1. 实验目的 3
  2. 实验的基本要求 ..3
  3. 系统分析与设计 ..3
    1. 系统功能描述(简单需求分析) ..3
    2. 系统功能流程 ..3
    3. 数据库设计 4

  1. 数据表的构建 ..4

3.系统的实现与测试 ..5

  1. 系统采用的关键技术 ..5
  2. 关键程序流程 ..6
  3. 关键代码分析 ..7
  4. 出现的问题及解决 ..18
    1. 向数据库中插入数据出现乱码以及界面显示有中文乱码问题: 18
    2. 弹出提示框问题 ..19
    3. 系统界面 19

  1. 进入系统界面 (登录界面) ..19
  2. 管理员模块界面: ..19
  3. 添加图书界面: ..20
  4. 罚金设置界面: ..20
  5. 用户管理界面: ..20
  6. 用户模块界面: ..21
  7. 图书检索、借阅界面: ..21
  8. 续借图书界面: ..22
  9. 归还界面: ..22
  10. 安全退出界面: ..23

5.操作方法 23

  1. 登录 23
  2. 图书检索,借阅 ..23
  3. 图书归还,续借 ..23
  4. 图书,用户的添加 ..23
  5. 图书,用户的删除操作 ..24
  6. 图书,用户的更新操作 ..24

6.分析与总结 24

  1. 实验分析与总结 ..24
  2. 附录: 25

7.1 参考文献: ..25

  1. MVC 架构模式的认识 ..25
  2. 27

南昌大学软件学院 java web 大作业 实验报告

1.前言

  1. 实验目的
    学习 Web应用程序的开发,以 B/S方式, JSP编程技术开发图书管理系统;
    通过编程实践掌握 JSP的动态网页与 sql2012 数据库相结合的技术;
    通过 MVC(模型 -视图-控制 )架构模式,使其在开发过程中得以应用,并了解 Web 编程模式下
    的 Model1 和 Model2 的区别;了解 Struts 框架的具体含义及在 Struts 模式下的开发。
  2. 实验的基本要求
    数据库表不少于 3 个,且表之间必须存在关联。
    页面设计布局合理,颜色使用恰当,风格统一,页面应不少于 10 个。
    系统功能不少于 6 个,且能正确运行。
    系统采用面向对象的方式设计,尽量使界面、业务、数据之间的耦合关系降低。
    代码实现尽量使用事件处理、事务处理。
    系统应对一些常见的异常进行适当的处理。
    数据的操作以事务的方式实现,要求处理并发问题。
  3. 系统分析与设计
  4. 系统功能描述(简单需求分析)
    图书管理系统是典型的信息管理系统 (MIS),本系统是根据现代化校园的发展而设计的基
    于 jsp的图书管理系统,本系统就是为了管理好图书信息和借阅等一系列操作而设计的。
    图书管理系统需要满足来自两方面的需求, 这三个方面分别是学生和管理员。 学生的需求是
    查询图书馆的藏书,借阅图书,和退换图书等功能;管理员的功能最为复杂,包括对学生、
    图书进行管理,及系统状态的查看、维护并。学生要使用图书管理系统,需要进行登陆,登
    陆之后则可以进行一系列的操作,例如:查询图书,借阅图书,归还图书等功能。而作为管
    理员,则可以对学生进行添加,只有已添加有卡号的学生才可以进行图书管理系统的登陆,
    管理员还可以对图书进行增,删,改,查。亦可以对用户进行增,删,改查等功能。
  5. 系统功能流程

为了满足以上的需求,系统分成了两大模块,普通用户模块和管理员模块。

  1. 27

南昌大学软件学院 java web 大作业 实验报告

功能模块图如图所示。

相应 Struts 页面流程如下所示(电子版可自行放大) :

  1. 数据库设计
    1. 数据表的构建

本系统采用如下的数据表:

用户信息表 users:用于记录用户信息数据表

  1. 27

南昌大学软件学院 java web 大作业 实验报告

字段名 类型 长度 是否为主键 可否为空 说明

ID nchar 10 是 否 用户 ID

username nchar 10 否 否 用户姓名

password nchar 10

cardnum int 10


否 否 用户密码

否 否 卡号信息

userlevel int 10 否 否 用户级别

coater int 10 否 否 借阅限额

borrowed int 10 否 否 已借阅数

can_borrow int 10 否 否 可借阅数

图书信息表 books: (用于存储图书相关信息 )

字段名 类型 长度 是否为主键 可否为空 说明

b_ID int 10 是 否 图书 ID

b_name nvarchar 50 否 否 图书名称

b_author nchar 10 否 否 图书作者

b_publish nvarchar 50 否 否 图书出版社

b_type nchar 10 否 否 图书类型

b_count int 10

b_hot int 10

借阅表 borrowbook: ( 用于表示借阅信息 )


否 否 拥有数量

否 否 欢迎度

字段名 类型 长度 是否为主键 可否为空 说明

brid int 10 是 否 借阅表 id

cardnum int 10 是 否 用户表外键

b_ID int 10 是 否 图书表外键

borrowday nchar 10 否 否 借阅日期

shouldreturn nchar 10 否 否 应还日期

罚金表 fine: (用于设置罚金 )

字段名 类型 长度 是否为主键 可否为空 说明

fine float 10 是 否 罚金

3.系统的实现与测试

3.1 系统采用的关键技术

本系统采用的是 Model2 模型,Model2 表示的是基于 MVC模式的框架。MVC是 Model-View

-Controller 的简写。 "Model" 代表的是应用的业务逻辑(通过 JavaBean,), "View" 是应

用的表示面(由 JSP页面产生) ,"Controller" 是提供应用的处理过程控制(一般是一个

Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些

组件可以进行交互和重用。从而弥补了 Model1 的不足。

  1. 27

南昌大学软件学院 java web 大作业 实验报告

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。

  1. 27

南昌大学软件学院 java web 大作业 实验报告

相应的程序架构如图所示:

  1. 关键代码分析

数据库的连接和相关一些操作函数 (在文件 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;

// 数据库的 url

  1. 27

南昌大学软件学院 java web 大作业 实验报告

private String url = "jdbc:sqlserver://localhost:1433;DatabaseName=Book";

// 数据库的用户名密码

String user = "sa";

String pass = "123";

// 用于验证查询操作

public boolean query(String s) throws SQLException{

try{

// 加载驱动

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异常 <br>");

}

return(rs.next());

}

// 用于结果集可滚动的操作

public ResultSet getlist(String s) throws SQLException{

try{

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


// 加载驱动
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);
// 得到一个可滚动但不可以更新的结果集 rs
rs = stmt.executeQuery(s);
}catch(SQLException e){
System.out.println("更新操作连接数据库的过程中出现 SQL异常
<br>");
}
return rs;
}
// 用于对数据库的更新
public int update(String s) throws SQLException{
int msg=0;
try{
// 加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}catch(ClassNotFoundException e){
System.out.println("加载驱动器类时异常 ");

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


}
try{
// 创建链接
conn = DriverManager.getConnection(url, user, pass); stmt = conn.createStatement();
msg = stmt.executeUpdate(s);
}catch(SQLException e){
System.out.println("连接数据库的过程中出现 SQL异常 <br>");
}
return(msg);
}
// 批处理,用于处理多条 sql
public boolean executebatch(String a[]){
try {
// 创建链接
conn = DriverManager.getConnection(url, user, pass); conn.setAutoCommit(false);//关闭自动提交,进行事物处理 stmt = conn.createStatement();
for(int i=0;i<a.length;i++){
stmt.addBatch(a[i]);
}
int [] number = stmt.executeBatch();// 开始批处理,返回被执行的 sql 语句的序号
conn.commit();
System.out.println("共有 "+number.length+"条 sql语句被执行 "); stmt.clearBatch();//清空 batch
conn.close();
return true;

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


} catch (SQLException e) {
// TODO Auto-generated catch block try {
conn.rollback();
return false;
} catch (SQLException e1) {
// TODO Auto-generated catch block e1.printStackTrace();
}
e.printStackTrace();
}
return false;
}
// 关闭数据流
public void close() throws SQLException{
conn.close();
stmt.close();
rs.close();
}
}
管理员操作用户 (在文件 UserService.java 中实现的 )
// 管理员对用户的添加操作
public boolean adduser(String a[]) throws SQLException{
// 将密码明文转换为密文存入数据库
a[2] = ead.encrypt(a[2]);
// 利用字符串的拼接组成 sql语句

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


sql = "insert into users
values('"+a[0]+"','"+a[1]+"','"+a[2]+"',"+a[3]+","+a[4]+","+a[5]+","+a[6]+")";
System.out.println("添加的 sql"+sql);
// 调用数据库的更新数据的操作函数
int result = db.update(sql);
if(result!=0)
return true;
return false;
}
// 管理员对用户的删除操作
public boolean deluser(String id) throws SQLException{
sql = "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 SQLException{
sql = "update users set username='"+a[1]+"',userlevel="+a[2]+" where ID='"+a[0]+"'";
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 SQLException{
ArrayList al = new ArrayList();

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
if(a[0].equals("")){
sql = "select * from books where "+a[2]+" LIKE '%"+a[1]+"%' order by b_hot desc";
}else{
sql = "select * from books where "+a[2]+" LIKE '%"+a[0]+"%' 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 SQLException{
String 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;
}
// 续借图书

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


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){
// 字符拼接将设置的金额拼接成 sql
sql = "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;
}else{
System.out.println("设置罚金失败! ");
}
} catch (SQLException e) {
// TODO Auto-generated catch block e.printStackTrace();
}

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


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 block e.printStackTrace();
}
return m;
}
}
Resetfine.java部分代码:
// 设置罚金
if("y".equals(isfirst)){
f.setFine(fs.getlastfine()); request.setAttribute("oldfine", f.getFine());
return mapping.findForward("success");
}else{
f.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");
}

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


辅助工具包(实现用户密码的加密和时间的计算转换问题)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 ParseException{
Date 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);
}
// 获取当前的时间

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


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.java
package 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;k<m;k++){
int mima = c[k]+p[k%n];
c[k] = (char)mima;//加密
}
return new String (c);//返回密文
}
/**
* 输入加密后的 String,返回原本的 String
*
* @param
* @return
*/
public String decrypt(String sourceString){
char [] p = "图书管理 ".toCharArray();
int n = p.length;

  1. 27

南昌大学软件学院 java web 大作业 实验报告

char [] c = sourceString.toCharArray();

int m = c.length;

for(int k = 0;k<m;k++){

int mima = c[k]-p[k%n];

c[k] = (char)mima;//解密

}

return new String (c);//返回明文

}

}

  1. 出现的问题及解决
    1. 向数据库中插入数据出现乱码以及界面显示有中文乱

码问题:

问题描述: 当需要将数据插入数据库时, 会发现插入的数据有乱码。 在界面的表单进行数据输入时,传出传入的中文数据也会出现乱码。

1、JSP显示中文乱码的问题,一般都是没有设置页面编码,注意添加以下这样一段代码

<%@ page pageEncoding= ”-U8TF%>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>

"pageEncoding"指定了当前 jsp文件存储使用的编码方式, “contentType用来”指定响应头消息

中的 "Content-Type"

当服务端的响应头消息中没有指定 charset 时,客户端会依据上面代码中的 charset 指定的编

码方式解码页面。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

并且 JSP都以 UTF-8的编码方式保存, 把所有可能出现的问题通通抹杀。 http://www.linuxidc.com 如

果你使用 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); 这句话一定要有, 不然过滤器不会向前执行, 会停止 不前,这样程序就没法运行了!

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


3、读取数据时,在 Servlet 中添加 request.setCharacterEncoding("UTF-8"); 可以很好地解决从JSP页面接受中文参数乱码。

  1. 弹出提示框问题
    问题描述:由于对 Struts 还不是完全的熟悉,对于其该怎样使用弹出框还是有点困扰,
    其不能再 action 里弹出一个弹出框后再进行 return mapping 的操作,这样写并不会有提示
    框,而是直接执行了 return mapping 语句。
    解决方法:使用 servlet 和 jsp结合来弹出提示框,即在 servlet 里给 jsp 传递一个参数,
    然后在 jsp 里进行该参数的判断,然后根据判断结果看是否弹出提示框,因为在 jsp 里可以
    直接写 js代码,这样弹出框会方便很多,只要用 alert(“我是弹出框! ”);这一句就可以了。
  2. 系统界面
  3. 进入系统界面 (登录界面)
  4. 管理员模块界面:
  5. 27

南昌大学软件学院 java web 大作业 实验报告

  1. 添加图书界面:
  2. 罚金设置界面:
  3. 用户管理界面:
  4. 27

南昌大学软件学院 java web 大作业 实验报告

  1. 用户模块界面:
  2. 图书检索、借阅界面:
  3. 27

南昌大学软件学院 java web 大作业 实验报告

  1. 续借图书界面:
  2. 归还界面:
  3. 27

南昌大学软件学院 java web 大作业 实验报告

4.9 安全退出界面:

5.操作方法

  1. 登录
    首先,输入正确网址即可打开系统登录界面,输入正确账号密码,系统会根据账号的级别,相应的进入不同的操作界面。
  2. 图书检索,借阅
    登录成功,点击左侧导航栏的检索、 借阅,即可进入相应界面。 输入关键词,或选择类别,点击搜索,会出现相应内容。
  3. 图书归还,续借

登录成功后,点击左侧相应的归还或续借菜单,即可进入相关界面,点击归还或续借按钮即可完成操作。

  1. 图书,用户的添加

管理员界面,点击左侧菜单的添加用户和添加图书,输入相关信息,点击添加即可。

  1. 27

南昌大学软件学院 java web 大作业 实验报告

  1. 图书,用户的删除操作
    管理员界面,点击左侧菜单的删除用户和删除图书,找到想要删除的用户或图书,当然也可以通过 id 号或卡号进行搜索,然后进行操作。
  2. 图书,用户的更新操作

管理员界面,点击左侧菜单的更新用户和更新图书,找到想要更新的用户或

图书,当然也可以通过 id 号或卡号进行搜索,然后在该用户的这一条记录的相

应位置填写修改后的数据(当然有些字段是不能修改的) ,点击更新按钮即可。

6.分析与总结

  1. 实验分析与总结

在这一节中,我主要讨论了两个问题,一个是系统的联机文档,另一个是系

统的测试,下面我们分别加以说明。 作为一个完整的系统, 联机文档是其中不可

缺少的部分也是相当重要的部分。 好的文档能够使用户快速了解并准确的使用系

统的各项功能。 减少误操作, 减少错误产生的可能, 这对用户和开发人员都有很多的好处。所以在开发本系统中, 也加入了不少的文档, 除了对于几大模块的详细说明外,对于易出错和不易操作的地方 (如多条件查询部分) 又作了详细的说明。

由于本身能力的局限性,所以做编写的代码,即使经过反复检查也难免出错

所以在本阶段力求使用有限的时间找出尽可能多的错误, 力求系统尽量正确。 我们在本系统的测试中使用了黑盒法 (即不关心程序内部的逻辑结构, 而是根据程序的功能来设计是检测) 请一位不熟悉本系统的人来进行随意性的操作, 打破习

惯的操作顺序,从中发现错误,在此阶段系统的大量错误得到了改正 .

信息管理系统所涉及的数据库设计的重要步骤加载测试。 加载测试工作贯穿于程序测试工作的全过程,整个录入、修改、查询、处理工作均可视为对数据库

的加载测试工作。 要设计出一个好的信息管理系统数据库, 除满足系统所要求的

功能外,还必须遵守下列原则: 1)基本表的个数越少越好。 2) 主键的个数越少越好。键是表间连接的工具,主键越少,表间的连接就越简单。 3)字段的个数越

少越好。 4) 所有基本表的设计均应尽量符合第三范式。数据库的设计中,如何

处理多对多的关系和如何设计主键, 是两个有着较大难度、需要重点考虑的问题。

最后,希望自己在以后的空闲时间,能将该系统逐渐完美,将 bugs一个一

个的消除,将界面重新设计,使其符合当代的审美潮流。

  1. 27

南昌大学软件学院 java web 大作业 实验报告

  1. 附录:

7.1 参考文献:

[1]JSP 编程技巧 /清宏计算机工作室编著 . 北京:机械工业出版社, 2001.1

[2]JAVA EE工程实训教程 /朱俊炎,吴英培编著 .天津科学技术出版社 ., 2010.2 [3] 深入 JAVA Servlet 网络编程 . 清华大学出版社

[4]Struts 开发入门与项目实践 . 北京:人民邮电出版社 , 2005.8

[5]J2EE 应用开发实例精解 . 清华大学出版社

7.3 MVC架构模式的认识

模型 -视图 -控制器( MVC )是 80 年代 Smalltalk-80 出现的一种软件设计模式,现在已经被

广泛的使用。

1、模型( Model)

模型是应用程序的主体部分。模型表示业务数据,或者业务逻辑 .

2、视图( View )

视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。

3、控制器( controller)

控制器工作就是根据用户的输入,控制用户界面数据显示和更新 model 对象状态。

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


MVC 式的出现不仅实现了功能模块和显示模块的分离, 同时它还提高了应用系统的可
维护性、可扩展性、可移植性和组件的可复用性
早期的程序中, 如果不注意对数功能和显示的解耦合, 常常会导致程序的复杂及难以维
护。很多 VB,Delphi 等 RAD 程序都有这种问题。甚至现在的 C#,Java 有时候也会出现把业
务逻辑写在显示模块中的现象
管 MVC 设计模式很早就提出, 但在 Web 项目的开发中引入 MVC 却是步履维艰。 主要
原因:一是在早期的 Web 项目的开发中,程序语言和 HTML 的分离一直难以实现。 CGI 程
序以字符串输出的形式动态地生成 HTML 内容。后来随着脚本语言的出现,前面的方式又
被倒了过来,改成将脚本语言书写的程序嵌入在 HTML 内容中。这两种方式有一个相同的
不足之处即它们总是无法将程序语言和 HTML 分离。二是脚本语言的功能相对较弱,缺乏
支持 MVC 设计模式的一些必要的技术基础。 直到基于 J2EE 的 JSP Model 2 问世时才得以改观。 它用 JSP 技术实现视图的功能, 用 Servlet 技术实现控制器的功能, 用 JavaBean 技
术实现模型的功能
JSP Model 1 与 JSP Model 2
SUN 在 JSP 出现早期制定了两种规范, 称为 Model1 和 Model2 。虽然 Model2 在一定程度上实现了 MVC ,但是它的应用用并不尽如人意
JSP Model 1
JSP Model 2

  1. 27
    南昌大学软件学院 java web 大作业 实验报告


model2 容易使系统出现多个 Controller ,并且对页面导航的处理比较复杂
有些人觉得 model2 仍不够好,于是 Craig R. McClanahan 2000 年 5 月 提交了一个
WEB framework 给 Java Community. 这就是后来的 Struts.
2001 年 7 月, Struts1.0 ,正式发布。该项目也成为了 Apache Jakarta 的子项目之一
Struts 质上就是在 Model2 的基础上实现的一个 MVC 架构。它只有一个中心控制器, 他采用 XML 定制转向的 URL。采用 Action 来处理逻辑。

  1. 27
  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值