冰浪

哥已不再年轻 - 坚定梦想,毕生追求!
posts - 85, comments - 90, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

受控bean与实体bean的数据传递

Posted on 2006-09-25 13:51 冰浪 阅读(1270) 评论(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中的相对应的属性的名字和数据类型一致,否则会产生数据类型不匹配的异常。但并不是要求属性数目一致。


评论

# re: 受控bean与实体bean的数据传递  回复  更多评论   

2006-09-25 14:53 by 123bingbing
如果你是编程高手,这里将是你一个展现自我的新舞台----www.mylinux.com.cn

# re: 受控bean与实体bean的数据传递  回复  更多评论   

2006-09-27 06:08 by 祎恬凡
PropertyUtils.copyProperties:Copy property values from the "origin" bean to the "destination" bean for all cases where the property names are the same (even though the actual getter and setter methods might have been customized via BeanInfo classes).

这说明该方法可以拷贝bean中只要命名相同的属性值,而不要求类型是否一致。当然了,类型不同的时候,他会自己去转换,当转换不过来的时候就会发生那个classcastexception了。

# re: 受控bean与实体bean的数据传递  回复  更多评论   

2006-09-27 06:08 by 祎恬凡
PropertyUtils.copyProperties:Copy property values from the "origin" bean to the "destination" bean for all cases where the property names are the same (even though the actual getter and setter methods might have been customized via BeanInfo classes).
这说明该方法可以拷贝bean中只要命名相同的属性值,而不要求类型是否一致。当然了,类型不同的时候,他会自己去转换,当转换不过来的时候就会发生那个classcastexception了。

# re: 受控bean与实体bean的数据传递  回复  更多评论   

2006-09-29 16:31 by 冰川
支持下,呵呵!

只有注册用户登录后才能发表评论。


网站导航: