程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Apache Geronimo和Spring框架,第1部分: 開發方法學

Apache Geronimo和Spring框架,第1部分: 開發方法學

編輯:關於JAVA

簡介:Apache Geronimo 最新的 1.1 版具有很多引人注目的新特性,其核心為控制反轉 (Inversion Of Control,IoC) 模型,這個模型也是 Spring 框架的核心模式。Spring 框架是在 Apache 許可協議下 開發的,是一個分層的 Java™ Platform, Enterprise Edition (Java EE) 和 Java 2 Platform, Enterprise Edition (J2EE™) 應用程序框架。Spring 框架構建在 Java EE 應該更易於使用的基 礎上。本系列教程共分為六部分,涵蓋了 Spring 框架從前端到後端的全部內容,包括如何用 Apache Geronimo 實現其功能的內容。本期教程是本系列教程的第 1 部分,將向您介紹 Spring 框架的架構,並 探討了 Geronimo 和 Spring 之間交叉的內容。

開始之前

本系列教程面向的讀者是想深入了解 Spring 框架,並想知道如何在 Apache Geronimo 應用服務器上發揮其強大功能的 Java EE 開發人員。

關於本系列

這個分為六部分的系列教程介紹了 Spring 框架以及如何在 Geronimo 中使用它。 首先,我們將研究不同的 Spring 框架方法學,以及這幾種方法學是如何在 Geronimo server 上工作的 。在本系列教程中,將開發和部署一個個人地址薄應用程序。該應用程序包括下列功能:

顯示地 址薄

顯示每個條目的詳情

給地址薄添加一個新條目

編輯、修改和刪除一個條目

在第 1 部分中,介紹了 Spring 框架的各個模塊,以及各模塊與 Geronimo 應用服務器上 Java EE 應用程序開發工作的關系。還闡述了 Spring 框架所基於的方法學。

第 2 部分回顧了如何在 Geronimo 上使用 Spring 框架構建第一個只有骨架的應用程序。

在 第 3 部分,通過添加由 Apache Derby 數據庫提供的 Java Database Connectivity (JDBC™) 支 持,對第 2 部分的 Geronimo 應用程序進行了擴展。您還將學習如何使用 iBatis 把對象關系映射集成 到這個應用程序中。

在第 4 部分裡,您將接觸到 Spring 面向方面編程(aspect-oriented programming,AOP)和 Spring Web 框架的內容。通過使用 Spring AOP,可把任何由 Spring 框架管理 的對象變成面向方面的。本教程依賴於 Spring AOP 所提供的聲明性事務管理服務。

第 5 部分考察了 Spring 的模型–視圖–控制器 (MVC) 架構。該教程向讀者介紹了 Spring MVC 的 MVC 框架和 Web 視圖,讓讀者對 Spring MVC 有初步的了解。

在本教程結束的第 6 部分,介紹了如何通過 Spring 框架使用 JavaServer Page™(JSP™)、Velocity、Tile 和 PDF 導出功能。您將使用和體驗 Spring MVC 內置的各種 Web 視圖。

關於本教程

Spring 不僅僅是又一個應用程序框架。它納入了經驗豐富的架構師們在應用程序方面的最佳實踐 ,是一個經過深思熟慮精心設計的框架。Rod Johnson 所著的 Expert One-on-One J2EE Design and Development 一書(參見 參考資料 部分的鏈接)中首先介紹了這個框架。對於 Spring 所提供的對象依 賴性、實現和配置特性的分離的重要性,業界並沒有馬上理解和承認,但是,現在這個理念已經得到廣泛 的認可,使 Spring 成為近期最引人注意的框架之一。

如何使各組件去耦是應用程序系統分析員 和開發人員們共同面對的一個棘手問題。許多框架試圖解決這個問題,但都沒有成功。由於 Spring 和 Geronimo 都采用 IoC 作為核心設計模式,所以現在有可能實現這種程度的配置分離。Spring 還簡化了 每個組件的測試。對於用 Spring 框架開發並部署在 Geronimo 上的組件,比較容易進行單獨的測試,因 為這些組件與它可能依賴的組件已經去耦了。

