How save or update single inputText field using ajax listener

浪子不回头ぞ 提交于 2019-12-12 01:29:34

问题


I spent already more time as is good about some saving or updating issue in inputtext field, i go right to the point: i have basic single input text with some basic attributtes

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

here is a getter for inputText value

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

nested in there i use ajax tag

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

a here is back bean method for updating a input text field

public void updateSelectedSalesName() {     

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

whole result of this is stack trace which say

value="#{salesController.selectedSalesName}": Property 'selectedSalesName' not writable on type sk.hotel.web.controller.SalesController

I know that something changes is need for that getter method but try some combinations without result which make corect update of value to database.

(I dont use any commands buttons for submit,update only response on pressing Enter in that inputText field.) I want some guide how can be modified this save/update process whether on back-bean or jsf layout or maybe someone solved similar situation already,and can share his solution.

Thanks all of you for advice posts. Regards and nice day


回答1:


First, add a field:

  String selectedSalesName;

Add a setter and setter:

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

Add a ajaxListener(AjaxBehaviurEvent event) to create a new Dealer or Update current Dealer

  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);
     }
  }

A setter to the current dealer

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

And the xhtml page:

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

Change "keyup" for the event you want to listen.

When you press a key, the listener is called, and the value of idSalesInput is submitted (the setSelectedSalesName() method is called here, for this reason you got the Property 'selectedSalesName' not writable exception),and the listener create or update a new DealerData.

Have a nice Day and sorry for my bad english!




回答2:


Binding value in your inputText is two way, when it is rendered than getter is called to calculate value, when it is submited (like in your AJAX event) setter is called for that property to set value in your backing bean. So JSF tries to call setSelectedSalesName(String value). JSF can't write your property, which means can't call setter.

See also:

  • AJAX listener not being fired for inside


来源:https://stackoverflow.com/questions/15155825/how-save-or-update-single-inputtext-field-using-ajax-listener

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!