分析实时信息数据Web系统的设计
来源:UC论文网2016-01-02 21:28
摘 要 :针对实时信息数据Web系统的应用需求,本文给出了系统设计方案和实现方法。在系统的Web服务器端使用MVC设计模式,视图层使用JSP技术,控制层使用Servlet技术,模型层使用的
摘 要:针对实时信息数据Web系统的应用需求,本文给出了系统设计方案和实现方法。在系统的Web服务器端使用MVC设计模式,视图层使用JSP技术,控制层使用Servlet技术,模型层使用的JavaBean技术。本文研究成果在在线机车运行信息分析系统中得到了良好地应用。
关键词:MVC;设计模式;视图层;控制层;模型层
实时信息数据Web系统提供的主要功能如图1所示。
实时信息主要是提供对当时在线信息进行实时查询,并能自动显示最近收到的数据。
信息查询主要是对接收到的已经插入到数据的实时信息的历史信息进行查询。
系统设置主要提供系统用到各种字典的设置,参数的设置,无线传输终端的配置等。
下面介绍Web系统主要实现过程。
1 MVC模式
MVC的描述最早见于Xerox在19世纪80年代末发表的大量文章。使用MVC的关键在于将逻辑分离为3个不同的单元:模型(Model)、视图(View)和控制器(Controller)。在一个服务器应用中,通常将应用划分为以下部分,即业务逻辑、表示和请求处理。业务逻辑用于表示对应数据的处理,如客户、产品和订单信息;表示是指应用数据如何显示给用户,如,位置、字体和大小;请求处理则是如何将业务逻辑和表示部分绑定在一起。采用MVC的说法,模型对应为业务逻辑和数据,视图对应为表示,控制器则对应为请求处理。
1.1 系统中使用的MVC模式
在系统中使用的是Servlet和JSP组成的MVC模式。
Servlet与JSP结合,这种应用很容易维护,而且当出现新的需求时也很容易扩展。由于Servlet是一个常规Java类,可以充分使用Java语言的强大功能来实现请求处理,在此可以使用标准Java开发和调试工具。然后,系统利用JSP最擅长的方面:通过包含由Servlet所收集或生成的信息来提供响应。
Servlet和JSP的常见结合方式是使用一个Servlet作为应用的控制器,并用多个JSP页面作为视图。基于这种方法,可以采用一种模块化的方式开发应用,Servlet相当于一个网关,它将请求分派至特定的处理组件,并且基于成功与否响应选择适当的JSP页面。
使用Servlet和JSP的MVC模式,角色分配如图2所示。
所有请求都发送至相当于控制器的Servlet,以提示需要做什么工作。此提示可以作为一个请求参数,也可以作为URI路径的一部分。JavaBean用于表示模型。Servlet可以自行完成所请求的动作,也可以将每个动作委托至相应的各个处理类。取决于处理的结果,控制器Servlet会选择适当的JSP页面来为用户生成响应。
1.2 系统中MVC的实现
在系统中使用了一个类名为WebManager的Servlet作为一个相当于网关的控制器,它负责将各个请求URI分发至对应的处理类。
WebManagerTrainManager中的doPost方法和doGet方法都指向了自定义的process方法:
public void doPost(
HttpServletRequest request,
HttpServletResponse response)
ThrowsServletException, IOException {
process(request,response);
}
public void doGet(
HttpServletRequest request,
HttpServletResponse response)
ThrowsServletException, IOException {
process(request,response);
}
WebManager中的process方法的作用是专门分发所都请求到各个处理类的。process方法首先分析URI,并取出本次URI要跳转到的模块的URI路径:
String requestURI
= StringUtil.extractPath(request.getRequestURI());
取到requestURI后,开始与系统现存的各个处理类匹配:
if(requestURI.equals("logout")){
responseURI="/html/index.jsp";
}else if(requestURI.equals("trainstatus")){
responseURI = trainAction.process(da,request,response);
}else if(requestURI.equals("pointdata")){
responseURI = pointDataAction.process(da,request,response);
} else if(requestURI.equals("login")){
responseURI = login.process(request,response);
}else if(requestURI.equals("qcjl")){
responseURI = recordAction.process(request, response);
}else if(requestURI.equals("trainlist")){
responseURI = fileAction.process(da, request, response);
}
……
当各个处理类返回responseURI后,判断是否是.jsp,如果是,则重定向到responseURI所指定的JSP页面:
if (responseURI.endsWith(".jsp")) {
request.getRequestDispatcher(responseURI).forward(request, response);
}
此外,在WebManager的init()的函数中,加入了需要启动的收发数据的线程和判断终端下线的任务线程,从而使这两个线程随系统的启动而自动启动。
系统中自己定义了WebManager作为MVC的控制器,而没有采用开源的中间件,主要出于以下几方面的考虑:(1)开源的中间件一般功能强大,同时实现较多功能,而系统对于这部分的要求不高,使用不到开源中间件提供的功能,造成“浪费”;(2)开源的中间件一般会使用大量其他程序组件,系统引入这些程序组件会给系统造成潜在的冲突;(3)开源软件可能存在未知的问题,如果出现问题不利于系统调试。
2 实时信息的实现
实时信息应用主要显示在线机车列表,动态更新在线机车列表,根据在线机车查看机车的实时信息数据,并能动态地增加显示该机车新收到的实时信息数据。客户查看机车信息实时信息的时序图如图3所示。
客户在浏览器上点击显示实时信息的链接,该链接作为一个HTTP请求发送到服务器上,服务器根据链接URL中的基础URI部分确定Web应用,并将请求发送给Servlet处理。
请求首先发送到Servlet控制器,控制器根据除了URI基础部分剩下的URI确定处理实时信息处理类,并将Servlet控制器中的request对象和response对象传给该处理类。
处理类接到request对象和response对象后,调用request的getParameter()方法取出请求参数,在程序中取出机车上的终端号,因为后台数据组织是按照终端号进行组织,机车号作为显示信息;程序中再取出一些查询条件的参数。然后,处理类调用实时信息工具JavaBean的方法进行数据库查询,实时信息工具JavaBean的方法返回一个处理结果,一般是一个List对象,里面存放着描述实时信息的对象。处理类接到查询结果后,调用request的setAttribute方法将查询结果放入request对象中,并返回一个用于显示结果的JSP页面。
Servlet控制器接到处理类返回的JSP页面,直接调用request的getRequestDispatcher方法,将request对象和response对象转发到JSP页面上。
JSP页面调用request的getAttribute获取查询结果,逐个遍历查询结果,显示结果。
以上是在系统中一个从客户端访问数据库的基本流程。系统中其他模块,如信息查询,也是按这个流程处理,只不过是查询数据库中终端的历史信息,显示结果的JSP与实时信息不一样。
3 系统设置的实现
系统设置中,很多模块也是从客户端获取参数和数据,然后根据参数和数据对数据库进行相应地操作。与实时信息模块不同的是,系统设置中的各个模块不只是对数据库进行查询操作,还会对数据库进行添加数据(insert)操作、修改(update)操作、删除(delete)操作。因此,对于系统设置中的各个模块页面请求时,在请求串中加入了一个操作任务的字段。例如,如果对数据进行添加操作,则操作任务请求串写为“……&task=add&……”。在处理类中,要提取出操作类型,并根据相应的操作做不同的处理:
String task=request.getParameter("task");
if("displaydata".equals(task)){
//进行显示数据操作,查询数据并把查询结果返回到JSP上
……
}else if("modifydata".equals(task)){
//进行修改数据操作,并把修改结果返回到JSP上
……
}else if("addpage".equals(task)){
//显示添加数据页面
……
}else if("adddata".equals(task)){
//添加数据操作,并把添加结果显示到JSP上
……
}else if("deletedata".equals(task)){
//删除数据操作,并把删除结果显示到JSP上
……
}else{
//默认操作方法,查询数据并把查询结果集显示到JSP上。
……
}
上面最后一个操作与第一个操作——displaydata不同,displaydata操作是查询数据库数据表中的某一条数据,用于修改该条数据使用;而最后一个操作是查询数据库数据表中全部的数据,显示给客户端,用于客户端选择修改或删除数据。这部分主要有如下几个功能模块。
(1)无线终端配属
主要是设置系统中已经安装和未安装的无线终端的终端号,保存在数据库中的终端配属表。
(2)远程设备配属
主要是设置系统中已经安装和未安装的无线终端的远程设备,保存在数据库中的远程设备配属表。
(3)远程设备终端配属
主要是根据系统中的无线终端配属和远程设备配属,建立起终端与所安装在远程设备上的关系,保存在数据库中的远程设备终端配属表。只有在这个表中的终端,才会真正认为是正在使用中的终端,并会在系统的内存中生成终端对象并保存在数据收发线程中。
(4)字典表维护
主要是维护一些字典表,如收到的数据中远程设备型号是数字代码,在系统中就需要建立字典表翻译代码成为客户使用人员熟悉的文字以及其他一些相关的数据字典。
以上这些系统设置的主要功能模块主要是对数据库进行操作,对相应的数据表进行添加,修改和删除操作。但是,对于远程设备终端配属相对复杂一些,涉及到终端操作,在建立配属关系时,需要同时产生内存中的终端对象并放入数据收发线程中;在删除配属关系时,需要从数据收发线程中删除该内存对象,并释放掉。
4 结 语
本文详细说明了系统中的Web系统用到技术和实现的主要方法。在系统的Web服务器端使用MVC设计模式,视图层使用JSP技术,控制层使用Servlet技术,模型层使用JavaBean技术。文中使用UML顺序图详细介绍了实时信息,信息查询和系统设置的实现过程。