jsp课程设计
一、项目背景
(一)关于JSP
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
它实现了Html语法中的java扩张(以<%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
(二)项目简介
学院目前共有1435名学生,每个学生都要完成课题的设计,如果没有一个系统来管理,想知道每个学生的课题信息是什么,课题开展的进度怎样,将会是一个非常耗费精力的事。为方便对学生的课题进行管理,本系统分为六个模块:系统模块、数据插入模块、数据删除模块、数据修改模块、数据查询模块、数据库模块、数据模块和数据库连接模块。
(三)术语说明
一级界面:指菜单界面。
二级界面:指所有直接通过一级界面进入的界面,也可称为信息类别选择界面。
三级界面:指所有直接通过二级界面进入的界面,也可称为详细信息输入界面。
二、任务概述
(一)目标
本项目旨在开发出一个可以帮助教师们进行简单的课设项目管理和评分的辅助性软件。
(二)运行环境
1、Java SE Development Kit 8u172,
2、安装有Mysql 5.0或以上版本
3、安装有Tomcat的服务器
(三)需求概述
本软件具备以下功能:
i. 添加功能:通过系统向用户提供的选择界面来正确的添加学生
信息或课程设计信息。在添加时将会限定学号和编号的唯一性,即当添加的学生学号或添加的课题编号重复时,系统将给出适当的提示并要求用户重新输入信息。
ii. 删除功能:通过系统向用户提供的选择界面来帮助用户删除
指定编号的信息。
iii. 修改功能:用户将可以通过学号或编号来找到指定的学生或课题信息(如果它们存在的话),并通过系统提供的选择界面来对信息进行修改。
iv. 查询功能:用户可以通过学号或编号来查询学生或者课题的信息,如果信息不存在,系统将会给出适当的提示。
v. 显示全部功能:一键选择显示全部的学生信息或课题信息。
vi. 统计功能:用户可以通过系统提供的选择界面来对当前已有的信息进行统计。
vii. 读取功能:允许用户通过该功能向指定的My SQL数据库文件读取数据。
viii. 保存功能:将当前数据保存至本地My SQL数据库文件
中。
(四)条件与限制
本系统旨在方便老师们对数据的管理,同时为了能更有效地执行任务,用户应先将存在excel中的输入导入至My SQL数据库中以方便系统读取。
三、总体设计
(一)处理流程
系统启动后将会直接进入主界面中,用户可以根据自己需要输入指令执行相应功能,在事务处理完毕后,用户可以通过退出指令退出系统。
(二)总体结构和模块
系统总体结构如下图所示:
(三)功能分配
i. 系统功能
?初始化系统
?刷新一级界面
?关闭系统
ii. 添加功能
?进入二级界面
?根据指令打开三级界面?输入数据
?返回一级界面
iii. 删除功能
?进入二级界面
?根据指令打开三级界面?确认编号/学号后删除数据?返回一级界面
iv. 修改功能
?进入二级界面
?根据指令打开三级界面?选择要修改的信息
?执行修改
?返回一级菜单
v. 查询功能
?进入二级菜单
?根据指令打开三级菜单
?根据编号/学号显示对应的信息
?返回一级菜单
vi. 显示全部功能
?进入二级菜单
?根据指令显示全部学生信息或课题信息vii. 统计功能
?进入二级菜单
?根据指令进入三级菜单
?根据指令给出相关统计数据
?循环执行功能
?返回一级菜单
viii. 保存功能
?刷新界面
?确认是否保存
?执行相应功能
?返回一级菜单
ix. 读取功能
?刷新界面
?从My SQL数据库文件中读取数据
?刷新一级菜单
四、接口设计
(一)外部接口
i. 用户界面:采用经典的Windows指令台风格,通过最简单的指令输入形式执行相应功能。
ii. 软件接口:运行于Windows XP/7/8.1/10且具有Win32指令台的操作系统
iii. 硬件接口:支持市面上常见的或更高档的微机和笔记本电脑。(二)内部接口
i. 系统模块:系统启动时自动调用,初始化界面后等待用户输入
ii. 数据插入模块:由系统模块调用,启动后调用数据模块的增加功能iii. 数据删除模块:由系统模块调用,启动后调用数据模块的删除和查询功能
iv. 数据修改模块:由系统模块调用,启动后调用数据模块的修改和查询功能
v. 数据查询模块:由系统模块调用,启动后调用数据模块的查询功能
vi. 数据库模块:由系统模块调用,启动后调用数据库连接模块。vii. 数据库连接模块:由数据库模块调用,启动后调用打开拦截、SQL语句查询、关闭连接等功能。
viii. 数据模块:可由数据插入模块、数据删除模块、数据修改模块、数据查询模块等模块调用,启动后可根据需要调用增加、删除、修改、查询等功能。
五、数据结构设计
(一)类结构设计
i. BinaryNode(二叉树节点)
template
struct BinaryNode
{
DataType data;
BinaryNode
BinaryNode
BinaryNode(DataType &element)
{
leftNode = rightNode = nullptr;
data = element;
};
};
ii. BinaryTree(二叉排序树)
template
class BinaryTree
{
private:
BinaryNode
DataType findMin(BinaryNode
void Release(BinaryNode
void PreOrder(BinaryNode
void InOrder(BinaryNode
void PostOrder(BinaryNode
BinaryNode
void Delete(DataType &element, BinaryNode
int length;
public:
BinaryTree() { length = 0; root = NULL; }
~BinaryTree() { Release(root); }
void Release() { this->Release(root); }
void PreOrder();
void InOrder();
void PostOrder();
void Insert(DataType &element);
DataType isFind(DataType &element);
void Delete(DataType &element);
int Length() { return this->length; }
};
iii. CurriculumDesign(课程设计实体类)
class CurriculumDesign
{
private:
string design_name;
string design_dataStruct;
string author;
Score design_score;
public:
CurriculumDesign();
CurriculumDesign(string design_name, string design_dataStruct = "NULL", string author = "NULL");
~CurriculumDesign();
string getInfo();
string writeToFile();
//getter & setter
string get_design_name() { return this->design_name; }
void set_design_name(string new_name) { this->design_name = new_name; }
string get_design_dataStruct() { return this->design_dataStruct; }
void set_design_dataStruct(string new_ds) { this->design_dataStruct = new_ds; }
string get_author() { return this->author; }
void set_author(string new_author) { this->author = new_author; }
double get_design_score() { return this->design_score.get_total(); }
void set_design_score(string type_score, double new_score);
void set_design_score(Score score);
// overload
friend bool operator<(CurriculumDesign &left, CurriculumDesign &right);
friend bool operator<(CurriculumDesign &left, double number);
friend bool operator>(CurriculumDesign &left, CurriculumDesign &right);
friend bool operator>(CurriculumDesign &left, double number);
friend bool operator==(CurriculumDesign &left, CurriculumDesign &right);
friend bool operator==(CurriculumDesign &left, double number);
friend ostream &operator<<(ostream &out, CurriculumDesign &temp); };
iv. Student(学生实体类)
class Student
{
private:
string stu_name;
int stu_ID;
string stu_class;
string design_name;
public:
Student();
Student(int stu_ID, string stu_name = "NULL", string stu_class = "NULL",
string design_name = "NULL") :
stu_ID(stu_ID), stu_name(stu_name), stu_class(stu_class),
design_name(design_name) {}
Student(const Student &obj);
~Student();
// getter & setter
string get_stu_name() { return this->stu_name; }
void set_stu_name(string new_name) { this->stu_name = new_name; }
int get_stu_ID() { return this->stu_ID; }
void set_stu_ID(int new_ID) { this->stu_ID = new_ID; }
string get_stu_class() { return this->stu_class; }
void set_stu_class(string new_class) { this->stu_class = new_class; }
string get_design_name() { return this->design_name; }
void set_design_name(string new_name) { this->design_name = new_name; } string getInfo();
string writeToFile();
// overload
friend bool operator<(Student &left, Student &right);
friend bool operator>(Student &left, Student &right);
friend bool operator==(Student &left, Student &right);
friend ostream &operator<<(ostream &out, Student &temp);
};
/**
* 每添加一个学生信息就对应添加一个课题信息,课题的作者即为学生名
* 课题不可删除,每删除一个学生就对应删除一个课题
* 学生的信息最初先添加在链表里,在课题打分后再添加到二叉树中进行排序* /
class Management
{
private:
BinaryTree
StudentList *stu_list; // 存储所有学生的信息
CurriculumDesignList *design_list; // 存储所有课设的信息
public:
Management();
~Management();
void Insert(Student &stu, CurriculumDesign &design); bool Delete(int stu_ID);
string Edit(int stu_ID, int new_info);
string Edit(int stu_ID, string type_info, string new_info); void SearchAllStudent();
void SearchAllDesign();
bool Search(int stu_ID);
bool Search(string design_name);
Student Get(int stu_ID);
CurriculumDesign Get(string design_name);
string* InfoToFile_Design();
string* InfoToFile_Student();
int numOfStudent() { return stu_list->Length(); }
int numOfDesign() { return design_list->Length(); }
int numOfMarkedDesign();
int numOfPassDesign();
void Mark(int stu_ID, Score score);
void MultipleMark();
void RankingList();
void ReadFile(string *str_stu, string *str_design);
};
vi. CurriculumDesignManagement (main函数部分方法)
Management admin; // 管理类实例化对象
void title(); // 标题
void footer(); // 结束语
void menu(); // 菜单
void Insert(); // 添加信息
void Delete(); // 删除信息
void Edit(); // 修改信息
void Search(); // 查询信息
int Calc_numOfStudent() { return admin.numOfStudent(); } // 统计学生总人数
int Calc_numOfMarkedDesign() { return admin.numOfMarkedDesign(); } // 统计已打分的课程数
int Calc_numOfPassDesign() { return admin.numOfPassDesign(); } // 统计及格人数
void SimpleMark();
void MultipleMark();
Score Grade();
void Save(); // 保存文件
void Load(); // 读取文件
bool isNumber(string str); // 判断str是否为纯数字串
int main();
b) 数据库结构设计
数据库采用Microsoft My SQL 2017,表结构设计如下:i. Student
ii.CurriculumDesign
iv. 数据查询模块:根据指令cmd调用admin中的四条查询函数。v. 数据修改模块:根据指令cmd调用admin中的两条编辑函数。六、运行设计
(一)运行模块的组合
所有类与函数均用英文全称命名,类内参数采用“[类名缩写][信息类型][数据名]”的格式来命名。如:学生的基本信息姓名的参数名为“stu_info_name”。
(二)运行控制
本软件控制流程如下:首先由用户启动软件,之后根据屏幕上的提示输入指令,系统根据指令触发事件及调用相关模块。
(三)运行时间
每个功能都快的感受不出来
七、出错设计处理
a) 本软件在系统关键处采用try-catch代码块将危险代码包围起来,保证用户触发异常时系统可以正常运行下去。
b) 在用户执行删除或修改等破坏性操作时,系统将会提供确认机制。
八、安全保密设计
九、维护设计
本软件完全依照RUP过程开发并充分考虑了软件的可维护性,详细编写了概要设计文档,以利于未来的二次开发。