Bridge方式搭建方法
一. 安裝eclipse,jdk,tomcat。本文以eclipse3.7.2,jdk1.7.0,tomcat-7.0.27為例
實驗環境:win7 X64 家庭高級版
二. 需要在 Eclipse 首選項中將我們的tomcat配置一下
選擇server中的runtime Environment
注(如果沒有server標簽,請保證你的ecplise安裝了web dev插件)
點add
點擊next
選擇好tomcat目錄后點擊finish即可完成配置。
三. 新建一個plug-project
我們為新項目命名為 com.sample.web, 在項目屬性設置中,我們將項目的運行 target 設置為 Equinox
在接下來的屬性設置中,我們不要選擇創建 Activator,具體設置如下圖。其它選項保持默認即可
到此我們已經完成了整個項目的創建,創建后的項目結構圖如圖
四.現在我們為我們的項目加入一些實質的代碼以方便測試
在src下新建包 com.sample.web.servlet
在項目中新建文件夾WebRoot,並在WebRoot下新建img和jsp文件夾
並放入相關文件
最后目錄結構如圖
並在包中新建文件 LoginServlet.java(代碼如下) :
package com.sample.web.servlet;

1 import java.io.IOException; 2 import java.io.PrintWriter; 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 9 /** 10 * @authorLevin 11 * @time2009-5-29 12 */ 13 public class LoginServlet extends HttpServlet{ 14 15 public void doGet(HttpServletRequest request, HttpServletResponse response) 16 throws IOException, ServletException 17 { 18 //Web 開發場景一:使用 Request 對象得到得到客戶端請求數據 19 String userName = request.getParameter("userName"); 20 //Web 開發場景二:操作 Session 21 request.getSession().setAttribute("userFromA", userName); 22 //Web 開發場景三:使用 Response 返回 23 response.setCharacterEncoding("GBK"); 24 response.setContentType("text/html"); 25 PrintWriter out = response.getWriter(); 26 out.println("<html>"); 27 out.println("<body>"); 28 out.println("<head>"); 29 out.println("<title> 登錄返回頁面 </title>"); 30 out.println("</head>"); 31 out.println("<body>"); 32 out.println(userName + ", 您的 sessionId:" + request.getSession().getId()); 33 out.println("</body>"); 34 out.println("</html>"); 35 out.flush(); 36 out.close(); 37 } 38 39 public void doPost(HttpServletRequest request, HttpServletResponse response) 40 throws IOException, ServletException { 41 doGet(request, response); 42 } 43 }
項目會有編譯錯誤,是因為我們使用了 javax.servlet 包中的類,所以我們點擊錯誤信息,Eclipse 會自動幫助我們修改項目的 MANIFEST.MF 文件,將需要的包添加到 Import-Package 中去。下面是我們項目中的 index.jsp 文件的內容
<HTML> <HEAD> <TITLE>My App Home</TITLE> <META http-equiv=Content-Typecontent="text/html; charset=iso-8859-1"> <% String javaVersion = System.getProperty("java.version"); %> </HEAD> <BODY> <p>Current JRE version: <font color="#FF0000"><%=javaVersion%></font></p> <p> <a href="/servlet/myfirstservlet?userName=userA"> Click to test seervlet </a> </BODY> </HTML>
plugin.xml 文件的內容如下所示,我們在其中定義了兩個擴展點,一個用來處理對資源文件例如圖片文件等的請求,另外一個用來處理 JSP 和 Servlet 的請求。
<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.4"?> <plugin> <extension point="org.eclipse.equinox.http.registry.resources"> <resource alias="/images" base-name="/WebRoot/img"> </resource> </extension> <extension point="org.eclipse.equinox.http.registry.servlets"> <servlet alias="/servlet/myfirstservlet" class="com.sample.web.servlet.LoginServlet" load-on-startup="true"> </servlet> <servlet alias="/jsp/*.jsp" class="org.eclipse.equinox.jsp.jasper.registry.JSPFactory:/WebRoot/jsp/"> </servlet> </extension> </plugin>
通過擴展點的配置,我們還需要對 MANIFEST.MF 文件進行相應的修改,引入需要的 bundle 和 package。最終的 MANIFEST.MF 文件如下 :
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Web Plug-in
Bundle-SymbolicName: com.sample.web;singleton:=true
Bundle-Version: 1.0.0
Bundle-Vendor: SAMPLE
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: javax.servlet,javax.servlet.http
Require-Bundle: org.eclipse.equinox.jsp.jasper.registry,
org.eclipse.equinox.http.registry
五.
最后一項配置。打開項目的運行配置窗口,先反選所有的 target platform,然后勾選com.sample.web 然后再點擊 Add Required Bundles 按鈕。這樣在運行時候 Eclipse 不會將所有的 bundle 都啟動,而只選擇性的啟動我們在配置文件中配置的 bundle。
點擊run結果如圖
輸入ss
可以看到我們的bundle已經被激活
至此我們基於equinox開發的web應用已經完成,下一步我們將要把equinox以及bundle做成一個 war部署到Servlet 容器中,和以前我們做普通的 Web 開發一樣,當做一個普通的 Web 應用運行。在這種方式下,使用了一種叫做 Servlet Bridge(Servlet 橋 ) 的技術,用戶對該 Web 應用的 http 請求被 servlet 容器轉發給該 Web 應用,Equinox 框架運行在該 Web 應用中,統一處理對於該應用的請求,並將請求轉發給對應的 bundle。
六 .一般情況下首先需要到 Equinox 站點上 下載bridge.war 文件,這個文件是 2007 年 4 月的版本。我們在前面創建工程的時候沒有讓大家選擇創建 activator, 原因就是在於 activator 引用的有些類在這個版本的 bridge.war 中不存在。此外:在我們的 sample 項目中,需要支持 JSP,所以需要幾個額外的 bundle。為了大家的方便,我另外做了一個 bridge.war, 里面包含這些需要的 bundle。在SourceCode。zip中
我們將其導入到我們的 Eclipse 工作空間中來,
七.接下來,我們將剛才創建的 sample 項目導出為一個 bundle:打開我們的 sample 項目的 build.proerties 文件,將我們需要的 WebRoot 文件夾及其子文件夾以及 plugin.xml 都選中。
然后將其導出為Deployable plug-ins and fragments
其他按照缺省設置即可,這時候大家會看到 Eclipse 會在你指定的目錄下生成 plugins /com.sample.web_1.0.0.jar 文件,將該 jar 文件放到剛才導入的 bridge 項目的 plugins 文件夾下
八.然后把該jar放到剛才導入的bridge項目的plugins下具體目錄結構如圖
九.在這種方式下,我們不需要去運行我們的 sample 項目 , 而是運行我們的 bridge 項目,選中 bridge 項目 , 右鍵 ->run as->run on server 將 bridge 項目運行到我們配置的 Tomcat 中去。由於我們並沒有設置讓我們的 sample 項目默認自動啟動,所以大家在此處需要啟動我們的 sample 項目的 bundle。啟動
十.啟動bundle
輸入ss查看bundle id。假設id=5
輸入start 5;啟動該bundle
現在輸入網址就可以訪問我們的bundle了
http://localhost:8080/bridge/servlet/myfirstservlet?userName=Levin
http://localhost:8080/bridge/jsp/index.jsp
http://localhost:8080/bridge/images/1.jpg
后記:在實際的開發過程中,如果每次都需要將我們的項目導出為 jar 文件放置到 bridge 中,開發效率是非常低下的。上述的步驟其實只適合在項目開發完成以后,實際部署到服務器上的時候才需要。在我們在開發過程中我們可以采取以下辦法來簡化開發:
打開 bridge 項目的 WebContent/Web-INF/eclipse/configuration/config.ini 文件,在其 osgi.bundles 的配置中增加對我們 sample project 的引用,例如:
reference\:file\:D:/eclipse-jee-ganymede-SR2-win32/workspace/com.sample.web@start
這時如果我們選中 bridge 項目 , 右鍵 ->run as->run on server 將 bridge 項目運行到我們配置的 Tomcat 中去的話,bridge 會根據 config.ini 中的配置,自動將我們的 sample project 也當做一個 bundle 啟動。
以上內容部分摘抄自http://www.ibm.com/developerworks/cn/web/0907_osgiweb_liuqing/