2012-10-16 47 views
0

我们有一个包含3列的数据表,第一个包含selectBooleanCheckbox,最后两个包含outputText。selectBooleanCheckbox在过滤的数据表更新后未更新

我们还在此表上设置了一个过滤器,根据过滤布尔值显示或隐藏行。

用于数据表的实体由这3列属性(1个布尔值,2个字符串)组成。见下文。

问题是,当我们在第一列(如“是”)中选择一个过滤器并单击更新按钮时,表格将被更新,但过滤器未应用,因此表格过滤器未刷新。

步骤重现:

  1. 加载页面,不修改任何复选框
  2. 选择过滤器 “是”
  3. 按下更新按钮
  4. 数据表未更新

这是我的Entity.java

public class Entity { 
    boolean     enabled; 
    private String   label; 
    private String   description; 

    public Entity(boolean enabled, String label, String description) { 
     this.enabled = enabled; 
     this.label  = label; 
     this.description = description; 
    } 

    public boolean getEnabled() { 
     return enabled; 
    } 

    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 
} 

这是我简单的bean

import java.util.ArrayList; 
import java.util.List; 

import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Controller; 

@Controller 
@Scope ("view") 
public class TestBean { 
    private List<Entity> list; 

    public TestBean() { 
     list = new ArrayList<Entity>(); 

     /* Populate examples */ 
     list.add(new Entity(true, "Book", "This is a C book")); 
     list.add(new Entity(false, "Screen", "21\" HP Screen")); 
     list.add(new Entity(true, "Game", "You won 1 million")); 
    } 

    /* 
    * Update list, in the real application it is a little bit more complicated 
    * but I simplified it and the problem is reproducible for this stuff too. 
    */ 
    public void update() { 
     Entity entity; 

     /* "Disable" the third because we didn't win */ 
     entity = list.get(2); 
     entity.setEnabled(false); 
    } 

    public List<Entity> getList() { 
     return list; 
    } 

    public void setList(List<Entity> list) { 
     this.list = list; 
    } 
} 

这是我对过滤器布尔值

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.faces.context.FacesContext; 
import javax.faces.model.SelectItem; 

import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Controller; 

/** 
* The Class BooleanListBean. 
*/ 
@Controller 
@Scope ("session") 
@SuppressWarnings ("serial") 
public class BooleanListBean implements Serializable { 

    /** 
    * Instantiates a new boolean list bean. 
    */ 
    public BooleanListBean() { 
     super(); 
    } 

    /** 
    * Gets the options. 
    * 
    * @return the options 
    */ 
    public SelectItem[] getOptions() { 
     final List<SelectItem> options = new ArrayList<SelectItem>(); 

     final FacesContext facesContext = FacesContext.getCurrentInstance(); 
     options.add(new SelectItem("", "Select")); 
     options.add(new SelectItem(Boolean.FALSE.toString(), "No")); 
     options.add(new SelectItem(Boolean.TRUE.toString(), "Yes")); 

     return options.toArray(new SelectItem[0]); 
    } 
} 

最后的XHTML文件小豆

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:ft="http://primefaces.prime.com.tr/facestrace" 
    xmlns:t="http://myfaces.apache.org/tomahawk" 
    xmlns:util="http://java.sun.com/jsf/composite/components/util"> 
<ui:composition template="/xhtml/common/toolbarLayout.xhtml"> 
    <ui:define name="content"> 
     <p:commandButton value="Update" 
      actionListener="#{testBean.update}" 
      update=":contentForm:entityList" /> 

     <p:dataTable value="#{testBean.list}" var="entity" id="entityList" widgetVar="entityList"> 
      <p:column headerText="Activated" 
       filterBy="#{entity.enabled}" filterOptions="#{booleanListBean.options}"> 

       <h:selectBooleanCheckbox value="#{entity.enabled}" /> 
      </p:column> 

      <p:column headerText="Label"> 
       <h:outputText value="#{entity.label}" /> 
      </p:column> 

      <p:column headerText="Description"> 
       <h:outputText value="#{entity.description}" /> 
      </p:column> 
     </p:dataTable> 
    </ui:define> 
</ui:composition> 
</html> 
+0

这看起来像是一个代码审查项目。除非你能缩小这个问题,否则很少有人会想通过这一切寻找根源。 – Max

+0

为什么用JSP标记问题?你根本没有使用JSP。 XHTML文件来自其继任者Facelets。您使用的XML标签来自JSF框架。 – BalusC

回答

0

我觉得dataTable的应该过滤价值标签,

filteredValue="#{testBean.filteredList}" 

添加筛选器列表中testBean就和参考它。