让JJ3跑在tomcat里面---新手使用jdon框架

写下这个标题的时候,一个jivejdon3模样的BBS正运行在我的tomcat6.0里面,之所以用模样两个字,因为它只有简单的发帖和回帖功能以及那亲切大方的界面,好像banq说过:"学习jj3的过程也是学习jdon整个网站内容的过程,是学习DDD思想的过程",所以我始终不期望自己短时间内把这个jj3论坛程序理解透彻,下面谈谈自己在成功让该论坛核心功能运行在tomcat中遇到的一些困难和对jdon框架的使用感受。
对于jdon框架,因为我还是在校学生,缺乏项目经验,更不具备完整或者正确的OO思想,在这个高手无数的论坛里面,我只能从完全幼稚的角度说话了,希望高手回帖多留情,也希望和我这样的新手来共同讨论学习感受,我没用过其他框架,但经常把很多开源框架下载下来然后demo,最后google高手对各种框架的使用感受!开始学jsp就有幸来到了这里,于是走进了模式于框架的路线。
能把jdonframework用得好用得精并用得灵活的人只能是精通struts和精通IOC的人,也就是如banq这样的人,这是我的感觉,要用这个框架做出像样的东西远非如struts_jdon_jdbc那样快速或简单,当我们的模型聚合了其他模型或关联了其他模型的时候,增删改查的对象设计以及缓存的管理是个大问题,道友,是否有同感?反正我看到jj3的增删改查实现是晕了,jj3发帖功能的实现对于url的要求以及ActionForm的设计都凸显了struts的技巧。缓存,爱你不容易,这是我从jj3抽取代码重新实现这个简单bbs的时候遇到的一个最大问题,保证论坛及主题的状态和数据库同步我是头痛了半天,最后没办法,直接ClearAllCache!这种做法应是用该框架的大忌吧,追求性能确实是要付出代价的,听说spring中缓存得自己配置,这就是代价。
这就是学这个框架的感受,我说了,这也许完全是我的程序经验和程序技巧问题,但我相信很多初学该框架的人也会有这些问题,热爱它并改造它,这是我的态度和理想,80后的人相当一部分是“追星族”,我也不例外,banq就是我心中的那颗星,我希望能在jdon上走得更远,能在国产框架上走得更远,并能在这个框架上灵活驾驭,所以我时刻关注着他们(jdonframework,easyjf,operamasks)。
最新消息,这个由jj3生出来的简单讨论系统要上线了,用户登陆以及向业务层传递登陆用户信息另写了一个action,没有了安全管理以及AOP的基于组件权限访问拦截,当有人发帖和回帖时会清掉所有缓存,这样的程序经得住多少人在线讨论?banq,可以告诉我吗?以后我会根据DDD思想和jj3的设计完善!
[该贴被oojdon于2008-01-19 04:49修改过]

晕,不小心表单重复提交,所以这个帖子在这个论坛里出现了两次!
表单重复提交,这个在真正的业务系统里面也是一个很重要的问题吧!

>当有人发帖和回帖时会清掉所有缓存,这样的程序经得住多少人在线讨论
你可以用Jmeter + jProfiler做个压力测试看看,全部清除对性能影响不是很大,可能在频繁发帖情况下,缓存将频繁清除,缓存利用不高,不过这种情况发生概率还是很小,一个论坛频繁发帖估计要变成全国排名前列了。

JiveJdon3的清除粒度要细一些,将当前帖子和引用其的Thread进行清除。

谢谢banq的回复,其实这个简单讨论系统将会出现在3月1号上线的网易高校奥运观方站上面,因为我们团队没有将这个网站的主题思想放在论坛上面,所以对讨论区的要求不高,相信直接清掉所有缓存也没有多少问题!
可是现在遇到了很多问题,比如用户的回帖嵌如了html或者javascript,视图显示的时候将会直接显示,这样界面就乱套了,还有就是主题回帖量超过30条发生分页后,接下来的回帖怎么跳转到回帖者的messsage?原代码的result.jsp中没有带分页信息呀:
<a href="<html:rewrite page="/forum/messageList.shtml" paramId="thread" paramName="forumThread" paramProperty="threadId" />&message=<bean:write name="messageId"/>#<bean:write name="messageId" />"
>或手工按这里返回所发帖子
</a>

>视图显示的时候将会直接显示
需要安装HtmlFilter进行Html过滤,可在JJ3后台管理界面的全局过滤中看到,在JJ3的安装文档中也有一个推荐的过滤器列表。

>接下来的回帖怎么跳转到回帖者的messsage
JJ3设计的就是能够跳转到回帖者的message,是通过threadId和MessageId两个参数,在后台进行遍历定位,定位到当前页面包含messageId就算找到了,可看看源码,然后通过messageId号码(这是html语法)就能够直接跳转了。

struts的bean:write的标签可以输出bean中的int字段吗?我怎么老是出错,可是jj3的论坛状态"主题/消息"都是用这个标签直接输出的,神了!banq可以讲讲吗?
我现在是把ForumState的主题和消息字段都设为了String然后在后台转换的。

已解决

