場景:iServer 啟動時自動打開並保存 Oracle 工作空間。
extend.listener 實作 ServletContextListenerWEB-INF/libweb.xml 註冊 <listener><listener-class>extend.listener</listener-class></listener>public class listener implements ServletContextListener {
private Workspace m_workspace;
@Override public void contextInitialized(ServletContextEvent sce) {
ServletContext sct = sce.getServletContext();
try {
m_workspace = new Workspace();
WorkspaceConnectionInfo conn = new WorkspaceConnectionInfo();
conn.setType(WorkspaceType.ORACLE);
conn.setServer("ORCL");
conn.setName("xxx");
conn.setUser("xxx");
conn.setPassword("xxx");
if (m_workspace.open(conn)) {
System.out.println("打開工作空間成功!");
if (m_workspace.save()) System.out.println("保存工作空間成功!");
} else {
System.out.println("打開工作空間失敗!");
}
conn.dispose();
m_workspace.dispose();
} catch (Exception e) { e.printStackTrace(); }
}
@Override public void contextDestroyed(ServletContextEvent sce) {
System.out.println("this is last destroyed");
}
}
更靈活的 SPI 機制,支援配置注入。
public class SaveWorkspaceProvider implements ProviderContextAware, SaveWorkspace {
private Workspace m_workspace;
@Override public void setProviderContext(ProviderContext context) {
ClearSetting setting = (ClearSetting) context.getConfig(ClearSetting.class);
if (setting == null) { System.out.println("無法獲取配置!"); return; }
String workspacePath = setting.getWorkSpacePath(); // 注意:字段名 workspacePath,getter 為 getWorkSpacePath()
try {
m_workspace = new Workspace();
WorkspaceConnectionInfo conn = new WorkspaceConnectionInfo();
conn.setType(WorkspaceType.SXWU); // 文件型工作空間
conn.setServer(workspacePath);
if (m_workspace.open(conn)) {
System.out.println("打開工作空間成功!");
if (m_workspace.save()) System.out.println("保存工作空間成功!");
} else {
System.out.println("打開工作空間失敗!");
}
conn.dispose();
m_workspace.dispose();
} catch (Exception e) { e.printStackTrace(); }
}
}
// 配置類
public class ClearSetting {
private String workspacePath; // 注意:字段名小寫 p
public void setWorkspacePath(String p) { this.workspacePath = p; }
public String getWorkSpacePath() { return workspacePath; } // getter 大寫 P
}
ProviderContextAware 讓提供者獲取配置上下文,實現解耦workspacePath vs getWorkSpacePath 易出錯)ORACLE、SXWU(文件型)等dispose() 釋放,避免洩漏掌握 Listener 與 Provider 兩種擴展機制,可滿足 iServer 啟動初始化、定時任務、自定義 REST 服務等多樣化業務需求。