本教程介紹了 Spring 框架的各個模塊,以及各模塊與 Geronimo 應用服務器上 Java EE 應用程序開 發工作的關系,為學習後續教程做准備。

先決條件

本教程假定讀者熟悉面向對象的編程(OOP),並了解 Java EE 的術語。了解面向方面編程則更好, 但不是必需的。

系統要求

為了學習本系列教程,至少需要下列工具:

Spring 框架 —— 您將使用 .zip 文件及其所有依賴項。

Apache Geronimo —— Geronimo 是由 Apache 提供的通過 J2EE 認證的應用服務器。

Apache Derby 數據庫 —— 本教程使用 Derby,這是一個開放源碼的輕量級數據庫。Derby 內嵌在 Geronimo 中,所以不需要另外安裝。

Sun 的 Java 1.4.2

Apache Ant —— 確保已正確安裝和配置 Apache Ant,並保證其 /bin 目錄包括在 Path 系統變量中 。

每個教程中還列出了這個教程需要的其他工具和 API。

Spring 框架和 Apache Geronimo

首先我們來看下 Spring 框架的架構、構成該框架的 7 個模塊以及它們與 Geronimo 的關系。

Spring 框架概述

盡管有其他一些輕量級框架(如 Struts),但這些框架主要面向的是 Web 層。而 Spring 不僅處理 Web 層,還處理業務層的問題,此外,它還具有一些強大的集成選項,可連接到不同的數據庫,如 Derby 。Spring 是一個很全面的框架,包括 MVC 框架、AOP 集成框架、JDBC 框架和對象關系映射(ORM)組件 ,通過這些組件可與諸如 Hibernate 和 Java Data Objects(JDO)之類的工具集成。

Spring 框架包含了許多功能和特性,它們在不同的層實現,各層間清晰地相互隔離。Spring 框架的 分層架構允許您決定需要實現哪些組件。這種結構讓您能夠靈活地在各階段使用 Spring,我們可以使用 一個 Spring 組件,讓它工作,然後再選擇另一個組件。

Spring 架構中包括 7 個組織良好的模塊。這些 Spring 模塊設計在核心容器之上。核心容器的職能 是充當 bean 容器,在運行時創建、管理和設置 bean。如 圖 1 所示。

圖 1. Spring 框架架構

Apache Geronimo 和 Spring

那麼,是什麼讓 Spring 框架可以很好地與 Geronimo 協同工作呢?這兩種技術之所以具有互補性是 由於以下一些事實細節:

Geronimo 和 Spring 框架都允許松散地耦合各種應用程序組件。

二者都使用 IoC(也稱為依賴性注入)來實現這樣的去耦。

二者都沒有試圖重新實現的東西,而是盡可能利用現有的開放源碼 API。

IoC 是一種有助於消除 OOP 組件之間耦合的設計模式。它通過消除某一組件 (X) 對另一組件 (Y) 的 依賴性來實現。實現 IoC 有幾種不同的方法,但基本方式是通過在 X 和 Y 之間引入接口來實現。 Spring 框架容器在運行時管理依賴性解析(dependency resolution)和對象的生命周期。

Spring 核心

Spring 的核心容器是該框架最重要和基本的部分。它提供了 IoC 功能,允許對 bean 容器進行管理 。該核心的一個基本組件是 BeanFactory,這是基本工廠模式的一個實現。它使應用程序的配置和依賴性 規范與實際編程邏輯清晰地分離開。

BeanFactory 接口

org.springframework.beans 包為 Spring 的 IoC 特性提供了基礎。需要考慮的最重要的接口之一是 BeanFactory 接口。通過使用高級配置,它能夠管理任何性質或復雜性的 bean。我們來看看 BeanFactory 的更多細節。

