JiveJdon的CRUD流程实现2
帖子初始化
主题贴或回贴的创建其实就是MessageForm的新增,新增功能是通过Jdon框架的CRUD实现的,前面已经描述,通过URL实现:
创建主题贴URL: /message/messageAction.shtml? forumId=xxxx
创建回帖URL: /message/messageReplyAction.shtml? forumId=xxxx
相应的struts-config.xml中配置如下:
<action name="messageForm" path="/message/messageAction"
type="com.jdon.strutsutil.ModelViewAction" scope="request" validate="false">
<forward name="create" path="/message/message.jsp" />
<forward name="edit" path="/message/message.jsp" />
</action>
所以,主题贴或回贴的新增页面/message/message.jsp是由Jdon框架的ModelViewAction推出的。
由于message.jsp中将使用MessageForm的Forum字段,页面显示“在XXX处论坛发言”。因此,必须首先初始化MessageForm中的Forum字段。
Jdon框架提供了三种种初始化ModelForm的方法:
第一个方法是在表现层直接实现,通过继承XmlModelHandler实现initForm方法,初始化MessageForm中的Forum字段。
第二个方法是通过配置initMethod在业务Service层中实现,通过Service接口的initMessage方法,需要在jdonframework.xml中配置<initMethod name="initMessage"/>。
为了降低表现层编码,让业务代码更多集中在业务层,我们采取第2个方案。
在ForumMessageService中增加initMessage(EventModel em)方法
一旦增加一个新方法,我们就要为其配置访问权限,initMessage是为了推出创建新贴页面用,因此只有注册用户才可以访问,配置jivejdon_permission.xml。
这里有一个非常重要的细节需要注意:
因为我们是在业务层的initMessage中页面初始化工作,ForumMessageService的initMessage代码如下:
public ForumMessage initMessage(EventModel em) {
logger.debug(" enter service: initMessage ");
ForumMessage forumMessage = (ForumMessage) em.getModel();
try {
if (forumMessage.getForum() == null) {
logger.error(" no Forum in this ForumMessage");
return forumMessage;
}
//获取forumMessage中的Forum中的fourmId
Long forumId = forumMessage.getForum().getForumId();
logger.debug(" paremter forumId =" + forumId);
Forum forum = forumDao.getForum(forumId);
forumMessage.setForum(forum);
} catch (Exception e) {
logger.error(e);
}
return forumMessage;
}
在initMessage方法中,是从initMessage方法参数中获取一个ForumMessage对象,这个ForumMessage虽然也以Model形式存在,但是它的性质是一种数据参数(DTO),我们要搞清楚它是从哪里来的,它实际是由表现层的界面对象ActionForm(ModelForm)转换过来的,那么ActionForm对象是从哪里来的?
ActionForm对象是从客户端调用URL:/message/messageAction.shtml? forumId=xxxx,所以,要使得initMessage方法中能够从ForumMessage获取到ForumMessage中的Forum的forumId,我们的调用参数形式就要改变如下:
/message/messageAction.shtml? forum.forumId=xxxx
另外还有一个小的Struts技术使用细节,这时MessagForm这个ActionForm需要对其中Forum这个字段对象进行初始化,可在MessagForm构造方法中写入:
public MessageForm(){
forum = new Forum(); // for parameter forum.forumId=xxx
}
贴子属性
帖子属性Property是一个name-value组合对象,可用于拓展新的字段,例如我们需要知道帖子发布或修改者IP地址,使用帖子属性来实现。
首先当创建帖子时,我们要推出一个创建页面,在
修改贴子
具体内容
当帖子所有者修改了帖子内容后,需要调用updateMessage来保存修改后的内容,一旦帖子被修改,该帖的modifiedDate就要被赋予最新的更新时间,如果该贴是主题贴,那么还要修改ForumThread的modifiedDate。
首先,在MessageDao中提供ForumThread的modifiedDate修改方法为void updateThreadDate(ForumThread forumThread)
注意,这里方法参数是forumThreadId 还是应该是整个forumThread对象呢?一般倾向与最好是整个对象forumThread。
但是在调用者updateMessage方法中,因为forumMessage对象是从前台传过来,是一个DTO,forumThread是从forumMessage中获得的,但是从前台界面传来的forumMessage能否给出一个完整的forumThread呢?这一切取决于updateMessage方法的传入参数ForumMessage是如何有前台传入参数的,修改贴传入参数是该贴的ID值,以及ForumMessage的实体内容(如新的主题和内容等),其他ForumMessage对象属性就没有了,因此我们必须从数据库获得真正的ForumMessage。
获取ForumMessage
这就需要我们在调用者updateMessage中,将ForumMessage充实完整,再填入新的实体内容,所以必须调用MessageDao的getMessage,如下:
//获得一个完整的forumMessage
ForumMessage forumMessage = getMessage(modForumMessage.getMessageId());
If (forumMessage == null) return; //如果为空,表示客户端传入参数错误
//将前台传入的修改后的内容逐个修改
forumMessage.setBody(modForumMessage.getBody());
forumMessage.setSubject(modForumMessage.getSubject());
messageDao.updateMessage(forumMessage);