引言
隨著Java技術的逐漸成熟與完善,作為建立企業級應用的標准平台,J2EE平台得到了長足的發展。借助於J2EE規范中包含的多項技術:Enterprise JavaBean(EJB)、Java Servlets(Servlet)、Java Server Pages(JSP)、Java Message Service(JMS)等,開發出了許多應用系統。但是,在傳統J2EE應用的開發過程中也出現了一些問題:1)數據模型和邏輯模型之間的矛盾。目前使用的數據庫基本上都是關系型數據庫,而Java本質上是一種面向對象的語言,對象在存儲和讀取時使用SQL和JDBC進行數據庫操作,降低了編程的效率以及系統的可維護性;2)傳統的J2EE應用多采用基於EJB的重量級框架,這種框架適合於開發大型企業應用,但是使用EJB容器進行開發和調試需要耗費大量時間。為了降低代碼的耦合性,提高系統的開發效率,本文提出了一種基於Struts框架和Hibernate框架的J2EE應用開發策略。
數據持久層及Hibernate
Hibernate是一個數據持久層框架,是一種實現對象和關系之間映射(O/R Mapping)的工具,它對JDBC進行了輕量級的對象封裝,使程序員可以使用對象編程思想來操作數據庫。它不僅提供了從Java類到數據表的映射,也提供了數據查詢和恢復機制。相對於使用JDBC和SQL來操作數據庫,使用Hibernate能大大的提高實現的效率。Hibernate框架用配置文件的形式來定義Java對象和數據表之間的映射關系,同時在更深的層面將數據表之間的關系解釋為Java對象之間的繼承及包含等關系。通過使用HQL語句將復雜的關系算法用對象的方式描述,在很大程度上簡化了對數據的查詢,加快了開發的效率。在Hibernate中有一個簡單而直觀的API,用於對數據庫所表示的對象執行查詢。要創建或修改這些對象,只需在程序中與它們進行交互,然後告訴Hibernate保存即可。這樣,大量封裝持久化操作的業務邏輯不再需要編寫煩瑣的JDBC語句,從而使數據持久層得到了極大的簡化。
用Struts實現MVC架構
MVC(Model-View-Controller)由Trygve Reenskaug提出,首先被應用在SmallTalk-80環境中,是許多交互和界面系統的構成基礎。根據界面設計可變性的需求,MVC把交互系統的組成分解成模型、視圖、控制器三部分。
模型(Model)是軟件所處理問題邏輯在獨立於外在顯示內容和形式情況下的內在抽象,封裝了問題的核心數據、邏輯和功能的計算關系,獨立於具體的界面表達和I/O操作。視圖(View)把表示模型數據及邏輯關系和狀態的信息及特定形式展示給用戶。它從模型獲得顯示信息,對於相同的信息可以有多個不同的顯示形式或視圖。控制器(Controller)是處理用戶與軟件的交互操作的,其職責是控制提供模型中任何變化的傳播,確保用戶界面於模型間的對應聯系;它接受用戶的輸入,將輸入反饋給模型,進而實現對模型的計算控制,是使模型和視圖協調工作的部件。通常一個視圖對應一個控制器。模型、視圖與控制器的分離,使得一個模型可以具有多個顯示視圖。如果用戶通過某個視圖的控制器改變了模型的數據,所有其它依賴於這些數據的視圖都應反映到這些變化。因此,無論何時發生了何種數據變化,控制器都會將變化通知所有的視圖,導致顯示的更新。這實際上是一種模型的變化-傳播機制。
Struts框架最早是作為Apache Jakarta項目的組成部分問世運做,它繼承了MVC的各項特性,並根據J2EE的特點,做了相應的變化與擴展。Struts框架很好的結合了Jsp,Java Servlet,Java Bean,Taglib等技術。在Struts中,承擔MVC中控制器角色的是ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發送到Struts的HTTP請求的入口點。它截取和分發這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數填充Action Form(FromBean),並傳給動作類(ActionBean)。動作類訪問核心商業邏輯,即訪問Java Bean或調用EJB。最後動作類把控制權傳給後續的JSP文件,由JSP文件生成視圖。所有這些控制邏輯利用Struts-config.xml文件來配置。在Struts框架中,視圖主要由JSP生成頁面完成,Struts提供豐富的JSP標簽庫,這有利於分開表現邏輯和程序邏輯。模型以一個或多個Java Bean的形式存在。在Struts中,主要存在三種Bean,分別是:Action,ActionForm,EJB或者Java Bean。
Struts框架沒有具體定義模型層的實現,在實際開發中,模型層通常是和業務邏輯緊密相連的,並且要對底層數據進行操作。下面介紹一種開發策略,將Hibernate引入到Struts框架的模型層中,使用它來進行數據封裝和映射,提供持久化的支持。
運用Hibernate和Struts開發J2EE應用
1、體系結構
圖3顯示了基於Hibernate和Struts開發策略的體系結構圖。
2、開發實踐
下面結合開發實踐,以在J2EE應用中非常普遍的用戶登錄過程為例,來說明上述體系結構是如何具體運用的。登錄的流程非常清晰:用戶從登錄頁面login.jsp輸入登錄信息,系統對登錄信息進行驗證,如果正確則成功登錄,否則提示相應錯誤信息。
在開發過程中,使用Eclipse做為開發環境,同時加載了對Struts及Hibernate提供更好的控制和支持的第三方插件MyEclipse,Web服務器使用Tomcat,數據庫選用了Mysql。
首先對Hibernate進行配置,只需要對系統自動生成的hibernate.cfg.xml進行修改,配置好數據庫連接的各種參數以及定義數據映射文件。由於Hibernate所帶的連接池主要用於測試,性能不是很好,可以通過JNDI將其修改為使用Tomcat的連接池。配置文件代碼中關鍵的一部分如下:
<hibernate-configuration><session-factory>
<property name="connection.datasource">java:comp/env/jdbc/ sysdb </property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect </property>
<mapping resource="User.hbm.xml"/>
</session-factory></hibernate-configuration>
其次是生成持久化類,實際上,由於使用了Hibernate,持久化類以及對持久化對象的映射定義均可以借助於系統中的向導自動生成。持久化對象的映射定義放到了User.hbm.xml中。部分代碼如下:
<class name="User" table="tUser">
<id name="UserID" column="User_ID" type="java.lang.Integer">
<generator class="native"></id>
<property name="UserName" column="User_Name" type="java.lang.String">
…..</class>
再次,使用Struts框架來實現邏輯控制,利用系統提供的向導可以生成視圖及控制器。具體的配置在Struts-config.xml文件中。相關代碼如下:
<form-beans><form bean name="LoginForm" type="com.LoginForm"></form-beans>
<action-mappings><action attribute="LoginForm" input="Login.jsp" path="/DoLogin"
….</action></action-mappings>
輸入頁面Login.jsp將用戶填寫的登錄信息提交給控制器DoLogin進行處理,控制器調用由Hibernate定義好的持久化類User從數據庫中讀取相應信息進行驗證。操作完成後將提示信息展示在表示層中。DoLogin中使用語句User u1=UserDAO.findbyname(username)得到User對象,然後就可以進行登錄信息的驗證。
從整個開發過程可以看出,程序員除了利用向導對有關的配置文件進行修改,只須編寫少量代碼即可完成登錄模塊的編碼。開發完成的模塊符合MVC框架的要求,質量比較高,易於修改和維護。
總結與展望
Hibernate是一個功能強大、高性能、非常流行的ORM工具,它推動了基於普通Java對象模型、用於映射底層數據結構的持久對象的開發,能夠提供高級數據查詢和檢索服務。Struts是一個優秀的基於J2EE平台的MVC框架,它簡化了WEB層的開發,實現了應用程序的顯示邏輯和業務邏輯的分離。將這兩種技術結合起來開發J2EE應用,能極大的提高開發效率,使系統具有更好的可維護性和可擴展性。這種開發策略正逐漸被眾多程序員所接受,在實際開發中得到廣泛的應用。