BeanFactory 是創建和管理應用程序所需的大量 bean 的一個容器。這些 bean 的性質可以有很大差 異。有些是只具有基本屬性的簡單 bean;有些則可以與其他 bean 協同工作,所以具有依賴性;還有些 則具有遞歸的依賴性。BeanFactory 通過配置文件來管理這些依賴性。最常用的 BeanFactory 實現是 org.springframework.beans.factory.xml.XmlBeanFactory。在 清單 1 和 清單 2 中列出了構造 BeanFactory 實例的一些例子。

清單 1. 構造一個 BeanFactory 的實例

//Create an XMLBeanFactory by specifying the configuration
// file as a FileSystemResource
Resource resource = new FileSystemResource("beans.xml");
XMLBeanFactory beanFactory = new XMLBeanFactory(resource);

清單 2 顯示了構造一個 BeanFactory 實例的另一種方法。

清單 2. 構造一個 BeanFactory 的實例

//Create an XMLBeanFactory by specifying the configuration
// file as a ClassPathResource
Resource cpResource = new ClassPathResource("beans.xml");
XMLBeanFactory beanFactory = new XMLBeanFactory(cpResource);

BeanFactory 配置中最起碼要包括 BeanFactory 必須管理的一個或多個 bean 的定義。在 XmlBeanFactory 中,它們被配置為在頂級 bean 元素內的一個或多個 bean 元素(參見 清單 3 )。

清單 3. 一個 XmlBeanFactory

<beans>
   <bean id="xxxxxx" class="yyyyyy">
     ...
   </bean>
    ...
</beans>

關於 BeanFactory 還有很多東西需要學習,我們將在本系列教程的後面部分進行討論。

Spring 上下文

Spring 上下文位於核心包之上,它提供了一種以框架風格的方式訪問 bean 的途徑。Spring 上下文提供了對企業服務(如 Java Naming and Directory Interface™ (JNDI)、Enterprise JavaBeans (EJB)、e-mail、驗證、國際化、事件傳播 (event propagation)、資源 加載,以及上下文的透明創建)的支持。

用 ApplicationContext 增強 BeanFactory

如 前一節 中所述,BeanFactory 為應用程序提供了配置框架和基本功能,而 ApplicationContext 則為它 添加了增強功能。由於 ApplicationContext 是 BeanFactory 的子類,所以它具有 BeanFactory 所提供 的所有功能,並向其中添加了許多專有的特性。其中一些專有特性為:

與 Spring AOP 特性輕松 集成。

消息資源處理,用於 i18n(國際化)。

對資源(如 URL 和文件)的訪問。

事件處理和傳播給實現 ApplicationListener 接口的 bean。

透明地創建不同上下文的高 級聲明機制,如可選的父上下文和特定於應用程序層的上下文(例如,WebApplicationContext)。

ApplicationContext 構造是 BeanFactory 的一個完全超集,對 BeanFactory 功能的任何引用也 應該同樣適用於 ApplicationContext。在特定情形下,有時很難明確地決定該使用 BeanFactory 還是 ApplicationContext。由於 ApplicationContext 提供了 BeanFactory 的所有特性,而且在允許以更具 說明性的方式使用一些功能的同時,還為它增加了另外一些特性,所以與 BeanFactory 比較而言,該類 更優越一點。在內存使用問題比較重要的場合,比如對於每千字節(內存)都很重要的 applet,使用 BeanFactory 是一個好的選擇。在本系列教程的第 2 部分,將學習關於 ApplicationContext 的更多知 識,並學習如何定義和使用它。

Spring 面向方面的編程

使用 Spring 的 AOP 軟件包可以直接在 Spring 框架中實現 AOP。該軟件包還帶有一些有利於實現 AOP 的內置方面(bean)。其中比較重要的一個方面是 AOP 對象的事務管理服務。

AOP 簡介

