使用 SpringSource Slices 構建模組化 Web 應用程式

工程 | Rob Harrop | 2009年6月22日 | ...

更新:添加了 Git 子模組說明。

我過去曾談到為真正的模組化應用程式提供支援,我很高興地宣佈,您現在可以訪問 SpringSource Slices 的早期原型程式碼。

構建和安裝

您可以從我們的 Git 倉庫訪問原始碼

git clone git://git.springsource.org/slices/slices.git
git submodule init
git submodule update

要構建 Slices 的打包版本,只需在 build-slices 目錄中執行 ant clean jar package

cd slices/build-slices
ant clean jar package

這將在 target/artifacts 中生成一個 zip 檔案,其中包含 Slices 子系統,然後可以將其安裝到 dm Server 2.0 上

安裝 Slices 只是將新的子系統新增到 dm Server,然後更新 dmServer 的配置檔案以啟動新的子系統。Slices 應該適用於任何最新的 dm Server 2.0 快照版本。我這裡使用的是 2.0.0.CI-R326-B274,我已經下載並解壓縮到我的桌面

 unzip target/artifacts/springsource-slices-BUILD-20090622083953.zip -d ~/Desktop/springsource-dm-server-2.0.0.CI-R326-B274

接下來,必須更新 dm Server 的 kernel.properties 配置以包含新的 slices 子系統。開啟 dm Server 安裝的 config/kernel.properties 檔案,並編輯配置檔案配置部分以列出 slices 子系統併為配置檔案指定一個合適的名稱(我將其命名為 slices)

#######################
# Profile Configuration
#######################
profile.name=slices
profile.subsystems=	com.springsource.server.web,com.springsource.osgi.slices
profile.optionalSubsystems=

儲存更新後的檔案,你就可以嘗試 Slices 示例應用程式了。

試用示例應用程式

Slices 倉庫包含一個 Spring 3 PetClinic 示例版本,我們隨著 Slices 新功能的增加不斷地對其進行增強和改進。

在使用示例之前,必須將其依賴項新增到 dm Server 安裝中。依賴項列在示例的 dependencies.txt 檔案中。將列出的每個依賴項下載到安裝的 repository/bundles/usr 目錄。接下來,使用 -clean 啟動選項啟動 dm Server

./bin/startup.sh -clean

現在是構建和部署示例的時候了。進入 slices/samples/slices-petclinic/com.springsource.slices.petclinic.host 目錄並執行 ant clean jar

cd samples/slices-petclinic/com.springsource.slices.petclinic.host
ant clean jar

然後可以透過將生成的 war 包複製到 dm Server 的 pickup 目錄來部署主機

 cp target/artifacts/com.springsource.slices.petclinic.host.war ~/Desktop/springsource-dm-server-2.0.0.CI-R326-B274/pickup/

現在應該可以從 https://:8080/petclinic 訪問主機了

petclinic-no-slices

接下來,進入 slices/samples/slices-petclinic/com.springsource.slices.petclinic.appointments 目錄並執行 ant clean jar 來構建 appointments slice

cd samples/slices-petclinic/com.springsource.slices.petclinic.appointments
ant clean jar

現在可以透過將生成的 war 包複製到 dm Server 的 pickup 目錄來部署 slice

cp target/artifacts/com.springsource.slices.petclinic.appointments.war  ~/Desktop/springsource-dm-server-2.0.0.CI-R326-B274/pickup/

重新整理 https://:8080/petclinic,它現在將反映 appointments slice 的存在,並帶有一個新的 Appointments 連結

petclinic-appointments-slice

如果您願意,現在可以從 pickup 目錄中刪除 appointments war 包,以檢視 slice 再次消失。

Slices 應用程式的剖析

使用 Slices,您可以從多個 OSGi 捆綁包構建一個 Web 應用程式,每個捆綁包都為應用程式 URL 空間的獨立子部分提供內容。Slices 應用程式以父/子結構排列,每個應用程式最多有一個父級(稱為主機),以及零個或多個子級(稱為 slices)。我們正在開發一個簡單的 Slices 示例,它看起來像這樣

slice-anatomy

主機內部

