JiveJdon Community Forums
在线95人 J道首页 | 论坛首页 | 培训咨询 | 开源框架 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 开源JdonFramework及其应用案例论坛
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 1 回复 / 1 页 [ ]  发表新帖子  回复该主题贴
icmas

发表文章: 5
注册时间: 2003年05月29日 14:45
刚出炉的#######jive中filters的应用###### 发表: 2003年06月05日 11:22 回复
网路上关于jive(一种基于jsp技术的论坛)设计模式,缓冲机制,中文问题解决,Crack等方面的文章很颇多,但讨论filter相关的屡屡可数,为了使感兴趣的网友不在繁多的代码中花费过多的时间,特完成拙文一篇.先来看一张养眼的picture,
对jive有一定了解的朋友一看便知上图为jive论坛的设计构架.users不用说是指浏览论坛的用户,skin是皮肤的意思,filters即为本文将详细讨论的过滤器,经过一系列(interfaces)接口,最终的将是我们的后台数据库.
Flters在jive中的主要作用就是动态的从新格式化messages(帖子)的内容,以此提供额外的功能.例如:the URL filter可以转换用户在message中写入的任意URL为可以点击的链接.还有一种过滤器高亮度标识java源代码语法.在jive中任意数目自定义的过滤器可以被创建和安装.
我们基于jive2.1.2版本来看一下.所有的filters都集中在com.jivesoftware.forum.filter包中安装字母的先后顺序依次是JavaCodeHightlighter.java,DummyFilter.java,Emoticon.java,HtmlFilter.java,Newline.java,Profanity.java,QuoteFilter.java,TextStyle.java,WordBreak.java每个过滤器都继承抽象类ForumMessageFilter,主要重载以下方法 public ForumMessageFilter clone(ForumMessage message) public boolean isCacheable() 两个方法以及过滤器本身的构建器方法.同时要提到的是每个filter相关的*BeanInfo.java类,他们继承了J2SE中javabean的BeanInfo类,封装了相关的bean信息,如beanName,属性名数组,bean类本身.接着看一下管理N多filter的类FilterManager.java(在com.jivesoftware.forum包中),我们知道jive论坛filter设置是由管理页面来动态配置完成的,通过Globals设置和特定forum的配置两部分完成.看一下源码,
public interface FilterManager {
public ForumMessageFilter getFilter(int index) throws UnauthorizedException;
public int getFilterCount() throws UnauthorizedException;
public void addFilter(ForumMessageFilter filter) throws UnauthorizedException;
public void addFilter(ForumMessageFilter filter, int index) throws UnauthorizedException;
public void removeFilter(int index) throws UnauthorizedException;
public void saveFilters() throws UnauthorizedException;
public ForumMessage applyFilters(ForumMessage message);
public ForumMessage applyCacheableFilters(ForumMessage message);
public ForumMessage applyUncacheableFilters(ForumMessage message);
public boolean hasUncacheableFilters();
}
不难发现添加,删除,保存,获取,利用filter(包括采用filters,采用可cacheable的filter,采用不能cacheable的filter三种方法)动作都是在FilterManager.java接口中完成的,具体实现又采用设计模式中的Proxy模式FilterManagerProxy.java,这也是jive论坛的一大设计特色,细心的读者一定注意到com.jivesoftware.forum.database目录下有一个DbFilterManager.java同样实现了FilterManager接口,而且在DbForumFactory.java中被调用.,
我们从filters的管理设置和forum具体应用到message两条线来看filters在jive中的实际流程.
filters管理的前台页面是通过admin目录下的filter.jsp来实现.这个文件包括了全局filter的设置和每个forum的特殊需求设置.二者的实现区别是通过url传参(filters.jsp?forum=1)来完成. 完整的实现过程是这样的,
if (forum != null) { filterManager = forum.getFilterManager(); } else { filterManager = forumFactory.getFilterManager();也许你会对forumFactory的引用感到莫名其妙,它来自哪里?其实它是在global.jsp生成的.而且还是DbForumFactory的实现.而forumFactory调用getFilterManager()方法,其实是ForumFactoryProxy中的方法. public FilterManager getFilterManager() { return new FilterManagerProxy(factory.getFilterManager(), authorization,
permissions);
}
其中的factory.getFilterManager()又是DbForumFactory中的getFilterManager();
public FilterManager getFilterManager() {
return filterManager;
}
追根求源,filterManager又实现于DbFilterManager.java,在前面我们已经讨论过该类. FilterManager.java,FilterManagerProxy.java,DbFilterManager.java.以及不在我们讨论范围的ForumFactory.java,ForumFactoryProxy.java,DbForumFactory.java的层层调用关系.
讨论完filters的管理,我们再来看一下filters对Messages的影响.当我们post一个message的时候filters不会care,就是你post什么样子的message,数据库就原封不动的照写不误...,而真正发挥作用的时间是在getMessage即是我们查看,张贴后预览动作发出后.我们仅讨论post一个message后preview的情形,实际操作中查看,回复一篇帖子是一样的实现方法.来看一下preview.jsp.95行的样子. FilterManager filterManager = myEnv.getForumFactory().getFilterManager(); newMessage = filterManager.applyFilters(newMessage); //不难看出这行代码是采用全局filters完成对message的过滤功能 filterManager = forum.getFilterManager(); //message所属forum的filters.结合前面的讨论读者应该了解jive过滤器的基本功能.到次关于jive,filters的讨论已经结束,最后让我们小结一把.
小结:通过本文粗略的概括,大部分读者应该了解jive filters基本工作流程.filter应用在jive中相当灵活,可以动态的添加,删除,而且可以通过设置不同过滤范围,global(全局) filters 和 forum filters来满足不同的需要.同时还应知道过滤的功能是在发生在浏览查看message的动作.在post message时,jive filters不会care.对filter感兴趣可查看java blueprints关于J2EE构架的petstore源代码,其中的filter应用也相当精妙.
参考:
Jive诸多应用程序和源码下载来自于http://www.jivesoftware.com
Jive问题的讨论,相当多的精彩文章 http://www.jdon.com
联系mail:icmas@tom.com

shyguy

发表文章: 63
注册时间: 2002年09月02日 20:33
Re: 刚出炉的#######jive中filters的应用###### 发表: 2003年06月05日 11:34 回复
不错的文章~~~~

但是Jive的Filter其实还是相对麻烦了一点点,它的Filter是从Message接口出来的,需要implemnt相当多的Message接口中的方法。

在我的新系统中,新增加Filter就是一个接口,其中只有
apply(String):String;这么一个方法.所有需要上filter的对象都implements Filterable接口,然后通过visitor模式来一一实现content的转换。
为了解决内容cache的问题,我用了Observer,当message的onLoad/onEdit等事件发生的时候,通知FilterManager,重新apply filter。

通过模仿Jive,我认为Jive的设计上还是相当多的问题....
这个主题有 1 回复 / 1 页 [ ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-07 jdon.com

anti spam