The author of this article is co-author of the book "Struts Best Practices" published in German (2004) and French (Feb 2005). He has been working with Java n-tier web since 1998, including SilverStream appserver, before the advent of OS and J2EE. His company, Infonoia SA is editor of multi-platform, multi-repository software and solutions around document retrieval and publishing. Infonoia also provides consulting services, mentoring and training (English, French, German) on Best Practices in the web technologies and frameworks they use, such as Struts, Eclipse and RSP. Wolfgang is also available for speaking engagements on RSP. Wolfgang can be reached at wgehner at infonoia dot com.
關于本文
這篇文章將會分成兩個部分通過分析一個實例去分析如果使用OSGI構建一個WEB應用。
第一個部分只是簡單的介紹了如何在應用中創建擴展點(extension points),第二部分將通過映射你自己的Servlet和依賴關系使其能夠作為一個新的Web應用運行
Extensions and Extension points
在RSP Samples里面的每個Bundle目錄中都有一個 plugin.xml,這里面所配置的 Extension 和 Extension point讓這些URL和Resource能夠被訪問到,它為各個Bundle間的協作提供了一個通道。(個人感覺這里所說的擴展和擴展點有點像Spring AOP里面的 Advice 和 Pointcut),
OSGI-R4規范中提供了Declarative Services (簡稱DS)機制,關于DS的詳細介紹請查閱 BlueDavy 的Opendoc.
用Plug-in Manifest Editor打開org.rsp.framework.struts中的Plugin.xml,進入 Extensions 面板,可以看到這個Bundle使用了3種Equinox的Extension(看字面意思就能知道這3種Extension是做什么用的),再進入 Extension points面板,沒有發現該Bundle提供任何擴展點(Extension points),分析一下具體配置.
1
<?xml version="1.0" encoding="UTF-8"?>
2
<?eclipse version="3.0"?>
3
<plugin>
4
<extension id="myservletID" name="myservletName" point="org.eclipse.equinox.servlet.ext.servlets">
5
<alias>/do</alias>
6
<servlet-class>org.rsp.framework.struts.base.BundleActionServlet</servlet-class>
7
<init-param>
8
<param-name>config</param-name>
9
<param-value>*/WEB-INF/struts-config.xml</param-value>
10
</init-param>
11
<init-param>
12
<param-name>chainConfig</param-name>
13
<param-value>*/WEB-INF/chain-config.xml</param-value>
14
</init-param>
15
<httpcontext-name>cross-context</httpcontext-name>
16
</extension>
17
18
<extension id="myservletID3" name="myservletName3" point="org.eclipse.equinox.servlet.ext.servlets">
19
<alias>/struts/strutstest.jsp</alias>
20
<servlet-class>org.rsp.framework.struts.strutstest_jsp</servlet-class>
21
<httpcontext-name>cross-context</httpcontext-name>
22
</extension>
23
24
<extension id="testResource" point="org.eclipse.equinox.servlet.ext.resources">
25
<alias>/struts</alias>
26
<base-name>/</base-name>
27
<httpcontext-name>cross-context</httpcontext-name>
28
</extension>
29
30
<extension point="org.eclipse.equinox.servlet.ext.httpcontexts">
31
<path>/WebContent</path>
32
<httpcontext-name>cross-context</httpcontext-name>
33
</extension>
34
35
</plugin>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

第4-16行,擴展了org.eclipse.equinox.servlet.ext.servlets,也就是說/do路徑下的URL都交給org.rsp.framework.struts.base.BundleActionServlet去處理
第18-22行,將/struts/strutstest.jsp 交給 org.rsp.framework.struts.strutstest_jsp去處理
第24-28行,資源路徑的映射
第30-33行,Context映射

同理,資源映射也是如此
本文翻譯到此已經基本告一段落,原文后面的內容都是基本操作,而本文宗旨就是對OSGI的Web應用有個大概的了解,這個目的已經達到了。
結束語
偶爾從Google上搜索到了這篇文章,感覺對像我這樣的OSGI初學者很有用,于是將其意思整理了一下,帖在BLOG上,希望能對路過的OSGI愛好者有所幫助。
如果想更好的理解作者的意圖,建議看原文。
歡迎大家通過郵箱osgi.phrancol@gmail.com與我討論有關OSGI的話題。
作者針對原文開的討論帖 , [點擊這里]
Spring-osgi首頁有個OSGI視頻課程,值得一看 [點擊這里]
BlueDavy的BLOG [點擊這里]
Equinox in a Servlet Container
Developing Eclipse/OSGi Web Applications Part 1
Developing Eclipse/OSGi Web Applications Part 2