banq老师,这个程序由于运行在tomcat里面也就没有了基于容器的安全登陆,用户登陆我另做了一个action把用户信息放在session里面,现在的回帖发贴我都跳转到另外一个jsp来检查用户是否登陆,但是我发现这样跳转一次之后写进数据库的是乱码,现在我想请教的是:是否存在某种方法可以在表单提交的瞬间去检查session里面是否有用户的信息,如果用户没有登陆就跳转到login.jsp?虽然struts的普通action可以做到,但因为快速发帖和回帖是ModelSaveAction,我不能控制啊!

你可以做一个servletfilter,对所有的拦截然后转到login.jsp

jj3中是采用JavaEE容器的安全机制,因此只要配置web.xml,就由JavaEE服务器实现拦截和转发到你在web.xml中指定的login.jsp文件。

关于在tomcat中配置安全机制,已经有人试验成功:
配置Tomcat 基于Realm授权认证:

http://www.jdon.com/jivejdon/thread/32703.html

ok, 解决!
现在只剩下回帖和发帖后的缓存清理问题,在jj3代码中摸索了半天始终没有发现其玄机之所在……
ModelState-->boolean embedded
ForumBuilder-->


if (forum.isEmbedded())
return forum;//读取论坛模型的时候程序只执行到这里?
loadForumState(forum);
forum.setEmbedded(true);

MessageKernel-->


forumBuilder.loadForumState(forumMessage.getForum());//refresh this forum
forumBuilder.loadThreadState(forumMessage.getForumThread());//refresh thread
forumBuilder.loadForumState(forumMessage.getForum());//refresh forum
//刷新的时候重新new了ThreadState和ForumState,那原来内嵌的对象呢?

[该贴被oojdon于2008-02-04 07:23修改过]

大家春节快乐!
最新问题:
<html:form action="/message/messageSaveAction.sthml" method="post" >

<logic:notEqual name="messageListForm" property="allCount" value="0" >
<html:hidden property="method" value="deleteRecursiveMessage"/>
</logic:notEqual>
连同子帖一起删除的时候,ModelSaveAction怎么调用到服务层的deleteRecursiveMessage方法的?请banq老师解释一下 <html:hidden property="method" value="deleteRecursiveMessage"/>

oojdon,我没有详细看过程序。但根据他的程序写法和参数配置方式,我想他是使用Struts提供的 DispatchAction 的功能实现方法调用的。这个问题建议你去看一下Struts的 DispatchAction 的功能介绍和使用方法。

>ModelSaveAction怎么调用到服务层的deleteRecursiveMessage方法的
不好意思,回答迟了,这是使用Jdon框架的命令服务调用功能:
http://www.jdon.com/jdonframework/new.htm

当然,这里面也用到struts的dispatch功能。

这种方式可以简化我们很多小功能开发,如果每个小功能都要编写Action代码 service代码 DAO代码 很显然麻烦,使用这个模式,可以不必写表现层任何一点代码。只要直接写业务代码就可以,符合让程序员更多精力集中在业务层这样一个框架使用终极目标。

谢谢,是自己没有仔细看文档啊,文档里面已经是讲得很清楚的。
oojdon将刻苦专研,基于JJ3使之功能更加强大!
感谢jdon,感谢banq的奉献!


鞠躬!^_^
[该贴被oojdon于2008-02-15 19:27修改过]

根据原版JJ3我将模型继承ModelState,判断一个模型是否内嵌了其他模型,同时在ForumBuilder中也就有了{if (forum.isEmbedded()) return forum;}这样的语句,通过在服务层和DAO层之间加一个Decorator,不用回帖和发帖时清掉所有缓存,论坛状态和主题状态已经和数据库同步,可是现在有了另外一个奇怪的现象:
批量查询时新发的帖子并没有显示,回复某个帖子之后该帖子的所有回复也没有显示
这是否是框架对批量查询进行缓存引起的,可是在MessageDaoDecorator中已经清除了这些缓存啊?
于是我跑到了后台日志发现又有另外一怪现象:
在案例testWeb中的批量查询缓存清除会打印-->


clear the cache for the batch inquiry!
remove the object of BLOCK0select userId from testuser from cache
remove the object of BLOCK0select count(1) from testuser from cache

而在这个系统中后台日志却只打印了下面一句-->


clear the cache for the batch inquiry!


当我们在开始用框架运行testWeb,或者以testWeb为模板开发其他程序的时候那个速度可真是快啊,对于缓存问题只须一个PageIteratorSolver就搞定,可是业务对象一般都是模型嵌模型,而且会有大量的状态数据,OK,缓存的清理问题就来了,也许jdonframework的快速性也就卡在了这个地方,好像EJB也是对象池加上数据类缓存,不知道这个问题是否也要程序员去面对?针对模型聚合模型并附有状态数据的系统jdonframework可否有清除缓存的万能方法?

搜索了以前的一些帖子得到若干结论-->
缓存问题没有找到一劳永逸的完美解决方案,现在只有在业务层手工进行更新,因为Model对象是你设计的,你有责任负责保证他们状态的一致性,就象你考虑事务隔离级别来保持数据状态一致性一样,关于模型嵌套模型,我们根据Evans DDD设计Model类图时,那些Model和另外Model对象发生关联,这些都是知道的,没有这些关联类图,如何有后面的程序代码?缓存同步不是一件简单事情,它和事务 以及多线程一起,是JavaEE中最复杂的部分,所以才会有EJB这样打包专家出现。看来只有自己慢慢摸索了!!

[该贴被oojdon于2008-02-15 23:44修改过]
[该贴被oojdon于2008-02-16 00:23修改过]