Posted on 2006-09-25 13:51
冰浪 閱讀(1282)
評(píng)論(4) 編輯 收藏 所屬分類:
Frameworks
這些日子在用JSF+Hibernate組合來(lái)實(shí)現(xiàn)一簡(jiǎn)單應(yīng)用——留言本。
???????? 思路如下:
???????? 用JSF作為View層,Hibernate實(shí)現(xiàn) Model層即數(shù)據(jù)持久化,而Control層則采用POJO,即JavaBean。
???????? 在model層,用hibernate生成持久化對(duì)象,作為與數(shù)據(jù)庫(kù)間數(shù)據(jù)交互的“介質(zhì)對(duì)象”(自己命名的,呵呵)。如留言信息類Message.class,這也是POJO,即實(shí)體bean,所含方法只是setter/getter。但其卻與DB表中數(shù)據(jù)類型相對(duì)應(yīng)的。
???????? 在view層JSF中,與頁(yè)面顯示組件進(jìn)行值綁定的受控bean承擔(dān)了數(shù)據(jù)顯示與操作的任務(wù)。在此應(yīng)用中,如MessageBean.class,這是與hibernate中的Message.class這一實(shí)體bean相對(duì)應(yīng)的。
???????? 為什么不直接使用實(shí)體bean作為view層的數(shù)據(jù)顯示對(duì)象呢?這是因?yàn)樵贛VC模式中,任何兩層間都應(yīng)該是“松藕合”狀態(tài),而不產(chǎn)生相互依賴的情形。
???????? 既然如此,受控bean與實(shí)體bean之間又如何實(shí)現(xiàn)數(shù)據(jù)的傳遞呢?
???????? 在control層中,建立一個(gè)MessageBuilder.class類,來(lái)實(shí)現(xiàn)兩bean間的交互,這個(gè)類中主要利用了org.apache.commons.beanutils.BeanUtils類的copyProperties方法來(lái)實(shí)現(xiàn)。MessageBuilder.java的具體實(shí)現(xiàn)代碼如下:
//**********MessageBuilder.java的具體實(shí)現(xiàn)代碼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的具體實(shí)現(xiàn)代碼end**************
???????? 這就實(shí)現(xiàn)了受控bean與實(shí)體bean的數(shù)據(jù)交互。
???????? PS:BeanUtils.copyProperties(obj1,obj2) 方法要對(duì)象obj1,obj2中的相對(duì)應(yīng)的屬性的名字和數(shù)據(jù)類型一致,否則會(huì)產(chǎn)生數(shù)據(jù)類型不匹配的異常。但并不是要求屬性數(shù)目一致。