在討論 AOP 之前,我們首先來看一下面向對象的編程。OOP 將應用程序分解為大量互操作的對象。在 這裡,對模塊化因素的考慮主要還是集中在對象上。AOP 通過著眼於方面或關注點(Concern),而不是 對象,擴展了 OOP 的概念。AOP 應用程序按方面或關注點進行分解,否則,一個方面或關注點可能跨越 多個對象。事務和池(pooling) 就是方面(aspect)的例子。

Spring 帶有 AOP 框架

Spring 框架帶有一個專門的、隔離的 AOP 框架 —— 這裡隔離的意思是 Spring IoC 容器並不依賴 於 AOP,它並不要求必須使用 AOP。

Spring AOP 框架中已將一些聲明性中間件服務(即 aspect)打包在內。其中有一個預打包的中間件 服務是聲明性事務管理服務,正如在 EJB 中一樣,它提供了對聲明性事務的控制。在本教程後面的幾節 將對此進行更詳細的討論。

Spring DAO

Spring 的 Data Access Objects (DAO) 軟件包提供了一個 JDBC 抽象層。它還提供了一種更為容易 地管理異常處理和不同數據庫廠商拋出的錯誤碼的手段。另外,JDBC 包還提供了一種執行編程性或聲明 性事務管理的方法,不僅可用於實現特殊接口的類,也可用於所有的傳統 Java 對象 (plain old Java object,POJO)。

Spring 框架的設計使得它可以直接跟一些流行的 ORM API(如 JDO、Hibernate 和 iBatis)集成。

Spring DAO 的特性

Spring DAO 框架的主要目標是讓數據訪問技術(如 JDBC、Hibernate 或 JDO)相關的工作得以標准 化和簡化。如果使用 Spring DAO 框架,從一種數據訪問技術轉移到另一種會變得相當容易。

Spring DAO 框架試圖在以下幾方面實現標准化:

異常層次結構

Spring DAO 框架具有自己的異常層次結構,相比傳統的 SQLException 可提供多得多的信息。這些異 常把底層數據訪問技術拋出的異常包裝起來,以一種標准的和易於理解的格式顯示出來。

DAO 支持抽象類

為了更容易地以一致的方式使用各種數據訪問技術,如 JDBC、JDO 和 Hibernate,Spring 提供了一 組抽象 DAO 類,可以對其進行擴展。這些抽象類具有一些方法,可對數據源和針對當前使用技術的任何 其他配置設定項進行設置。

DAO 支持類包括:

JdbcDaoSupport:JDBC 數據訪問對象的超類。需要設置一個 DataSource,向子類提供一個基於它的 JdbcTemplate。

HibernateDaoSupport:Hibernate 數據訪問對象的超類。需要設置一個 SessionFactory,向子類提 供一個基於它的 HibernateTemplate。

JdoDaoSupport:JDO 數據訪問對象的超類。需要設置一個 PersistenceManagerFactory,向子類提供 一個基於它的 JdoTemplate。

現在讓我們來看一下 Spring 框架如何用 JDBC 來支持數據訪問。

使用 JDBC 的數據訪問

在 Java Platform, Standard Edition (Java SE) 和 Java EE 平台上的應用程序中使用傳統的 JDBC 有很多優缺點。JDBC 具有的一些特點使它的易用性變得差強人意。這些特性包括:

即使對於很簡單的數據庫功能,應用程序開發人員也必須寫很長而乏味的 try-catch 代碼塊。

JDBC 用戶最常見的錯誤是沒有正確地關閉連接。這就會讓許多連接資源無法被其他任務所用。

JDBC 沒有異常層次結構。

JDBC 的 SQLException 過於空泛,無法就出現的問題提供足夠的信息。

Spring 框架中的 JDBC 支持試圖通過一個非常有特色的方式解決這些問題。簡單地說,它將連接管理 功能和其他數據庫相關的資源管理功能進行抽象,不再由開發人員管理,這就使得資源的關閉更加正確, 代碼可讀性也得到了提高。

Spring 所提供的 JDBC 抽象框架包括 4 個不同的包 —— 核心包、數據源包、對象包和支持包。

