崔 荔, 邵春暉, 崔 磊
(1.長安大學 信息工程學院,陜西 西安 710064;2.西北大學 信息學院,陜西 西安 710064)
隨著計算機技術、網絡技術、通信技術的迅速發展和人們生活水平及需求的不斷提高,目前,網絡正以一種前所未有的沖擊力在影響著人類的活動,包括人類的生產和日常生活。網絡的快速發展,顛覆了傳統的信息傳播方式,沖破了傳統的時間,空間的局限性。極大的改變了人類的物質文化生活水品。新聞發布系統由此應運而生,更大加快了人們信息的接收速度。
針對新聞發布系統的發展現狀,文中提出了一種基于J2EE平臺的新聞發布系統,在本系統中,利用MVC設計模式,采用struts框架和hibernate框架的整合來進行軟件開發,通過兩個框架的整合設計,可以給程序帶來開發靈活、層次清晰、低耦合、后期易維護的好處。
J2EE是Java2平臺企業版,它的核心是一組技術規范與指南,其中所包含的各類組件、服務架構及技術層次,均有共同的標準及規格,讓各種依循J2EE架構的不同平臺之間,存在良好的兼容性,解決過去企業后端使用的信息產品彼此之間無法兼容,企業內部或外部難以互通的窘境[1]。
基于JAVA的動態Web開發有兩種常用的開發模型:Model1和 Model2。
在Model1模式下,整個Web應用幾乎全部由JSP頁面組成,JSP頁面接收處理客戶端請求,對請求處理后直接做出響應,用少量的JavaBean來處理數據庫連接、訪問等操作。Model1模式的實現比較簡單,適用于快速開發小規模項目,但從工程化的角度看,它的局限性非常明顯:JSP頁面身兼View和Controller兩種角色,將控制邏輯和表現邏輯混雜在一起,從而導致代碼的重用性非常低,給應用的可擴展性和可維護性增加了難度。
Model2模式實現了業務邏輯、顯示邏輯和控制邏輯的分離,即是基于MVC的框架。MVC框架也就是模型-視圖-控制器(Model-View-Controller)設計模式。其中 M代表Model,V代表View,C代表Controller。MVC設計模式的目的是增加代碼的可重用性,減少數據描述和應用操作的可耦合度,并提高代碼的可讀性。同時,也可提高系統的可維護性、可擴展性、靈活性以及封裝性。
Struts框架[2]其實是 MVC設計模式在 J2EE Web組件技術上的具體應用,在該框架中,主要是利用MVC設計模式中的模型(M)、視圖(V)、控制器(C)3 種不同形式的組件來構建具體的Web應用系統。其中,模型組件由JavaBean承擔,完成業務邏輯和數據處理等方面功能;視圖組件由JSP頁面承擔,完成展現前臺界面數據的功能;控制器組件由Struts的Action類承擔,完成視圖組件與模型組件的交互功能。
對于J2EE應用而言,不可避免的涉及數據庫的訪問操作,而目前的企業應用系統開發中所使用的數據庫大部分都是關系型數據庫,在傳統的Web應用開發中,直接使用JDBC與數據庫交互,需要編寫大量的SQL語句,修改維護都很不方便,而且破壞了Java的面向對象設計思想,因此需要一種對象與關系型數據庫之間的映射機制,以便后期在修改業務邏輯時是修改映射文件而不是Java代碼。Hibernate[3]作為目前流行的對象關系映射(Object/Relation Mapping,ORM)框架,對JDBC進行了輕量級的對象封裝,使得我們可以以面向對象的思想來操縱數據庫,Hibernate可以應用在任何使用JDBC的場合,因此從某種意義上說,Hibernate不僅能夠取代JDBC,而且還進一步完善和擴展了JDBC的功能。
MySQL[4]是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。MySQL使用的是結構化查詢語言 (SQL),SQL是用于訪問數據庫的最常用標準化語言。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站數據庫。
新聞發布系統[5]是將新聞、信息欄目和業界動態等信息集中起來發布、管理、查詢等的一種網站應用程序。網站內容通過后臺界面加入數據庫,然后通過已有的網頁模板格式發布到網站前臺界面上。
系統從邏輯上可分為兩大模塊:前臺新聞瀏覽模塊和后臺新聞管理模塊[6]。前臺新聞瀏覽模塊包含用戶登錄、新聞主頁、新聞瀏覽、新聞訪問統計4個子模塊。后臺新聞管理模塊包含用戶管理、新聞類型管理、新聞信息管理3個子模塊。系統體系結構圖如圖1所示。

