毕业设计EMS办公管理系统(B/S结构)+J2EE+SQLserver8.0
Posted 苏州程序大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了毕业设计EMS办公管理系统(B/S结构)+J2EE+SQLserver8.0相关的知识,希望对你有一定的参考价值。
EMS办公管理系统(B/S结构)+J2EE+SQLserver2000
✨博主介绍
💂 个人主页:苏州程序大白
💂 个人社区:CSDN全国各地程序猿
🤟作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室,2021年注册苏州凯捷智能科技有限公司
💅 有任何问题欢迎私信,看到会及时回复
👤 微信号:stbsl6,微信公众号:苏州程序大白
💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)
🎯 想加入技术交流群的可以加我好友,群里会分享学习资料
1、系统开发背景以及主要内容阐述
随着当今社会的迅猛发展,知识变的越来越重要,终身学习的观念已经深入人心。而办公信息管理系统――这一传统的获取知识的场所,它的地位也变的越来越重要。而办公信息管理系统的管理方法也更新了很多次。从最初的手工管理到现在的计算机管理等等。
笔者经过调查一些办公信息管理系统的现状,发现各办公信息管理系统使用的管理系统基本都是几年前的产品,大多使用jsp方式,web平台
也主要使用jsp
或php
开发。而且以前的VB面向对象化编程(OOP)支持
的不是很好,系统维护起来也相当困难。
MicrosoftJ2EE
技术的推出,将计算带入一个新时代。现在J2EE
已经引起业界广泛的关注。J2EE是专门为程序员设计的、功能强大的开发工具,利用该工具能够构建各类应用程序。J2EE
可以说是博大精深,蕴含者丰富的新技术新思想。
J2EE使应用程序的功能更强大,使系统开发更简单,使系统的部署更轻松。而J2EE包含的统一的类库,统一的数据结构使得各类编程模型更统一。
个人对J2EE
技术非常感兴趣,在这方面也做过大量的研究。又鉴于当前流行的办公信息管理系统管理信息系统技术都比较陈旧,就萌发了用J2EE
开发一个新办公信息管理系统管理信息系统的想法。
系统的实践意义有两个:1、开发出的系统功能强大,可以应用于各大中型办公信息管理系统使用,可以根据数据的要求添加功能。2、由于J2EE推出的时间不算很长,所以网上很少有用J2EE开发的公开源代码的大型系统。本系统可以给广大的J2EE编程爱好者一些参考。
本文理论部分主要针对数据库设计技术、存储过程技术、J2EE技术以及用SQL Server JSP 数据
提供程序访问SQLserver8.0
数据库技术这四个方面进行了研究和探讨。
办公信息管理系统管理信息系统的每一行代码都是精雕细琢出来的,从里面体现出J2EE的强大性以及优越性。笔者在编程过程中查阅了大量的籍,参考了大量MSDN
以及各大网站的技术文章,全部代码约有一万两千行左右。笔者为此做了大量的工作。
在系统的开发过程中,笔者深刻体会到了J2EE平台的强大性以及优越性以及存储过程在提高数据访问性能和增强数据访问安全性上所起到的重要作用。
2、系统概述
办公信息管理系统管理系统基于Microsoft公司最新的JSP平台构建,编码的基本语言是JSP。开发过程中统一使用J2EE框架的数据类型、方法,抛弃了原来vb6的内容。充分体现了J2EE的优越性,使系统易安装部署、易维护。
系统使用J2EE+SQLserver2000模式,数据层基本都基于存储过程构建,使得速度更快、安全性更高。
2.1系统提供的功能
本设计的学习目的旨在通过对公司办公管理系统(B/S结构)的需求分析、任务概述、前台设计、数据库设计、模块实现的介绍,使得读者能够对用Java/JSP开发B/S结构的实用系统有一个清楚的认识和理解。同时让读者能够在阅读和自行动手实现的过程中,进一步理解如何由实际功能需求转化为具体Java编程,并让读者熟悉和掌握JSP / Servlet编程和Java数据库编程。本设计的学习重点是如何将企业内部办公管理中的实际问题提炼为功能需求,如何将功能需求转化为具体的B/S结构的模块设计和数据库设计,以及如何将系统设计转换为规范文档描述和标准Java代码实现。
设计简介:
本系统为公司办公信息管理系统,主要用来管理公司的员工信息和财务信息,并提供公司内部信息交流平台。该系统主要由以下四个部分组成:
1、系统用户身份验证子系统:对用户所输入的用户名和密码进行匹配,并限制用户登录错误的次数,同时记录用户的登录状态,以便在用户浏览系统的其他页面时,进行登录状态的确认。
2、公司员工信息管理子系统:除了对员工信息的查询外,还可以具体细化为用户修改个人信息页面,系统管理员页面,添加新用户页面和修改某个用户信息页面。
3、公司财务信息管理子系统:可以具体细化为添加新财务信息记录页面,添加新财务项目页面,生成各种财务报表页面和修改某个财务记录页面。
4、公司内部信息交流子系统:可以具体细化为通知公告牌页面,发布新通知页面,修改某个通知页面,意见箱页面,意见分析页面,投票站页面和投票分析页面。
针对数据设计的部分:
由于数据的多元性和位置不确定性,该部分采取基于B/S的方式实现。代码使用JSP编写,利用JSP的优点,可以自动适应多种数据浏览器。截图如下:
数据只需要有一台联网的计算机和一个常用WEB浏览器。就可以轻松的进行办公信息管理系统查询、更改个人信息、向办公信息管理系统反馈信息等。该部分主要提供以下功能:
1、登陆验证。(防止数据信息被盗用。)
2、办公信息管理系统查询。(一个综合的办公信息管理系统查询系统,可以方便的使数据查到需要的籍。)
3、数据个人信息查询以及管理。(可以适当的更改一些数据个人的资料,如email等,此外在这里还可以查到数据当前的、所有的记录等。)
4、信息服务。(定期公布超期的数据列表,以及新到的办公信息管理系统等信息。)
2.2系统创新部分以及一些特点
1、首先本系统是基于J2EE平台构建的,这是以前从未有过的。
2、系统很好的解决了一个关于时间冲突的问题。
时间冲突问题阐述如下:
办公信息管理系统管理信息系统是一个网络版的系统,其运作方式是有一台主数据服务器、还有若干个负责各项功能的数据端。举个例子:办公信息管理系统可能有若干台数据端电脑用于管理、还可能有若干台用于管理、还可能有若干台用于办公信息管理系统、数据信息维护等。因为每台电脑的系统时间可能会发生改变,这就会造成数据错误。比如张某于2月10日在负责的A号电脑上借了一本,可能A的系统时间被误设定为2月5日。如果张某的最大时间为一个月,则他应该的时间就被误设定为3月5日。
笔者在开发过程中也参考了一些相关的办公信息管理系统系统,发现有的系统根本没有注意到这个问题。有的是在系统数据端设定一个时间校准的提示或者干脆就手工输入时间。这样无疑给操作人员增加了负担,而且校准还不一定正确。
在本系统中,所有的时间都是基于服务器时间的。即系统中必要的与时间有关的操作。都采用标准的T-SQL函数GETDATE()从数据服务器返回时间。这就避免了功能上的错误,也避免了给操作人员带来的不必要负担。
3、用J2EE的开放式并发进行并发控制
在办公信息管理系统系统的使用过程中,可能同时有多台数据机在操作同一个数据行。比如负责修改办公信息管理系统信息的A号电脑正在修改编号为XXX的籍,而编号为B的电脑正试图删除编号为XXX的籍。这样做肯定会有一些冲突,这就要讨论并发控制。
当多个用户试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响。处理这种情况的系统叫做“并发控制”。
在以前的编程模型中,大多使用保守式并发控制,即在从获取记录直到记录在数据库中更新的这段时间内,该行对用户不可用。J2EE的数据集DataSet是一个断开式的模型,不适合保守式并发。在我所编写的办公信息管理系统管理信息系统中,使用了开放式并发控制(参见附录中我翻译的英文文章),即只有当实际更新数据时,该行才对其他用户不可用。更新将在数据库中检查该行并确定是否进行了任何更改。如果试图更新已更改的记录,则将导致并发冲突。
4、全部数据层都基于存储过程构建
使用存储过程,可以减少网络流量,提高程序的速度以及安全性。具体内容请参见笔者文章里对存储过程的研究讨论。
3、系统设计过程及原理阐述
管理信息系统(以下简称MIS)服务于现代化的企事业管理,是提供企事业工作效率和经济效益的计算机网络系统。
管理信息系统涉及的因素非常多、非常复杂,开发起来具有一定的难度。如果掌握了一套行之有效的开发方法,以及把握好MIS开发中的重点,开发中就可以大量的解约人力、财力等。
我个人经过大量的研究、实践。认为在MIS开发中,首先数据库技术是MIS开发中的重要技术。数据库开发成败直接影响到整个MIS的开发。所以,构架一个优秀的MIS一定要有好的数据库设计。本文讨论的重点就是数据库设计理论。主要是两方面,一是基本的数据库理论;二是J2EE平台上的J2EE数据访问技术。
其次,在MIS开发过程中,所使用的开发工具和应开发应用程序的种类也很重要。这里就不能不提到Microsoft公司的JSP平台。JSP 是一种新的计算平台,它简化了在高度分布式 Internet 环境中的应用程序开发。它提供一个一致的面向对象的编程环境、提供一个将系统部署和版本控制冲突最小化的代码执行环境等等非常优秀的特点。在以后介绍开发过程中将简单阐述。
再次,界面的设计也是MIS的一个重点。界面一定要具有易学性及易使用性。在当今流行的程序设计中,设计包含用户界面的应用程序时有两种选择:Windows 窗体和 Web 窗体。两者在开发环境中都具有完全的设计时支持,并且可以提供丰富的用户界面和高级应用程序功能以解决业务问题。要根据应用程序的具体功能来选择到底开发何种应用程序。我所开发的这个办公信息管理系统管理信息系统是这两者的结合。在管理功能方面,我使用了传统的WinForms技术。而在数据使用方面的功能模块,是用webForms开发的。
3.1 数据库设计
数据库技术是20世纪60年代后期产生何发展起来的一项计算机数据管理技术,现广泛运用与各种信息处理以及科学研究上。数据库技术已经成为当今时代非常重要的技术。
当今流行的数据库系统主要是以关系数据库为代表的第二代数据库系统。
当今流行的大型数据库管理系统主要有SQL Server、Oracle、Sybase等。
办公信息管理系统管理信息系统选用的是SQLserver2000数据库管理系统。
选择它的原因有:SQLserver2000功能强大,能完整实现数据库系统的所有功能。再者,我们选用的系统开发平台是微软公司的JSP平台,它很好的支持了其公司的数据库产品SQLserver2000,而且为了加快数据处理速度,JSP平台中还专门有一个SQL Server数据提供程序(System.Data.SqlClient)。
办公信息管理系统管理信息系统使用SQLserver2000数据库管理系统,最后设计的数据库表如下:
数据库名称lib2004数据表有:
数据库表关系如下:
以下是一个办公信息管理系统管理系统中一个验证登陆的函数:
Public Function validateLogin(ByVal uid As String, ByVal pwd As String) As Boolean
Dim IsCorrect As Boolean = False
Dim cnmy As New SqlConnection(“server=(local);database=lib2004;uid=sa;pwd=”)
Dim cmd As New SqlCommand
With cmd
.Connection = cnmy
.CommandType = CommandType.Text
.CommandText = "select count(*) from manager where Man_id=@Man_id and Man_pwd=@Man_pwd"
End With
Dim mMan_id As New SqlParameter("@Man_id", SqlDbType.NVarChar, 50)
Dim mMan_pwd As New SqlParameter("@Man_pwd", SqlDbType.NVarChar, 12)
With cmd.Parameters
.Add(mMan_id)
.Add(mMan_pwd)
End With
mMan_id.Value = uid
mMan_pwd.Value = pwd
Try
cnmy.Open()
If cmd.ExecuteScalar = 1 Then
IsCorrect = True
End If
Catch ex As Exception
MessageBox.Show("登陆验证时数据库发生错误" + vbCrLf + ex.Message, _
"error", MessageBoxButtons.OK, MessageBoxIcon.Stop)
Return False
Finally
cnmy.Close()
If Not cnmy Is Nothing Then
cnmy.Dispose()
End If
End Try
Return IsCorrect
End Function
现在对这个函数按步骤详细说明。
该例子体现了如何执行sql语句。
该实例用到了System.Data.SqlClient命名空间中两个重要的对象:1.连接对象SqlConnection;2.sql命令对象SqlCommand。
SqlConnection 对象表示与 SQL Server 数据源的一个唯一的会话。对于数据端/服务器数据库系统,它相当于到服务器的网络连接。
其重要属性如下表:
ConnectionString | 获取或设置用于打开 SQL Server 数据库的字符串。 |
ConnectionString格式如下:
使用sql验证方式: | (server=服务器名称;database=数据库名称;uid=用户名;pwd=密码) |
使用windows集成验证 | (server=服务器名称;database=数据库名称;Integrated Security=SSPI) |
SqlCommand对象表示要对 SQL Server 数据库执行的一个 T-SQL 语句或存储过程。其重要属性如下:
CommandText | 获取或设置要对数据源执行的 Transact-SQL 语句或存储过程。 |
CommandTimeout | 获取或设置在终止执行命令的尝试并生成错误之前的等待时间。 |
CommandType | 获取或设置一个值,该值指示如何解释 CommandText 属性。 |
Connection | 获取或设置 SqlCommand 的此实例使用的 SqlConnection。 |
SqlCommand 特别提供了以下对 SQL Server 数据库执行命令的方法:
ExecuteReader | 执行返回行的命令。为了提高性能,ExecuteReader 使用 Transact-SQL sp_executesql 系统存储过程调用命令。因此,如果用于执行像 Transact-SQL SET 语句这样的命令,ExecuteReader 可能无法获得预期效果。 |
ExecuteNonQuery | 执行 T-SQL INSERT、DELELE、UPDATE 及 SET 语句等命令。 |
ExecuteScalar | 从数据库中检索单个值(例如一个聚合值)。 |
ExecuteXmlReader | 将 CommandText 发送到 Connection生成一个 XmlReader 对象。 |
直接使用数据命令的基本步骤是:
1、新建一个SqlConnection对象,设置其ConnectionString属性。
2、新建一个SqlCommand对象,分别设置其CommandText、CommandTimeout、CommandType、Connection属性。
3、如果要执行的T-SQL 语句或存储过程带有参数,则先要设定SqlCommand对象的Parameters属性。
4、调用SqlConnection对象的open方法打开连接。
5、执行SqlCommand命令。执行的方式及相应的返回结果见上表。
6、调用SqlConnection对象的close方法关闭连接。
本例使用ExecuteScalar方法
返回一个聚合函数count(*)的值
,count(*)返回结果
为所查询到记录的个数。如果用户名和密码均符合的话,则返回一条记录,此时Count(*)值为1
,符合条件,就成功的通过了验证。
4、部分核心代码
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>
<%@ page import="cn.edu.buaa.nlsde.db.*"%>
<%request.setCharacterEncoding("GB2312");
String TheMessage = "";
String sql1 = "";
String sql2 = "";
String sql3 = "";
String sql4 = "";
String TheAddDate = "";
int QueryLabel = 0;
String TheName = "";
String TheDepartment = "";
String TheProjectName = "";
int TheFundTypeA = 0;
int TheFundTypeB = 0;
int TheFundTypeC = 0;
int TheFundTypeD = 0;
String TheSummary = "";
String TheRemark = "";
String TheModifyDate = "";
int TheSum = 0;
String temp = "";
String SqlString = "";
Calendar cal = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String Date = format.format(cal.getTime());
format = new SimpleDateFormat("yyyy");
String Year = format.format(cal.getTime());
format = new SimpleDateFormat("MM");
String Month = format.format(cal.getTime());
format = new SimpleDateFormat("dd");
String Day = format.format(cal.getTime());
ResultSet RSRecordResult = null;
ResultSet RSThisRecord = null;
Hashtable HTThisRecord = new Hashtable();
//判断用户是否登录
if (session.getAttribute("ID") == null)
response.sendRedirect("../login.jsp");
//判断用户是否具有财务管理员身份
if (session.getAttribute("IsFinancialManager").equals("False"))
response.sendRedirect("finance.jsp");
//连接系统数据库
//Connection conn = (new DBConnect()).getODBCConn("EIMS");
Connection conn = (new DBConnect()).getConnPoolConn("eims");
Statement stmt = conn.createStatement();
boolean Warning = false;
//查询某个财务记录
if (request.getParameter("Query") != null)
//获得用户的查询条件
if (request.getParameter("QueryCheck1") != null
&& (request.getParameter("FinancialRecordID") != null))
sql1 = "and ID=" + request.getParameter("FinancialRecordID");
else
sql1 = " ";
if (request.getParameter("QueryCheck2") != null
&& (request.getParameter("FinancialProjectName") != null))
sql2 =
" and ProjectName='"
+ request.getParameter("FinancialProjectName")
+ "'";
else
sql2 = " ";
if (request.getParameter("QueryCheck3") != null)
sql3 =
" and Name='" + request.getParameter("SelectName") + "'";
else
sql3 = " ";
if (request.getParameter("QueryCheck4") != null)
TheAddDate =
request.getParameter("AddYear")
+ "-"
+ request.getParameter("AddMonth")
+ "-"
+ request.getParameter("AddDay");
sql4 = " and AddDate='" + TheAddDate + "' ";
else
sql4 = " ";
SqlString =
"select * from FinancialRecord where AccountName='"
+ session.getAttribute("Name")
+ "' "
+ sql1
+ sql2
+ sql3
+ sql4
+ " order by Name";
System.out.println(SqlString);
RSRecordResult = stmt.executeQuery(SqlString);
TheMessage = "您查询的财务记录如下";
QueryLabel = 2;
//用户选定了查询出来的某个财务记录
else if (request.getParameter("SelectRecord") != null)
TheMessage = "请在下面修改此条财务记录";
RSThisRecord =
stmt.executeQuery(
"select * from FinancialRecord where ID="
+ request.getParameter("RadioFinancialRecord"));
QueryLabel = 3;
while (RSThisRecord.next())
HTThisRecord.put("ID", new Integer(RSThisRecord.getInt(1)));
HTThisRecord.put("Name", RSThisRecord.getString(2));
HTThisRecord.put("ProjectName", RSThisRecord.getString(4));
HTThisRecord.put(
"FundTypeA",
new Integer(RSThisRecord.getInt(5)));
HTThisRecord.put(
"FundTypeB",
new Integer(RSThisRecord.getInt(6)));
HTThisRecord.put(
"FundTypeC",
new Integer(RSThisRecord.getInt(7)));
HTThisRecord.put(
"FundTypeD",
new Integer(RSThisRecord.getInt(8)));
HTThisRecord.put("Summary", RSThisRecord.getString(10));
HTThisRecord.put("Remark", RSThisRecord.getString(11));
HTThisRecord.put(
"AddDate",
RSThisRecord.getString(13).substring(0, 10));
//用户对选定的财务记录进行了更新
else if (request.getParameter("UpdateRecord") != null)
//校验用户的输入
try
NumberFormat numberformat = NumberFormat.getInstance();
numberformat.parse(request.getParameter("UpdateFundTypeA"));
numberformat.parse(request.getParameter("UpdateFundTypeB"));
numberformat.parse(request.getParameter("UpdateFundTypeC"));
numberformat.parse(request.getParameter("UpdateFundTypeD"));
ResultSet RSLinkedDepartment =
stmt.executeQuery(
"select Department from PSLogins where Name='"
+ request.getParameter("UpdateName")
+ "'");
TheName = request.getParameter("UpdateName");
while (RSLinkedDepartment.next())
TheDepartment =
RSLinkedDepartment.getString("Department");
TheProjectName = request.getParameter("UpdateProjectName");
TheFundTypeA =
new Integer(request.getParameter("UpdateFundTypeA"))
.intValue();
TheFundTypeB =
new Integer(request.getParameter("UpdateFundTypeB"))
.intValue();
TheFundTypeC =
new Integer(request.getParameter("UpdateFundTypeC"))
.intValue();
TheFundTypeD =
new Integer(request.getParameter("UpdateFundTypeD"))
.intValue();
TheSummary = request.getParameter("UpdateSummary");
TheRemark = request.getParameter("UpdateRemark");
TheModifyDate = Date;
TheSum =
TheFundTypeA + TheFundTypeB + TheFundTypeC + TheFundTypeD;
//修改此条财务记录
stmt.executeUpdate(
"update FinancialRecord set Name='"
+ TheName
+ "',Department='"
+ TheDepartment
+ "',FundTypeA="
+ TheFundTypeA
+ ",FundTypeB="
+ TheFundTypeB
+ ",FundTypeC="
+ TheFundTypeC
+ ",FundTypeD="
+ TheFundTypeD
+ ",Sum="
+ TheSum
+ ",Summary='"
以上是关于毕业设计EMS办公管理系统(B/S结构)+J2EE+SQLserver8.0的主要内容,如果未能解决你的问题,请参考以下文章