核心包 包括 JdbcTemplate 類。它采取了 Web 應用程序中最常用的模板模式。JdbcTemplate 類是 JDBC 核心包中最主要的類。

數據源包 包括一個用於簡化 DataSource 訪問的實用工具類。它還包括了各種用於測試數據庫訪問代 碼的 DataSource 實現。

對象包 包括一些類,它們把將關系數據庫管理系統 (RDBMS) 的查詢、更新和存儲過程表示為線程安 全的可重用對象。

支持包 包括許多實用工具類和 SQLException 翻譯功能。

在本系列教程的後面幾個部分,將介紹 Spring 如何使用模板模式來簡化 JDBC 代碼。

Spring ORM

Spring 框架的設計使得它可以直接集成到流行的對象關系映射 API(如 JDO、Hibernate 和 iBatis )中。

使用 Spring ORM 的優點

ORM 工具使開發人員能夠實現面向對象設計的首要原則:封裝。這就讓客戶端可以與一個對象交互, 而不需要知道它的實現細節。Spring 的 IoC 魔法幾乎使這種去耦得以完全實現。這裡我說 “幾乎” 是 因為 Spring ORM 試圖做到這一點,但並沒有完全成功。

不過,Spring 的 ORM 模塊仍然成為分層方法的傑出范例。Spring ORM 支持可以逐步地引入到應用程 序中。這樣做有個好處:可以確保它的實現得到充分的測試。使用 Spring 創建 ORM DAO 的其他好處有 :

易於測試:如前所述,采用 Spring 的 IoC 方法,對於與對象關系有關的不同實體的實現和配置位置 ,可以很容易地進行切換。這樣就很容易隔離地測試每一段與持久性有關的代碼。

通用的數據訪問異常:Spring 可以把您選擇的 ORM 工具拋出的異常包裝為一組易於理解的定義好的 異常。

集成的事務管理:Spring 不僅處理事務語義,對於回滾之類的操作,還完成適當的事務管理工作。該 框架也對異常進行處理。

避免供應商鎖定並允許隨意選用的實現策略:使用 Spring 的去耦方法,就有可能在運行時換用不同 的 API 和實現。因此,你將不會鎖定於使用某個供應商的產品和服務,而是可以根據需要隨意選用。

Spring 方便了資源管理、DAO 實現支持以及與幾種 ORM 工具的事務策略集成,這些 ORM 工具的例子 有:Hibernate、JDO、Oracle Top Link、Apache ObJectRelationalBridge (OJB) 和 iBATIS SQL Maps 。下一節將考察以 Hibernate 為底層 API 時的幾種集成策略。

使用 Spring Hibernate OR Mapper 進行資源管理

正如 JdbcTemplate 處理應用程序中大多數資源管理功能和執行順序一樣,類似地,Spring 提供了一 個 HibernateTemplate 和 HibernateCallback,以便能與底層數據訪問技術和事務技術實現清晰地隔離 ,從而使應用程序對象之間的耦合變得更為松散。

為了避免應用程序對象與資源查找表緊密地關聯起來,Spring 中允許把像 JDBC DataSource 或 Hibernate SessionFactory 這樣的資源定義為一個應用程序中上下文中的 bean。需要訪問資源的應用程 序對象只是通過對 bean 的引用來接受對這類預定義實例的引用。清單 4 顯示了如何構造一個 JDBC DataSource,並在其上構造一個 Hibernate SessionFactory。

清單 4. 構造一個 JDBC DataSource,並在其上構造一個 Hibernate SessionFactory

<beans>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy- method="close">
|-------10--------20--------30--------40--------50--------60--------70--------80-------- 9|
|-------- XML error: The previous line is longer than the max of 90  characters ---------|
<property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
<property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
<property name="username" value="XXXX"/>
<property name="password" value="YYYY"/>
</bean>

<bean id="mySessionFactory"
  class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="mappingResources">
<list>
<value>product.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
net.sf.hibernate.dialect.MySQLDialect 
</prop>
</props>
</property>
</bean>
...
</beans>

