VSSH 结构实现 WordPress 主题功能
发表于:2010-03-16 | 5 个回复

  过去网站的换肤功能比较简单,仅仅局限于 css 的修改上。而 WordPress 的主题功能十分强大,它为制做者公开了大量的 API ,通过调用这些 API 主题制做者可以根据喜好在主题中调用不同的 API 来达到不同的效果。甚至还可以对 API 进行扩展。这样做优点是显而易见的–灵活。不过缺点也是有的,即对主题制做者的要求比较高。不仅要了解 CSS、HTML 等前端知识,更要对 PHP 有一定的了解。看看目前 WordPress 种类繁多的主题就知道这点门槛并不算什么。

  我是一名 Java 开发人员,更喜欢用 Java 的方式考虑问题。如何使用 Java 实现类似功能呢?这个问题要是在十年前那并不算什么问题。在 Jsp + Bean 的时代,完全可以参考 WordPress 的实现方式实现该功能。但今天没有人会去那样做,在这个框架横行的时代,想要灵活地实现这个功能似乎有些困难。毕竟框架为开发者设定了条条框框。目前大多数 Java 的 Web 应用会使用 VSSH (Velocity + Struts + Spring + Hibernate) 进行开发,我们假定以 VSSH 框架结构来考虑如何实现这个功能。

  首先界面还是比较好实现的,在 index.vm 中导入 #parse 主题的 vm 文件即可,复杂的地方在于后台的运用。如何调用 Action ?PHP 页面和函数都放在 .php 文件中,任何页面想要使用某个函数只要导入该函数所在的文件即可。比如 function.php 中有个显示文章列表的函数 showArticleList ,index.php 页面只要在适当的位置调用这个函数即可。这是一种页面主动的实现方法。而 Java 呢?使用 VSSH 框架结构后,页面没有调用后台程序的能力,所有的业务逻辑都放在后台制做,页面只是被动地显示后台返回的数据。同样显示文章列表,Java 的做法是先执行后台应用,然后由 Action forward 到页面,而页面只要遵循后台对数据的包装结构解包把数据显示出来即可,所以主动权在后台。所以若要实现 WordPress 的主题功能,必须由主题制做者自行实现 Action 。具体的功能实现(如文章列表)还是由系统提供,主题制做者只要使用 Struts 的 Ioc 将系统公开的 API (Service 或 Domain) 注射进来调用即可。当然主题开发者并不一定要使用系统提供的 API ,也可以自行实现某些功能。到目前为止,一切看上去都很好,问题似乎解决了,事实上最大的问题还没有提到–主题的页面如何调用主题的 Action ?我们知道,页面要访问 Struts 的 Action ,需要事先在 Struts.xml 中对 Action 进行配置,否则系统将会出错。若改换主题时都要手动对 Struts.xml 进行配置那是多么尴尬的事情,比竟用户不一定都会 Struts 有所了解,所以还得改进设计。目前能想出来的方案有两个。

  方案一:主题的所有页面都访问系统提供的某个 Action ,由该 Action 解析主题 .jar 文件,将 .jar 文件中的 class 并运用反射生成对象并运行。实现是没有问题,不过所有的访问都指向同一个 Action 会造成这个 Action 的复杂度增加,不易维护。另外,每次都解析 .jar ,反射生成对象对资源的消耗较大,更重要的是会给 Struts 和 Spring 的注射工作带来麻烦。

  方案二:在更改主题时将主题的 .jar 文件拷贝至 lib 目录下,并修改 struts.xml 文件。这个方案看上去似乎不错,没有额外的程序,完全使用 Struts 自身的功能,框架的注射功能完全可用,就象完整的应用一样。不过也有很大的问题–需要重启容器。向容器中新增 .jar 文件和修改 Struts.xml 后是需要重启服务的。

  上面两个方案看上去第二个更适合一些,不过重启容器这个问题不解决有些尴尬。让我再想想看还有没有什么更好的方法,大家有什么好的方法还请告诉我一下。

评论留言

  1. 我也是java开发人员,也用过wordpress,你说的这个问题好像不好解决啊。要么不要用struts。

  2. 这个问题我基本上已经有思路了,关键在于修改 struts.xml 后不重启服务即可。

  3. 感謝分享,這是偉大的!

  4. thank sharing :)

  5. 看你的博客还真是有收获。Grape也比较成功。有空我会下载一个学习下。