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

注意:此解决方案并非旨在成为能够解决所有问题的功能齐全的插件系统。 它不支持版本控制,子模块等。这就是标题为何“简单”的原因。 但是您可以用它做很多事情,而且它的复杂性非常低。

参考: Bozho的技术博客博客中的JCG合作伙伴 Bozhidar Bozhanov的 Web应用程序简单插件系统 。

翻译自: https://www.javacodegeeks.com/2013/08/a-simple-plugin-system-for-web-applications.html

web应用插件开发

web应用插件开发_Web应用程序的简单插件系统相关推荐

  1. Web应用程序的简单插件系统

    我们需要制作多个具有很多共享功能的基于Web的项目. 为此,某种插件系统将是一个不错的选择(作为复制粘贴内容的替代方法). 有些框架(例如grails)可以选择制作Web插件,但大多数没有,因此需要实 ...

  2. linux 下c插件开发,Linux C编程:打造一个插件系统

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 运行环境:linux 使用语言:c 或者c++ 插件,很多人用过,比如游戏插件,编辑器插件这些, 最著名的就数魔兽大脚插 ...

  3. java web指纹采集_web应用程序指识别中的指纹收集

    web应用程序指纹识别是入侵前的关键步骤,假设通过指纹识别能确定web应用程序的名称及版本号.下一步就可以在网上搜索已公开的漏洞.或网上搜到其源码然后进行白盒的漏洞挖掘. 指纹识别的核心原理是通过正則 ...

  4. web应用程序和web网站_Web应用程序和移动应用程序的基本启动清单

    web应用程序和web网站 by Ben Cheng 通过本诚 Web应用程序和移动应用程序的基本启动清单 (The Essential Launch Checklist for Web Apps a ...

  5. web应用程序和web网站_Web应用程序中的泄露秘密

    web应用程序和web网站 环境变量变得疯狂:数据泄露结果 (Environment Variables Gone Wild: Data Breach Results) Information dis ...

  6. java web删除文件_Web开发为了java端程序能删除文件的解决办法

    Web开发为了java端程序能删除文件,必须在.../jre/lib/security/java.policy文件中添加以下两个中的任何一段代码进去. 注:必须是服务器的本地文件,局域网内的其他机器文 ...

  7. 在web前端调用后台java程序(java类)的方式

    在web前端调用后台java程序(java类)的方式: 首先静态html标签是无法直接调用java程序的,但是可以通过imput button按钮点击,onclick事件调用一个js函数,用这个js函 ...

  8. 认证令牌_Java应用程序的简单令牌认证

    认证令牌 "我喜欢编写身份验证和授权代码." 〜从来没有Web开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. ...

  9. Java应用程序的简单令牌认证

    "我喜欢编写身份验证和授权代码." 〜从来没有Web开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. JSON ...

最新文章

  1. (08) 需求征集 -- 消息管理
  2. numpy.random.normal详解
  3. 干货丨一组图详解元数据、主数据与参考数据
  4. Qt修炼手册8_常用的容器类QVector和QList
  5. 文件上传案例阻塞问题
  6. 信用逾期3年是不是一定会坐牢?
  7. 鲁九的六人小聚:夏吕吕岳倪兴
  8. 保存工具条菜单有bug吗?
  9. 玲珑杯round11-B:萌萌哒的第二题
  10. Word 多级标题中的某一级的编号变为竖线
  11. 网上订餐系统python程序代码_网上订餐系统源代码
  12. 浏览器 - 监听浏览器刷新及关闭
  13. linux进入bios设置超线程,从BIOS开启超线程的方法
  14. TiDB EcoSystem Tools 原理解读(一):TiDB-Binlog 架构演进与实现原理
  15. [递推] 费解的开关
  16. 开源的IM框架--担心
  17. airpods二代降噪吗_2020年苹果无线蓝牙耳机AirPods/Airpods Pro选购指南和使用技巧 | 10月更新...
  18. python自动化输入文本_python输入文本
  19. Win8.1 kb2919355安装不上怎么办?
  20. systemd:源自红帽的系统初始化和服务管理套件

热门文章

  1. 【贪心】最大连续数列的和
  2. ACM一类方程问题的求解[最短路建模] bzoj2118
  3. 41、java应用占用cpu过高原因分析
  4. MyBatis-generator使用,Example缺少分页问题解决
  5. 十分钟快速了解 ES6 Promise
  6. 使用Docker 实现微服务并搭建博客,一文全掌握
  7. JavaFX UI控件教程(二十)之HTML Editor
  8. java过滤html标签获取纯文本信息
  9. C#的protected internal
  10. publiccms实现遍历多级分类下的不同样式内容