DAO 實現支持

請看一個演示基本模板編程模型的示例。應用程序對象的實現只需要有一個 Hibernate SessionFactory,它可以通過 Spring 應用程序上下文的一個簡單 bean 引用來提供。清單 5 顯示了在 Spring 應用程序上下文中定義一個 DAO,其中引用了前面定義的 SessionFactory。

清單 5. 在 Spring 應用程序上下文中定義 DAO

<beans>
...
<bean id="employeeDao" class="emp.EmployeeDaoImpl">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
</beans>

清單 6 顯示了 DAO 方法實現的一個示例

清單 6. DAO 方法實現的示例

public class EmployeeDaoImpl implements EmployeeDao {

private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}

public Collection loadEmployeesByDepartment(final String department)
  throws DataAccessException
{
HibernateTemplate ht = new HibernateTemplate(this.sessionFactory);

return (Collection) ht.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery(
"from test.Employee employee where employee.department=?");
query.setString(0, department);
return query.list();
}
});
}

}

對於任何 Hibernate 數據訪問,都可以有效地采用回調(函數)實現。HibernateTemplate 確保會話 可以正確地打開和關閉,並自動地參與事務。模板實例具有線程安全性和可重用性,所以在使用它的類中 可以作為實例變量保存。

事務策略

Spring 事務抽象的關鍵在於事務策略的概念。可以通過 org.springframework.transaction.PlatformTransactionManager 接口捕獲它。清單 7 顯示了使用事務 策略的一個簡單示例。

清單 7. 演示 PlatformTransactionManager 用法的示例

public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionException;

void commit(TransactionStatus status) throws TransactionException;

void rollback(TransactionStatus status) throws TransactionException;
}

在本系列教程的第 4 部分,將學習關於不同事務策略的更多內容。

Spring Web Flow (SWF)

Spring Web Flow 模塊提供了幾個面向 Web 的集成特性。它通過聲明幫助定義了 Web 應用程序的流 (flow)。同時,它還提供了其他特性,例如多部分功能(multipart functionality)、利用 servlet 偵聽器的上下文初始化,以及面向 Web 的應用程序上下文。當與 WebWork 或 Struts 一起使用 Spring 時,這個包就是可用來與它們集成的包。

選擇合適的工作流

多數人可能都曾在定義 Web 應用程序工作流時碰到過困難。隨著復雜步驟越來越多,情形會變得更為 麻煩。許多 Web 應用程序中包括一大堆復雜的浏覽操作,其中用戶可以自由地在頁面間導航。當用戶決 定采取某些行動時,則使用受控的導航,引導用戶通過一系列的步驟達成其業務目標。

假設有個貸款申請站點的例子。它允許用戶在提供各種不同的貸款選項細節的頁面間自由導航。這是 一個很好的自由浏覽 用例。但是,如果用戶選擇一個選項決定申請一筆貸款,就開始受控的工作流 —— 貸款申請流程。這個是一個受控導航或受控浏覽的例子。

對於這種受控的導航,或稱流,傳統的建模方法無法將流作為一個最高級的概念來建模和實現。SWF 是 Spring 框架的分層架構中一個定義良好的組件,它以高效和功能強大的方式解決了這個問題。

遵循 Spring 框架的模型,SWF 也被設計為一個自包含的模塊。它的流引擎對第三方 API 的依賴性非 常小,而且所有的依賴性都得到仔細的管理。SWF 讓您清楚簡單地顯示 Web 應用程序的頁面流,並可以 任何地方重用它,包括像 Struts、Spring MVC、Tapestry、JavaServer Faces (JSF) ,甚至是 portlet 這樣的環境。

SWF 的優點

SWF 的優點有:

SWF 是一個自包含的模塊,這樣就可以設計出可重用的 Web 流,把它用於類似的場合。

SWF 易於使用,這是因為它具有定義良好的構造。它具有清晰、可配置的生命周期,由容器自動進行 管理。

