摘要:本文介绍了一种开发基于Web的管理信息系统的实现框架。利用JSP/Servlet技术,结合MVC设计模式,使得开发过程更加灵活,更加易于维护。
关键词:管理信息系统,JSP,Servlet,MVC设计模式,JDBC
1、 引言
管理信息系统(MIS)是一个由人、计算机等组成的能进行信息的收集、传递、存储、加工和使用的系统。随着科技的发展,信息的膨胀,企业信息化成了企业在竞争中处于不败地位的有效手段之一。而MIS不仅能够及时全面地提供信息和数据,简化统计工作,对不同的管理层次提出不同的报告之外,还能根据过去的数据预测未来的情况。因此,采用何种方法开发出一种兼顾开发效率和运行效率,同时满足分布式事件处理功能的管理信息系统就显得尤为重要。本文阐述了一种利用JSP/Servlet构建三层式管理信息系统的方法。
2、 系统的三层体系结构
系统的三层体系结构如图1。
图1基于Java技术的Web应用体系结构
整个管理信息系统采用Browser/Web/DataBase的三层体系结构。Web服务器接受请求,通过应用程序服务器执行一个Java服务器端小程序Servlet并返回其输出,从而实现与客户机进行信息资源的交互。数据库服务器用来存储管理信息系统中所用到的各种数据,数据由数据库管理程序直接录入。系统的客户端只需要一个浏览器即可。相关人员通过浏览器来查询、增加、修改、删除数据,对信息进行管理。
3、 系统的设计模式
设计模式是面向对象的程序设计人员用来解决编程问题的一种形式化表示。目前,在大多数Browser/Server结构的Web应用中,浏览器直接通过HTML或者JSP的形式与用户交互,响应用户的请求。虽然很直观,但是大多数管理信息系统操作的数据量都是惊人的,随着代码的增多会使JSP页面臃肿不堪,Web服务器的负荷过重。因此,在中间层上采用基于模型视图控制器(MVC.Model-View-Controller)的设计模式。Model层用来实现业务逻辑,View层用来显示用户界面,Controller层主要负责View层和Model层之间的控制关系。具体实现时,把Servlet用作应用程序的控制器,把JSP文档作为视图,JavaBeans被用来表示模型。所有的请求都被发送给作为控制器的Servlet,它接受请求,并根据请求信息将它们分发给适当的JSP来响应。同时,Servlet还根据JSP的需求生成JavaBeans的实例并输出给JSP环境。JSP可以通过直接调用方法或使用UseBean的自定义标签得到JavaBeans中的数据。这种设计模式很好地实现了数据层与表示层的分离,使开发工作更加容易和迅速。在这种设计模式下,各层次之间的数据传递如图2。
图2 MVC设计模式的数据传递图
4、 数据存取技术
数据库是管理信息系统的核心内容。目前,Web与数据库接口技术有很多,其中JDBC是Java程序连接和存取数据库的应用程序接口,由一组用Java语言编写的类与接口组成,是执行SQL语句的Java API。本文介绍的管理信息系统中,在数据的存取方面,采用了 JSP/Servlet+JDBC的技术,即客户端不产生数据库查询命令,客户端上的浏览器通过URL和中间层的Web服务器建立连接。Web服务器主要负责接收本地或远程浏览器的HTTP数据请求,然后中间层的Servlet收到请求后,通过执行程序中的SQL语句,利用JDBC提供的标准API对数据库进行访问和相应的操作处理。Servlet再将查询的数据传给JSP,最后生成标准的JSP页面将结果返回给提出请求的浏览器。这样,不仅将客户端与数据库服务器端分开,同时提高了数据库的访问效率。
5、 实例
为了更好地说明用JSP/Servlet构建三层式管理信息系统的方法,作者将举例分析设计一个商品邮购管理信息系统。这个商品邮购管理信息系统利用Java语言进行服务器端应用程序的开发,使用IBM公司的Webshpere作为应用服务器,数据库管理系统选用SQL Server7.0,数据库接口程序使用JDBC2接口。整个系统使用基于Web的方式来实现邮购业务的客户管理、职员管理、订单管理、商品管理、出库管理、入库管理等业务处理、流程控制、权限控制、查询统计以及打印等功能。其中详细分析订单管理部分的查询功能。
5.1数据库设计
对于订单部分,需要定义订单信息表Db_order,表中的字段有订单编号(ddbh),客户编号(khbh),商品编号(spbh),商品单价(spdj),定购数量(dgsl),合计总价(hjzj),收到金额(sdje),收到日期(sdrq)。为了能够在应用中使用Db_order表,必须建立数据库连接。这个功能由sql_data.java来实现。其部分代码如下。
public class sql_data { String url = "jdbc:odbc:PostOrder"; // use your hostname and port number here String login = "sa"; // use your login here String password ="zh12345"; // use your password here public Connection connection = null; public Statement st = null; public ResultSet rs = null; try { Class.forName("com.microsoft.jdbc.sqlserver.SqlServerDriver"); conn =DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); } } |
public class OrderGl { …… //定义如下的方法完成对订单的查询操作 public final String currentMultiQuery( javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws com.goods.exception.GoodsException { //从JSP页面获得相应查询信息 com.goods.view.OrderView view = getView(request, response); String ddbh = view.getDdbh(); //订单编号 //生成SQL语句 String sqlQuery = "select ddbh,khbh,spbh,spdj,dgsl,hjzj,sdje,sdrq from db_order "; //执行查询操作 java.util.Vector vector = new java.util.Vector(); com.goods.sjk.sql_data per = new com.goods.sjk.sql_data(); try { java.sql.ResultSet rs = per.executeQuery(sqlQuery); while (rs.next()) { com.goods.dx.Db_order temp = new com.goods.dx.Db_order(); temp.setDdbh(rs.getString("ddbh")); temp.setKhbh(rs.getString("khbh")); temp.setSpbh(rs.getString("spbh")); temp.setSpdj(rs.getString("spdj")); temp.setDgsl(rs.getString("dgsl")); temp.setHjzj(rs.getString("hjzj")); temp.setSdje(rs.getString("sdje")); temp.setSdrq(rs.getString("sdrq")); vector.addElement(temp); } rs.close(); per.close(); } catch (Throwable e) { e.printStackTrace(); per.close(); cxyw.printErrorToWeb(request, response, e.toString()); return e.toString(); } //将相关信息回显给界面 view.setVct(vector); request.setAttribute("view", view); return "1"; } } |
<jsp:useBean id="view" class="com.goods.view.OrderView" scope="request" /> <jsp:useBean id="temp" class="com.goods.dx.Db_order" scope="page" /> < jsp:useBean >动作用id和scope发现存在的各个对象,再通过<%=view.getDdbh() 和<%=temp.getDdbh()%>来获取相关数据。 |