2013-03-01 61 views
0

我已經花了更多的時間,因爲在輸入文本字段中有一些保存或更新問題,我直接去了點: 我有一些基本的單獨輸入文本如何使用ajax監聽器保存或更新單個inputText字段

<h:inputText id="name" value="#{salesController.selectedSalesName}" />

這裏是inputText的值

public String getSelectedSalesName(){ 
    for(DealerListView dealer : dealerList){ 
     if(dealer.getDealerId() == getSelectedDealerId()){ 
      return dealer.getName(); 
     } 
    } 
    return ""; 
} 

嵌套一個getter在那裏,我用ajax標籤

<f:ajax event="change" render="name" listener="#{salesController.updateSelectedSalesName()}" /> 

一個這裏是回用於更新輸入文本字段

public void updateSelectedSalesName() {  

     DealerData dealDat = BeanFactory.getHotelDAOService(DealerData.class).findOne(selectedDealerId); 
     dealDat.setName(name); 
     BeanFactory.getHotelDAOService(DealerData.class).update(dealDat);  
} 

的這整個結果堆棧跟蹤它說

值bean方法=」 #{} salesController.selectedSalesName「:房產 'selectedSalesName' 在類型sk.hotel.web.controller.SalesController

01不可寫

我知道有新的變化是需要爲getter方法,但嘗試沒有結果,一些組合,這使得有價值的數據庫corect更新。

(我不使用對提交的任何命令的按鈕,當按下Enter鍵在inputText字段只更新響應)。 我需要一些指導如何修改這個保存/更新過程是否回溯豆或JSF佈局 或也許有人已經解決了類似的情況,並可以分享他的解決方案

感謝大家的意見的帖子。 的問候和美好的一天

+1

1.''屬性值的結合需要**都setter和getter ** bean的屬性和前應該引起你所面臨的prblems。 2.你將面對的性能問題,作爲消氣部件可以被稱爲很多次,你寫的方式是消耗資源(替代方法:使用您在'Constructor' /'@ PostConstruct'方法/'preRenderView'評價其他字符串屬性事件3阿賈克斯監聽器必須是以下類型'公共無效ajaxListener(AjaxBehaviorEvent事件)'的,所以改變你的bean的方法聲明。 – skuntsel 2013-03-01 10:59:37

+0

謝謝你的帖子,也爲這些建議,是的,我想這兩個結合前的OD setter/getter,但這只是簡單的概述,並沒有深入這方面,我嘗試修改基於這個我的代碼,我看到我有多遠:) – Maston 2013-03-01 12:35:57

+0

不客氣! – skuntsel 2013-03-01 12:39:26

回答

4

首先,添加一個字段:

String selectedSalesName; 

添加一個setter和setter:

public String getSelectedSalesName() { 
    return selectedSalesName; 
    } 
    public void setSelectedSalesName(String selectedSalesName) { 
    this.selectedSalesName = selectedSalesName; 
    } 

添加ajaxListener(AjaxBehaviurEvent事件)來創建一個新的經銷商或更新現有經銷商

public void ajaxListener(AjaxBehaviorEvent event) { 
    Dao dao = BeanFactory.getHotelDAOService(DealerData.class) 
    if (selectedDealerId == null) { 
     DealarData dealerData= new DealerData(); 
     dealerDate.setName(getSelectedSalesName()); 
     dao.add(dealerData); 
     setDealer(dealerData); 
    } else { 
     DealerData dealDat = dao.findOne(selectedDealerId); 
     dealDat.setName(name); 
     dao.update(dealDat); 
    } 
    } 

一個二傳手,以目前的經銷商

int selectedDealerId; 
    public void setDealer(DealerData dealer) { 
     selectedDealerId = dealer.getId(); 
     selectedSalesName = dealer.getName(); 
    } 

而XHTML頁面:

<h:inputText value="#{salesController.selectedSalesName}" id="idSalesInput"> 
     <a4j:ajax event="keyup" listener="#{salesController.ajaxListener}" 
       execute="idSalesInput"/> 
    </h:inputText> 

更改您要收聽的活動的「密碼」。

當你按下一個鍵時,監聽器被調用,並且idSalesInput的值被提交(setSelectedSalesName()方法在這裏被調用,因此你得到屬性'selectedSalesName'不可寫異常),並且監聽器創建或更新新的DealerData。

有一個不錯的一天,對不起,我的英語不好!

+0

非常感謝這非常好的演示文稿,顯示如何提供在Jsf提交的價值,像這樣的事情我想找到但沒有結果,好吧我做了一些基於這個修改,讓你知道怎麼回事,問候 – Maston 2013-03-01 13:29:17

+0

你想用這麼多操作來嚇唬數據庫(* keyup *)?這是**糟糕的做法**。改變佔位符。 – skuntsel 2013-03-01 13:31:44

+0

@skuntsel我認爲最好的活動是「onblur」,你可以指定(或鏈接)什麼是PlaceHolder? – 2013-03-01 14:36:04

1

綁定值的inputText是雙向的,當它比調用getter時,計算值,當它(在你的AJAX事件等)submited呈現二傳手稱爲該屬性設置值在你的支持bean中。所以JSF試圖調用setSelectedSalesName(String value)。 JSF不能寫你的屬性,這意味着不能調用setter。

參見:

相關問題