2013-02-21 177 views
0

我的JSF頁面上點擊一個命令按鈕

<h:form> 
    <h:dataTable id="btable" value="#{ballController.items}" var="item"> 
     <h:column> 
      <h:outputText value="#{item.id}"/> 
     </h:column> 
     <h:column> 
      <h:outputText value="#{item.bname}"/> 
     </h:column> 
    </h:dataTable> 

    <h:commandButton action="#{ballCOntroller.items}" value="test"> 
      <f:ajax execute="@form" render="btable" /> 
    </h:commandButton> 
</h:form> 
在我的控制器

重裝使用CRUD生成的JSF數據表,這個方法是由ballController.items

public DataModel getItems() { 
    if (items == null) { 
     items = getPagination().createPageDataModel(); 
    } 
    return items; 
} 

但在點擊按鈕ITL給予稱爲我錯誤地說:

serverError: classjavax.faces.el.MethodNotFoundException /app/ball/index.xhtml @40,101 action="#{ballController.items}": Method not found: [email protected]()

我的目標是重新加載dataTable點擊命令按鈕而不刷新整個頁面。

*編輯

我全豆代碼

@ManagedBean(name = "ballController") 
@ViewScoped 
public class ballController implements Serializable { 

    private ball current; 
    private DataModel items = null; 
    @EJB 
    private ballFacade ejbFacade; 
    private PaginationHelper pagination; 
    private int selectedItemIndex; 

    public ballController() { 
    } 

    public ball getSelected() { 
     if (current == null) { 
      current = new ball(); 
      selectedItemIndex = -1; 
     } 
     return current; 
    } 

    private ballFacade getFacade() { 
     return ejbFacade; 
    } 

    public PaginationHelper getPagination() { 
     if (pagination == null) { 
      pagination = new PaginationHelper(10) { 
       @Override 
       public int getItemsCount() { 
        return getFacade().count(); 
       } 

       @Override 
       public DataModel createPageDataModel() { 
        return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()})); 
       } 
      }; 
     } 
     return pagination; 
    } 

    public String prepareList() { 
     recreateModel(); 
     return "List"; 
    } 

    public String prepareView() { 
     current = (ball) getItems().getRowData(); 
     selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex(); 
     return "View"; 
    } 

    public String prepareCreate() { 
     current = new ball(); 
     selectedItemIndex = -1; 
     return "index"; 
    } 

    public String create() { 
     try { 

      getFacade().create(current); 
      JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ballCreated")); 
      return prepareCreate(); 
//   return null; 
     } catch (Exception e) { 
      JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
      return null; 
     } 
    } 

    public String prepareEdit() { 
     current = (ball) getItems().getRowData(); 
     selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex(); 
     return "Edit"; 
    } 

    public String update() { 
     try { 
      getFacade().edit(current); 
      JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ballUpdated")); 
      return "View"; 
     } catch (Exception e) { 
      JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
      return null; 
     } 
    } 

    public String destroy() { 
     current = (ball) getItems().getRowData(); 
     selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex(); 
     performDestroy(); 
     recreatePagination(); 
     recreateModel(); 
     return "List"; 
    } 

    public String destroyAndView() { 
     performDestroy(); 
     recreateModel(); 
     updateCurrentItem(); 
     if (selectedItemIndex >= 0) { 
      return "View"; 
     } else { 
      // all items were removed - go back to list 
      recreateModel(); 
      return "List"; 
     } 
    } 

    private void performDestroy() { 
     try { 
      getFacade().remove(current); 
      JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ballDeleted")); 
     } catch (Exception e) { 
      JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
     } 
    } 

    private void updateCurrentItem() { 
     int count = getFacade().count(); 
     if (selectedItemIndex >= count) { 
      // selected index cannot be bigger than number of items: 
      selectedItemIndex = count - 1; 
      // go to previous page if last page disappeared: 
      if (pagination.getPageFirstItem() >= count) { 
       pagination.previousPage(); 
      } 
     } 
     if (selectedItemIndex >= 0) { 
      current = getFacade().findRange(new int[]{selectedItemIndex, selectedItemIndex + 1}).get(0); 
     } 
    } 

    public DataModel getItems() { 
     if (items == null) { 
      items = getPagination().createPageDataModel(); 
     } 
     return items; 

    } 

    private void recreateModel() { 
     items = null; 
    } 

    private void recreatePagination() { 
     pagination = null; 
    } 

    public String next() { 
     getPagination().nextPage(); 
     recreateModel(); 
     return "List"; 
    } 

    public String previous() { 
     getPagination().previousPage(); 
     recreateModel(); 
     return "List"; 
    } 

    public SelectItem[] getItemsAvailableSelectMany() { 
     return JsfUtil.getSelectItems(ejbFacade.findAll(), false); 
    } 

    public SelectItem[] getItemsAvailableSelectOne() { 
     return JsfUtil.getSelectItems(ejbFacade.findAll(), true); 
    } 

    @FacesConverter(forClass = ball.class) 
    public static class ballControllerConverter implements Converter { 

     public Object getAsObject(FacesContext facesContext, UIComponent component, String value) { 
      if (value == null || value.length() == 0) { 
       return null; 
      } 
      ballController controller = (ballController) facesContext.getApplication().getELResolver(). 
        getValue(facesContext.getELContext(), null, "ballController"); 
      return controller.ejbFacade.find(getKey(value)); 
     } 

     java.lang.Integer getKey(String value) { 
      java.lang.Integer key; 
      key = Integer.valueOf(value); 
      return key; 
     } 

     String getStringKey(java.lang.Integer value) { 
      StringBuffer sb = new StringBuffer(); 
      sb.append(value); 
      return sb.toString(); 
     } 

     public String getAsString(FacesContext facesContext, UIComponent component, Object object) { 
      if (object == null) { 
       return null; 
      } 
      if (object instanceof ball) { 
       ball o = (ball) object; 
       return getStringKey(o.getId()); 
      } else { 
       throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + ball.class.getName()); 
      } 
     } 
    } 
} 

回答

1
serverError: classjavax.faces.el.MethodNotFoundException /app/ball/index.xhtml @40,101 action="#{ballController.items}": Method not found: [email protected]() 

發生,因爲你試圖訪問getItems不正確的方式。

更新你的bean代碼:

public DataModel items() { 
    if (items == null) { 
     items = getPagination().createPageDataModel(); 
    } 
    return items; 
} 

否則改變你的facelet行動EL表達式action="#{ballCOntroller.getItems}"

編輯

您可以更新您的List爲:

public class DataTableBean implements Serializable { 

    List<String> dataModelList = new ArrayList<DataModel>(); 

    public List<DataModel> getDataModelList() { 
     return dataTableList; 
    } 

    public void setDataModelList(List<String> dataModelList) { 
     this.dataTableList = dataTableList; 
    } 

    public void addItems(){ 

     List<DataModel> tempList = getPagination().createPageDataModel(); // Returns a list of type `List<DataModel>`. 

     dataModelList.addAll(tempList); 

    } 
} 
+0

我已將操作更改爲getItems。現在它給了我這個錯誤:serverError:類java.lang.IndexOutOfBoundsException索引:0,大小:0 – 2013-02-21 08:36:54

+0

你試圖訪問一些'數組'或'列表'使用'項目?你可以發佈你的bean代碼,你得到這個錯誤! – dShringi 2013-02-21 08:41:06

+0

更新Daniel提供的代碼。由於'commandButton' *的''action'屬性必須總是返回一個'String'或一個'Object'(調用toString()來派生邏輯結果)。 – dShringi 2013-02-21 08:47:39

2

要重新加載表,你只需要使用<f:ajax render="btable" />

<h:commandButton value="test"> 
     <f:ajax render="btable" /> 
</h:commandButton> 

但對做一些動作,像添加一些數據到表中,您需要將按鈕指向適當的方法

<h:commandButton value="test" action="#{ballController.addItem}""> 
     <f:ajax render="btable" /> 
</h:commandButton> 


public void addItem() { 
    if (items == null) { 
     items = getPagination().createPageDataModel(); 
    } 
    items.getWrappedData().add(/*something like new MyObject("one","two")*/); 
} 
+0

我看到了,你能給我一個關於如何添加項目和項目的例子嗎?對不起,我對jsf仍然陌生,大部分頁面都是使用CRUD自動生成的。我有一個簡單的ID和名稱表 – 2013-02-21 08:53:35