通過查看相應的 Web 流定義(在一個 .xml 或 Java 類中),可以清楚地看到 Web 應用程序中的頁 面流。

如前所述,SWF 可以很容易地插入到其他框架中去。

簡言之,SWF 是一個基於有限狀態機的功能強大的控制器,它完全解決了 MVC 結構中 “C” 的問題 。在本系列教程將來的幾部分中將學習關於 SWF 的更多知識。

Spring Web MVC

Spring 的 Web MVC 包提供了模型-視圖-控制器(MVC)的實現。Spring 的 MVC 實現不僅僅是一個普 通的實現 —— 它在域建模代碼和 Web 表單之間實現了清晰的分離,還允許使用 Spring 框架所有的其 他特性,如驗證。

MVC 架構

對於基於 Web 的應用程序,MVC 架構是一種廣泛采用的架構方案。它把應用程序分割為模型、視圖和 控制器這三個層,並使它們相應的職能去耦。每個層處理特定的任務,並具有針對其他層的特定職能。

簡言之,模型表示業務數據和業務邏輯。視圖顯示模型的內容,它從模型那裡獲得數據,並指定如何 顯示這些數據。它分派用戶的請求,並選擇合適的視圖來顯示數據。

Spring 框架為構建 Web 應用程序提供了一個深思熟慮的 MVC 框架。Spring 的 MVC Web 應用程序框 架構建在核心功能之上。它是一個與 Struts 類似的基於請求的框架,但試圖解決 Struts 所暴露出來的 缺陷。對於現代基於請求的框架必須處理的所有職能,Spring MVC 框架定義了不同的策略接口。這些接 口的職能都很簡單和清楚,所以,Spring MVC 用戶可以很容易地編寫自己的實現。

Spring 的 Web MVC 框架是圍繞 DispatcherServlet 設計的,這個組件具有前端控制器的職能,在 HTTP 請求的執行階段,它負責把控制委派給各個接口。默認處理器是一個非常簡單的控制器接口,它只 有一個方法:ModelAndView handleRequest(request, response)。

下面是 Spring MVC 定義的最重要的接口:

HandlerMappings:通過使用處理程序映射,可以把傳入的請求映射到適當的處理程序。Spring MVC 還提供了一組前置和後置處理器和控制器,它們在特定條件下執行,例如匹配指定的 URL 和控制器。

HandlerAdapater:運行一個適當的對象來處理收到的請求。

Controller(s):這些 bean 提供處理傳入請求的實際功能,也就是 MVC 中的 “C”。

View Resolver:能夠把視圖名解析為視圖。

Locale Resolver:能夠解析客戶機用於 i18n 支持的區域。

Theme Resolver:如果應用程序提供基於主題的個性化視圖,該對象可以解析這些主題。

Multipart Resolver:提供了處理 HTML 表單的多部分文件上載的功能。

Spring MVC 所提供的高度抽象最重要的優點之一是:測試這些接口和整個應用程序的實現變得非常容 易。DispatcherServlet 的設計允許開發人員以一種簡單而一致的方式按照 Spring IoC 模型來配置應用 程序的 Web 層。

在本系列教程的第 6 部分,將學習關於 Spring 的更多內容。

結束語

Spring 是一個功能強大的框架,它試圖解決 J2EE 和 Java EE 開發中存在的普遍問題。它還非常靈 活,可用於 J2EE 和 Java EE 之外的環境。它的目標是讓大家記住面向對象編程中正確的做法:使用接 口來設計應用程序。

本系列教程共分為六部分,本文是第一部分,概要介紹了功能強大的 Spring 框架以及它如何試圖解 決 J2EE 和 Java EE 開發中存要的普遍問題。現在讀者應該已了解 Spring 的 7 個模塊以及它們的方法 。請准備好閱讀第 2 部分,在這一部分中將介紹一個個人地址薄應用程序,該應用程序在整個系列教程 中都被用作樣例。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved