段永良,卜言彬,高 露
(中國傳媒大學 南廣學院,江蘇 南京 211172)
將廣播電視發(fā)射網的信號數據上傳至服務器,進行有效存儲從而實現(xiàn)數據的妥善管理。根據所存儲的數據進行對比,判斷其是否符合標準、是否存在干擾等等。
廣播電視發(fā)射網用于發(fā)射廣播電視信號,信號數據應該有專屬的工具來存儲并處理,因此,開發(fā)一個Web應用類型的管理系統(tǒng)很有必要,通過這個應用實現(xiàn)信號數據的完整封裝并分發(fā),從而使得廣播電視發(fā)射網信息管理走向智能、走向高效、走向簡單直觀。
傳統(tǒng)的廣播電視發(fā)射網信號數據都由人工進行管理,繁瑣復雜,開發(fā)Web應用來管理這些數據會使過程簡單,結果直觀。因為計算機的界面適用于和人交互,所以設計的界面會顯得尤其人性化,直觀的同時能夠很快地進行數據的分析處理。選擇開發(fā)JavaWeb應用實現(xiàn)這個數據管理系統(tǒng)很容易讓人接受和理解,JavaWeb可采用的請求響應式的數據查詢操作方式更顯完美。另外,運用計算機的存儲管理使得管理過程更高效、更安全[1]。
廣播電視發(fā)射網信號數據管理系統(tǒng),基于B/S模式,以請求響應式的方式,記錄廣播電視發(fā)射網信息、廣播電視發(fā)射臺信息、發(fā)射機信息、信號信息,對這些信息可進行相應的增加、刪除、修改、查詢操作,通過系統(tǒng)的管理,最終實現(xiàn)以下目標:對廣播電視發(fā)射網信息進行增刪改查;對廣播電視發(fā)射臺信息進行操作管理;對每個廣播電視發(fā)射臺下所對應的發(fā)射機的信息進行操作管理;對每臺發(fā)射機的發(fā)射的信號信息進行操作管理;對用戶進行管理。
廣播電視發(fā)射網工作人員:通過注冊獲得一個賬號,以此賬號可以登錄到系統(tǒng)中,進行數據的普通查詢操作等等。
系統(tǒng)管理員:登錄后進入后臺管理界面,對廣播電視發(fā)射網工作人員進行有效管理,對系統(tǒng)的數據信息進行管理,實施刪除、修改、增加、查詢等。
主要介紹開發(fā)環(huán)境及主要技術、數據庫、廣播電視發(fā)射網模塊、廣播電視發(fā)射臺模塊、發(fā)射機模塊、信號模塊、用戶模塊、管理中心模塊[2]。
編輯器->Eclipse(Luna),數據庫->Oracle&&sqlDeveloper,語言->Jave,前端->Html5、JavaScript、jQuery,驗證->Ajax,后端->三大框架SSH(Hibernate,Struts,Spring),三層架構模式,面向接口編程,spring依賴注入等。
三大框架:Spring+Struts+Hibernate,Spring引入各個組件的對象并且進行注入;Struts的作用相當于servlet用于處理請求并實現(xiàn)頁面跳轉,而Hibernate就是對數據庫的底層操作數據的增刪改查。
三層架構:從下往上依次是Dao數據層,Service業(yè)務邏輯層,MVC顯示層,通過這個模式實現(xiàn)整個項目的架構搭建。這里的MVC是指model:JavasBean類,view:jsp/html,controller:控制器,這里就是struts,控制頁面的跳轉。
面向接口編程和依賴注入:這兩個技術都是Spring框架帶來的好處之一,Spring是個輕量級的框架,管理著對象的產生以及對象與對象之間的關系,對象的產生是注入的,并不關心對象是如何產生的,只要獲取對象即可;面向接口編程,使得重點都放在功能上,不用關心具體的實現(xiàn)類是哪一個[3]。
數據庫有6個表,每個表有表名、字段名、屬性。
廣播電視發(fā)射網信息表有6個字段,廣播電視發(fā)射臺信息表有4個字段,發(fā)射機信息表有4個字段,信號信息表有6個字段,用戶信息表有8個字段,管理員信息表有6個字段。數據庫用Oracle,Sys是數據庫的超級用戶,數據庫內很多重要的東西(數據字典表、內置包、靜態(tài)數據字典視圖等)都屬于這個用戶,sys用戶必須以sysdba身份登錄。
(1)數據模型建立
在model包中新建一個關于station廣播電視發(fā)射網(以下簡稱發(fā)射網)的類,其中包括發(fā)射網編號、名稱、地址經、緯度,這些都是station類的屬性,然后使用相應的get和set方法使用屬性,屬性定義為private私有類型,使得屬性只屬于類的各個對象,然后每產生一個對象就會在數據庫中形成相應的一條數據記錄。因為使用ORM技術來建表,所以對應的類通過注解@Entity實體,形成表格數據形式,并注解@Table(name=”t_name”)形成表;另外,表格中每形成一條記錄都是使用id自增長的格式,所以Id要注解為主鍵@Id,并且注解上:@GeneratedValue(stratgy=GeneratedType.AUTO)實現(xiàn)主鍵自增長。
(2)框架配置
手動創(chuàng)建dao層hibernate對象,配置一個hibernate.cfg.xml(這個配置文件起到初始化的作用),使得初始化類在插入對象時操作底層數據庫,在后面的具體操作中就不會使用這個配置了,因為引入了Spring,所以這個配置會在Spring的配置文件中實現(xiàn)。
(3)開發(fā)過程
分為幾個小部分:發(fā)射網、廣播電視發(fā)射臺(以下簡稱發(fā)射臺)、廣播電視發(fā)射機(以下簡稱發(fā)射機)、廣播電視發(fā)射信號(以下簡稱信號),分別對這幾個部分進行對應的技術實現(xiàn)。通過接收到發(fā)射網的信號數據,確定發(fā)射網的編號、名稱、地理坐標,因此建表的時候需要對發(fā)射網這些屬性進行描述,將這些屬性封裝到發(fā)射網對象中從而實現(xiàn)在數據庫的存儲、修改、刪除、添加。
項目中新建com.model的包,這個包專門用來存放基本類模型。新建一個發(fā)射網類Station.java,關于發(fā)射網的屬性:station_id序號、addressCode編號、addressName名稱、latitude經度、logitude緯度,這些屬性只屬于發(fā)射網本身,設置為private類型,只能通過方法進行使用,因此要給這些屬性添加getXX和setXX方法。然后,需要有空構造函數和帶參數的構造函數,因為每當要在數據庫中形成一條新紀錄都必須要構造一個新對象。
(4)手動建表并初始化
新建一個初始化包,建立一個InitStation類,因為現(xiàn)在是通過手動操作hibernate,所以需要每一個過程都描述清楚,每次需要對數據庫進行操作的時候都要建立會話工廠,開啟事務,打開事務,然后進行增刪改操作,最后執(zhí)行完后進行事務關閉。
(5)引入Spring框架
經過初始化后,數據庫可以成功連接,現(xiàn)在使用spring來引入Hibernate的操作對象,并由spring管理struts對象,控制邏輯的跳轉。使用Spring來管理生成對象并控制對象與對象之間的關系,對象的產生和屬性設置通過Spring的IOC(控制反轉)和DI(依賴注入)實現(xiàn)。
(6)添加發(fā)射網
采用從前往后的開發(fā)模式,即從頁面->action->service->dao層。
新建add_station.jsp頁面,提交到stationAction中,并且指定為add方法,用的是post方法,表單中使用一系列的input控件標簽,給每個控件一個name。
新建action包,建立一個StationAction.java類。該類繼承自ActionSupport類,這個action要處理前端提交過來的數據信息,用strut可以實現(xiàn)自動獲取客戶端提交的請求對象數據。其實現(xiàn)過程是,根據約定大于配置的規(guī)則,前端頁面中配置的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類的屬性名一致,最起碼類型是一致的,因為,系統(tǒng)的宗旨就是通過操作對象來實現(xiàn)數據的增刪改查,所以添加實現(xiàn)的就是將前端提交的屬性通過set到對象中,將這個對象封裝起來,從而將對象存放到數據庫中去形成一條記錄。
上述添加方法中用到了service層的service對象,因為service層是邏輯業(yè)務層,所有的轉換、業(yè)務邏輯運算等等都是放在這一層的,就是通過在stationAction中引入對Service對象的調用,從而實現(xiàn)業(yè)務運算,所以現(xiàn)在進入到service層,新建service包,建立一個StationService.java類,在這個類中進行一些業(yè)務邏輯的轉換。然而,因為需要在service中建立action中對應的多個方法,需要實現(xiàn)的功能就會很多,所以StationService實際上是個interface,即接口。
新建service接口的實現(xiàn)類,放在ServiceImpl包中,類名StationServiceImpl,并且要實現(xiàn)StationService接口。
上述用到的stationDao對象,是通過StationDao接口得到的,建立dao層的包,其中新建StationDao接口,因為這也是個接口,所以只需要在接口中添加上service實現(xiàn)時用到的方法即可。
建一個dao的實現(xiàn)類的包DaoImpl,新建一個StaionDao的實現(xiàn)類,StationDaoImpl類實現(xiàn)StationDao接口。再建立一個成功添加的頁面,添加一個successs即可。
(7)查詢Station并形成列表
同樣使用從前向后的開發(fā)模式,新建station_list.jsp頁面。以表格顯示出來,表格中用一個iterator的遍歷,將action中封裝的list取出來,這里用到了分頁技術。這里有個注意點,因為現(xiàn)在取的是action中的對象值,而后臺的數據都是放在棧中的,取值的時候可以不用“#”,而如果是取頁面上下文的數據時必須要用“#”。
(8)刪除station數據
同樣使用從前向后的方式,因為在前面使用后面組件中的對象或方法對象時會報錯,從而根據報錯的這個機制在后面組件中對應的地方添加方法的實現(xiàn)即可,這種顯示提示的方式給開發(fā)帶來了很大的便利。
(9)修改Station對象信息
和刪除的方法類似,不需要建頁面,在station_list.jsp中每條數據后面添加修改的超鏈接,超鏈接的請求是stationAction中的update方法。
一個發(fā)射網擁有多個發(fā)射臺,其對應關系是一對多的。發(fā)射臺和station之間存在著聯(lián)系,每一個發(fā)射臺對應在特定的station下面,以station的id為參照線,按照這個參照線進行發(fā)射臺的增、刪、改、查。另外,需要補充的是每個發(fā)射臺有自己的名稱,每個名稱對應到一個編號,于是根據這個編號可以比較方便地進行查找發(fā)射臺的具體信息,因此,發(fā)射臺有名稱和編號兩個屬性以及一個id。
(1)創(chuàng)建發(fā)射臺模型
1)model包中建立Machine類模型;2)Mechine發(fā)射臺的初始化。
(2)添加發(fā)射臺
和添加發(fā)射網一樣采用從前到后的開發(fā)模式,點擊添加發(fā)射臺,跳出添加頁面,add_machine.jsp(新建的頁面,通過表單形式,一系列的input,注意這時候會將父節(jié)點就是Station的id傳過來,因此這個id必須被隱形的傳到action中,用input,只是設置成hidden類型了),輸入發(fā)射臺編碼和名稱即可提交,成功后到數據庫查詢。
(3)查看發(fā)射臺列表
1)添加查看超鏈接,連接到新頁面machine_list.jsp,并且將station_id傳過來,即根據station來查找其下對應的發(fā)射臺;2)新頁面machine_list.jsp,即發(fā)射臺列表,頁面同樣是采用從action中獲取的page對象的list屬性得到machine的每一個屬性并顯示出來;3)machineAction中添加getMachineList方法,同樣給出頁數和條數,并將結果對象返回到前端中;4)MachineService接口中添加getAllStation方法,傳遞頁數和條數;5)MachineDao中添加getAllStationCount和getMachineList方法;6)配置struts請求成功后的跳轉路徑,只需再配置一個result,給出跳轉的頁面machine_list.jsp。
(4)刪除發(fā)射臺
根據列表給出的每一條machine對應的id,從而到后端數據庫中找到相應的對象,然后進行對象的刪除;MachinAction中添加delete方法,調用machineService方法形成對象后刪除;MachineService實現(xiàn)類中先將參數轉型,然后用dao層getMachineById找到對象進行刪除;MachineDao接口中添加deleteMahchine和getMachineById方法;配置struts.xml,同樣是operate_ok.jsp頁面,在數據庫中查詢記錄被刪除即可。
(5)修改發(fā)射臺信息
修改信息的過程基本上同station發(fā)射網信息修改過程,其基本想法就是將原來的屬性數據傳遞到后端,根據給出的父節(jié)點machine_id將父對象找出來,然后形成一個新的空的machine,將新的屬性set到machine中,并set一個新的station父對象給machine,然后在數據庫中把這個對象save到數據庫中。
一個發(fā)射臺內擁有多臺發(fā)射機設備,這些發(fā)射機設備有各種屬性,被各個發(fā)射臺所關聯(lián),一個發(fā)射臺可以控制多臺發(fā)射機。
(1)建立sender模型類;(2)初始化sender;(3)添加設備:頁面中添加超鏈接,action中添加請求添加的方法add,并且action中要注解上@Controller;(4)刪除設備:同上述刪除發(fā)射臺一樣,前端傳來節(jié)點的id,根據這個id找出對應的對象,然后刪除這個對象即可;(5)修改設備信息:將原來信息的值全都傳到后端,然后根據這個id找出對象,給對象重新設置屬性值,再將對象update到數據庫即可[4]。
這里的信號是指分布在廣播電視覆蓋區(qū)內各測試點的接收信號,信號強度即為覆蓋場強。對于信號模塊,開發(fā)過程與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實現(xiàn)類中得以實現(xiàn),再對Dao層方法調用,實現(xiàn)save。
(2)獲取信號列表
獲取信號列表,同樣用的是page對象封裝一切的屬性,包括信號的list,在頁面中取出對應的屬性值即可,action中添加請求的方法,然后在service中處理具體的請求過程,最后由dao層來進行數據的分頁查詢與顯示:
(3)刪除信號
由前端提交過來的id,找出相應id的signal對象,然后將這個對象從數據庫中刪除。
這個模塊是為發(fā)射網的用戶而設計的,主要設計了注冊和登錄功能。創(chuàng)建用戶的模型,用戶的action,service和dao,同樣要進行初始化,驗證連接是否正確。
(1)注冊
register_jsp注冊頁面,以表單方式進行提交,提交至請求userAction的register方法,其實,register就是在做用戶添加功能,在這部分關鍵是只要將屬性封裝到user對象中即可,然后dao層save對象[5]。
(2)登錄
用表單將用戶名和密碼提交至后臺,根據這兩個信息到數據庫中查找是否有這個對象的存在,若有計數大于0,則登錄成功,如果沒有則說明用戶不存在,因此要做的工作是重新注冊然后進行登錄。
(3)查詢信息
通過首頁的導航欄選擇進入查詢程序,可以查看發(fā)射網、發(fā)射臺、發(fā)射機、信號等具體的信息,還能夠通過條件進行查詢。
(4)退出
退出時,只需要將對應鏈接到的請求方法中session失效即可。
每個模塊的管理是建立在上述模塊每個功能實現(xiàn)的基礎上,在后臺通過將這些模塊的增、刪、改、查進行組合。
(1)各模塊管理
各模塊信息添加、刪除、修改、查詢,通過上述模塊的各種操作來實現(xiàn)。
(2)用戶管理
對用戶進行添加、刪除、查詢、列表。
傳統(tǒng)的設計思路是先建立數據存儲的表格,建立數據對象的類模型,通過前端提交過的客戶端請求,調用業(yè)務處理邏輯,從而實現(xiàn)對數據的增、刪、改、查;而該系統(tǒng)中使用三大框架SSH構建了整個流程,省略了先建表的過程,顯得非常清晰,易于讓人接受。其實,不管是用上述兩種方式的哪一種方式進行開發(fā),其實質都是一個就是根據屬性來封裝對象,只不過前者是對數據操作,后者是對對象操作,這是兩者最根本的區(qū)別[6]。使用三大框架、三層架構、面向接口編程和依賴注入技術構建廣播電視發(fā)射網信息管理系統(tǒng),簡單、方便、實用。系統(tǒng)運行正常,數據精確,方便快捷,穩(wěn)定可靠,省時省力,具有很高的推廣價值。