web应用插件开发_Web应用程序的简单插件系统
web應用插件開發
我們需要制作多個具有很多共享功能的基于Web的項目。 為此,某種插件系統將是一個不錯的選擇(作為粘貼粘貼內容的替代方法)。 有些框架(例如grails)可以選擇制作Web插件,但大多數沒有,因此需要實現定制的東西。
首先,讓我們定義所需的功能。 “插件”:
- 應該通過通過maven / ivy導入簡單地包括在內
- 如果使用了一個類,則應在依賴項注入容器中注冊所有類(自動或通過單行配置)
- 應該是垂直的–即包含所有文件,從javascript,css和模板到控制器,再到服務層類
- 不需要需要在項目之間復制粘貼的復雜配置
- 應該允許容易的開發和調試而無需重新部署
將Java類放入jar文件中,然后添加到lib目錄中,因此也添加到了類路徑中,這是簡單的部分。 但是我們需要將Web資源提取到各個位置,其余的代碼可以在這些位置使用它們。 可以使用三種通用方法:構建時提取,運行時提取和從類路徑加載運行時。
最后一種方法將需要一個控制器(或servlet),該控制器從類路徑(相應的jar)中加載資源,對其進行緩存并提供服務。 這有兩個明顯的缺點,其中之一就是放在罐子里,在開發過程中不容易更換它們。 使用類路徑資源也很棘手,因為您事先不知道文件名。
其他兩種方法非常相似。 例如,Grails使用構建時提取–插件是一個zip文件,其中包含所有必需的資源,并且在構建項目時將它們提取到各自的位置。 很好,但是需要更多的配置(在我們的例子中是Maven),可能還需要在項目之間復制。
因此,我們選擇了運行時提取方法。 它在啟動時發生–加載應用程序時,某種啟動偵聽器(在我們的示例中為帶有@PostConstruct的spring組件)會遍歷lib文件夾中的所有jar文件,并從特定文件夾中提取文件(例如,“ web ”)。 因此,jar文件的結構如下所示:
comcompanypkgFoo.classBar.class webplugin-namecssmain.cssjsfoo.jsbar.jsimageslogo.pngviewsfoo.jspbar.jsp最終結果是在啟動應用程序后,您可以從應用程序訪問所有必需的Web資源,因此可以將它們包含在主應用程序的頁面(視圖)中。
而且提取的代碼非常簡單(將zip4j用于zip部分)。 這可以是servlet上下文偵聽器,而不是spring bean –沒什么區別。
/*** Component that locates modules (in the form of jar files) and extracts their web elements, if any, on startup** @author Bozhidar*/ @Component public class ModuleExtractor {private static final Logger logger = LoggerFactory.getLogger(ModuleExtractor.class);@Injectprivate ServletContext ctx;@SuppressWarnings("unchecked")@PostConstructpublic void init() {File lib = new File(ctx.getRealPath("/WEB-INF/lib"));File[] jars = lib.listFiles();String targetPath = ctx.getRealPath("/");String viewPath = "/WEB-INF/views"; //that can be made configurablefor (File jar : jars) {try {ZipFile file = new ZipFile(jar);for (FileHeader header : (List<FileHeader>) file.getFileHeaders()) {if (header.getFileName().startsWith("web/") && !fileExists(header)) {// extract views in WEB-INF (inaccessible to the outside world)// all other files are extracted in the root of the applicationif (header.getFileName().contains("/views/")) {file.extractFile(header, targetPath + viewPath);} else {file.extractFile(header, targetPath);}}}} catch (ZipException ex) {logger.warn("Error opening jar file and looking for a web-module in: " + jar, ex);}}}private boolean fileExists(FileHeader header) {return new File(ctx.getRealPath(header.getFileName())).exists();} }因此,為了制作插件,您只需制作一個帶有jar包裝的Maven項目,并將其作為依賴項添加到您的主項目中,其他所有工作都將得到處理。 如果未啟用對bean的類路徑掃描(或選擇使其成為偵聽器),則可能需要注冊ModuleExtractor 。
注意:此解決方案并非旨在成為能夠解決所有問題的功能齊全的插件系統。 它不支持版本控制,子模塊等。這就是標題為何“簡單”的原因。 但是您可以用它做很多事情,而且它的復雜性非常低。
翻譯自: https://www.javacodegeeks.com/2013/08/a-simple-plugin-system-for-web-applications.html
web應用插件開發
總結
以上是生活随笔為你收集整理的web应用插件开发_Web应用程序的简单插件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本电脑触摸板如何打开和关闭电脑开关如
- 下一篇: 监视和管理备份系统