Posted on 2006-09-25 13:51
冰浪 阅读(1271)
评论(4) 编辑 收藏 所属分类:
Frameworks
这些日子在用JSF+Hibernate组合来实现一简单应用——留言本。
思路如下:
用JSF作为View层,Hibernate实现 Model层即数据持久化,而Control层则采用POJO,即JavaBean。
在model层,用hibernate生成持久化对象,作为与数据库间数据交互的“介质对象”(自己命名的,呵呵)。如留言信息类Message.class,这也是POJO,即实体bean,所含方法只是setter/getter。但其却与DB表中数据类型相对应的。
在view层JSF中,与页面显示组件进行值绑定的受控bean承担了数据显示与操作的任务。在此应用中,如MessageBean.class,这是与hibernate中的Message.class这一实体bean相对应的。
为什么不直接使用实体bean作为view层的数据显示对象呢?这是因为在MVC模式中,任何两层间都应该是“松藕合”状态,而不产生相互依赖的情形。
既然如此,受控bean与实体bean之间又如何实现数据的传递呢?
在control层中,建立一个MessageBuilder.class类,来实现两bean间的交互,这个类中主要利用了org.apache.commons.beanutils.BeanUtils类的copyProperties方法来实现。MessageBuilder.java的具体实现代码如下:
//**********MessageBuilder.java的具体实现代码begin**************
package efan5.myguestbook.control;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanUtils;
import efan5.myguestbook.model.Message;
import efan5.myguestbook.view.MessageBean;
public class MessageBuilder {
public MessageBuilder(){}
public static Message createMessage(MessageBean messageBean){
Message message = new Message();
try {
BeanUtils.copyProperties(message, messageBean);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return message;
}
public static MessageBean createMessageBean(Message message){
MessageBean messageBean = new MessageBean();
try {
BeanUtils.copyProperties(messageBean,message);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return messageBean;
}
}
//**********MessageBuilder.java的具体实现代码end**************
这就实现了受控bean与实体bean的数据交互。
PS:BeanUtils.copyProperties(obj1,obj2) 方法要对象obj1,obj2中的相对应的属性的名字和数据类型一致,否则会产生数据类型不匹配的异常。但并不是要求属性数目一致。