圖1 系統體系結構圖Fig.1 System structure
考慮到新聞發布系統后期的可維護性與可擴展性,使用Struts與Hibernate框架整合開發能很好的降低程序的耦合性[7]。系統總體上可分為以下5個層次:
1)客戶層:運行于客戶機器上的瀏覽器,處理與用戶的交互;
2)視圖層:視圖是應用程序的用戶界面,實現模塊的外觀,它是應用程序的外觀表現,可以訪問業務邏輯層的數據,而不必關心業務邏輯和控制器的具體情況。它只是作為用戶輸入數據并進行操作的方式和界面。整個視圖層建立在Struts框架基礎上,其中Model(模型組件)交由業務邏輯層實現,View(視圖組件)由JSP頁面組成,Controller(控制器組件)則由Action類與Struts的配置文件struts.xml組成。
3)業務邏輯層:完成系統所需的業務,為視圖層提供所需要的業務方法,由JavaBean等構成。由于模型與數據的格式無關,因此一個模型可以為多個視圖提供數據,從而增強代碼的可重用性。
4)數據持久層:由 Hibernate組成,Hibernate從數據庫層中獲取數據,然后生成持久對象(Persistent Object,PO),再把PO傳給業務邏輯層。
5)數據庫層:存放新聞發布系統相關信息數據。
Struts框架是一個基于 Model-View-Controller(MVC)設計模式的應用框架,它將頁面顯示、業務邏輯處理和數據處理功能在邏輯上分離,從而降低了耦合度。Struts繼承了MVC的各項特性,并根據J2EE的特點,做了相應的變化與擴展。本系統的表現層由Struts框架實現,通過配置文件struts.xml將模型、視圖、控制器各組件聯系起來。控制器負責應用程序的調度,它負責接收從視圖層傳來的客戶請求,然后通過配置文件將不同的請求交予不同的模型去處理,同時將相關數據傳遞到模型層,模型層對數據處理完畢之后再返回給控制器,控制器將獲得的數據轉發給視圖層,最終由視圖層經過瀏覽器的解析把數據呈獻給客戶。
以保存新聞操作為例,struts.xml的業務邏輯代碼如下:
當管理員在瀏覽器中點擊保存新聞后,該JSP頁面會提交一個名為save的請求,struts框架會在struts.xml配置文件中尋找對應的action name,找到后在NewsAction類中找到save方法。save方法進行數據持久化操作后,返回字符串為success時(新聞保存成功),瀏覽器跳轉到success.jsp頁面,返回字符串為error時 (新聞保存失敗),瀏覽器則跳轉到error.jsp頁面。
基于Hibernate框架構建的數據持久層需要創建數據訪問對象(DAO)、值對象(VO)、和 Hibernate Mappings映射文件。其中每個VO封裝了持久層對象的數據,對應于數據庫中的一張表,由一些屬性及對應的getter/setter方法組成;DAO用于持久化VO,每個DAO類均定義了查詢、插入、更新、刪除等數據庫操作的基本方法;Hibernate Mappings映射文件告訴Hibernate怎樣把對象持久化到關系數據庫中。
以持久化新聞操作為例,將一條新聞保存在數據庫中需要以下4個步驟:
1)配置 hibernate.cfg.xml文件
在hibernate的配置文件中定義連接數據庫的相關信息,部分代碼如下所示:
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/cms
123456
org.hibernate.dialect.MySQLDialect
……
2)定義映射文件News.hbm.xml
每個持久化類都要有與之對應的映射文件,映射文件名為“類名.hbm.xml”,這個映射文件定義O/R映射的規則。例如持久化類News包含title、content、click 3個屬性,其對應的映射文件News.hbm.xml包含了OR映射所需的元數據,元數據中 包含了持久化類的聲明,以及類中各屬性到數據庫表各字段的映射關系,部分代碼如下所示:
3)定義持久化類News.java:
持久化類是指需要被hibernate持久化到數據庫中的類,持久對象是一個普通的JavaBean,部分代碼如下所示:
public class News{
private int id;//新聞編號
private String title;//新聞標題
private String content;//新聞內容
private int click;//新聞點擊次數
public String getId() {return id;}
public void setId(int id) {this.id=id;}
public String getTitle() {return title;}
public void setTitle(String title) {this.title=title;}
public String getContent() {return content;}
public void setContent (String content) {this.content=content;}
public int getClick() {return click;}
public void setClick(int click) {this.click=click;}
}
4)定義持久化操作類NewsDAO.java
Hibernate為Java程序員提供了面向對象的API和接口來操縱數據庫,從而避免了在業務邏輯中嵌入大量的JDBC訪問和事物控制代碼。在開發中通常利用Configuration、SessionFactory、Session、Transaction、Query 這 5 個核心接口對持久 化對象進行存儲和事務控制,部分代碼如下所示:
public class NewsDAO{
public void save(){
Configuration cfg=new Configuration ();//配 置 和 啟 動Hibernate
SessionFactory sf=cfg.configure().buildSessionFactory();//初始化 Hibernate
Session session=sf.getCurrentSession();//創建 session 實例
session.beginTransaction();//事物開始
session.save(news);//保存持久化對象
session.getTransaction().commit();//事務提交
}
}
文中分析了Struts和Hibernate框架實現的原理,結合新聞發布系統提出了一種基于MVC設計模式的Struts與Hibernate整合使用的Web應用系統,著重介紹了框架模型主要層次的技術實現。通過將兩種技術結合起來開發J2EE應用,能極大地提高開發效率,使系統更加具有靈活性。
[1]白勝普.J2EE企業級應用測試實踐[M].北京:清華大學出版社,2009.
[2]孫衛琴.精通Struts基于MVC的Web設計與開發[M].北京:電子工業出版社,2004.
[3]王國輝,馬文強.Hibernate應用開發完全手冊[M].北京:人民郵電出版社,2007.
[4]李立功,趙揚.MySQL程序設計與數據庫管理[M].北京:科學出版社,2001.
[5]茹蓓,張磊.新聞信息發布管理系統的現狀及改進[J].平原大學學報,2004(6):60-61.RU Bei,ZHANG Lei.The current situation and improving of the news announcing and managing system[J].Journal of Pingyuan University,2004(6):60-61.
[6]韓霄.基于J2EE的新聞發布系統的分析與設計[J].網絡安全技術與應用,2011(10):61-63.HAN Xiao.Analysis and design of News Releases system based on J2EE[J].Network Security,2011(10):61-63.
[7]董袁泉.基于Hibernate和 Struts框架的J2EE應用開發[J].沙洲職業工學院學報,2011(3):10-13.DONG Yuan-quan.J2EE Application and development based on the hibernate and struts framework[J].Journal of Shazhou Professional Institute of Technology,2011(3):10-13.