osgi使用 equnix框架 Bridge方式搭建方法(部分來源於ibm網站)


Bridge方式搭建方法

一. 安裝eclipsejdktomcat。本文以eclipse3.7.2jdk1.7.0tomcat-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下新建imgjsp文件夾

並放入相關文件

最后目錄結構如圖


並在包中新建文件  LoginServlet.java(代碼如下) 

package  com.sample.web.servlet; 
 
View Code
 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。在SourceCodezip

       我們將其導入到我們的 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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM