段永良,卜言彬,高 露
(中国传媒大学 南广学院,江苏 南京 211172)
将广播电视发射网的信号数据上传至服务器,进行有效存储从而实现数据的妥善管理。根据所存储的数据进行对比,判断其是否符合标准、是否存在干扰等等。
广播电视发射网用于发射广播电视信号,信号数据应该有专属的工具来存储并处理,因此,开发一个Web应用类型的管理系统很有必要,通过这个应用实现信号数据的完整封装并分发,从而使得广播电视发射网信息管理走向智能、走向高效、走向简单直观。
传统的广播电视发射网信号数据都由人工进行管理,繁琐复杂,开发Web应用来管理这些数据会使过程简单,结果直观。因为计算机的界面适用于和人交互,所以设计的界面会显得尤其人性化,直观的同时能够很快地进行数据的分析处理。选择开发JavaWeb应用实现这个数据管理系统很容易让人接受和理解,JavaWeb可采用的请求响应式的数据查询操作方式更显完美。另外,运用计算机的存储管理使得管理过程更高效、更安全[1]。
广播电视发射网信号数据管理系统,基于B/S模式,以请求响应式的方式,记录广播电视发射网信息、广播电视发射台信息、发射机信息、信号信息,对这些信息可进行相应的增加、删除、修改、查询操作,通过系统的管理,最终实现以下目标:对广播电视发射网信息进行增删改查;对广播电视发射台信息进行操作管理;对每个广播电视发射台下所对应的发射机的信息进行操作管理;对每台发射机的发射的信号信息进行操作管理;对用户进行管理。
广播电视发射网工作人员:通过注册获得一个账号,以此账号可以登录到系统中,进行数据的普通查询操作等等。
系统管理员:登录后进入后台管理界面,对广播电视发射网工作人员进行有效管理,对系统的数据信息进行管理,实施删除、修改、增加、查询等。
主要介绍开发环境及主要技术、数据库、广播电视发射网模块、广播电视发射台模块、发射机模块、信号模块、用户模块、管理中心模块[2]。
编辑器->Eclipse(Luna),数据库->Oracle&&sqlDeveloper,语言->Jave,前端->Html5、JavaScript、jQuery,验证->Ajax,后端->三大框架SSH(Hibernate,Struts,Spring),三层架构模式,面向接口编程,spring依赖注入等。
三大框架:Spring+Struts+Hibernate,Spring引入各个组件的对象并且进行注入;Struts的作用相当于servlet用于处理请求并实现页面跳转,而Hibernate就是对数据库的底层操作数据的增删改查。
三层架构:从下往上依次是Dao数据层,Service业务逻辑层,MVC显示层,通过这个模式实现整个项目的架构搭建。这里的MVC是指model:JavasBean类,view:jsp/html,controller:控制器,这里就是struts,控制页面的跳转。
面向接口编程和依赖注入:这两个技术都是Spring框架带来的好处之一,Spring是个轻量级的框架,管理着对象的产生以及对象与对象之间的关系,对象的产生是注入的,并不关心对象是如何产生的,只要获取对象即可;面向接口编程,使得重点都放在功能上,不用关心具体的实现类是哪一个[3]。
数据库有6个表,每个表有表名、字段名、属性。
广播电视发射网信息表有6个字段,广播电视发射台信息表有4个字段,发射机信息表有4个字段,信号信息表有6个字段,用户信息表有8个字段,管理员信息表有6个字段。数据库用Oracle,Sys是数据库的超级用户,数据库内很多重要的东西(数据字典表、内置包、静态数据字典视图等)都属于这个用户,sys用户必须以sysdba身份登录。
(1)数据模型建立
在model包中新建一个关于station广播电视发射网(以下简称发射网)的类,其中包括发射网编号、名称、地址经、纬度,这些都是station类的属性,然后使用相应的get和set方法使用属性,属性定义为private私有类型,使得属性只属于类的各个对象,然后每产生一个对象就会在数据库中形成相应的一条数据记录。因为使用ORM技术来建表,所以对应的类通过注解@Entity实体,形成表格数据形式,并注解@Table(name=”t_name”)形成表;另外,表格中每形成一条记录都是使用id自增长的格式,所以Id要注解为主键@Id,并且注解上:@GeneratedValue(stratgy=GeneratedType.AUTO)实现主键自增长。
(2)框架配置
手动创建dao层hibernate对象,配置一个hibernate.cfg.xml(这个配置文件起到初始化的作用),使得初始化类在插入对象时操作底层数据库,在后面的具体操作中就不会使用这个配置了,因为引入了Spring,所以这个配置会在Spring的配置文件中实现。
(3)开发过程
分为几个小部分:发射网、广播电视发射台(以下简称发射台)、广播电视发射机(以下简称发射机)、广播电视发射信号(以下简称信号),分别对这几个部分进行对应的技术实现。通过接收到发射网的信号数据,确定发射网的编号、名称、地理坐标,因此建表的时候需要对发射网这些属性进行描述,将这些属性封装到发射网对象中从而实现在数据库的存储、修改、删除、添加。
项目中新建com.model的包,这个包专门用来存放基本类模型。新建一个发射网类Station.java,关于发射网的属性:station_id序号、addressCode编号、addressName名称、latitude经度、logitude纬度,这些属性只属于发射网本身,设置为private类型,只能通过方法进行使用,因此要给这些属性添加getXX和setXX方法。然后,需要有空构造函数和带参数的构造函数,因为每当要在数据库中形成一条新纪录都必须要构造一个新对象。
(4)手动建表并初始化
新建一个初始化包,建立一个InitStation类,因为现在是通过手动操作hibernate,所以需要每一个过程都描述清楚,每次需要对数据库进行操作的时候都要建立会话工厂,开启事务,打开事务,然后进行增删改操作,最后执行完后进行事务关闭。
(5)引入Spring框架
经过初始化后,数据库可以成功连接,现在使用spring来引入Hibernate的操作对象,并由spring管理struts对象,控制逻辑的跳转。使用Spring来管理生成对象并控制对象与对象之间的关系,对象的产生和属性设置通过Spring的IOC(控制反转)和DI(依赖注入)实现。
(6)添加发射网
采用从前往后的开发模式,即从页面->action->service->dao层。
新建add_station.jsp页面,提交到stationAction中,并且指定为add方法,用的是post方法,表单中使用一系列的input控件标签,给每个控件一个name。
新建action包,建立一个StationAction.java类。该类继承自ActionSupport类,这个action要处理前端提交过来的数据信息,用strut可以实现自动获取客户端提交的请求对象数据。其实现过程是,根据约定大于配置的规则,前端页面中配置的input标签的name,在action中设置name的属性,根据需要给定set方法,用set方法将name的值设置到action中的属性中去,get方法则用于后端将数据返回到页面前端。
在StationAction中的类名上注解@Controller,@Scope,这是因为spring在托管struts的对象,注解这个后会在启动时扫描这个形成对应的action对象。
添加属性,属性名和前端的input标签的name一致,并给出相应的get和set方法。
添加add方法,这个方法名要对应到前面提交的方法名参数,在这个方法中有四个参数,addressCode, addressName, latitude, logitude,这些参数同样遵循约定大于配置,和model包中的station类的属性名一致,最起码类型是一致的,因为,系统的宗旨就是通过操作对象来实现数据的增删改查,所以添加实现的就是将前端提交的属性通过set到对象中,将这个对象封装起来,从而将对象存放到数据库中去形成一条记录。
上述添加方法中用到了service层的service对象,因为service层是逻辑业务层,所有的转换、业务逻辑运算等等都是放在这一层的,就是通过在stationAction中引入对Service对象的调用,从而实现业务运算,所以现在进入到service层,新建service包,建立一个StationService.java类,在这个类中进行一些业务逻辑的转换。然而,因为需要在service中建立action中对应的多个方法,需要实现的功能就会很多,所以StationService实际上是个interface,即接口。
新建service接口的实现类,放在ServiceImpl包中,类名StationServiceImpl,并且要实现StationService接口。
上述用到的stationDao对象,是通过StationDao接口得到的,建立dao层的包,其中新建StationDao接口,因为这也是个接口,所以只需要在接口中添加上service实现时用到的方法即可。
建一个dao的实现类的包DaoImpl,新建一个StaionDao的实现类,StationDaoImpl类实现StationDao接口。再建立一个成功添加的页面,添加一个successs即可。
(7)查询Station并形成列表
同样使用从前向后的开发模式,新建station_list.jsp页面。以表格显示出来,表格中用一个iterator的遍历,将action中封装的list取出来,这里用到了分页技术。这里有个注意点,因为现在取的是action中的对象值,而后台的数据都是放在栈中的,取值的时候可以不用“#”,而如果是取页面上下文的数据时必须要用“#”。
(8)删除station数据
同样使用从前向后的方式,因为在前面使用后面组件中的对象或方法对象时会报错,从而根据报错的这个机制在后面组件中对应的地方添加方法的实现即可,这种显示提示的方式给开发带来了很大的便利。
(9)修改Station对象信息
和删除的方法类似,不需要建页面,在station_list.jsp中每条数据后面添加修改的超链接,超链接的请求是stationAction中的update方法。
一个发射网拥有多个发射台,其对应关系是一对多的。发射台和station之间存在着联系,每一个发射台对应在特定的station下面,以station的id为参照线,按照这个参照线进行发射台的增、删、改、查。另外,需要补充的是每个发射台有自己的名称,每个名称对应到一个编号,于是根据这个编号可以比较方便地进行查找发射台的具体信息,因此,发射台有名称和编号两个属性以及一个id。
(1)创建发射台模型
1)model包中建立Machine类模型;2)Mechine发射台的初始化。
(2)添加发射台
和添加发射网一样采用从前到后的开发模式,点击添加发射台,跳出添加页面,add_machine.jsp(新建的页面,通过表单形式,一系列的input,注意这时候会将父节点就是Station的id传过来,因此这个id必须被隐形的传到action中,用input,只是设置成hidden类型了),输入发射台编码和名称即可提交,成功后到数据库查询。
(3)查看发射台列表
1)添加查看超链接,连接到新页面machine_list.jsp,并且将station_id传过来,即根据station来查找其下对应的发射台;2)新页面machine_list.jsp,即发射台列表,页面同样是采用从action中获取的page对象的list属性得到machine的每一个属性并显示出来;3)machineAction中添加getMachineList方法,同样给出页数和条数,并将结果对象返回到前端中;4)MachineService接口中添加getAllStation方法,传递页数和条数;5)MachineDao中添加getAllStationCount和getMachineList方法;6)配置struts请求成功后的跳转路径,只需再配置一个result,给出跳转的页面machine_list.jsp。
(4)删除发射台
根据列表给出的每一条machine对应的id,从而到后端数据库中找到相应的对象,然后进行对象的删除;MachinAction中添加delete方法,调用machineService方法形成对象后删除;MachineService实现类中先将参数转型,然后用dao层getMachineById找到对象进行删除;MachineDao接口中添加deleteMahchine和getMachineById方法;配置struts.xml,同样是operate_ok.jsp页面,在数据库中查询记录被删除即可。
(5)修改发射台信息
修改信息的过程基本上同station发射网信息修改过程,其基本想法就是将原来的属性数据传递到后端,根据给出的父节点machine_id将父对象找出来,然后形成一个新的空的machine,将新的属性set到machine中,并set一个新的station父对象给machine,然后在数据库中把这个对象save到数据库中。
一个发射台内拥有多台发射机设备,这些发射机设备有各种属性,被各个发射台所关联,一个发射台可以控制多台发射机。
(1)建立sender模型类;(2)初始化sender;(3)添加设备:页面中添加超链接,action中添加请求添加的方法add,并且action中要注解上@Controller;(4)删除设备:同上述删除发射台一样,前端传来节点的id,根据这个id找出对应的对象,然后删除这个对象即可;(5)修改设备信息:将原来信息的值全都传到后端,然后根据这个id找出对象,给对象重新设置属性值,再将对象update到数据库即可[4]。
这里的信号是指分布在广播电视覆盖区内各测试点的接收信号,信号强度即为覆盖场强。对于信号模块,开发过程与sender和machine原理一致,不同的是信号的参数会比较多,有场强、频率、接收时间、类型(广播、电视)。
(1)添加信号
1)建立信号模型:注解成Entity和Table,准确地形成对应的数据库表格。配置hibernate.cfg.xml,扫到这个类形成表格。初始化时,在id为61的Sender下建立一系列信号,将id为61的sender取出来set到signal对象中,最后save,到数据库中验证,找到记录。2)添加信号功能:建立一个页面,在其中输入各种信号属性数据,然后提交,以表单的形式请求到SignalAction的add方法,add方法中会调用SignalServeice的add相应的方式,并在SignalServiceImpl实现类中得以实现,再对Dao层方法调用,实现save。
(2)获取信号列表
获取信号列表,同样用的是page对象封装一切的属性,包括信号的list,在页面中取出对应的属性值即可,action中添加请求的方法,然后在service中处理具体的请求过程,最后由dao层来进行数据的分页查询与显示:
(3)删除信号
由前端提交过来的id,找出相应id的signal对象,然后将这个对象从数据库中删除。
这个模块是为发射网的用户而设计的,主要设计了注册和登录功能。创建用户的模型,用户的action,service和dao,同样要进行初始化,验证连接是否正确。
(1)注册
register_jsp注册页面,以表单方式进行提交,提交至请求userAction的register方法,其实,register就是在做用户添加功能,在这部分关键是只要将属性封装到user对象中即可,然后dao层save对象[5]。
(2)登录
用表单将用户名和密码提交至后台,根据这两个信息到数据库中查找是否有这个对象的存在,若有计数大于0,则登录成功,如果没有则说明用户不存在,因此要做的工作是重新注册然后进行登录。
(3)查询信息
通过首页的导航栏选择进入查询程序,可以查看发射网、发射台、发射机、信号等具体的信息,还能够通过条件进行查询。
(4)退出
退出时,只需要将对应链接到的请求方法中session失效即可。
每个模块的管理是建立在上述模块每个功能实现的基础上,在后台通过将这些模块的增、删、改、查进行组合。
(1)各模块管理
各模块信息添加、删除、修改、查询,通过上述模块的各种操作来实现。
(2)用户管理
对用户进行添加、删除、查询、列表。
传统的设计思路是先建立数据存储的表格,建立数据对象的类模型,通过前端提交过的客户端请求,调用业务处理逻辑,从而实现对数据的增、删、改、查;而该系统中使用三大框架SSH构建了整个流程,省略了先建表的过程,显得非常清晰,易于让人接受。其实,不管是用上述两种方式的哪一种方式进行开发,其实质都是一个就是根据属性来封装对象,只不过前者是对数据操作,后者是对对象操作,这是两者最根本的区别[6]。使用三大框架、三层架构、面向接口编程和依赖注入技术构建广播电视发射网信息管理系统,简单、方便、实用。系统运行正常,数据精确,方便快捷,稳定可靠,省时省力,具有很高的推广价值。