petclinic.host 捆綁包包含所有共享內容,例如影像和 CSS,以及用於提供主頁的控制器和 JSP。主機捆綁包只是一個符合 RFC66 規範的 Web 捆綁包,在其 web.xml 中配置了 SliceHostFilter。下面的程式碼片段顯示了來自 petclinic.host 捆綁包的 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
    <filter>
    	<filter-name>host-filter</filter-name>
    	<filter-class>com.springsource.osgi.slices.core.SliceHostFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>host-filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

	<!-- Enables clean URLs with JSP views e.g. /welcome instead of /app/welcome -->
	<filter>
		<filter-name>UrlRewriteFilter</filter-name>
		<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>UrlRewriteFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
		
	<!-- Handles all requests into the application -->
	<servlet>
		<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
				/WEB-INF/spring/*.xml
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<!-- Maps all /app requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
		<url-pattern>/app/*</url-pattern>
	</servlet-mapping>

  	<!-- Serves static resource content from the webapp root & .jar files such as spring-js.jar -->
	<servlet>
		<servlet-name>Resources Servlet</servlet-name>
		<servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
		<load-on-startup>0</load-on-startup>
	</servlet>
		
	<!-- Map all /resources requests to the Resource Servlet for handling -->
	<servlet-mapping>
		<servlet-name>Resources Servlet</servlet-name>
		<url-pattern>/resources/*</url-pattern>
	</servlet-mapping>	
	
</web-app>

正如您所看到的,主機可以有任何正常的 servlet 和過濾器對映,但它需要 SliceHostFilter 才能將請求路由到其 slices。

Slice 內部

slice 是一個捆綁包,其外觀和功能類似於標準 RFC66 Web 捆綁包,只不過它沒有自己的 ServletContext。相反,slice 在其主機的 ServletContext 下執行。

Slices 的主要設計目標之一是確保 slice 開發與標準 Web 應用程式開發儘可能相似。為此,您可以使用 web.xml 以與為任何應用程式建立 Web 內容完全相同的方式建立 slice Web 內容。這是來自 petclinic.appointments 捆綁包的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- Handles all requests into the application -->
	<servlet>
		<servlet-name>appointments</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>		
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<!-- Maps all /app requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>appointments</servlet-name>
		<url-pattern>/app/*</url-pattern>
	</servlet-mapping>
	
</web-app>

appointments slice 只是委託給 Spring DispatcherServlet。Spring MVC 可以在 slice 中正常使用。

slice 可以透過簡單地引用 slice 本身不存在的資源名稱來訪問主機捆綁包中的資源。如果 slice 想要訪問主機中的資源,即使它自己有一個同名資源,它也可以使用 host: 字首來訪問

ServletContext context =  getServletContext();
context.getResource("host:/WEB-INF/some.config.xml");

slice 需要定義它想要附加到的主機,並使用 Slice-Host 清單頭來完成。 Slice-ContextPath 頭定義了 slice 處理的 URL 部分

Bundle-SymbolicName: petclininc.appointments
Slice-Host: petclinic.host;version="[1.0, 2.0)"
Slice-ContextPath: /appointments

Slice 生命週期

主機可以在沒有附加任何相應 slice 的情況下執行。當與主機匹配的 slice 安裝到伺服器中時,該 slice 將附加到主機。此時,與新附加的 slice 的 Slice-ContextPath 匹配的主機 URL 部分的子部分將路由到該 slice。

當 slice 被解除安裝時,路由到 slice 的 URL 空間部分現在將直接路由到主機。透過這種方式,您可以在主機中建立內容來處理缺失的 slices。

今天我可以在 Slice 中做什麼?

截至本文撰寫時,Slices 程式碼庫支援 Slice 中的以下功能

  • Servlets 和 servlet 對映
  • JSP
  • Spring MVC
  • Slice 本地會話
  • 自動回退到應用程式範圍的會話
  • 透過 ServletContext 進行 slice 本地資源查詢
  • 自動回退到主機中的資源查詢
  • 使用 host: 顯式主機資源查詢

下一步是什麼?

我們正在為 Slices 開發許多有趣的新功能,包括

  • slices 中的過濾器和過濾器對映
  • slices 中的監聽器
  • UI 組合框架。您可以在 Petclinic 示例中看到一種手動方法
  • Tiles 2 整合
  • 完整的示例應用程式
  • SpringSource Tool Suite 支援

如果您有任何功能建議或發現錯誤,請隨時 在我們的 JIRA 上提出問題。

如果您想密切關注進度,可以關注我們的 Git 倉庫和我們的 #dmserver Twitter 標籤。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有