如何使用ajax侦听器保存或更新单个inputText字段

时间:2013-03-01 10:44:30

标签: jsf jsf-2

我已经花了更多时间在inputtext字段中保存或更新一些问题,我直截了当地说: 我有基本的单输入文本和一些基本的属性

  

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

这是inputText值的getter

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

嵌套在那里我使用ajax标签

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

这里是用于更新输入文本字段的后bean方法

public void updateSelectedSalesName() {     

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

这样的整个结果是堆栈跟踪,说

  

value =“#{salesController.selectedSalesName}”:属性'selectedSalesName'在sk.hotel.web.controller.SalesController类型上无法写入

我知道该getter方法需要进行一些更改,但尝试一些没有结果的组合,这样可以将corect更新为数据库。

(我不使用任何命令按钮进行提交,仅在该inputText字段中按Enter键更新响应。) 我想要一些指南如何在back-bean或jsf布局上修改这个保存/更新过程 或者也许有人已经解决了类似的情况,并且可以分享他的解决方案。

感谢大家的建议帖子。 问候和美好的一天

2 个答案:

答案 0 :(得分: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>

更改您想要收听的活动的“keyup”。

当你按一个键时,会调用监听器,并提交idSalesInput的值(这里调用setSelectedSalesName()方法,因此你得到了属性'selectedSalesName'不可写的异常),并且监听器创建或更新新的DealerData。

祝你有个美好的一天,对不起我的英语不好意思!

答案 1 :(得分:1)

inputText中的绑定值是双向的,当它被渲染时比调用getter来计算值,当它被提交时(如在你的AJAX事件中),为该属性调用setter来设置你的值支持豆。所以JSF试图调用setSelectedSalesName(String value)。 JSF无法编写您的属性,这意味着无法调用setter。

另见: