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

Eclipse 插件開發實戰:基於 WTP Wizard 的 DataModel-DataModelProvider-View-Operation 模式擴展

     編輯:Java 相關知識

背景:為何需要擴展 WTP Wizard?

Web Tools Platform (WTP) 是 Eclipse 上構建 J2EE Web 應用的核心插件集,提供豐富的項目創建、Web Service、Servlet 等標準向導。但實際業務往往需要定制化功能——如創建 Portlet 應用需生成特定部署描述文件、自定義語法編輯器等。當 WTP 通用功能無法滿足業務需求時,必須進行擴展開發。

向導設計模式演進

JFace Wizard:基礎 View-Control 模式

數據分散在各頁面,無統一數據模型,適合簡單頁面跳轉。

Data Model Wizard:引入數據模型

內嵌 Data Model(屬性集合,支持監聽器、驗證、自定義訪問規則),通過 Synchronize Helper 實現頁面控件與模型數據雙向同步。採用 DataModel-View-Operation 模式:Model 封裝狀態,View 負責交互,Operation 執行業務動作。

WTP Wizard:DataModelProvider 解耦

在 Data Model Wizard 基礎上引入 DataModelProvider,形成 DataModel-DataModelProvider-View-Operation 四層架構:

  • Data Model:退化為純鍵值對集合,無語義邏輯,僅存儲數據。
  • DataModelProvider:接管模型初始化、驗證、屬性定義、訪問規則等所有語義邏輯。用戶僅通過 Provider 訪問 Model:dataModel.getProperty(provider.PROPERTY_NAME)。
  • View (WizardPage):通過 synchHelper.synchText(widget, provider.PROPERTY, null) 綁定控件與模型屬性。
  • Operation:執行最終業務邏輯,從 Model 讀取數據。

優勢:Model 純粹存儲,存取職責分離,便於擴展存取邏輯;Provider 集中管理屬性語義。

實戰案例:創建定制化 Web 項目向導

需求

基於 Dynamic Web Application Project Wizard,新增「Main Class Group Panel」輸入包名與主類名,並生成 Portlet 部署描述文件。

實現步驟

1. 註冊擴展點

<extension point="org.eclipse.ui.newWizards">
  <wizard class="com.sample.tools.app.wizard.SampleProjectWizard"
          icon="icons/newapp_wiz.gif"
          id="com.sample.tools.app.wizard.SampleProjectWizard"
          name="Sample Project" project="true">
    <description>Create a WTP Sample Project</description>
  </wizard>
</extension>

2. 四大核心類實現

Wizard 類:繼承 DataModelWizard,實現 INewWizard:

public class SampleProjectWizard extends DataModelWizard implements INewWizard {
    protected void doAddPages() {
        addPage(new SampleProjectFirstPage(getDataModel(), "first.page"));
    }
    protected IDataModelProvider getDefaultProvider() {
        return new SampleProjectCreationDataModelProvider();
    }
    public void init(IWorkbench wb, IStructuredSelection sel) { }
}

WizardPage 類:繼承 WTP 頁面基類,重寫 createPresetPanel 隱藏不需字段,新增自定義面板:

protected void createPresetPanel(Composite top) {
    Group group = new Group(top, SWT.NONE);
    group.setText("Sample Main Class");
    // Package 輸入框
    synchHelper.synchText(tp, SampleProjectCreationDataModelProvider.PACKAGE, null);
    // Main Class Name 輸入框
    synchHelper.synchText(tc, SampleProjectCreationDataModelProvider.MAIN_CLASS_NAME, null);
}

DataModelProvider 類:繼承 WebFacetProjectCreationDataModelProvider,定義新屬性與默認值:

public class SampleProjectCreationDataModelProvider extends WebFacetProjectCreationDataModelProvider {
    public static final String PACKAGE = "MAIN_CLASS_PACKAGE";
    public static final String MAIN_CLASS_NAME = "MAIN_CLASS_NAME";

    public Object getDefaultProperty(String propertyName) {
        if (PACKAGE.equals(propertyName)) return "com.sample.app";
        if (MAIN_CLASS_NAME.equals(propertyName)) return "NewsListSample";
        return super.getDefaultProperty(propertyName);
    }
    public Set getPropertyNames() {
        Set names = super.getPropertyNames();
        names.add(PACKAGE); names.add(MAIN_CLASS_NAME);
        return names;
    }
    public IDataModelOperation getDefaultOperation() {
        return new SampleCreationOperation(getDataModel());
    }
}

Operation 類:繼承父操作,執行額外創建邏輯:

public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
    IStatus status = super.execute(monitor, info);
    if (status.isOK()) {
        String pkg = getDataModel().getStringProperty(PACKAGE);
        String cls = getDataModel().getStringProperty(MAIN_CLASS_NAME);
        // 創建主類、複製資源文件、生成 Portlet 描述符等
    }
    return status;
}

總結與替代方案

本文採用面向對象繼承擴展方式:子類化現有 Wizard 組件,通過重寫/覆蓋修改行為。另一種方案是擴展點擴展,影響所有現有實例,僅能增強不能減弱功能,讀者可自行查閱相關文檔。

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