Maston
Maston

Reputation: 31

How save or update single inputText field using ajax listener

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

Upvotes: 0

Views: 9253

Answers (2)

Arturo Volpe
Arturo Volpe

Reputation: 3627

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!

Upvotes: 4

partlov
partlov

Reputation: 14277

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:

Upvotes: 1

Related Questions