首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

OSGi + JSF 整合實戰:基於 Equinox 的模塊化 Web 應用構建

     編輯:J2EE

背景與挑戰

OSGi 提供動態模塊化能力,但 JSF 依賴 Servlet 容器與 JSP 編譯器 (Jasper),Equinox 中 org.eclipse.equinox.jsp.jasper 需修改源碼以支援 JSF 標籤庫解析,導致整合門檻較高。本文提供完整可落地步驟。

環境準備

  1. 安裝 CVS 客戶端 (Equinox 專案代碼託管於 CVS)。
  2. 棧出 org.eclipse.equinox.jsp.jasper 源碼。
  3. 修改 Jasper 相關類以正確解析 JSF f:/h: 標籤庫 (具體修改點視 Equinox 版本而定,核心為標籤庫 URI 識別與 TLD 載入邏輯)。
  4. 構建修改後的 Bundle 並部署至目標運行環境。

示例專案結構:osgi.jsf.finals

1. 插件配置 (MANIFEST.MF 關鍵條目)

Bundle-ClassPath: ., lib/jsf-api.jar, lib/jsf-impl.jar, lib/jstl.jar, lib/standard.jar
Export-Package: org.danlley.jsf.beans
Import-Package: javax.faces.*, javax.servlet.*, javax.servlet.jsp.*, org.apache.jasper.*
Require-Bundle: org.eclipse.equinox.jsp.jasper, org.apache.jasper

2. 頁面開發

index.jsp - 登錄頁

<%@ taglib uri="https://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="https://java.sun.com/jsf/html" prefix="h" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<html><body>
<f:view>
  <h:form>
    <h:outputText style="color:red" value="#{user.errMsg}" />
    <h3>JSF Samples</h3>
    Nick Name: <h:inputText value="#{user.id}" /><p>
    <h:commandButton value="Submit" action="#{user.verify}" />
  </h:form>
</f:view>
</body></html>

welcome.jsp - 成功頁

<%@ taglib uri="https://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="https://java.sun.com/jsf/html" prefix="h" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<html><body>
<f:view>
  <h:outputText value="#{user.id}" /> Welcome!
  <h3>JavaServer Faces!</h3>
</f:view>
</body></html>

3. Backing Bean 實現

package org.danlley.jsf.beans;

public class UserBean {
    private String id, pwd, errMsg;
    // Getter/Setter 省略

    public String verify() {
        if ("JsfUser".equals(id)) return "success";
        setErrMsg("userID should be JsfUser");
        return "failed";
    }
}

4. 導航規則

<navigation-rule>
  <from-view-id>/index.jsp</from-view-id>
  <navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/welcome.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
    <from-outcome>failed</from-outcome>
    <to-view-id>/index.jsp</to-view-id>
  </navigation-case>
</navigation-rule>

關鍵整合點總結

層面傳統 Web 應用OSGi + JSF
類加載單一 ClassLoaderBundle ClassLoader 隔離,需正確 Import/Export JSF API/Impl 包
JSP 編譯容器內建 JasperEquinox Jasper Bundle 需修改支援 JSF 標籤庫 URI
生命週期ServletContextListenerBundleActivator start/stop 掛載 FacesServlet、載入 faces-config
資源訪問ServletContext.getResourceBundleContext.getResource / ClassLoader.getResourceAsStream
熱部署整體重啟/熱替換受限Bundle 級動態安裝/更新/協載,JSF 狀態需妥善遷移

避坑指南

  • JSF 實現包版本衝突: 確保 Bundle ClassPath 僅包含單一版本 jsf-impl.jar,避免多版本類加載錯誤。
  • EL 表達式解析器: Equinox 預設 EL 可能非 JSF 專用,需確保 javax.el.ExpressionFactory 綁定正確實現 (如 JBoss EL / GlassFish EL)。
  • 靜態資源服務: 配置 Equinox HTTP Service (Jetty) 映射 /images/*, /css/* 至 Bundle 內 WebContent 目錄。
  • Facelets 優於 JSP: 新專案強烈建議使用 Facelets (JSF 2.0+ 標準 VDL),避開 Jasper 整合痛點,獲得更好模板復用與編譯時檢查。

結語

OSGi + JSF 整合雖涉及 Jasper 修改等深水區,但通過模塊化獲得的動態擴展、版本隔離、熱部署能力,對大型長期演進系統極具價值。掌握核心類加載與標籤庫解析機制,配合 Facelets 現代化 VDL,可構建健壯的模塊化企業級 Web 應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved