Posted on 2006-09-25 13:51
冰浪 閱讀(1277)
評論(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中的相對應的屬性的名字和數據類型一致,否則會產生數據類型不匹配的異常。但并不是要求屬性數目一致。