使用 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 檔案,並編輯 Profile Configuration 區段以列出 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 目錄來部署 host

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

現在應該可以從 https://127.0.0.1:8080/petclinic 存取 host

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://127.0.0.1:8080/petclinic,它現在將反映 appointments slice 的存在,並顯示一個新的 Appointments 連結

petclinic-appointments-slice

您可以根據需要,現在從 pickup 目錄中移除 appointments war 以查看 slice 再次消失。

Slices 應用程式的剖析

使用 Slices,您可以從多個 OSGi 捆綁包建構 Web 應用程式,每個捆綁包都為應用程式 URL 空間的不同子部分提供內容。 Slices 應用程式以父/子結構排列,每個應用程式最多有一個父節點(稱為 host),以及零個或多個子節點(稱為 slices)。 我們正在開發一個簡單的 Slices 範例,如下所示

slice-anatomy

Host 內部

petclinic.host 捆綁包包含所有共享內容,例如影像和 CSS,以及用於提供首頁的控制器和 JSP。 host 捆綁包只是一個符合 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>

如您所見,host 可以有任何正常的 servlet 和篩選器對應,但它需要 SliceHostFilter 才能將請求路由到其 slices。

Slice 內部

slice 是一個看起來和功能都像標準 RFC66 webbundle 的捆綁包,唯一的區別是它沒有自己的 ServletContext。 相反,slice 在其 host 的 ServletContext 下運行。

Slices 的主要設計目標之一是確保 slice 開發與標準 Web 應用程式開發盡可能相似。 為此,您可以完全按照建立任何應用程式的 Web 內容相同的方式,使用 web.xml 建立 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 本身不存在的資源名稱來存取 host 捆綁包中的資源。 如果 slice 想要存取 host 中的資源,即使它本身具有類似名稱的資源,也可以使用 host: 字首來執行此操作

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

slice 需要定義它想要附加到的 host,並使用 Slice-Host 資訊清單標頭來執行此操作。 Slice-ContextPath 標頭定義 slice 處理的 URL 部分

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

Slice 生命周期

host 可以在沒有任何相應的 slices 附加的情況下運行。 當將與 host 相符的 Slice 安裝到伺服器中時,該 slice 會 附加 到 host。 此时,host 的 URL 部分中与新附加的 slice 的 Slice-ContextPath 相符的子部分会路由到该 slice。

卸載 slice 時,曾經路由到 slice 的 URL 空間部分現在直接路由到 host。 這樣,您可以在 host 中建立內容以處理遺失的 slices。

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

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

  • Servlet 和 servlet 對應
  • JSP
  • Spring MVC
  • Slice 本機 Session
  • 自動回退到應用程式範圍的 Session
  • 透過 ServletContext 進行 Slice 本機資源查找
  • 自動回退到 host 中的資源查找
  • 使用 host: 進行明確的 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 社群中所有即將舉行的活動。

檢視全部